Dies ist meine erste Herausforderung bei ppcg!
Eingang
Eine Zeichenfolge, die aus zwei verschiedenen ASCII-Zeichen besteht. Zum Beispiel
ABAABBAAAAAABBAAABAABBAABA
Herausforderung
Die Aufgabe besteht darin, diese Zeichenfolge nach folgenden Regeln zu dekodieren:
- Überspringe die ersten beiden Zeichen
- Teilen Sie den Rest der Zeichenfolge in Gruppen von 8 Zeichen
- In jeder Gruppe ersetzen jedes Zeichen mit ,
0
ob das Zeichen das gleiche wie das erste Zeichen des ursprünglichen Zeichenfolge und mit1
ansonsten - Jetzt repräsentiert jede Gruppe ein Byte. Konvertieren Sie jede Gruppe in Zeichen aus dem Byte-Zeichencode
- Verketten Sie alle Zeichen
Beispiel
Lassen Sie uns den obigen String dekodieren.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Beachten Sie, dass dies A
das erste und B
das zweite Zeichen in der ursprünglichen Zeichenfolge ist. Ersetzen Sie daher jeweils A
mit 0
und B
mit 1
. Jetzt erhalten wir:
00110000 00110001 00110010
das ist [0x30, 0x31, 0x32]
in binär. Diese Werte stellen jeweils Zeichen ["0", "1", "2"]
dar, daher sollte die endgültige Ausgabe erfolgen 012
.
Wertung
Dies ist natürlich Codegolf , was bedeutet, dass Sie Ihren Code so kurz wie möglich halten. Die Bewertung wird in Bytes gemessen.
Einschränkungen und IO-Format
Es gelten Standardregeln. Hier sind einige zusätzliche Regeln:
- Sie können eine gültige Eingabe annehmen
- Eingabezeichenfolge besteht aus genau zwei verschiedenen Zeichen
- Die ersten beiden Zeichen sind unterschiedlich
- Die Mindestlänge der Eingabezeichenfolge beträgt 2 Zeichen
- Die Länge ergibt immer 2 Modulo 8
- Sie können davon ausgehen, dass die Zeichenfolge immer nur aus druckbaren ASCII-Zeichen besteht
- Sowohl in der Eingabe als auch in der dekodierten Zeichenfolge
- Führende und nachfolgende Leerzeichen sind in der Ausgabe zulässig (alles, was passt
/\s*/
)
Antworten:
Brainfuck ,
76 7165 Bytes-6 Bytes dank Nitrodon!
Probieren Sie es online!
Es fühlt sich komisch an, Python zu schlagen ...
quelle
Stax ,
1511 BytesFühren Sie es aus und debuggen Sie es unter staxlang.xyz!
Schneller und schmutziger Ansatz. Wir arbeiten daran, es zu verbessern.Verbesserte es!Entpackt (13 Bytes) und Erklärung
quelle
JavaScript (Node.js) , 67 Byte
Probieren Sie es online!
Wie?
Wir verwenden zwei verschiedene Syntaxen des
Buffer
Konstruktors:Buffer([n])
generiert einen Puffer, der das einzige Byte n enthält, und wird in das entsprechende ASCII-Zeichen umgewandelt. Es werden nur die 8 niedrigstwertigen Bits von n berücksichtigt.Buffer(n)
erzeugt einen Puffer von n Bytes. DaherBuffer(0)
erzeugt einen leeren Puffer, der auf eine leere Zeichenfolge dazu gezwungen wird.Hinweis: Beide sind in neueren Node-Versionen veraltet.
Buffer.from([n])
undBuffer.alloc(n)
sollte stattdessen verwendet werden.Kommentiert
quelle
Bash,
595852 BytesProbieren Sie es online!
Vielen Dank an Cows Quack für die Einsparung von 6 Bytes.
Diese Herausforderung funktioniert bemerkenswert gut mit einer Reihe von Coreutils (und
dc
der Konvertierung und Ausgabe am Ende). Erstens verwenden wirum die zwei Zeichen in der Eingabe in Nullen und Einsen umzuwandeln. Das
-t
Flag schneidet das erste Argument auf die Länge des zweiten ab, sodass die ersten beiden Zeichen in der Eingabe in0
und transliteriert werden müssen1
. Dann,Entfernt die ersten beiden Zeichen und
Gibt 8 der Zeichen pro Zeile aus. Schließlich
sed
verwandelt der Befehl jede Zeile in eindc
Snippet, das die Zahl als Binärzahl liest und dieses Byte ausgibt.quelle
cut -c
kann entfernt werden)Z80-Maschinencode auf einem Amstrad-CPC,
32 3130 ByteDer Code übernimmt die Anweisung , jedes Zeichen durch zu ersetzen,
0
wenn dieses Zeichen mit dem ersten Zeichen der ursprünglichen Zeichenfolge identisch ist.1
Andernfalls wird buchstäblich nicht geprüft, ob ein Zeichen mit dem zweiten Zeichen in der Eingabezeichenfolge übereinstimmt. Es wird nur geprüft, ob das erste Zeichen und das erste Zeichen identisch sind.Ich lief aus Registern (die Z80 hat nur 7 leicht verwendbar 8-Bit - Register, der Rest Notwendigkeit mehr Anweisungen) so habe ich
&01
inH
, zusammen mit der VerwendungL
des ASCII - Zeichens aufzubauen (ich es nur realisiert unnötig zu initialisierenL
, speichern ein Byte ). WennH
das Carry-Flag überschritten wird, kann das Zeichen inL
ausgegeben werden. Glücklicherweise gibt es ein 16-BitADC
( Ad d mit C arry), das die Aufgabe eines Linksschiebebefehls erfüllt.(DE)
kann nur eingelesen werden,A
obwohl(HL)
es in jedes 8-Bit-Register eingelesen werden kann. Es war also ein Kompromiss, den man verwenden sollte. Ich konnte nicht direkt(DE)
mit vergleichenC
, also musste ich zuerst einen ladenA
. Die Bezeichnungen sind nur zufällige Wörter, die mitL
(einer Anforderung des Assemblers) beginnen.A
der Akku - das einzige Register, das Vergleiche anstellen kannB
dasZählerregisterfür den Befehl. Durch die Neuanordnung des Codes konnte ich die AufgabeDJNZ
: D ecrement (B
) und J ump if N on Z eroDJNZ
mit einem Byte weniger erledigenC
das erste Zeichen in der EingabezeichenfolgeD
,E
alsDE
Adresse des aktuellen EingabezeichensH
der Carry-Trigger (jede 8. Schleife)L
das ausgegebene Zeichen wird aufgebautquelle
05AB1E , 10 Bytes
Probieren Sie es online!
-3 danke an emigna.
quelle
01‡
anstelle der Schleife verwenden. EDIT: oder noch besser:¦¦Sk8ôJCçJ
J,
1713 Bytes-4 danke an FrownyFrog
Alte Version:
Erläuterung:
Beispiele:
quelle
2}.1{=
um 4 Bytes zu sparen.[:
am Anfang haben :)Python 2 , 77 Bytes
Probieren Sie es online!
quelle
R , 71 Bytes
Probieren Sie es online!
Überraschend golfen!
Konvertiert zuerst den String mit in ASCII-Code-Punkte
utf8ToInt
und speichert ihn alsy
. Das Entfernen der ersten beiden Zeichen mit negativer Indizierung ist kürzer als das Verwenden vontail
.Das Array
y[-1:-2]==y[2]
ist äquivalent zu den Bits, wenn%*%
(Matrixmultiplikation) angewendet wird, aber zuerst formen wir dieses Array in einmatrix
mit umnrow=8
und wandeln es von einem linearen Array in Bytegruppierungen um. Glücklicherweise können wir dann mithilfe der Matrixmultiplikation mit den entsprechenden Zweierpotenzen in ASCII-Codepunkte2^(7:0)
konvertieren und die Codepunkte anschließend mit in eine Zeichenfolge zurückkonvertierenintToUtf8
.quelle
Python 3 , 77 Bytes
Probieren Sie es online!
quelle
PHP,
7371 BytesLaufen Sie als Pipe mit
-nR
oder versuchen Sie es online .Golfen:
-6
und vorinkrementieren um8
strtr
übermäßige Zeichen im längeren Parameter ignoriert (nichtsubstr
erforderlich)10
und das anschließende Invertieren sind keine Anführungszeichen erforderlich -> -1 Byte~
dient als Wortgrenze -> -1 Byte.quelle
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pyth,
209 Bytes11 Bytes dank FryAmTheEggman gespart.
Probieren Sie es hier aus
Erläuterung
quelle
Ruby ,
8279 BytesProbieren Sie es online!
quelle
.join
durch*''
unds[0..1]
durch ersetzt werdens[0,2]
.Japt, 11 Bytes
Versuch es
Erläuterung
quelle
s2
Abkürzung, nett.PHP + GNU Multiple Precision,
6361Leider ist die GMP-Erweiterung nicht standardmäßig aktiviert (sondern ausgeliefert).
Laufen Sie wie folgt:
quelle
<?=
Spart 2 Bytes und eventuell den Tag. ;-)-R
(ich habe es versucht).-F
stattdessenHaskell , 75 Bytes
Probieren Sie es online!
quelle
Java 8,
143142141 Bytes-1 Byte danke an @ OlivierGrégoire .
Probieren Sie es online aus.
Erläuterung:
quelle
Python 3 ,
9986 BytesProbieren Sie es online!
Danke an ASCII-only für eigentlich das ganze
quelle
APL + WIN, 30 Bytes
Indexursprung 0. Fordert zur Eingabe eines Strings auf
Erläuterung:
quelle
Rot , 110 Bytes
Probieren Sie es online!
Erläuterung:
Eine einfache, unkomplizierte Lösung, keine eingebauten.
quelle
Google Sheets, 123 Byte
Die Eingabe erfolgt in Zelle
A1
. Google fügt automatisch)))
das Ende der Formel hinzu.Erläuterung:
Mid(A1,3+8*(Row(A:A)-1),8)
packt ab dem dritten Stück jeweils 8 Zeichen.Substitute(Mid(~),Left(A1),0)
Ersetzt jede Instanz des ersten Zeichens durch 0.Substitute(Substitute(~),Mid(A1,2,1),1)
ersetzt das zweite Zeichen durch 1.Char(Bin2Dec(Substitute(~)))
konvertiert den Block in Dezimalzahl und dann in ASCII.IfError(Char(~,""))
alle korrigiert die Fehler , die resultieren aus der Tatsache , dassRow(A:A)
Renditen weit mehr Werte als wir soBin2Dec
gibt uns eine Menge von Nullwerten undChar
Fehler heraus auf Null.ArrayFormula(Join("",IfError(~)))
Fügt alleChar
Ergebnisse zusammen undArrayFormula
macht dieRow(A:A)
Rückgabe zu einem Array von Werten anstelle nur des ersten Werts.quelle
Ruby ,
61-42Bytes-19 Bytes dank benj2240
Probieren Sie es online!
quelle
pack
ist eine inspirierte Wahl, aber im Moment sind Sie auf einem langen Weg. Es kann noch mehr von der Arbeit für Sie tun.Perl 5
-lp
, 34 BytesProbieren Sie es online!
quelle
REXX, 41 Bytes
Probieren Sie es online!
quelle
Python 2 , 88 Bytes
Probieren Sie es online!
Nicht die kürzeste - nur eine Alternative.
Die folgende Version gibt die Ausgabe in einer Zeile für 98 Byte aus, obwohl die Regeln festlegen, dass nachfolgende Leerzeichen zulässig sind:
Probieren Sie es online!
quelle
/\s*/
.C # (Visual C # -Compiler) , 158 Byte
Probieren Sie es online!
quelle
Perl 5
-p
, 40 BytesProbieren Sie es online!
quelle
Scala , 95 Bytes
Probieren Sie es online!
quelle
Haskell ,
12410593 BytesProbieren Sie es online!
f
wandelt die Zeichenfolge in eine Liste von Bits um, indem jedes Zeichen mit dem ersten verglichen wird und dasBool
s in Nullen und Einsen mit umgewandelt wirdfromEnum
.g
teilt diese Liste in Gruppen von 8, wandelt sie in dezimalen, und nimmt den Wert der erhaltenen Zahl alsEnum
, dieChar
eine Instanz ist.Änderungen:
map
in Funktion einbetten )take
@Lynns Antwort (wird durch Zippen mit kürzerer Liste entfernt)quelle
toEnum
anstelle von verwendenchr
und verwerfen. Auch dasmap
kann in aufgenommen werdeng
. Der Zwischenraum8 s
kann entfernt werden.Viertens (gviertens) , 83 Bytes
Probieren Sie es online!
Die Eingabe ist eine standardmäßige Forth-Zeichenfolge (Adresse und Länge). Die Ausgabe erfolgt auf Standardausgabe
Erläuterung
quelle