Skip to content

Trennen Sie 4 Bits

Bleiben Sie dran, denn in dieser Bewertung finden Sie den Fund, den Sie suchen.

Lösung:

Jelly, 18 Bytes + 0 Strafen = 18

79Ọv2;$ḅ⁹b2+4b4FẠ

Rückgabe: 1 wenn es keine gleich langen Bitstrings gibt 4 oder mehr in der 8-Bit-Wortrepräsentation der ASCII-Zeichenketteneingabe gibt, und 0 sonst.

Versuchen Sie es online! (Testreihe mit einigen zusätzlichen Fällen hinzugefügt)

Mit Jelly's Codepage gibt es keine Teilstrings der Länge 4 oder länger mit gleichen Bits:

7    0x37    00110111
9    0x39    00111001
Ọ    0xB5    10110101
v    0x76    01110110
2    0x32    00110010
;    0x3B    00111011
$    0x24    00100100
ḅ    0xD4    11010100
⁹    0x89    10001001
b    0x62    01100010
2    0x32    00110010
+    0x2B    00101011
4    0x34    00110100
    0x5C    01011100
b    0x62    01100010
4    0x34    00110100
F    0x46    01000110
Ạ    0xAB    10101011

Bei Lauflängen gleicher Bits von:

221323221211111312322133122121221111213121123132213111122211311332313211313211111112

Wie?

Tricks zur Vermeidung von Fehltritten sind:

  • Die Monade "von Zeichen in Ordinalzahlen umwandeln" zu vermeiden. O durch Konvertierung der Zahl 79 in ein Zeichen mit gefolgt von einer "Auswertung des Jelly-Codes mit Eingabe", v.

  • zur Vermeidung einer direkten Umwandlung in Binärcode mit B (0x42, 1000010) durch die einfache Zwei-Byte-Alternative b2 unter Verwendung der generischen dyadischen Basiskonvertierung.

  • um ein paar normale Auswahlmöglichkeiten für die Zählung der Läufe gleicher Bits zu vermeiden - die erste Wahl wäre "alle überlappenden Scheiben gegebener Länge", (0xF5 oder . 11110101). Eine zweite Möglichkeit wäre die Verwendung von "alle Unterlisten", (0xCF oder 11001111).
    Eine Abhilfe, die ich vor der jetzigen verwendet habe, bestand darin, die Inkremente (zwischen aufeinanderfolgenden Elementen) mit I (wodurch Nullen und Einsen gleichgestellt werden) und nach jedem Vorkommen von drei Nullen in einer Reihe zu suchen. Zu diesem Zweck habe ich alle Nullen in Einsen umgewandelt, indem ich die Binomialfunktion mit 2c d.h.. 2Cx - wodurch die -1s zu 0s die 1s werden 2s, und die 0s werden zu 1s; auf diese Weise kann der Code nach dem ersten Vorkommen der Teilliste suchen [1,1,1] mit w111.
    Es wurde jedoch ein kürzerer Weg ersichtlich - die Aktion "alle überlappenden Slices gegebener Länge" zu imitieren, zu imitieren, kann man eine 4-weise Überlappung mit einer Dyade reduzieren, 4. Wenn dies mit Addition durchgeführt wird, +4durchgeführt wird, zählt es die 1s, so dass dann jede 0 oder 4 der Indikator für die Rückgabe eines wahren Wertes. Das Problem hier ist, dass der nächste offensichtliche Schritt darin bestünde, den Modulo 4 davon zu nehmen, um die 0 und 4 Einträge gleichzustellen, während die anderen möglichen Werte (1, 2, und 3) unverändert, aber +%4 hat % drin, das den Bit-Wert 010111 hat 0000 100100. Um diesen Nachteil zu vermeiden, werden die Zahlen alle in die Basis umgerechnet 4 mit b4 (Umrechnung 0 auf [0], 1 auf . [1], 2 zu [2], 3 bis [3], und 4 bis [1,0]) und die gesamte Liste wird mit F. Der letzte Test besteht einfach darin, zu prüfen, ob es irgendwelche 0s in der Liste gibt, was direkt mit der Monade erreicht werden kann .

79Ọv2;$ḅ⁹b2+4b4FẠ - Main link: printable ASCII character list
79                 - 79
  Ọ                - character from ordinal : 'O'
   v               - evaluate as Jelly code : input -> 'O' converts the input to ordinals
      $            - last two links as a monad
    2              -     2
     ;             -     concatenate (why? see the note beneath the code block)
       ḅ⁹          - convert from base 256 : gets an integer representing the byte string
         b2        - convert to base 2 AKA binary
            4     - 4-wise reduce with
           +       -     addition (sums all overlapping slices of length 4)
              b4   - convert to base 4 (vectorises)
                F  - flatten into a single list
                 Ạ - any falsy?

Anmerkung: Der Grund für ein 2 mit der ordinalen Liste verkettet wird, ist, um mit den Randfällen umzugehen, in denen der einzige Lauf von 4 in der Eingabezeichenfolge in den führenden Nullen des allerersten Zeichens vorkommt - diese Zeichen sind: tab; Zeile-feed; und carriage-return. Ohne diese Zeichen werden bei der Konvertierung zur Basis 256 führende Nullen aus der (vollständig verketteten) binären Zeichenfolge entfernt; mit den führenden 2 werden die führenden Nullen vorhanden sein und eine zusätzliche Eins und Null davor. Da kein druckbares ASCII genau drei führende Nullen hat, besteht keine Notwendigkeit, diese zusätzlichen Bits vor dem Rest der Prüfung zu verwerfen.

