Die Herausforderung
Schreiben Sie ein Programm, das eine einzeilige Zeichenfolge mit beliebigen druckbaren ASCII-Zeichen eingeben und dieselbe in Base85 codierte Zeichenfolge ausgeben kann (unter Verwendung einer Big-Endian-Konvention). Sie können davon ausgehen, dass die Eingabe immer ≤ 100 Zeichen ist.
Eine Anleitung zu Base85
Vier Oktette sind in (normalerweise) fünf Base85-Zeichen codiert.
Base85-Zeichen reichen von
!
bisu
(ASCII 33 - 117) undz
(ASCII 122).Zum Codieren führen Sie kontinuierlich eine Division durch 85 für die vier Oktette (eine 32-Bit-Zahl) durch und addieren 33 zum Rest (nach jeder Division), um das ASCII-Zeichen für den codierten Wert zu erhalten. Beispielsweise erzeugt die erste Anwendung dieses Prozesses das Zeichen ganz rechts im codierten Block.
Wenn ein Satz von vier Oktetten nur Null-Bytes enthält, werden sie als
z
statt codiert!!!!!
.Wenn der letzte Block kürzer als vier Oktette ist, wird er mit Null-Bytes aufgefüllt. Nach dem Codieren wird die gleiche Anzahl von Zeichen, die als Auffüllung hinzugefügt wurden, am Ende der Ausgabe entfernt.
Dem codierten Wert sollte vorangestellt
<~
und gefolgt werden~>
.Der codierte Wert sollte kein Leerzeichen enthalten (für diese Herausforderung).
Beispiele
In: easy
Out: <~ARTY*~>
In: test
Out: <~FCfN8~>
In: code golf
Out: <~@rGmh+D5V/Ac~>
In: Programming Puzzles
Out: <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>
Das folgende Snippet codiert eine bestimmte Eingabe in Base85.
quelle
Antworten:
CJam,
433935 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
Wenn die Eingabe leer war,
N,)
wird sie auf die Zeichenfolge angewendet"<~"
. DaN
anfänglich ein einzelnes Zeichen enthalten ist, ist die Ausgabe korrekt.Wir müssen uns nicht mit z befassen oder die codierten Chunks auf Länge 5 auffüllen, da die Eingabe nur druckbare ASCII-Zeichen enthält.
quelle
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 Bytes
Ich habe noch nie in Python Golf gespielt, daher ist dies wahrscheinlich nicht optimal.
Vielen Dank an @ZachGates für das Golfen von 3 Bytes!
quelle
input().encode()
stattstr.encode(input())
3 Bytes speichern.Python 2,
193162 BytesDies ist mein erster Code Golf, also bin ich sicher, dass etwas mit meinem Ansatz nicht stimmt. Ich wollte auch base85 implementieren, anstatt nur die Bibliotheksfunktion aufzurufen. :) :)
quelle
[:4+len(s)/4*4]
und am Ende der Ausgabe werden keine Zeichen entfernt.while
Schleife wie folgt in eine verwandeln :while b:d=chr(b%85+33)+d;b/=85
. Sie können auch den Abstand zwischen Ihrerprint
Anweisung und der Zeichenfolge entfernen . Entfernen Sie außerdem den Abstand zwischen den übergebenen Argumentens.unpack
.Oktave,
133131 BytesVielen Dank an @ojdo für den Vorschlag, dass ich Eingaben von argv anstatt von stdin nehme und mir 2 Bytes erspare.
Ungolfed:
Ich habe den Code auf ideone gepostet . Die eigenständige Funktion erfordert keine
end
Anweisung, aber da ideone die Funktion und das aufrufende Skript in derselben Datei hat, ist ein Trennzeichen erforderlich.Ich habe immer noch nicht herausgefunden, wie ich
stdin
an Ideone arbeiten kann. Wenn jemand weiß, bin ich immer noch interessiert, also schreibe mir bitte einen Kommentar.Beispielausgabe von ideone :
quelle
argv()
? Die Aufgabenbeschreibung scheint keine Leseeingabe von zu erfordernstdin
.dec2base
in Oktave Basen über 36?BASE
muss eine Zahl zwischen 2 und 36 oder eine Zeichenfolge sein . Hier'i':'u'
erweitert der Ausdruck die 85-Zeichenfolge!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
, die als Basis dient.Matlab, 175 Bytes
Beispiel:
quelle
PHP, 181 Bytes
Online Version
Erweitert
quelle
Pure Bash, ~ 738
Encoder zuerst (etwas Golf):
Tests:
und Decoder jetzt:
Kopieren Sie diese in
enc85.sh
unddec85.sh
,chmod +x {enc,dec}85.sh
und dann:Aber Sie könnten einen stärkeren Test machen:
Reduziert auf 724 Zeichen:
quelle