Hintergrund
Adler-32 ist eine von Mark Adler 1995 erfundene 32-Bit-Prüfsumme, die Teil der weit verbreiteten zlib-Bibliothek (ebenfalls von Adler entwickelt) ist. Adler-32 ist nicht so zuverlässig wie eine zyklische 32-Bit- Redundanzprüfung , aber - zumindest in der Software - viel schneller und einfacher zu implementieren.
Definition
Sei B = [b 1 , ⋯, b n ] ein Bytearray.
Die Adler-32-Prüfsumme von B ist definiert als das Ergebnis von low + 65536 × high , wobei:
niedrig: = ((1 + b 1 + ⋯ + b n ) mod 65521)
hoch: = ((((1 + b 1 ) + (1 + b 1 + b 2 ) + ⋯ (1 + b 1 + ⋯ + b n )) mod 65521)
Aufgabe
Berechnen Sie mit einem Byte-Array als Eingabe die Adler-32-Prüfsumme und geben Sie sie zurück. Beachten Sie dabei Folgendes.
Sie können die Eingabe als Array von Bytes oder Ganzzahlen oder als Zeichenfolge verwenden.
In beiden Fällen werden in der Eingabe nur Bytes verwendet, die druckbaren ASCII-Zeichen entsprechen.
Sie können davon ausgehen, dass die Länge der Eingabe 0 <Länge ≤ 4096 entspricht .
Wenn Sie die Ausgabe drucken möchten, können Sie eine beliebige positive Basis bis einschließlich 256 verwenden.
Wenn Sie Unary wählen, stellen Sie sicher, dass der Interpreter bis zu 2 32 - 983056 Byte Ausgabe auf einem Computer mit 16 GiB RAM verarbeiten kann.
Built-Ins, die die Adler-32-Prüfsumme berechnen, sind verboten.
Es gelten die Standardregeln für Code-Golf .
Testfälle
String: "Eagles are great!"
Byte array: [69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]
Checksum: 918816254
String: "Programming Puzzles & Code Golf"
Byte array: [80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 32, 80, 117, 122, 122, 108, 101, 115, 32, 38, 32, 67, 111, 100, 101, 32, 71, 111, 108, 102]
Checksum: 3133147946
String: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
Byte array: [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126]
Checksum: 68095937
String: <1040 question marks>
Byte array: <1040 copies of 63>
Checksum: 2181038080
quelle
Antworten:
Jelly,
1917 BytesProbieren Sie es online!
quelle
⁹²¤
Mathematica, 46 Bytes
Eine anonyme Funktion, die ein Integer-Array verwendet und den Adler-32 zurückgibt, mit einigen Verbesserungen gegenüber Miles und Martin (siehe Kommentare).
Meilen 'ist auch 46 Bytes , aber schneller:
quelle
Julia,
7346 BytesDies ist eine anonyme Funktion, die ein Array akzeptiert und eine Ganzzahl zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Wir kombinieren
sum(x) + 1
undsum(cumsum(x) + 1)
in ein Array, wox
sich das Eingabearray befindet, und nehmen jedes Modulo 65521. Wir berechnen dann das Skalarprodukt mit 1 und 4 8 , was uns ergibt(sum(x) + 1) + 4^8 * sum(cumsum(x) + 1)
, was genau die Adler-32-Formel ist.Probieren Sie es online! (Beinhaltet alle Testfälle)
27 Bytes gespart dank Sp3000 und Dennis!
quelle
x86-64-Maschinencodefunktion:
3332 Byte (oder3130 Byte mit einerint[]
Eingabe anstelle vonchar[]
)x86-32-Maschinencodefunktion: 31 Byte
Als GNU C-Inline-Asm-Codefragment: Speichert
2B1B (nur dasret
Insn).Kommentierte Quelle und Testfahrer auf Github
Die 64-Bit-Version kann mit dem Standardsystem V x86-64 ABI direkt von C aus aufgerufen werden (mit 2 Dummy-Args können Args in den gewünschten Regs abgerufen werden). Benutzerdefinierte Aufrufkonventionen sind für asm-Code keine Seltenheit, daher ist dies eine Bonusfunktion.
32-Bit-Maschinencode spart 1B, da die hohen und niedrigen Hälften mit zusammengeführt werden
push16/push16 => pop32
nur im 32-Bit-Modus funktioniert. Für eine 32-Bit-Funktion wäre eine benutzerdefinierte Aufrufkonvention erforderlich. Wir sollten das nicht ablehnen, aber das Aufrufen von C erfordert eine Wrapper-Funktion.Nach der Verarbeitung von 4096
~
(ASCII 126) Byteshigh = 0x3f040000, low = 0x7e001
. Dashigh
höchstwertige Bit ist also noch nicht gesetzt. Mein Code Vorteil hiervon nimmt, meldet verlaufeax
inedx:eax
mitcdq
als eine Möglichkeit der Nullstellungedx
.0x40 - 0x20
= 32 Bytes.Kommentierte NASM-Quelle:
Tricks:
xchg eax, r32
ist ein Byte; billiger als mov. 8086 brauchte Daten in ax für viel mehr Dinge als> = 386, also beschlossen sie, viel Opcode-Platz für die jetzt selten genutzten zu verwendenxchg ax, r16
.Durch das Mischen von push64 und push16 zum Zusammenführen von high und low in einem einzigen Register werden Anweisungen zum Verschieben von reg-reg-Daten um zwei Sekunden gespart
div
. Die 32-Bit-Version dieses Tricks funktioniert sogar noch besser:push16 / push16 / pop32
Insgesamt sind es nur 5B, nicht 6.Da wir Push / Pop verwenden, ist dies im SysV amd64 ABI (mit einer roten Zone) für Inline-Asm nicht sicher .
Ich habe auch erwogen,
rcx
als Array-Index zu verwenden, anstatt zwei Schleifenzähler zu haben, aber adler32 (s)! = Adler32 (reverse (s)). Also konnten wir nicht verwendenloop
. Zählen von -len bis zu null und Verwenden vonmovzx r32, [rsi+rcx]
nur viel zu vielen Bytes.Wenn wir in Betracht ziehen wollen, den Zeiger selbst zu erhöhen, ist wahrscheinlich 32-Bit-Code der richtige Weg. Sogar der x32 ABI (32-Bit-Zeiger) reicht nicht aus, da er
inc esi
bei amd64 2B, bei i386 1B beträgt. Es ist schwer scheint zu schlagenxor eax,eax
/lodsb
/loop
: 4B insgesamt jedes Element zu erhalten wiederum in EAX Null erweitert.inc esi
/movzx r32, byte [esi]
/loop
Ist 5B.scas
ist eine weitere Option zum Inkrementieren eines Zeigers mit einem 1B-Befehl im 64-Bit-Modus. (rdi
/edi
stattrsi
, also nehmen wir den Zeiger arg inrdi
). Wir können das Flag-Ergebnis von jedoch nichtscas
als Schleifenbedingung verwenden, da wir eax nicht auf Null setzen möchten. Eine andere Registerzuordnung könnte möglicherweise ein Byte nach der Schleife speichern.int[]
EingangDie vollständige Funktionsübernahme
uint8_t[]
ist die "Hauptantwort", weil es eine interessantere Herausforderung ist. Auspacken nachint[]
ist eine unvernünftige Sache, um unseren Anrufer zu bitten, dies in dieser Sprache zu tun, aber es spart 2B.Wenn wir unsere Eingabe als entpacktes Array von 32-Bit-Ganzzahlen betrachten, können wir problemlos ein Byte speichern (verwenden
lodsd
und durchxor eax,eax / cdq
nur ersetzen)xor edx,edx
).Wir können ein weiteres Byte speichern, indem wir edx mit
lodsd
/ auf Null setzencdq
und die Schleife so neu anordnen, dass das abschließende 0-Element vor dem Verlassen geladen wird . (Wir gehen immer noch davon aus, dass es existiert, obwohl dies ein Array vonint
, nicht eine Zeichenfolge ist).Ich habe auch eine ungetestete Version erstellt, die
scasd
(1B-Version vonadd edi,4
) undadd eax, [rdi]
anstelle von verwendetlodsd
, aber es sind auch 30 Bytes. Die Einsparungen durchhigh
eax am Ende der Schleife werden durch größeren Code an anderer Stelle ausgeglichen. Es hat den Vorteil, dass es nicht auf ein Abschlusselement0
in der Eingabe ankommt, was für ein entpacktes Array, bei dem wir auch die Länge explizit angeben, möglicherweise nicht zumutbar ist.C ++ 11 Testtreiber
Siehe den Github-Link. Diese Antwort wurde zu groß und der Testfahrer erhielt mehr Funktionen mit größerem Code.
quelle
int[]
wenn dies erforderlich ist oder mehr als 4 Byte Code oder etwas gespeichert wurden. Ich habe kein Problem damit, eine Lösung für dasadler32(int[])
Problemadler32(char[])
vorzulegen , aber ich bin der Meinung, dass das Problem interessanter ist, da es sich um die echte adler32-Funktion handelt. Das ist es, was ich wirklich im Asm Golf spielen möchte. (Und ich würde es sehr lieben, irgendwie ein weiteres Byte zu speichern, da in real life asm 33 Bytes = 48 Bytes sind, wenn die nächste Funktion verwendet wirdALIGN 16
). Ich werde wohl weiterhin beide Golf spielen.do{}while(--len)
Loop-Stil anstelle von a verwendewhile(len--){}
.MATL , 22 Bytes
Die Eingabe kann ein Array von Zahlen oder die entsprechende ASCII-Zeichenfolge sein.
Probieren Sie es online!
Erläuterung
quelle
Eigentlich 36 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Java, 84 Bytes
Wenn Java-Lösungen immer vollständig kompilierbarer Code sein sollen, lassen Sie es mich bitte wissen.
Ungolfed
Hinweis
Sie werden den Eingang konvertieren ,
String
umint[]
(int[]
ein Byte kürzer alsbyte[]
oderchar[]
).Ausgabe
quelle
Piet, 120 Codels
Mit Codegröße 20:
Notizen / Wie funktioniert es?
Da es nicht möglich ist, ein Array oder eine Zeichenfolge als Eingabe zu verwenden, verwendet dieses Programm eine Reihe von Ganzzahlen (die ASCII-Zeichen darstellen) als Eingabe. Anfangs dachte ich über die Verwendung von Zeicheneingaben nach, hatte jedoch Mühe, eine gute Lösung für die Terminierung zu finden. Daher wird die Eingabe jetzt abgebrochen, wenn eine Zahl kleiner als 1 eingegeben wird. Es waren ursprünglich nur negative Werte für die Beendigung, aber ich musste die Initialisierung nach dem Schreiben des Programms ändern, so dass ich jetzt nicht die erforderlichen
2
, nur eine1
(26/45 auf dem Trace-Image) anpassen kann. Dies spielt jedoch keine Rolle, da gemäß den Herausforderungsregeln nur druckbare ASCII-Zeichen zulässig sind.Ich hatte lange Mühe, in die Schleife zurückzukehren, obwohl ich am Ende die elegante Lösung gefunden habe. Nein
pointer
oderswitch
Operationen, nur der Interpreter rennt gegen Wände, bis er wieder in den grünen Codel übergeht, um die Eingabe zu lesen (43-> 44 auf den Trace-Bildern).Die Beendigung der Schleife wird erreicht, indem zuerst die Eingabe dupliziert, 1 hinzugefügt und dann überprüft wird, ob sie größer als 1 ist. Ist dies der Fall, wird die Codelauswahl ausgelöst und die Ausführung auf dem unteren Pfad fortgesetzt. Ist dies nicht der Fall, bleibt das Programm links (hellgelbe Codierungen, 31/50 auf den Trace-Bildern).
Die unterstützte Eingabegröße hängt von der Implementierung des Interpreters ab, obwohl es möglich wäre, eine beliebig große Eingabe mit dem richtigen Interpreter zu unterstützen (z. B. einen Java-Interpreter, der
BigInteger
als interne Werte verwendet).Ich habe gerade gesehen, dass das Setup eine unnötige
DUP
undCC
(7-> 8-> 9 in den Trace-Bildern) enthält. Keine Ahnung wie das passiert ist. Dies ist jedoch effektiv ein Noop. Es schaltet die Codelauswahl 16-mal um, was zu keiner Änderung führt.Npiet Spurenbilder
Setup und erste Schleife:
Schleife beenden, ausgeben und beenden:
Ausgänge
Verzeih mir, wenn ich nur eine Ausgabe einbinde, dauert die Eingabe nur sehr lange: ^)
Npiet Spur für [65, -1]
quelle
C89, 70 Bytes
So testen Sie (kompilieren mit
gcc -std=c89 -lm golf.c
):quelle
zlib
Sieht die Quelle so aus? Hm ...for
anstelle vonwhile
:for(h=0,l=1;*B;)h+=l+=*B++;
Labyrinth ,
37363231 BytesProbieren Sie es online!
Eingabe als Liste von Ganzzahlen. Das Programm bricht mit einem Fehler ab (dessen Fehlermeldung an STDERR geht).
Erläuterung
Labyrinth-Grundierung:
_
.Obwohl der Code mit einem 4x2 "Raum" beginnt, sind das eigentlich zwei getrennte, zwei mal zwei zusammengedrückte Schleifen. Die IP bleibt aufgrund der Stack-Werte immer nur an einer Schleife hängen.
Der Code beginnt also mit einer 2x2-Schleife (im Uhrzeigersinn), die Eingaben während der Berechnung der Präfixsummen liest:
Jetzt haben wir alle Präfixsummen auf dem Aux- Stack sowie eine Kopie der Summe über alle Werte und die
0
von EOF auf main . Damit betreten wir eine weitere 2x2-Schleife (im Uhrzeigersinn), die alle zu berechnenden Präfixsummen summiertHIGH
.Der Hauptstapel hat jetzt
LOW - 1
undHIGH
und Null, außer dass wir das Modulo noch nicht genommen haben. Der Rest des Codes ist vollständig linear:Die IP stößt jetzt auf eine Sackgasse und dreht sich um. Die
+
und*
sind aufgrund der Nullen am Boden des Stapels im Wesentlichen No-Ops. Das36
verwandelt nun die Oberseite von main in63
, aber die beiden{{
ziehen zwei Nullen von aux darüber. Dann wird%
versucht, durch Null zu dividieren, wodurch das Programm beendet wird.Beachten Sie, dass Labyrinth Ganzzahlen mit willkürlicher Genauigkeit verwendet, sodass das Verschieben des Modulos bis zum Ende der Summe keine Probleme mit dem Überlauf von Ganzzahlen verursacht.
quelle
Python 2,
6058 BytesEin ziemlich unkomplizierter Ansatz. Dies ist ein vollständiges Programm, das eine Liste von ganzen Zahlen über STDIN aufnimmt, z
[72, 105, 33]
.(Danke an @xnor für den tollen Aliasing- / Initialisierungstipp)
quelle
H=h=65521
,h
während Sie das Alias 65521 initialisieren.J, 30 Bytes
Dies könnte wahrscheinlich mit einem anderen Zug mehr kondensiert werden.
Verwendung
Hier
x $ y
erstellt eine Liste mitx
Kopien vony
.Erläuterung
quelle
Oktave,
5250 Bytes2 Bytes dank @LuisMendo eingespart
Nimmt ein Array von Ganzzahlen als Eingabe.
low wird vom letzten Element von high (vor der Summierung) genommen, anstatt die Summe explizit zu berechnen, wodurch eine Gesamtsumme von ... 1 Byte eingespart wird !
Probelauf auf ideone .
quelle
+B
. Ich denke, die Eingabespezifikation besagt, dass Sie ganze Zahlen verwenden können, also mache ich das vielleicht einfach.CJam,
3029 BytesEingabe als Liste von Ganzzahlen.
Teste es hier.
Erläuterung
quelle
Perl 6 , 60 Bytes
Erläuterung:
Prüfung:
quelle
Python 3 (79 Bytes)
Basierend auf der Lösung von R. Kap.
Ich habe die Multiplikation durch eine Verschiebung ersetzt und ein Paar Klammern entfernt.
Da ich keine Kommentare posten kann, habe ich eine neue Antwort gegeben.
quelle
Schema, 195 Bytes
Wenn da nicht all diese Klammern wären ...
quelle
Haskell,
5450 BytesAnwendungsbeispiel:
g [69,97,103,108,101,115,32,97,114,101,32,103,114,101,97,116,33]
->918816254
.scanl
Bezieht den Startwert (->1
) in die Liste ein (->[1,1+b1,1+b1+b2,..]
), sosum
ist1
das deaktiviert, was durch Voranstellen-1
der Liste vor der Summierung festgelegt wird.Edit: Danke @xnor für 4 Bytes.
quelle
m
:m=(`mod`65521).sum g x=m(-1:scanl(+)1x)*4^8+m(1:x)
. Es gibt wahrscheinlich eine bessere Möglichkeit, die Beträge zu korrigieren, als vorauszugehen.JavaScript (ES7),
5250 BytesES6 benötigt 51 Bytes (ersetzen Sie 4 ** 8 durch 65536). Wenn Sie eine String-Version wünschen, dann für 69 Bytes:
Bearbeiten: 2 Bytes dank @ user81655 gespeichert.
quelle
ARM Thumb-2-Funktion akzeptiert
uint8_t[]
: 40 Bytes (36B für nicht standardmäßige ABI undint[]
)Features: Nicht verzögertes Modulo, daher sind Eingaben mit beliebiger Größe in Ordnung. Verwendet den Divisionsbefehl nicht, ist also nicht langsam. (ähm, zumindest nicht aus diesem Grund: P)
Einsparungen durch weniger strenge Regeln:
uint32_t[]
Array zu entpacken .Der beste Fall ist also 36B.
0x28 = 40 Bytes
Anmerkungen:
Statt
log%m
am Ende machen wir dasif(low>=m) low-=m
in der Schleife. Wenn wir Tief vor Hoch machen, wissen wir, dass keines von beiden möglicherweise übersteigen2*m
kann. Modulo ist also nur eine Frage des Subtrahierens oder nicht. Acmp
undsub
vorhergesagt ist nur 6B im Thumb2-Modus. Die Standardsprache für%
ist 8B im Thumb2-Modus:Die
adler(char *)
Version mit impliziter Länge hat dieselbe Codegröße wie die explizite Längeadler(uint8_t[], uint32_t len)
. Wir können Flags für die Schleifenausgangsbedingung mit einem einzelnen 2B-Befehl in beide Richtungen setzen.Die implizite Längenversion hat den Vorteil, dass sie korrekt mit der leeren Zeichenfolge arbeitet, anstatt zu versuchen, 2 ^ 32-mal eine Schleife auszuführen.
zusammenstellen / kompilieren mit:
oder
Ohne
-static
hat der Prozess, unter dem ausgeführt wirdqemu-arm
, seinen dynamischen Linker nicht gefunden. (Und ja, ich einen ARM - Cross-Entwick - Setup installieren nur für diese Antwort, weil ich meine dachte sagt-subtrahieren Idee war ordentlich.) Auf amd64 Ubuntu installierengcc-arm-linux-gnueabi
,g++-arm-linux-gnueabi
. Ich fand einegdb-arm-none-eabi
Art kaum funktionierende Verbindung zuqemu-arm -g port
.Kommentierte Quelle:
test-adler32.cpp
hat die gleichen testfälle undmain()
wie für meine x86-64 antwort, startet aber so:quelle
x86-16-Bit-Maschinencodefunktion: 32 Byte unter Verwendung einer benutzerdefinierten Aufrufkonvention
Argumente in Registern und keine anderen Register als bp (und sp) beibehalten.
Im 16-Bit-Code geben wir einen 32-Bit-Wert im
dx:ax
Registerpaar zurück. Das heißt , wir nicht ausgeben müssen , um alle Anweisungen Verschmelzunghigh
undlow
ineax
. (Dies würde auch in 32- und 64-Bit-Code Bytes einsparen, aber wir können nur die Auslagerung dieser Arbeit in 16-Bit-Code an den Aufrufer rechtfertigen.)Kommentierte Quelle und Testtreiber auf Github (für x86 16, 32 und 64bit und ARM).
0x120 - 0x100 = 32 Bytes
Getestet durch Assemblieren des gleichen Codes für den 32-Bit-Modus, damit ich ihn (mit einer Wrapper-Funktion) von C kompiliert mit aufrufen kann
-m32
. Für mich ist der 16bit-Modus etwas interessant, DOS-Systemaufrufe hingegen nicht. Alle Befehle haben explizite Operanden, mit Ausnahme vonloop
undlodsb
. Daher werden bei der Zusammenstellung für den 32-Bit-Modus Präfixe mit Operandengröße verwendet. Gleiche Anweisung, andere Kodierung. Aberlodsb
im 32bit Modus wird verwendet[esi]
, so dass diese Testversion mit 32-Bit-Zeigern funktioniert (da wir keine Adressberechnung oder Zeigerinkrementierung / -vergleich durchführen).Keine Inkongruenzen. Mein Testgeschirr gibt eine Meldung aus, wenn eine Nichtübereinstimmung vorliegt.
Bei 16-Bit-Registern können wir die Modulo-Reduzierung erst nach der Schleife aufschieben. Es gibt einen interessanten Unterschied zwischen 16-Bit- und anderen Operandengrößen:
m = 65521
(0xFFF1
) ist mehr als die Hälfte von 65536. Das Subtrahierenm
von Übertrag hält den Wert unter 2 * m, auch wennhigh=0xFFF0 + 0xFFF0
. Nach der Schleife reicht ein Vergleichen und Subtrahieren anstelle von adiv
.Ich habe eine neuartige Technik zur Modulo-Reduzierung eines Registers nach einer Addition entwickelt, die einen Übertrag erzeugen kann . Anstatt die obere Hälfte der Eingabe für auf Null zu setzen
div
, verwenden Siesetc dl
diese Option, um einen 32-Bit-Dividend zu erstellen, der das nicht abgeschnittene Additionsergebnis enthält (dh
das bereits auf Null gesetzt ist). (div
Macht 32b / 16b => 16bit Division.)setcc
(3 Bytes) wurde mit 386 eingeführt. Um dies auf 286 oder früher auszuführen, verwendet das Beste, das ich mir ausgedacht habe, den undokumentiertensalc
Befehl (setze AL aus Carry) . Es ist ein Ein-Byte-Opcode fürsbb al,al
, so dass wirsalc
/neg al
vor dem Ausführen desxchg ax, dx
(was wir sowieso brauchen) verwenden könnten . Ohnesalc
gibt es eine 4B-Sequenz:sbb dx,dx
/neg dx
. Wir können 3Bsbb dx,dx
/ nicht verwendeninc dx
, da diessetnc
eher emulieren würde alssetc
.Ich habe versucht , eine 32-Bit-Operandengröße anstelle der Verarbeitung von Carry zu verwenden, aber es sind nicht nur die
add
Anweisungen, die ein Präfix für die Operandengröße benötigen. Anweisungen zum Einrichten der Konstanten usw. benötigen auch Präfixe für die Operandengröße, sodass sie nicht die kleinsten sind.quelle
Pyth,
25,2423 Bytes1 Byte danke an @Jakube .
1 weiteres Byte dank @Jakube .
Probieren Sie es online!
Übersetzung meiner Antwort in Jelly .
quelle
Perl 5, 43 Bytes
42 Bytes plus 1 für
-aE
statt-e
Die Eingabe erfolgt als durch Leerzeichen getrennte Dezimalzahlen.
Ein Tipp von meinem Hut zu Sp3000 , von dem ich Ideen für diese Antwort nahm.
Wie es funktioniert:
-a
,$.
beginnt bei 1 und@F
ist das Eingangsarray.$h
beginnt bei 0.$_
wird von verwendetmap
als Platzhalter für jedes Element eines Arrays verwendet.map$h+=$.+=$_,@F
bedeutet , dass in für jedes Element@F
wir dieses Element hinzufügen$.
und fügen Sie dann$.
zu$h
.$.%65521+$h%65521*4**8
(das heißt,($. % 65521) + ( ($h % 65521) * (4**8) )
undsay
(drucken) das Ergebnis.quelle
Faktor
112109103 BytesNun , dies ist eine wörtliche Übersetzung des Algorithmus in der Frage ... nun, da ich es tatsächlich gemacht habe, weißt du, richtig.
Ungolfed:
Erwartet eine beliebige Folge von Zahlen oder eine Zeichenfolge (kein großer Unterschied, obwohl sie technisch nicht identisch sind).
Ich weiß nicht, wie dies für die angegebene Grenze für eine mit 32-Bit-Wortgröße kompilierte Version von Factor funktioniert, aber für meine 6-GB-64-Bit-Maschine mit 2,2 GHz:
quelle
Rubin, 91 Bytes
quelle
Clojure, 109 Bytes
Basierend auf der @ Mark Adler- Lösung .
Ungolfed
Verwendung
quelle
Javascript (130 Zeichen Golf)
Ungolfed
Golf gespielt
Fügen Sie es in die Developers Console ein und geben Sie ihm ein Array of Bytes EG:
Und es wird die Prüfsumme an die Konsole zurück
quelle
TMP, 55 Bytes
3a1.3b0.1;4+a>T8%a>xFFF14+b>a8%b>xFFF11~5<b>164|b>a2$b$
Die Implementierung in Lua finden Sie hier: http://preview.ccode.gq/projects/TMP.lua
quelle
Python 3.5, 82 Bytes:
( -1 Byte danke an Neil ! )
( -1 byte dank mathmandan ! )
( -4 Bytes dank Dennis ! )
Eine anonyme
lambda
Funktion. Akzeptiert ein Byte-Array, wendet den gesamten Algorithmus auf das Array an und gibt das Ergebnis aus. Hat erfolgreich für alle Testfälle gearbeitet. Sie rufen dies auf, indem Sie eine Variable zuweisen und diese Variable dann wie eine normale Funktion aufrufen. Wenn Sie die Shell verwenden, sollte diese ohne Druckfunktion ausgegeben werden. Wenn dies nicht der Fall ist, müssen Sie den Funktionsaufruf in den Zeilenumbruch einbindenprint()
Funktion einschließen, um die Ausgabe tatsächlich zu sehen.Probieren Sie es online! (Ideone)
quelle
(E+15)
ist eigentlich ein Byte länger als65536
.4**8
ist ein Byte kürzer als65536
.Spaltung , 324 Bytes
Faire Warnung, die einzige Implementierung, auf der ich dies getestet habe, ist mein eigener Port der Sprache zu F #. Es wird nicht golfen, vor allem, weil ich es leichter fand, ein paar lange Läufe zu machen, während sich meine Hauptkonstante am Boden abkühlte, damit ich zurückkommen und es optimieren kann.
Wie funktioniert es?
R'~++Y++~'L
Block verschmilzt eine Konstante 256 und startet sie nach unten, wobei der Massenmultiplikator des Reaktors direkt darunter eingestellt wird.R'~++A++~'A
Block verschmilzt weitere 256 und startet ihn in Richtung des Reaktors, der das Teilchen in zwei Massen-Vielfache von65536
Masse aufspaltet, wobei sie nach links und rechts abgeschossen werden (wobei das rechte Teilchen sofort vom Terminator zerstört wird).65521
(unserer großen Primzahl) erreicht.Z
) am Ende des Durchlaufs bewirkt, dass das Partikel die Primzahl dupliziert und eine nach rechts zurückschickt, wo sie letztendlich die gespeicherte Masse des Spaltreaktors (^
) festlegt . So wenden wir den Modul-Operator auf den H-Block an.<
), den wir für den L-Block verwenden werden.|S
"Kühlturm" erklärt.\Y/
schmilzt den L-Block (der über den linken Kanal hereinkommt) und den H-Block (der über den rechten Kanal hereinkommt) und knallt sie dann in einen Terminator, der den Exit-Code auf die verschmolzene Masse setzt.quelle
*
ich die Ausgabe zurück. Ich werde sehen, ob ich morgen einen anderen Dolmetscher finde, der die Ausgabe überprüft.