Java 7, 812726673644634616599588 145 Bytes + 10*44 = 585

boolean
b(char[]b){String
g="";for(char
c:b)g+=g.format("%"+(1-1)+"8d",new
Integer(Integer.toString(c,2)));return!g.matches(".*(.)\1\1\1.*");}

Ich verwende Zeilenumbrüche anstelle von Leerzeichen, um die Strafe zu minimieren...

Versuchen Sie es online!

Binär

01100010011011110110111101101100011001010110000101101110000010100110001000101000011000110110100001100001011100100101101101011101011000100010100101111011010100110111010001110010011010010110111001100111000010100110011100111101001000100010001000111011011001100110111101110010001010000110001101101000011000010111001000001010011000110011101001100010001010010110011100101011001111010110011100101110011001100110111101110010011011010110000101110100001010000010001000100101001000100010101100101000001100010010110100110001001010010010101100100010001110000110010000100010001011000110111001100101011101110000101001001001011011100111010001100101011001110110010101110010001010000100100101101110011101000110010101100111011001010111001000101110011101000110111101010011011101000111001001101001011011100110011100101000011000110010110000110010001010010010100100101001001110110111001001100101011101000111010101110010011011100010000101100111001011100110110101100001011101000110001101101000011001010111001100101000001000100010111000101010001010000010111000101001010111000101110000110001010111000101110000110001010111000101110000110001001011100010101000100010001010010011101101111101

Alte Bitshifting-Lösung 141 Bytes + 10*101 = 1.151

boolean
b(char[]b){
int
o=0,p=0,i;
for(char
c:b){for(i=0;i<8;){if((c&(1<

Versuchen Sie es online!

Binär

011000100110111101101111011011000110010101100001011011100000101001100010001010000110001101101000011000010111001001011011010111010110001000101001011110110000101001101001011011100111010000001010011011110011110100110000001011000111000000111101001100000010110001101001001110110000101001100110011011110111001000101000011000110110100001100001011100100000101001100011001110100110001000101001011110110110011001101111011100100010100001101001001111010011000000111011011010010011110000111000001110110010100101111011011010010110011000101000001010000110001100100110001010000011000100111100001111000110100100101011001010110010100100101001001111000011000100101001011110110110111100111101001100000011101101110000001010110010101100111011011111010110010101101100011100110110010101111011011100000011110100110000001110110110111100101011001010110011101101111101011010010110011000101000001100110011110001101111011111000011001100111100011100000010100101110010011001010111010001110101011100100110111000001010001101100011110000110101001110110111110101111101011100100110010101110100011101010111001001101110000010100011010100111100001101100011101101111101

APL (Dyalog Classic), 26 + 1 × 10 = 36 Bytes

Notizen

Enthält einen 4er-Lauf von 1en. Erfordert ⎕IO←0 was auf vielen Systemen Standard ist. Beachten Sie, dass dies sein muss. auf einem Classic-Interpreter ausgeführt werden muss, damit Strings ein Byte pro Zeichen sind.

Einreichung

1≠⊃⌽⌈∊(×4¨⍳≢⍬⍬)⍷¨⊂11⎕DR⍞

Probieren Sie es online aus!

Binäre Quelle

00110001101011001001110010110010100101110101110010111001001010001101011100110100010111001010100010 1111 0010111011101010111010101100101001101110101010100010011011001100010011000110001100010001000101001010001101

Erläuterung

 Aufforderung zur Eingabe einer Zeichenkette

11 ⎕DR umwandeln in 1-bit Boolesche (1) D ata R eDarstellung

 einschließen, damit wir mehrere Dinge auf sie anwenden können

(...) ⍷¨ Binäre Indikatoren, mit denen jede der folgenden Sequenzen beginnt ...

× Vorzeichen (bei binären Daten nicht möglich, aber als Abstandshalter zum Aufteilen von Läufen enthalten)

4 ¨ Expandieren (Kopieren) jeweils auf Länge vier

 die ganzen Zahlen bis zu

 die Summe von

⍬⍬  die Liste, die aus zwei leeren numerischen Listen besteht

 auflisten (verflachen)

 kumulatives Maximum

 umkehren

 wähle den ersten

1 ≠ ist eine anders als? (d.h. NICHT)

Durchgehen

Wir geben "48" für die nicht durchgelaufene Version ein ~ ∨/ ∊ (0 0 0 0)(1 1 1 1) ⍷¨ ⊂ 11 ⎕DR ⍞:

11 ⎕DR ⍞ wandelt "48" in 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 um (d.h. Dez 52 56, Hex 34 38)

(0 0 0 0)(1 1 1 1) ⍷¨ ⊂ findet Anfänge von 0-Läufen und 1-Läufen; (0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

∨/ ∊ sieht nach, ob es eine Wahrheit gibt (d.h. irgendwelche Läufe); 1

~ verneint das; 0

Wir laden Sie ein, unsere Funktion zu unterstützen, indem Sie einen Kommentar anheften und bewerten. Wir heißen Sie willkommen.



Nutzen Sie unsere Suchmaschine

Suche
Generic filters

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.