Ihr Unternehmen hat kürzlich eine neue Gruppe äußerst engagierter Systemadministratoren eingestellt. Sie haben das Gefühl, dass nur das Betrachten von Computerbildschirmen sehr einschränkend ist (ich meine, eine Bildwiederholfrequenz von 60 Hz ist einfach NICHT genug). Deshalb haben sie den CPU-Datenbus an einen DAC angeschlossen und spielen diesen über einen Lautsprecher durch den Serverraum, damit sie ihn hören können bis 20kHz. Ein Problem: Sie sind Sysadmins, keine Elektroingenieure, und ihre Lautsprecherkonfiguration bricht immer wieder zusammen. Sie stellten fest, dass dies auf zu plötzliche Änderungen der Byte-Werte im Code zurückzuführen ist, den die Software-Ingenieure auf dem Mainframe kompilieren. Die Sysadmins veranstalten jetzt einen kleinen Wettbewerb, um herauszufinden, wer den Code erstellen kann, der für ihre Lautsprecherkonfiguration am schonendsten ist.
Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion in einer Sprache Ihrer Wahl zu erstellen , die zwischen aufeinanderfolgenden Bytes so wenig wie möglich Unterschiede aufweist (siehe Abschnitt Berechnung). Dieses Programm hat die Aufgabe, seine eigene Punktzahl zu berechnen.
Eingang
Eine ASCII-Zeichenfolge in stdin
oder die nächstgelegene Entsprechung Ihrer Sprache oder als Funktionseingabe, wenn Sie eine Funktion erstellen. Da sich Ihr Programm zur Berechnung Ihrer Punktzahl selbst als Eingabe verwenden muss, sollte Ihr Programm Unicode unterstützen, wenn es Unicode enthält. Ansonsten ist ASCII ausreichend. Es kann davon ausgegangen werden, dass die Eingabe mindestens 2 Byte lang ist.
Berechnung
Jedes Zeichen der Zeichenfolge wird nach dem ASCII-Standard in sein numerisches Äquivalent konvertiert. Dann wird der Unterschied zwischen allen Zeichen zuerst quadriert und dann summiert . Beispielsweise abd
erhält die Zeichenfolge eine Punktzahl von 1²+2²=5
.
Ausgabe
Ausgabe ist der Titel Ihres Eintrags. Dies bedeutet, dass ein vorangestelltes #
Zeichen oder ein angefügtes Zeichen und ein -
(Bindestrich) eingefügt werden sollten . Anschließend sollte der Name Ihrer Programmiersprache ausgegeben werden, gefolgt von einem Komma, einem Leerzeichen und einer Ganzzahl, die das Ergebnis der Berechnung darstellt. Beispielsweise
#C++, 98
wäre eine gültige Ausgabe. Die Ausgabe sollte in stdout
oder in der Sprache erfolgen, die Ihrer Funktion am nächsten kommt, oder als Rückgabewert für Ihre Funktion.
Wertung
Ihre Punktzahl ist der von Ihrem Programm berechnete Wert, wobei das Programm selbst als Eingabe dient.
Bearbeiten: Sollte jetzt mit Zeilenumbrüchen umgehen, sorry für früher, Leute
Hier ist ein Pyth-Skript zur Überprüfung der Punktzahlberechnung.
quelle
Antworten:
CJam,
1051827643569545407327279235233229Das obige Programm generiert den eigentlichen Quellcode, der 1.179.112 Byte lang ist.
Testen
Mit dem Java-Interpreter kann der Quellcode folgendermaßen generiert und getestet werden:
Alternative Version
Bei 36 Punkten - für eine Endnote von 265 - können wir den Quellcode um 99,92% kürzer machen:
Sie können diese Version online im CJam-Interpreter testen .
Idee
Wir wollen den Code ausführen
Halten Sie die Punktzahl so niedrig wie möglich. Um dies zu erreichen, werden wir diese Zeichenfolge Zeichen für Zeichen erstellen (mit ein paar No-Ops davor und danach) und das Ergebnis auswerten.
Glücklicherweise sind
'
(Push-Zeichen-Literal),(
(Dekrement) und)
(Inkrement) aufeinanderfolgende ASCII-Zeichen, sodass das Pushen beliebiger Zeichen relativ kostengünstig ist.ASCII-Zeichen nach
'
können als gedrückt werden'()…)(
, wobei die Anzahl von)
dem Codepunkt abhängt.Beispielsweise
+
kann so geschoben werden'())))(
. Der Abstand zwischen'
und(
, und(
und)
ist 1. Die folgenden)(
heben sich gegenseitig auf; Ihre einzige Funktion besteht darin, den Weg für das Folgende'
(entsprechend dem nächsten Zeichen) mit aufeinanderfolgenden Zeichen zu ebnen .Charaktere, die auf diese Weise gedrückt werden, erhöhen die Punktzahl um 4 Punkte.
ASCII-Zeichen davor
'
können als gedrückt werden''(…(
, wobei die Anzahl von(
vom Codepunkt abhängt.Beispielsweise
#
kann so geschoben werden''((((
. Der Abstand zwischen'
und(
beträgt 1.Charaktere, die auf diese Weise gedrückt werden, erhöhen die Punktzahl um 2 Punkte.
''(…(
Funktioniert eigentlich für alle ASCII-Zeichen, da Character 16 Bit breit ist und umbrochen wird. Zum Beispiel+
kann gedrückt werden als''
, gefolgt von 65.532(
s.Diese Technik wird in der 1,2-Megabyte-Version des Codes verwendet.
Der Charakter
'
kann so verschoben werden''
, dass die Punktzahl nicht beeinflusst wird.Code
quelle
Haskell,
1528279574291196839217744771742Verwendung (Hinweis:
"
muss maskiert werden):Ich stelle der
""
Eingabezeichenfolge die leere Zeichenfolge voran , um dem Haskell-Interpreter beim Ermitteln der Typen zu helfen. Ohne fehlgeschlagene Typinferenz ist der Code zu polymorph. Der Rest ist wie gewohnt: Ordnen Sie jedes Zeichen ASCII zu, erstellen Sie eine Liste mit Nachbardifferenzen, Quadrat, Summe und vorangestelltem Sprachnamen.quelle
> <>, 30227
Gah, der Titel hat meine Punktzahl verdoppelt; in den Worten meines eigenen Programms, n & oooooo! Ich nehme mir später etwas Zeit, um das zu verbessern. Ich weiß auch, dass dieses Ergebnis möglicherweise falsch ist, da ich im Online-Interpreter keine Zeilenumbrüche eingeben kann und ich nicht sicher bin, ob es eine Möglichkeit gibt, einen Eingabestapel für den offiziellen zu füllen.
Auf keinen Fall vollständig optimiert, sondern die relative Nähe (zumindest in Bezug auf ASCII-Zeichen) der Befehle in> <>
vollausgenutzt. Ich konnte den Zeilenvorschub nicht einfach als Eingabe senden, also habe ich den Pyth-Score-Checker verwendet, aber er passt zu einer Reihe von zufälligen Testfällen, die ich verwendet habe, daher sollte dies in Ordnung sein.Hier ist eine mit einer Punktzahl von 30353 (was korrekt sein sollte, da es sich um eine Zeile handelt):
quelle
Java,
664656550662434Überraschend kurz. Akzeptiert ein Zeichen-Array anstelle einer Zeichenfolge.
Ich habe ein Programm verwendet, um die besten Variablennamen zu generieren.
quelle
((Function<char[],String>) ABCD->{…}).apply(…)
, danke. Diese Lambdas scheinen ohne den Typenkontext ziemlich unvollständig zu sein.K5, 25478
Ziemlich einfache Lösung. Dies ist eine Funktion, deren Eingabe über einen String erfolgt.
quelle
Windows PowerShell ISE-Host, 62978
638946796077050Bearbeiten - speicherte einige Punkte, indem die
$A
Variable entfernt wurde und stattdessen rückwärts durch die Zeichenfolge gezählt wurde. Außerdem wurden einige Schlüsselwörter in CAPS konvertiertEdit2 - speicherte einige weitere Punkte mit
$($HOST.NAME)
anstelle vonPowerShell
Edit3 - speicherte weitere Punkte durch Tauschen von Variablennamen und änderte die Art und Weise, wie die Ausgabe generiert wird.
Verwendet Variablen, die mit Zahlen benannt sind, da sie "näher" sind,
$
sodass unsere Strafe geringer ist.Es ist interessant, keine regulären Golftechniken anzuwenden. Zum Beispiel
|%{$
ist 22534, während|foreach{$
nur 8718 ist.Dies ist wahrscheinlich nahezu optimal, ohne die Techniken zu ändern.
quelle
MATLAB,
1921439748394443878537593Vielen Dank an Luis Mendo für die weitere Reduzierung der Differenz!
Vielen Dank an NumberOne für die Reduzierung des Rauschens durch Ändern des Namens der Eingangsvariablen!
Wie das geht
ans
in MATLAB gespeichert istA9876543210
und gibt die Summe der quadrierten Nachbardifferenzen des Strings aus.diff
findet paarweise benachbarte Unterschiede in einem Array und erzeugt ein Array vonlength(A9876543210)-1
. Durch die Verwendungdiff
eines String-Arrays wird dieses in eindouble
Array umgewandelt, in dem die ASCII-Codes der einzelnen Zeichen generiert werden und die Unterschiede der aufeinanderfolgenden Paare zu einem anderen Array führen.diff(A9876543210)'
das mehr Lärm als mitA9876543210.'
(danke Luis Mendo!)quelle
A=
norm(diff(B))^2
ist kürzer%d
.B
als Variablennamen?A=@(A)...
ist gültiges MATLAB, daA
Gültigkeitsbereich.QBasic, 38140
YAY für SHOUTY SYNTAX
(Getestet mit QB64 .)
Dies ist ein vollständiges Programm, das die Zeichenfolge eingibt und die Antwort ausgibt. Die einzige Einschränkung besteht darin, dass das Programm keine mehrzeiligen Eingaben akzeptiert (
LINE INPUT
kann alles verarbeiten, solange es sich um eine einzelne Zeile handelt).Deobfuscated:
Wenn Sie eine Zeichenfolge mit mehreren Zeichen übergeben, erhalten Sie
ASC
den ASCII-Wert des ersten Zeichens. Auch numerische Variablen werden bequemerweise automatisch auf Null initialisiert.quelle
Python 2, 91026
Definiert eine anonyme Funktion, die eine Zeichenfolge verwendet und die Punktzahl zurückgibt. Probieren Sie es online aus .
Das meiste davon ist eine ziemlich einfache funktionale Implementierung: zip
A
mitA[1:]
, um eine Liste von Buchstabenpaaren zu erhalten, dann subtrahieren Sie derenord
s, Quadrat und Summe mit einem Generatorausdruck.Beachten Sie, dass die beiden Variablen innerhalb des Generators Ausdruck werden immer nur durch die folgenden Zeichen folgen:
)
,,
und Raum. Alle drei haben sehr niedrige ASCII-Werte. Daher müssen wir jede Variable mit einem möglichst niedrigen ASCII-Wert beenden. Das niedrigste Zeichen, mit dem eine Variable in Python beendet werden kann, ist0
. Darüber hinausA0
verringert jede Gelegenheit, die wir haben, um einen großen Sprung in zwei kleinere Sprünge aufzuteilen, die Punktzahl: kostet 289, ist aberA90
nur 145 undA9876543210
ist dürftig 73.(Dieser Ansatz hat der Lambda-Variablen nicht geholfen
A
, wahrscheinlich, weil er[
bei einem Vorkommen gefolgt ist .)quelle
JSFuck, 144420642
Bauen Sie es aus:
Fügen Sie dies in das kleine Eingabefeld von JSFuck.com ein, um es in JSFuck zu kompilieren. Das Ergebnis ist ein 112701 Zeichen langes Skript, daher kann ich es hier nicht einfügen. Die letzten beiden Zeichen dieses Skripts sind Klammern, setzen Sie die Eingabe dazwischen.
Es dauert fast 20 Sekunden, bis sich das Programm auf meinem Computer ausgewertet hat.
Erläuterung
Ich hatte mehr Zeit, um daran zu arbeiten, also setzte ich mich und versuchte, die Variablennamen zu optimieren. Hier sind die Variablennamen, die es wert sind, in der Reihenfolge ihrer Punktzahl verwendet zu werden.
Hier ist das JavaScript, das ich in JSFuck übersetzt habe:
Ich habe mir den Übersetzer von JSFuck.com genauer angesehen und herausgefunden, wie seine Bewertungsfunktion funktioniert. Wenn "Eval source" aktiviert ist, wird der Code zu einer selbstausführenden JSFuck-Funktion. Um die Eingabe zu erhalten, müssen wir jedoch innerhalb der Funktion auf Argumente [0] zugreifen. Dies bringt unseren endgültigen JS-Code auf ...
(Wenn Sie sich fragen, warum meine vorherige Version eine niedrigere Punktzahl als diese hatte, dann weil es ein JSFuck-Programm war, das eine Zeichenfolge zurückgab, die als JS ausgewertet werden musste. Aus diesem Grund habe ich sie auch nicht in der Veröffentlichung belassen.)
quelle
abs
bist unnötig. Ich denke, das könnte den Unterschied ausmachen ... :)JSFuck, 102280181
.CJam,
23663,19389,11547Probieren Sie es online aus
Es fängt an, sich so anzufühlen, als könnte dies durch strategisches Hinzufügen weiterer Charaktere fast endlos vorangetrieben werden. Aber ich denke, dass ich anfange, einen Punkt zu erreichen, an dem die Renditen abnehmen, also höre ich vorerst auf. Wo ich zum Beispiel habe
ULC;;;
, könnte ich das ganze Alphabet rückwärts gefolgt von 26 verwenden;
, aber die Gewinne werden immer kleiner.Bei weitem die größte Lücke, die ich gelassen habe, ist zwischen dem
m
und dem,
in der Anfangssaite. Ich habe nichts Vernünftiges gefunden, um es loszuwerden. Ich bin sicher, es gibt Wege. Aber wenn ich es bis ans Limit treibe, sieht es vielleicht nach Dennis 'Lösung aus ...quelle
JAVASCRIPT, 33911
Dies ist bei weitem eine der albernsten Optimierungen, die ich jemals in einem Code Golf gemacht habe ...
Fordern Sie Neil für den "Kommentar-Spam" -Vorschlag auf = P
quelle
/**/
an geeigneten Stellen einfügen .JAVASCRIPT, 31520
Diese Lösung war sehr
viel lächerlicherals meine andere, und deshalb hatte ich das Gefühl, sie hätte ihre eigene Antwort verdient.Das sind 7306 Zeichen, von denen das meiste das eigentliche Programm ist, das in diese 0/1-Zeichenfolge codiert ist, und der Rest nur, um sie zu decodieren. Es funktioniert, indem der Index jeder '1' minus dem Index der vorherigen '1' abgerufen wird, um den erforderlichen Zeichenwert zu erhalten. Anschließend wird die resultierende Zeichenfolge in die eigentliche Funktion umgewandelt, bei der es sich im Wesentlichen um ein Standardgolfprogramm zur Lösung des Problems handelt (das selbst nur etwa 105 Zeichen umfasst).
quelle
R,
68911571835381652224Nimmt einen String aus STDIN und konvertiert ihn über RAW in eine Ganzzahl. Diffs, quadriert und summiert den resultierenden Vektor. Das Ergebnis wird als String zurückgegeben. Vielen Dank an @nimi für den Variablennamen-Tipp.
quelle
Mathematica, 33552
Dieser Code wird zu einer unbenannten Funktion ausgewertet, die das "Rauschen" einer Eingabezeichenfolge berechnet. Dabei wird ausgenutzt, dass die ASCII-Darstellung von Binärdaten im Wesentlichen "rauschfrei" ist. Die angezeigten Binärdaten sind die Zeichenfolge
Das wäre eine gültige Antwort für sich gewesen und hätte 37848 Punkte gebracht.
Alles andere
dekodiert einfach die Binärzeichenfolge und interpretiert sie als Mathematica-Code. Beachten Sie, dass der leere Kommentar von Mathematica
(**)
sehr "rauscharm" ist und tatsächlich Rauschen aus dem"
s entfernt.quelle
Java8:
1171701005089906298890Mit Hilfe des Lambada-Ausdrucks und der Inline-Zuweisung von Variablen kann dieser Code ein wenig verkürzt werden.
quelle
Java,
129300,128400,110930,106581,105101Diese Herausforderung brachte mich dazu, tiefer über die zu verwendenden und zu optimierenden Charaktere nachzudenken, als die kürzeste Lösung zu finden. Ich werde weiter daran arbeiten, die Zahl zu senken.
Dies ist eine Lambda-Funktion, wobei
B
es sich um die Zeichenfolge handelt, die die Funktion darstellt. Vergessen Sie nicht, die Anführungszeichen ("
) zu umgehen, wenn Sie dies als Zeichenfolge übergeben.quelle
Pyth, 16391
Der einzige Trick, der hier verwendet wird, ist die Base-256-Codierung
#Pyth,
, die weitaus weniger kostet als der String selbst.quelle
M, 47033,
52798Um dies zu verwenden, müssen wir Anführungszeichen und Leerzeichen (die in MUMPS! Von Bedeutung sind) wie folgt maskieren:
Beachten Sie, dass "M" ein alternativer Name für "MUMPS" ist - es gibt Meinungsverschiedenheiten unter den Praktizierenden darüber, welcher richtig ist. Natürlich habe ich hier die kürzere Variante gewählt.
quelle
NEW
. Wenn ichAAAA
(jetztAAA9876543210
) mit dem Rechnen beginne , wird dies erzwungen0
(vielleicht ist das nur ein Detail der Caché-Implementierung? Ich habe keine GT.M-Installation zum Testen). Guter Anruf auf der Betreiberprioritätensache; Es fällt mir immer schwer, rein von links nach rechts zu denken. (Ich habe auch vergessen, dass M einen Potenzierungsoperator hat - es kommt nicht oft vor, wenn Sie CRUD-Anwendungen schreiben.)Ruby, 118402
Es liest eine Datei über die Befehlszeile ein, z
ruby diff.rb /path/to/file
. Es gibt Raum für Verbesserungen, und daran arbeite ich gerade.quelle
C ++ 166345
quelle
Perl, 93556
Ich werde versuchen, das noch etwas zu reduzieren.
Es stellt sich heraus , dass die geschweiften Klammern (
{
und}
, ASCII 123 und 125) und der Unterstrich (_
ASCII 95) sehr teuer sind , da alle anderen Charaktere rund um den Bereich von 30-70 sind, weshalb ich die formatiertif
, wie ich es tat, und warum ich$AAAAA
anstelle von Perls Geliebtem benutze$_
.Leider sind alle Variablen mit Symbolen schreibgeschützt, sodass ich Kombinationen wie
$#
und nicht nutzen kann$$
.quelle
F #,
136718130303Wo gibt es ein
\n
nach dem;
.quelle
POSIX Shell, 172026
Schade, ich kann nicht das gleiche Ergebnis wie der Pyth-Checker (178386) erhalten ...
quelle
Lua,
171078,117896Golf gespielt:
Ungolfed:
quelle
C ++, 49031
Ein C ++ - Makro, das eine C-Zeichenfolge verwendet und das Ergebnis in die Standardausgabe schreibt
Probieren Sie es online!
quelle
C ++, 5
quelle