Vorwort
In einer sehr heißen Situation muss man beim Golfen noch weiter gehen.
(zB bei einer Herausforderung, bei der Ihre Antwort 100 Zeichen lang ist und es nur peinlich ist, dass Sie es nicht geschafft haben 99)
In diesem Fall verwenden Sie von nun an den Algorithmus des Gewinners für diese Herausforderung :)
Tor
Sie müssen ein Programm schreiben, das ein uint32 verwendet und die am meisten komprimierte Form zurückgibt.
$ mathpack 147456
9<<14
- Es wird mehrere Lösungen für eine Nummer geben. Wählen Sie die kürzeste
- Wenn das komprimierte Formular länger oder gleich der ursprünglichen Nummer ist, geben Sie die ursprüngliche Nummer zurück
Regeln
- Schreiben in einer beliebigen Sprache - Ausgabe in einer beliebigen Sprache
- Ich bin mir dessen bewusst , dass in C
'abc'
ist6382179
und Sie recht gute Ergebnisse mit dieser Umwandlung erreichen können. Aber die Sprachen sind bei dieser Herausforderung getrennt, also verlieren Sie nicht den Mut - Es ist verboten, externe Variablen zu verwenden. Nur Operatoren und Literale sowie mathematische Funktionen!
Wertung
Hier sind die Testfälle: pastebin.com/0bYPzUhX
Ihre Punktzahl (Prozent) ist das Verhältnis byte_size_of_your_output / byte_size_of_the_list
ohne Zeilenumbrüche .
(Sie müssen dies selbst tun, da ich nur für den Fall die besten Codes überprüfe.) Die
Gewinner werden nach Punktzahl und Sprache der Ausgabe ausgewählt !
Beispiele:
$ mathpack 147456 | mathpack 97787584 | mathpack 387420489
9<<14 | 9e7^9e6 | pow(9,9)
code-challenge
bebe
quelle
quelle
write in any language - output in any language
- Die beiden Sprachen können unterschiedlich sein, oder?Antworten:
Code: Mathematica, Ausgabe: C, ~ 62,1518% (12674/20392)
Ich dachte, ich würde es auch mit C versuchen, wegen dieser lustigen Charakterliterale. Derzeit ist dies das einzige, was diese Antwort versucht, und es funktioniert ziemlich gut.
Ich hoffe, ich habe nichts verpasst, aber diese Antwort verhindert Rückschläge, einfache Anführungszeichen und Trigraphen. Es gibt einen auskommentierten Code, der oktale oder andere Escape-Sequenzen für nicht druckbare Zeichen verwendet, aber ich denke nicht, dass dies tatsächlich notwendig ist, da C in der Lage sein sollte, mit Bytes in Zeichenliteralen umzugehen, afaik (bitte korrigieren Sie mich, wenn ich 'Ich liege falsch).
Testen Sie dies wie bei der anderen Einreichung mit
quelle
\n
) und 13 (\r
). Ein Null-Byte wird OK kompiliert, jedoch mit der Fehlermeldungwarning: null character(s) preserved in literal
.Code: Mathematica, Ausgabe: Julia, ~ 98,9457% (20177/20392 Bytes)
Die Funktion nimmt eine Zahl und gibt die kürzeste gefundene Zeichenfolge zurück . Derzeit werden vier einfache Optimierungen angewendet (ich könnte morgen weitere hinzufügen).
Sie können es wie folgt auf die gesamte Datei anwenden (um die Punktzahl zu messen):
Beachten Sie, dass einige dieser Optimierungen davon ausgehen, dass Sie sich auf einer 64-Bit-Julia befinden, sodass Sie
int64
durch ganzzahlige Literale standardmäßig eine erhalten. Andernfalls werden Sie bei Ganzzahlen größer als 2 31 ohnehin überlaufen . Unter dieser Annahme können wir einige Optimierungen anwenden, deren Zwischenschritte sogar noch größer als 2 32 sind .EDIT: Ich habe die Optimierung in den Beispielen des OP vorgeschlagen , um bitweise xor zwei große Zahlen in wissenschaftlicher Notation (eigentlich für alle xor , oder und und ). Beachten Sie, dass die Verlängerung
xormap
,ormap
undandmap
darüber hinaus zwei Operanden umfasst 32 könnte Hilfe bei der Suche zusätzliche Optimierungen, aber es funktioniert nicht für die gegebenen Testfälle und erhöht nur die Laufzeit durch so etwas wie ein Faktor von 10.EDIT: I off weitere 16 Bytes rasiert, indem alle Überprüfung
n-9, n-8, ..., n+8, n+9
zum Bestimmen, ob jeder diejenigen kann verkürzt werden, wobei in diesem Fall I dargestellt , die Anzahl auf dem basiert, Addieren oder Subtrahieren der Differenz. Es gibt einige Fälle, in denen eine dieser 18 Zahlen mit 3 oder mehr Zeichen weniger als sichn
selbst dargestellt werden kann. In diesem Fall kann ich zusätzliche Einsparungen erzielen. Es dauert jetzt ungefähr 30 Sekunden, um es in allen Testfällen auszuführen, aber wenn jemand diese Funktion tatsächlich "verwendet" hat, würde er sie natürlich nur für eine einzelne Nummer ausführen, sodass sie immer noch weit unter einer Sekunde liegt.BEARBEITEN: Weitere unglaubliche 4 Bytes, indem Sie dasselbe für die Multiplikation und Division tun. 50 Sekunden jetzt (die geteilten dauern nicht so lange, weil ich diese nur überprüfe, wenn die Zahl tatsächlich durch den interessierenden Faktor teilbar ist).
BEARBEITEN: Eine weitere Optimierung, die mit dem angegebenen Testsatz nicht wirklich hilft. Dieser könnte ein Byte für Dinge wie 2 30 oder 2 31 speichern . Wenn wir stattdessen uint64s hätten, gäbe es viele Zahlen, bei denen dies eine enorme Einsparung bedeuten könnte (im Grunde immer dann, wenn die Bitdarstellung mit vielen 1s endet).
EDIT: Entfernt die xor , oder , und Optimierungen zusammen. Mir ist gerade aufgefallen, dass sie in Julia nicht einmal funktionieren, weil (ganz offensichtlich) die wissenschaftliche Notation Ihnen einen Float gibt, in dem bitweise Operatoren nicht einmal definiert sind. Interessanterweise scheinen eine oder mehrere der neueren Optimierungen alle Fälle zu erfassen, die durch diese Optimierungen verkürzt wurden, da sich die Punktzahl überhaupt nicht geändert hat.
quelle
J bis C (ungetestet, funktioniert aber in den meisten Fällen als Basisantwort.)
Gibt ein Zeichenfolgenliteral aus, das, wenn es in C eingegeben wird, die Zahl darstellt (wie im OP erwähnt). Dies ist keine ernsthafte Vorlage, sondern etwas, um meine J-Fähigkeiten zu stärken, von denen ich dachte, ich würde sie teilen.
Alternativer Einzeiler:
Was J versucht, daraus zu machen, wenn Sie es eingeben:
Vielen Dank, J. Außerdem, für diejenigen, die sich mit J auskennen, rockt visio für die Erstellung komplexerer Funktionen:
quelle
\
,?
oder'
?m&u@:v
Verwenden Sie stattdessen ,m u v
um wertvolle Zeichen zu speichern und die Lesbarkeit zu verbessern. Wenn wir dies auf Ihren Code anwenden, erhalten wirf =: [: (,~ 0 $~ 8 - 8 | #) #:
undg =: [: ($~ 8 ,~ # % 8:) f
und zuletzttoCString =: a. {~ [: #. g
. Alles zusammen bekommen wira. {~ [: #. [: ($~ 8 ,~ # % 8:) [: (,~ 0 $~ 8 - 8 | #) #:
, was wirklich leicht zu lesen ist.