Herausforderung
Ihre Aufgabe ist es, eine Ganzzahl als eine Zeichenfolge aus ASCII- Zeichen zu codieren und sie dann erfolgreich zu decodieren, nachdem die Zeichenfolge zufällig gemischt wurde.
Sie schreiben zwei Programme / Funktionen , die als Encoder und Decoder bezeichnet werden .
Encoder
- Eingabe: eine ganze Zahl im Bereich von .
- Ausgang: ein String von ASCII - Zeichen (nicht unbedingt druckbar).
Decoder
- Eingabe: eine zufällige Permutation der Zeichenkette .
- Ausgabe: die ganze Zahl .
Wertung
Sei die maximale Länge von über alle möglichen Werte von . Wenn der Encoder nicht deterministisch agiert (was zulässig ist, siehe unten), ist das die maximale Länge von , die auftreten kann (möglicherweise ).
Lassen das sein Länge des Encoder in Bytes und die Länge der Decoder in Bytes.
Dann lautet Ihre Punktzahl .
Der Sieg wird der Einreichung mit der niedrigsten Punktzahl zuerkannt .
Zeitlimit
Es gibt eine etwas willkürliche Zeitgrenze von 1 Minute auf der Ausführungszeit von sowohl dem Encoder und dem Decoder für einen einzelnen Testfall (dh ein einziger Wert von ).
Das Ziel ist es, Lösungen zu vermeiden, die die Codierung brachial erzwingen, indem alle Sequenzen mit bestimmten Eigenschaften aufgelistet werden. Wenn Ihre Lösung etwas Klügeres als das tut, entspricht sie höchstwahrscheinlich der zeitlichen Beschränkung und wird als gültig betrachtet. Wenn es für einige zufällig ausgewählte Werte von auf TIO funktioniert , wird es ebenfalls als gültig betrachtet. Andernfalls werde ich es auf meinem Computer testen, aber beachten Sie, dass Ihre Lösung mit ziemlicher Sicherheit scheitern wird, wenn sie reine Brute-Force-Lösung ist.
Regeln
- Der Encoder und der Decoder müssen in derselben Sprache geschrieben sein .
- Der Decoder muss für jede mögliche Permutation der vom Encoder zurückgegebenen Zeichenfolge die richtige Ganzzahl ausgeben .
- Der Encoder und Decoder sind nicht zu erlaubt Austausch von Informationen in irgendeiner Weise (zB durch globale Variablen oder Dateien).
- Der Ausgang des Encoder muss nicht sein deterministisch (das heißt, der gleiche Eingang können unterschiedliche Ausgabestrings erzeugen , wenn der Encoder mehrere Male ausgeführt wird), aber der Decoder muss immer erraten die richtige ganze Zahl n .
- Der Codierer und der Decodierer können die Ganzzahl auf jede zweckmäßige Weise annehmen und zurückgeben (z. B. wenn , ist die Eingabe in Ordnung
14
,"14"
oder[1,4]
). - Der Encoder ausgeben kann die String entweder durch Drucke auf
stdout
oder durch Rücksendung eine Zeichenfolge, eine Liste / Array von Zeichen oder eine Liste / Matrix von ganzen Zahlen im Bereich ; Beachten Sie, dass der Decoder als Eingabe eine Permutation von empfängt, wie sie vom Encoder zurückgegeben wird. Daher sollte er die Zeichenfolge im gleichen Format wie akzeptieren . - Standardlücken sind verboten.
- Wenn möglich, erläutern Sie, wie Ihr Code funktioniert und warum die von Ihnen angegebene Punktzahl korrekt ist.
Beispiel
Angenommen, .
- Der Encoder empfängt
14
als Eingang. Es kann ausgegeben werden"qwerty"
.- Der Decoder empfängt beispielsweise eine Permutation von
"qwerty"
als Eingabe"tweyqr"
. Es muss ausgegeben werden14
(in jedem geeigneten Format).
Der Encoder hätte auch zurückkehren [113,119,101,114,116,121]
können. In diesem Fall hätte der Decoder beispielsweise empfangen [116,119,101,121,113,114]
.
Beachten Sie, dass der vom Encoder zurückgegebene String möglicherweise auch nicht druckbare ASCII-Zeichen enthält (jedoch immer im Bereich [0x00, ..., 0x7F]
).
Antworten:
Gelee , (17 Bytes + 18 Bytes) × Länge 6 = 210 Punkte
Probieren Sie es online! (oder mit zusätzlichen Debug-Informationen)
Nachdem ich versucht hatte, diese Herausforderung mit dem Ziel der angegebenen Siegbedingung zu lösen, hielt ich es für interessant, eine hypothetische alternative Siegbedingung anzustreben: Codegolf mit einer minimal möglichen maximalen Länge für die Ausgabe.
Erläuterung
Codierung
Der erste Schritt bei der Codierung besteht darin, die Eingabe als Basis 36 (
b36
) darzustellen . 36 6 = 2176782336> 2147483647, daher enthält das Ergebnis höchstens 6 Ziffern, von denen jede im Bereich von 0 bis 35 liegt.Als nächstes wandeln wir dies in eine Darstellung um, die 6 verschiedene Ziffern enthält . Hierfür gibt es mehrere mögliche Algorithmen. Hier wird jedoch 1 zur kleinsten Ziffer, 2 zur zweitkleinsten Ziffer, 3 zur drittkleinsten Ziffer usw. addiert. Dies bedeutet, dass wenn zwei Ziffern gleich wären, eine von ihnen willkürlich als kleiner betrachtet wird und sie sich somit unterscheiden. und offensichtlich kann dieser Algorithmus nicht dazu führen, dass zwei verschiedene Ziffern gleich werden. Um dies in Jelly darzustellen, verwenden wir
Ụ
("Indizes nach Werten sortieren"), um eine Liste der Indizes in sortierter Reihenfolge zu erhalten.Ụ
erneut, um dies umzukehren, wobei jedes Element des Originals in sortierter Reihenfolge seiner Position zugeordnet wird; undµ…+
um das Original zur neuen Liste hinzuzufügen. Das Ergebnis ist eine Darstellung der eingegebenen Nummer als sechs verschiedene Ziffern im Bereich von 1 bis 41 (Minimum 0 + 1, Maximum 35 + 6).Wir teilen dies dann in eine weitere Form auf: eine sortierte Liste von Ziffern im Bereich von 1 bis 41 sowie eine Zahl von 1 bis 720, die angibt, in welcher der 720 möglichen Permutationen sich die Ziffern befanden. (Die
Œ¿
undṢ
extrahieren die Permutationsnummer und sortieren jeweils auflisten.)Schließlich konvertieren wir die Zahl von 1 nach 720 in die Basis 3 (
b3
), kehren sie um (U
) und kodieren die sechs 3 - und sechs 1 - bis 41 - stelligen Ziffern, indem wir sie mit reverse divmod (dem Wert von) in ein einzelnes ASCII - Zeichen packen das zeichen mod 3 ist die 3-stellige basis, der durch 3 geteilte wert ist die 1–41-stellige). Der mögliche Bereich der Ergebnisse ist (1 × 3) + 0 = 3 mindestens und (41 × 3) + 2 = 125 höchstens und entspricht unserem ASCII-Bereich. Das Packen erfolgt über×3
und+
zusammen mit einem zusätzlichenµ
Befehl, um sicherzustellen, dass jeder Befehl mit dem richtigen Datenbit arbeitet. (Hier gibt es einen kleinen Golf-Trick: Wir multiplizieren mit 3, bevor wir die Permutation extrahieren. Das erspart die Ausgabe eines Bytes für ein Gruppierungszeichen.)Im Übrigen liegt der Grund für die Umkehrung der Zahl zur Basis 3 darin, dass sie möglicherweise weniger Ziffern als die Zahl von 1 bis 41 enthält. (Mehr kann es nicht geben; die kleinste Zahl, für die n !> 3 n etwas über 6 liegt.) Jelly fügt effektiv nachgestellte Nullen ein, wenn zwei Zahlen unterschiedlicher Länge addiert werden, damit sie übereinstimmen. Abschließende Nullen würden die Interpretation der Zahl beeinflussen, führende Nullen jedoch nicht. Umgekehrt wird also sichergestellt, dass die zusätzlichen Nullen an einem Ort landen, der unsere Antwort nicht durcheinander bringt.
Dekodierung
Der erste Schritt bei der Decodierung besteht darin, die beiden Zahlen (die Zahl zur Basis 3 und die Zahl von 1 bis 41) zu extrahieren. Wir können ihre Ziffern mit Division (
:3
) bzw. Modulo (%3
) leicht genug ermitteln , aber woher wissen, in welcher Reihenfolge sie sich befanden? Nun, die 1–41-Nummer hatte ihre Ziffern in sortierter Reihenfolge, und die Ziffern an den entsprechenden Positionen der beiden Nummern wurden in denselben Zeichen gespeichert. Auf diese Weise können wir herausfinden, in welche Reihenfolge die Ziffern der 1–41 gemischt wurden (indem wir ihre relativen Werte betrachten) und wissen, dass die Ziffern der Basis-3 auf die gleiche Weise gemischt worden sein müssen. Tatsächlich, weil Zeichen unserer ASCII-Codierung genauso sortiert sind wie die Ziffern von 1 bis 41 (diese waren alle verschieden und sind signifikanter als die Zahlen der Basis 3).Ṣ
. Beide Extraktionen beginnen also mitṢ
, gefolgt von%3
oder:3
nach Bedarf.Während die Ziffern der 1–41 noch in sortierter Reihenfolge sind, haben wir einen sehr praktischen / knappen Weg, um zu den Ziffern 0–35 der Basis 36 zurückzukehren. subtrahieren Sie einfach 1 von der ersten, 2 von der zweiten, 3 von der dritten und so weiter. In Jelly können wir das mit
_J
("subtract index") machen.Währenddessen kehren wir im anderen Zweig der Dekodierung die Ziffern der Basis 3 wieder in order (
U
) um und konvertieren sie von Basis 3 zurück in einen Permutationsindex mitḅ3
.Wir können dann die beiden Zweige mit kombinieren
œ?Ç
;œ?
bedeutet "permutieren bei gegebenem Permutationsindex" undÇ
bedeutet "das Ergebnis des Anwendens der darüber liegenden Zeile", dh es ist das, was Jelly anweist, beide Zeilen getrennt für dieselbe Eingabe auszuführen.Was wir jetzt haben, sind die Ziffern der ursprünglichen Zahl, in der Basis 36 (aufgrund der
_J
) und in der ursprünglichen Reihenfolge (aufgrund derœ?
), so dass wir einfach a tun könnenḅ36
, um von der Basis 36 in eine einzelne Ganzzahl zurück zu konvertieren.Kommentar
Das TIO! Der obige Link verwendet 312699167 als zu verschlüsselnde Nummer. Diese Zahl in der Basis 36 ist
[5, 6, 6, 8, 7, 35]
und zeigt somit alle Aspekte der Codierung: Die 35 testet die Grenze des Bereichs von 0 bis 127, den wir haben; das Duplikat 6s testet die Auflösung identischer Ziffern in der ursprünglichen Basis 36; und die Tatsache, dass die Ziffern fast (aber nicht vollständig) sortiert sind, bedeutet, dass die Permutationszahl sehr klein ist, wodurch sie viel weniger Ziffern als die Basiszahl 36 aufweist und somit die Notwendigkeit zeigt, sie umzukehren, bevor sie zum Original hinzugefügt wird.Es ist sehr praktisch, wie alle Konstanten hier zusammenpassen. 36 6 ist nur gerade hoch genug, um 2 31 , 3 6 ist nur gerade hoch genug, um 6! Zu passen, und (36 + 6) × 3 ist nur gerade hoch genug, um in die 128 Möglichkeiten zu passen, die wir haben. (Die letzte Einschränkung ist die am wenigsten enge, da wir die 0-Indizierung anstelle der 1-Indizierung verwenden könnten, um Zeichen im Bereich 0-2 zu verwenden. Dennoch würde dies nur genug Platz bieten, um 37 als Basis zu verwenden als 36.)
quelle
Gelee , (
43 Bytes +65 Bytes) × Länge 8 =8064 PunkteProbieren Sie es online!
Gelee , (
21 Byte +43 Bytes) × Länge 10 =6040 PunkteProbieren Sie es online!
Erläuterung
Lösung 1
Dies verwendet einen anderen Algorithmus als die meisten anderen Antworten. Wir beginnen mit der Codierung des Wertes in hexadezimal (
b⁴
), wie bei den anderen Antworten, und nehmen dann eine kumulative Summe (Ä
). Jede Eingabe gibt eindeutig eine andere Ausgabe aus (da beide Operationen umkehrbar sind), und vorausgesetzt, dass die hexadezimale Codierung höchstens 8 Stellen enthält, deren Maximum 7 (für die achte bis letzte Stelle) und 15 (für die letzte bis siebte Stelle) beträgt. letzte Stelle) beträgt die maximale Anzahl in der Ausgabeliste 7+ (7 × 15) = 112, weniger als die von der Frage geforderten 127. Außerdem muss die Ausgabe in sortierter Reihenfolge erfolgen, damit wir die Zufallswiedergabe umkehren können.Für den Decoder kehren wir zuerst das Shuffle mit sort (
Ṣ
) um; kehre dann die kumulative Summe um, indem du eine Null voranstellst (Ż
) und die Differenz aufeinanderfolgender Paare nimmst (I
); konvertiere dann zurück von hexadezimal (ḅ⁴
).Lösung 2
Die Frage ermöglicht es uns, die Eingabe als Liste von (vermutlich dezimalen) Ziffern zu betrachten, sodass wir "schummeln" können, indem wir einfach die Basiskonvertierung entfernen. Die maximal in der Ausgabe verwendete Zahl ist dann 2 + (9 × 9) = 83 (tatsächlich 82, da 2999999999 außerhalb des Bereichs liegt, die schlechteste mögliche Eingabe also 1999999999). Die resultierende Codierung ist ziemlich schrecklich, da Codierungen für dieses Problem erforderlich sind, hat jedoch den Vorteil, dass sie sehr knapp zu generieren sind, was die Ausführlichkeit der Codierung überwiegt.
Diese Antwort fühlt sich so sehr wie Schummeln an, dass es nicht meine primäre Lösung für dieses Problem ist, aber es scheint, dass es sich lohnt, sie hinzuzufügen, da sie technisch den Regeln entspricht und eine bessere Punktzahl ergibt.
Kommentar
Ich habe einige Algorithmen im Sinn, um die Länge 8 zu unterschreiten, aber es scheint unwahrscheinlich, dass Sie einen Algorithmus der Länge 7 mit ≤ 9 Bytes (nicht betrügen) oder ≤ 5 Bytes (betrügen) implementieren können ist wahrscheinlich der beste Weg, um es zu tun. (Ich könnte trotzdem aus Spaß eine Lösung für die alternative Herausforderung "Minimiere die Länge der Codierung" ausprobieren.)
Anders als bei einigen anderen Lösungen ist die Verwendung von 16 als Basis hier nicht kritisch. Es gibt viele andere Zahlen, die für eine Lösung der Länge 8 funktionieren würden (z. B. 18). Ich habe 16 für die erste Lösung ausgewählt, nur weil Jelly eine 1-Byte-Methode hat, um dies darzustellen, und andere brauchbare Basen mehrere Bytes aus dem Programm verbrauchen müssten. Natürlich muss die zweite Lösung 10 als Basis verwenden, um die Lücke auszunutzen.
Vielen Dank an @Dennis für den Hinweis auf einige neuere Jelly-Befehle, die das Schreiben dieses Algorithmus noch schwieriger gemacht haben.
quelle
Ä
ist kurz für+\
,Ż
ist kurz für0;
.Shakespeare Programming Language , 10 * (264 + 494) =
8650 79107580Encoder: 264 Bytes
Probieren Sie es online!
Decoder: 494
Probieren Sie es online!
Das war eine Sache.
Der Encoder codiert jede Ziffer als Ziffer plus dem Index der Ziffer mal zwölf. Der Decoder speichert alle Eingaben im Speicher des Ford und durchläuft dann eine Schleife über einen Zähler, wobei jede Stelle ausgegeben und gelöscht wird, die niedriger ist als der Zähler * 12 + 10.
Erläuterung:
Encoder
Decoder
quelle
Python 2.7, 31 * (52 + 37) = 2759
Encoder (
6952 Bytes):Decoder (
4137 Bytes):Speichert alle von Null verschiedenen Bits in der Eingangsnummer als ASCII-Werte. Der Wert des ASCII-Zeichens speichert die Position des gesetzten Bits. Zum Beispiel würde der Wert 'a' bedeuten, dass das 97. Bit gesetzt ist.
Ein paar Verbesserungen dank @ Delfad0r
Probieren Sie es online!
quelle
e =
und dasd =
am Anfang fallen lassen - anonyme Funktionen sind vollkommen in Ordnung. Beachten Sie außerdem, dass die Problemanweisung eindeutig besagt, dass der Encoder möglicherweise eine Liste von Ganzzahlen anstelle von Zeichen zurückgibt, sodass Sie die Konvertierung von Ganzzahl-> Zeichen-> Ganzzahl vermeiden können. Darüber hinaus können Sie 2 Bytesn&(1<<i)
anstelle von verwendenn&(1<<i)>0
und speichern. Schließlich ist die Obergrenze füri
(127) viel zu groß, 32 ist ausreichend und spart 1 Byte.(52+37)*31=2759
da die längste, wenn alle 31 Bits gesetzt sind.lambda n:[chr(i)*(n&1<<i>0)for i in range(32)]
, 6 Bytes zu speichern.Stax , Ergebnis 8 × (10 + 9) = 152
Encoder, 10 Bytes
Führen Sie es aus und debuggen Sie es
Der Encoder gibt den String in aufsteigender Reihenfolge aus.
Decoder, 9 Bytes
Führen Sie es aus und debuggen Sie es
quelle
05AB1E , 8 maximale Länge * (8 + 7) Bytes = 120
Encoder (8)
Probieren Sie es online!
Decoder (7)
Probieren Sie es online!
Verwendet die gleiche Technik wie Wastl und Jonathan .
quelle
Python 3 , 8 * (45 + 38) = 664
Encoder (45 Bytes):
Decoder (38 Bytes):
Probieren Sie es online!
quelle
lambda l:sum(x%16<<x//16*4for x in l)
funktioniert gut :)lambda n:[n>>4*i&15|i<<4for i in range(8)]
und 1 im Decoder:lambda l:sum(x%16<<x//16*4for x in l)
für eine Gesamtpunktzahl von 632JavaScript (ES6), 8 * (40 + 32) = 576
Encoder (40 Bytes)
Decoder (32 Bytes)
Demo
Probieren Sie es online!
Wie?
Die Eingabe ist in 8 Blöcke mit jeweils 4 Bits unterteilt und jeder Block wird mit 1 von 16 möglichen Zeichen codiert. Das höchstwertige Bit des letzten Blocks wird niemals gesetzt.
quelle
Jelly , (8 + 9) Bytes * 8 maximale Länge = 136
Encoder (Fußzeile formatiert die Liste aus Gründen der Übersichtlichkeit wie Python)
Decoder
Es ist theoretisch möglich, eine maximale Länge von sechs zu haben. Kann das in 22 Bytes oder weniger geschehen?
Es ist unmöglich mit einer maximalen Länge von fünf da∑i = 5i = 0( 127+i127) =321402081<231- 1
Wie?
Schon seit231- 1 kann als 8 hexadezimale Ziffern codiert werden (
7fffffff
oder[7,15,15,15,15,15,15,15]
), dann können wir den auf Null basierenden Index jeder hexadezimalen Ziffer multipliziert mit 16 addieren, um sicherzustellen, dass eine solche Konvertierung immer in sortierter Reihenfolge erfolgt, wobei auch der am weitesten rechts stehende Wert (dh[7,15,15,15,15,15,15,15] + [0,16,32,48,64,80,96,112] = [7,31,47,63,79,95,111,127]
) eingehalten wird . Das Decodieren kehrt dann denselben Prozess um.Encoder :
Decoder :
quelle
Shakespeare Programming Language , 31 * (472 +
383379344) =265052638125296Bisherige Bewertung: 16909322 * (246 + 217) = 7829016086
Dies ist immer noch sehr hoch, aber es ist das niedrigste, an das ich momentan denken kann.
Encoder:
Probieren Sie es online!
Decoder:
Probieren Sie es online!
Wenn die Zeichenfolge ein Zeichen mit dem ASCII-Code (n + 1) enthält, wird grundsätzlich die n-te Binärzahl festgelegt.
quelle
Python 3 (208 Bytes + 200 Bytes) * 6 Länge = 2448
Probieren Sie es online! (Enthält beide, das zusätzliche Byte ist der Zeilenumbruch zwischen ihnen).
-4 Bytes (-24 Punkte) durch Verwendung der leeren Liste (wodurch mehr Dinge bei 0 beginnen konnten)
Encoder (208 Byte)
Decoder (200 Bytes)
Beobachtungen:
Das Mischen kann für streng nicht aufsteigende (dh sortierte) Listen verlustfrei rückgängig gemacht werden.
Streng nicht ansteigende numerische Listen der gleichen Länge können vollständig sortiert werden (wie in Python).
Wir können definieren, dass Listen zuerst nach Länge sortiert werden, um eine Gesamtreihenfolge aller sortierten Listen zu bilden.
Wir können eine indizierbare Folge dieser Listen bilden, wenn wir definieren, dass die einzigen gültigen Werte in einer Liste Ganzzahlen von
0
bis127
einschließlich sind (dh es gibt eine endliche Anzahl gültiger Listen mit LängeL
).Strategie:
Drehregler:
N
Suchen Sie unter Angabe einer Zahl dieN
gültige, nicht aufsteigende Liste.Decoder: Bei einer (gemischten) gültigen Liste sortieren Sie diese und geben den Index in der Reihenfolge der gültigen Listen zurück.
Allgemeine Code-Erklärung:
T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1
Berechnen Sie die
n
thd
-simplex ZahlFür
d=0
immer1
Für
d=1
,n
(die Anzahl der Punkte in einer Reihe von Punkten mit Längen
)Für∑ni = 1ich , (die Anzahl der Punkte in einem Dreieck von Punkten mit Seitenlänge
d=2
,n
)Für∑nj = 1∑ji = 1ich , (die Anzahl der Punkte in einem Tetraeder von Punkten mit Seitenlänge
d=3
,n
)Encoder Erklärung:
def E(n,h=128):
d=l=0
,s=[]
n
ist die Eingangsnummer,h
ist der "hohe Wert" (dh die höchste zulässige Zahl + 1),d
ist die Länge der Ausgabe,s
ist die Ausgabe,l
ist der "niedrige Wert" (beginnend mit 0, wird später erklärt)while n>=T(h,d):
,n-=T(h,d)
,d+=1
Es gibt
T(h,d)
gültige Längenlistend
, und unsere Berechnung ist einfacher, wenn anstelle eines tatsächlichen Indexn
ein Index relativ zur Liste[0]*d
(am Index0
) angegeben wirdn
. Dies passt auchd
die Länge an, um für das Gegebene korrekt zu seinn
.for i in range(d):
Effektiv: "für die
i+1
th Nummer in der Liste"Hier werde ich erklären
l
, der "niedrige Wert"Nachdem eine Nummer in die Liste aufgenommen wurde, kann keine kleinere Nummer in die Liste aufgenommen werden (um sie sortiert zu halten). Dies
l
ist auch die letzte Nummer, die der Liste hinzugefügt wurde.while n>=T(h-l,d+~i):
,n-=T(h-l,d+~i)
,i+=1
Wenn
n
es zu groß ist, um mitl
dieser "Ziffer" codiert zu werden , stellen Sie esn
entsprechend ein und erhöhen Sie esl
s+=[l]
n
Mit einerl
bei dieser "Ziffer" codieren .Zuerst haben wir
h
Optionen, welche "Ziffer" als nächstes eingegeben werden soll, aber sobald wir eine "Ziffer" (die zugewiesen istl
) eingegeben haben, sind wir aufh-l
Optionen für die nächste "Ziffer" beschränkt.Zuerst gab es
T(h,d)
gültige Listen, aber wir haben eine "Ziffer" hinzugefügtl
, wobei die Anzahl der verbleibenden "Ziffern"d-1
und die Anzahl der gültigen nächsten "Ziffern" auf " verringert " wurdeh-l
, also die Anzahl der gültigen Listen danachT(h-l,d-1)
Erklärung zum Decoder:
def D(s):
,s.sort()
,l=0
,d=len(s)
s
ist die (gemischte) Eingabeliste, also ists.sort()
es;l
ist der "niedrige Wert" (h
der "hohe Wert" ist nur ein Literal128
s im Code, um Bytes zu sparen),n
ist die Ausgangsnummer,d
ist die Länge.n=sum(T(128,D)for D in range(d))
Einstellen
n
zu dem Punkt in der Sequenz von[0]*length
for i in s:
Für jede Ziffer:
for j in range(l,i):
,n+=T(128-j,d-1)
Einstellen
n
zu dem Punkt in der Sequenz von[...prevdigits, thisdigit, 0...]
l=i
: Stellen Sie den "niedrigen Wert" auf die letzte Ziffer eind-=1
: Verringern Sie die Länge, da wir eine Ziffer verwendet habenreturn n
: Nachn
für alle Ziffern eingestellt wurde, ist es die richtige Zahl; Gib es zurück.Tut mir leid, wenn dies nicht klar ist, aber hier ist meine originale, nicht mit Fehlern behaftete Debug-Version. Probieren Sie es online aus! , die die leere Liste nicht verwendet, ist also 1 von allen in dieser Version verwendeten Zahlen
quelle
Ruby , (36 + 29 Bytes) * 8, Punktzahl 520
Kodieren:
Probieren Sie es online!
Dekodieren:
Probieren Sie es online!
Wie es funktioniert:
Die Nummer wird mit 4-Bit-Chunks und einem 3-Bit-Index codiert.
Der Decoder nimmt das Input-Array und setzt jedes Nibble wieder an seine Stelle.
quelle
Holzkohle , Punktzahl 10 * (10 + 15) = 250.
Verwendet dezimal; Die vorherige Lösung auf Basis von Base 16 erzielte
328296264 Punkte.Kann nicht druckbare Zeichen ausgeben. Insbesondere die Eingabe von Zeichen 10 in Charcoal ist schwierig.
Encoder, 10 Bytes:
Probieren Sie es online!Link ist eine ausführliche Version des Codes.
Decoder, 15 Bytes:
Probieren Sie es online!Link ist eine ausführliche Version des Codes.
Die Version mit einer Liste von ganzen Zahlen ergibt
360Punkte296 (Basis 16; Dezimal würde 310 Punkte ergeben):Encoder, 19 Bytes:
Probieren Sie es online!Link ist eine ausführliche Version des Codes.
Decoder, 18 Bytes:
Probieren Sie es online!Link ist eine ausführliche Version des Codes.
Version mit druckbaren Zeichen ergibt 360 (bisher
416)384368 in Basis 16):Encoder, 19 Bytes:
Probieren Sie es online!Link ist eine ausführliche Version des Codes.
Decoder, 17 Bytes:
Probieren Sie es online!Link ist eine ausführliche Version des Codes.
quelle
Brachylog , 17 + 18 Bytes * 8 Länge = 280
Encoder:
Decoder:
Ein p kann ohne Auswirkung an das Ende des Encoders angehängt werden. Der Decoder wird ausgeführt, indem das (gemischte) Ergebnis als Ausgabe verwendet und die ursprüngliche Nummer in die Eingabe übernommen wird.
Wenn es ein (ordnungsgemäß implementiertes) kumulatives Summenprädikat geben würde, könnte die Punktzahl auf 20 fallen
Probieren Sie es online!
quelle
05AB1E , Ergebnis: (2 + 2 Bytes ) * 11 maximale Länge = 44
Encoder (2 Bytes ):
Probieren Sie es online aus.
Decoder (2 Bytes ):
Probieren Sie es online aus.
Die Eingabe des Codierers und die Ausgabe des Decodierers sind eine Liste von Ziffern.
Port von @ ais523s 2. Gelee Antwort .
Erläuterung:
Da der231- 1 hat eine Länge von 10 Stellen, die maximale Länge der Ausgabe ist 11.
.¥
Ausgabe eine Null vorangestellt wird, entspricht die Länge der Ausgabe der Länge der Eingabe + 1. Sincequelle
Gol> <> , 8 * (14 + 13) = 216
Encoder Probieren Sie es online! 14 Bytes:
Decoder Probieren Sie es online! 13 Bytes:
Da dies nicht druckbare ASCII-Zeichen ausgeben kann und somit mit dem Decoder in Konflikt gerät, gibt es jetzt eine Version, die Zahlen in der Ausgabe / Eingabe verwendet:
Encoder Probieren Sie es online! 14 Bytes:
Decoder Probieren Sie es online! 13 Bytes:
Codierung:
Die Codierung erfolgt durch Aufteilen der angegebenen Zahl in 8 x 4-Bit-Blöcke. Diese Chunks werden dann um 3 Bit nach rechts verschoben und die ursprüngliche Position des Chunks wird am Ende als Zahl zwischen 0 und 7 angehängt. Die Codierung sieht also folgendermaßen aus:
quelle
6 Perl , 10 * (10 + 12) =
340220Encoder:
Decoder:
Probieren Sie es online!
Die Encoder-Funktion zippt jede Ziffer mit dem 0-Index der Nummer. Dann sortiert der Encoder die Liste der Zahlen und erhält das Modulo um 10, dh die zweite Ziffer der Zahl.
Die Summe ist 10, da dies die maximale Länge von 2 31 -1 ist.
quelle
Haskell , 10 * (23 + 51) = 740
Hier ist ein Programm, das Werte codiert, mischt, decodiert und validiert: Probieren Sie es online aus!
Encoder, 23 Bytes
Probieren Sie es online!
Decoder, 51 Bytes
Probieren Sie es online!
Erläuterung
Da wir die Eingabe als Dezimalstellen verwenden dürfen, werden wir diese verwenden. Der Encoder ordnet jede Ziffer zu, die vorkommt
10*index + digit
. Beachten Sie, dass sich alledigit
s in befinden,[0..9]
damit wir das Obige mit umkehren könnendivMod
. Nach dem Wiederherstellen der Indizes und Ziffern muss nur noch nach den Indizes sortiert und diese entfernt werden.Es wird erwartet, dass die Lösung für Werte bis zu funktioniert231- 1 = 2147483647 Das ist 10 Stellen lang, also wird der maximale Code-Punkt sein, den wir bekommen 9 ⋅ 9 = 81 < 128 . Außerdem wird jede Ziffer in ein "Zeichen" umgewandelt, sodass wir eine maximale Länge von 10 haben.
quelle
Schale , 10 × (7 + 8) = 150
Gerader Port meiner Haskell-Lösung nur mit der Beobachtung, dass10 ⋅ 9 = 90 < 128 (Husk's
N
ist 1-basiert):Encoder, 7 Bytes
Probieren Sie es online!
Decoder, 8 Bytes
Probieren Sie es online!
quelle
APL (Dyalog Unicode) ,LE+ LD= 36 ; A = 8 → 288 .
Probieren Sie es online! (enthält 5 zusätzliche Bytes für die Zuweisungen und die Newline).
Verwendet
⎕IO←0
Wie:
quelle
PHP, 8 * (44 + 53) = 776
Encoder, 44 Bytes:
Gibt eine durch Leerzeichen getrennte Liste von Ganzzahlen aus. Als Rohr mit laufen lassen
-nR
.Maximal 8 Bytes mit 4 Datenbits (unteres Halbbyte) und 3 Gewichtungsbits (oberes Halbbyte).
Einfach ausgedrückt:
Setzen Sie jede hexadezimale Ziffer in ein eigenes Zeichen und speichern Sie die Position der Ziffer in der oberen Hälfte des Bytes.
Beispiel:
1457893891
(0x56e5b203
) Wird in drehen0x03
,0x10
,0x22
,0x3b
,0x45
,0x5e
,0x66
,0x75
→
3 16 34 59 69 94 102 117
Decoder, 53 Bytes:
oder
oder
Nehmen Sie Ganzzahlen aus Befehlszeilenargumenten. Laufen Sie mit
-nr
.Probieren Sie sie online aus .
quelle
Python 2 , 10 * (68 + 54) = 1220
Probieren Sie es online!
EDIT: Danke an Jo King für die Hinweise - nicht sicher, warum ich im Nachhinein um 32 versetzt habe.
Codiert die Position und den Wert jedes Ortes als ein einzelnes Zeichen, beginnend mit
[Leerzeichen] (Position 0, Wert 0)dem NUL-Byte 0x0.Dekodiert von:
quelle
32
Offset? Ebenfalls,[-1]
auch%10
stattdessen am richtigen Ort seinC (gcc) , 10 · 112 = 1120
Probieren Sie es online!
Ich habe globale Variablen, aber sie geben tatsächlich keine Informationen zwischen zwei Funktionen weiter. Die Variablendeklaration für
c
wird in beiden Funktionen verwendet, um 2 Byte Codelänge zu sparen.Eine Version, die druckbares ASCII nur für eine
35-Byte-Strafe verwendet, ist hier:Vielen Dank an @ceilingcat für 70 Punkte Verbesserungen.
quelle