Inspiriert von dieser Frage zu SO besteht Ihre Aufgabe darin, ein Programm zu erstellen, das in (mindestens) zwei Hauptversionen der von Ihnen gewählten Sprache gültig ist und unterschiedliche Ergebnisse liefert.
Regeln
- Jede Sprache mit mehr als einer Hauptversion kann verwendet werden.
- Für die Zwecke dieser Herausforderung würde ich eine "Hauptversion" vorschlagen, bei der sich die erste Nummer in der Versionsnummer ändert.
- PHP 4 und PHP 5 unterscheiden sich, PHP 5.3 und PHP 5.4 nicht.
- Da ich das Versionsschema jedoch nicht für alle Sprachen kenne, kann die Community sicher feststellen, ob Sie die "Hauptversion" selbst fair ermittelt haben.
- Für die Zwecke dieser Herausforderung würde ich eine "Hauptversion" vorschlagen, bei der sich die erste Nummer in der Versionsnummer ändert.
- Der Code muss kompiliert und jedes Mal mit denselben Flags und Eingaben ausgeführt werden
- Ausgenommen, die Version der Sprache zu ändern, wenn dies relevant ist
- Fehler zählen nicht als Ausgabe, und Antworten, die Fehler verursachen, werden disqualifiziert (Fehlerausgaben werden nur ignoriert).
- Das Programm sollte nur die Eingaben vornehmen, die zum Ausführen erforderlich sind.
- Für jede gegebene Version sollte die Ausgabe immer gleich sein
- Die Änderung soll eine Folge einer Änderung der Sprachspezifikation und nicht der VM-Spezifikation oder der Umgebungsmetadaten sein
Wertung
- Code-Golf- Typ Bewertung nach Länge, also
+1
für jedes Zeichen / Byte -1
für jedes Zeichen Unterschied in der Länge der Ausgabe.- zB Ausgabe von Version 1
abcde
(5 Zeichen), Ausgabe von Version 2123abc
(6 Zeichen) =-1
- zB Ausgabe von Version 1
Andere Regeln
- Es gelten Standardausnahmen - keine externen Programme, Webanfragen usw.
- Ihr Programm sollte beendet sein (innerhalb von 2 Sekunden)
- Die niedrigste Punktzahl gewinnt.
"Bessere" Wertung
Behalten Sie Ihre ursprünglichen Antworten bei, im Interesse der Fairness markiere ich den Gewinner anhand der ursprünglichen Regeln.
Da meine ursprüngliche Wertung grundsätzlich fehlerhaft ist, können Sie sie mit folgendem Bewertungssystem erneut bewerten / wiederholen:
- Code-Golf- Typ Bewertung nach Länge, also
+1
für jedes Zeichen / Byte +1
für jeden Zeichenunterschied in der Länge der Ausgabeabcde
und123456
->+1
-1
für jeden eindeutigen Zeichenunterschied in der Ausgabe (begrenzt auf die Länge der kürzesten Ausgabe)abcde
und123456
->-5
12345
und123456
->-1
12345
und123455
->0
- Punktzahl, die dem Nullsieg am nächsten kommt
- Bei einem zweiten Unentschieden gewinnt der einfache Code-Golf- Score.
code-challenge
James Webster
quelle
quelle
zzzz
undaaaa
, gibt mir das-4
? So scheint es mir.Antworten:
Überarbeitete Antwort für "besseres" Bewertungssystem
C89 / C99, Score: 0
Mein Programm ist 52 Zeichen lang und verwendet den gleichen Mechanismus wie in meiner ursprünglichen Antwort, um die unterschiedliche Ausgabe zu erzielen. Dies funktioniert, weil C89 nicht
//
als Kommentar behandelt wird:Die Ergebnisse:
Alte Antwort:
C89 / C99, Score: -Infinity?
Ich bin nicht ganz sicher, ob dieses Programm nicht gegen die Regeln verstößt, aber egal. Dieses Programm nutzt die Tatsache aus, dass in C89
//
kein gültiger Kommentar steht sondern/* ... */
steht.Mit dem Kommentar-Trick wird eine andere Funktion ausgeführt. In C89 wird die Funktion nur gedruckt,
"trolololol..."
bis der Stapel überläuft (sodass sie möglicherweise innerhalb von 2 Sekunden beendet ist).C99
C89
quelle
Scores closest to zero win
das also eigentlich sehr weit von Null.Python - 10 Punkte weniger als die nächstbeste Antwort
In Python 2 wird hiermit die gesamte Liste der Ganzzahlen von 0 bis 99 gedruckt.
In Python 3
range
ist es ein Generator und gibt daher nur "range (0,100)" aus.Da ich in Python noch nie auf eine Größenbeschränkung für Zahlen gestoßen bin, kann ich diese 100 durch eine viel größere Zahl (z. B. 2 ** 1000) ersetzen und am Ende einen praktisch unbegrenzten Unterschied in der Ausgabe feststellen.
Bearbeitet, um der Tatsache Rechnung zu tragen, dass ich zwar für jeden praktischen Zweck eine unendlich niedrige Punktzahl erzielen kann, mit einem Programm, das unter 2 Sekunden endet, jedoch nicht die tatsächliche Unendlichkeit erreichen kann
Für das aktualisierte Punktesystem würde ich Folgendes einreichen:
Ausgabe:
Python 2:
[0, 1, 2, 3]
Python 3:
range(0, 4)
Der erste Druck hat 5 eindeutige Zeichen (
[123]
), der zweite Druck hat 8 eindeutige Zeichen (range(4)
), der Unterschied in der Länge der Ausgabe ist 1, der Code hat 15 Zeichen, die kürzeste Ausgabe ist 11 Zeichen ... diese Regeln sind aber ziemlich verwirrend Ich denke, das bringt mich zu einem Endergebnis von 15 + 1-min (11,5 + 8) = 5.quelle
Python - 0 Punkte
Keine Ahnung, wie das funktioniert: P Bin gerade beim Ausprobieren von Zufallscode darauf gestoßen.
Auf Python 3 ist es
<class 'int'>
und auf Python 2 ist es<type 'int'>
(mit interaktiver Konsole)"Besser" Punktzahl: 3 (Länge) + 1 (Char Diff.) - 4 (eindeutige Zeichen)
Älteres Python 1 - 7 Punkte
Vielen Dank an @grc für diese Version und hilf mir, vier Punkte abzuziehen!
In Python 2 wird diese Anweisung so interpretiert,
print ()
dass das leere Tupel gedruckt wird()
.In Python 3 ist das
print
eine Funktion und führt dazu, dass nichts gedruckt wird."Besser" Score: 7 (Länge) + 2 (Char Diff.) - 2 (einzigartige Zeichen)
Älteres Python 2 - 13 Punkte:
"Besser" Punktzahl: 12 (Länge) + 2 (Char Diff. O / P) - 1 (Unique Chars O / P)
Ich weiß, dass dies nicht gewinnen wird, gab aber dennoch eine Antwort, da dies mein erster Python-Versuch ist :)
quelle
print()
.dict.itertools()
: PC #
Ich habe auch die generischen Inferenzalgorithmen für Methodentypen zwischen C # 2, 3 und 4 geändert. Zum Beispiel:
In der C # 2-Methode besagt die Typinferenz, dass T nicht beide
int
und seinint?
kann und daher produziert2
. In der C # 3-Methode besagt die Typinferenz "Der beste Kompromiss zwischenint
undint?
istint?
" und wähltM<int?>
und produziert daher 1.quelle
Ruby, 4 Zeichen + 0 Zeichenlängendifferenz - 3 eindeutige Zeichenunterschiede = 1 Punkt
In Ruby 1.9 wird gedruckt
"d"
. Am 1.8 wird gedruckt100
.Erklärung:
?d
steht"d"
in 1.9 und100
(der ASCII-Code für d) in 1.8.p x
ist äquivalent zuputs x.inspect
.*
ist sowohl String-Wiederholung als auch Multiplikation."Optimierte" Version für altes Scoring:
Ruby, 8 Zeichen - 999999989 Zeichen Differenz = Punktzahl von -999999981
Ausdrucke
33000000000.0
für 1.8 und"!!!!!!
...!!!"
für 1.9. (?!
ist33
in 1.8 und"!"
in 1.9, und*
ist Zeichenfolge-Wiederholung und Multiplikation.)Sie können mit der Multiplikation wirklich so weit gehen, wie Sie möchten, es hängt nur davon ab, wie schnell Ihr Computer ist.
quelle
Bash - -∞ (bis zu praktischen Grenzen)
Effektiv, wie viel Speicher Sie haben. ZB mit ca. 10GB:
Bash 2: Unterstützt keine Bereiche bei der Klammererweiterung, druckt also
{0..999999999}
.Bash 3:
Beliebige Sprache - -∞ (bis zu praktischen Grenzen)
Sie werden das in so ziemlich jeder Sprache haben, auch wenn es etwas komplexer wird. Sobald Sie zwei verschiedene Werte eingeben können, können Sie Code schreiben, der eine willkürlich unterschiedliche Ausgabe erzeugt. Eine bessere Bewertungsmethode würde die Unterschiede in der Ausgabe ignorieren.
quelle
…
Version in der Sprache "any language" steht für alle Tricks, mit denen Sie Ihr Programm von einer Änderung der Sprachspezifikation abhängig machen. Es ist die Versionserkennung, ob Sieif $version >= 3
oderif isinstance(range(0),list)
.C #
Der folgende Code würde die unterschiedliche Ausgabe für C # 5.0 und frühere Versionen von C # erzeugen.
Ausgabe: C # 5.0
Ausgabe: C # 4.0
Der Grund wird in dem Blogbeitrag von Eric Lippert erläutert
Das Schließen der Schleifenvariablen wird als schädlich angesehen
quelle
Python, -14 Punkte (3 - 17 Zeichenlängendifferenz = -14)
Python 2-Ausgänge:
0
Python 3-Ausgänge:
0.6666666666666666
Bessere Wertung, 5 Punkte (3 + 2 Zeichenlängendifferenz = 5)
Python 2-Ausgänge:
1
Python 3-Ausgänge:
1.5
quelle
C #
Ich habe C # 4 Kovarianz und Kontravarianz hinzugefügt, also Programme der Form:
Würde
false
in C # 2 und 3 undtrue
in C # 4 produzieren.Man könnte jedoch argumentieren, dass dies nicht zählt, da sich auch die Bibliothek, die die Definition von enthält
IEnumerable<T>
, ändern musste.quelle
C ++ 98/11 - "Bessere" Bewertung (115 Zeichen - 115 eindeutige Zeichenunterschiede in der Ausgabe = Punktzahl von 0)
Eine leicht überarbeitete Version, um den neuen Bewertungsregeln zu entsprechen
Golf gespielt:
Ungolfed-Version:
Die neue Lösung unterscheidet sich nicht wesentlich von der alten. In der neuen Lösung ist die Ausgabe in C ++ 11 und C ++ 98 mit 116 Zeichen gleich lang, aber das einzige gemeinsame Zeichen ist das von der Puts-Funktion angehängte neue Zeilenzeichen.
Für C ++ 98 wird das
u8
inu8"\x7E"[0]
noch ersetzt, aber jetzt mit"\x0B"
. So wird der resultierende Wert nach der Vorverarbeitung sein"\x0B""\x7E"[0]
. Die beiden Zeichenfolgen werden verkettet"\x0B\x7E"
und der Indexoperator greift auf das erste Element zu, in diesem Fall auf das Zeichen mit dem Wert 11 in der Zeichencodierung. Zusätzlich wird der Wert voni
addiert, der ursprünglich 114 ist. Das Zeichen mit dem Wert 125 wird also in das resultierende Array geschrieben. Wiei
Null werden alle Werte von 125 bis 11 in das Array geschrieben undputs
alle Zeichen mit den Werten von 11 bis 125 plus der nachfolgenden neuen Zeile gedruckt.In C ++ wird 11
u8"\x7E"[0]
als UTF-8-String interpretiert, der aus dem Einzelzeichen mit dem Hexadezimalwert 7E besteht. Der tiefgestellte Operator greift jetzt auf dieses Zeichen zu und der Wert voni
wird hinzugefügt, was zu dem Dezimalwert 241 während der ersten Iteration führt. Währendi
auf Null geht, werden alle Werte bis 126 in das Array und geschriebenputs
die Zeichen mit den Werten von 126 bis 241 plus der nachfolgenden neuen Zeile gedruckt.Dies führt je nach verwendetem Zeichensatz zu unterschiedlichen Ergebnissen, da die meisten Zeichensätze nur die ersten 128 Zeichen gemeinsam haben.
Für ISO-8859-2 wäre die Ausgabe wie folgt:
C ++ 98:
C ++ 11:
C ++ (106 Zeichen - 107 Unterschied in der Ausgabe = Punktzahl von -1) (ALTE REGELN)
Golf gespielt:
Ungolfed-Version:
Kompiliert mit
g++ -std=c++98 main.cpp
undg++ -std=c++11 main.cpp
.Eigentlich können Sie ersetzen
108
jede positive Zahl im ganzzahligen Bereich , um negative Ergebnisse zu erzielen. Solange es größer als 108 ist;)In C ++ 98
#define u8 "f"
bewirkt , dass der Prä - Prozessor zu ersetzenu8""[0]
mit"f"""[0]
. Dies führt dazu"f"[0]
, dass es sich letztendlich um ein einzelnes Zeichen handelt'f'
, das in ein Array geschrieben wird.puts(c)
druckt das resultierende Array, bestehend aus i-1'f'
.In C ++ 11
u8""[0]
wird die leere Zeichenfolge als UTF-8-Zeichenfolge interpretiert, sodass keine Zeichenfolgenverkettung erfolgt. Da es sich um eine C-Zeichenfolge handelt, greift der Indexoperator auf das abschließende Nullbyte zu und schreibt es in ein Array.Am Ende
puts(c)
wird das resultierende Array gedruckt, das nur aus Null-Bytes besteht. Aber wieputs
hält den Eingang zu lesen, sobald es einen Null - Byte trifft, wird es nur eine neue Zeile gedruckt werden und nichts mehr.quelle
?
(auf meinem (Mac) System mindestens)CSS2 vs CSS3 48 Punkte
Gerendert als
ABCDEFGHIJKLMNOPQRSTUVWXYZ
(Kapitälchen) in CSS3-BrowsernGerendert wie
abcdefghijklmnopqrstuvwxyz
auf Nicht-CSS3-Browsern74 Zeichen - 26 Zeichen Unterschied = 48
quelle
Perl, 24 Zeichen - (9 * (10 ^ 9)) - 1 Zeichenunterschied = Punktzahl von - ((9 * (10 ^ 9)) - 1) +24
Druckt 9e9-mal
a
für alle Versionen unter 5, druckta
für alle Versionen über 5. Sie können die Punktzahl unendlich niedrig machen, indem Siea
der zweiten Ausgabe einfach mehr s hinzufügen .quelle
Befunge, 36 - 378 = -342; 164 - 2576 = -2412
In Befunge 93 würde dies 3 Leerzeichen ausgeben
<v
, gefolgt von 76 Leerzeichen, gefolgt von<v
76 Leerzeichen<v
, dann 76 Leerzeichen, dann<v
gefolgt von 77 Leerzeichenv
um 78 Leerzeichen gefolgt. Länge:3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395
Diese Option kann problemlos erweitert werden, indem zusätzliche Zeilen hinzugefügt werden, die den ersten fünf Zeilen ähneln.In Befunge 98 würde dies ausgegeben
<v <v <v <v v
.Der Unterschied in der Länge:
395 - 17 = 378
. Das Ergebnis wäre also (nach den alten Regeln):-342
Hinweis: Ich hätte einen noch größeren Unterschied feststellen können, wenn ich
.
anstelle von verwendet hätte,
. der Unterschied wäre gewesen-684
Regeländerung:
Das ist etwas kniffliger.
Befunge 93 Ausgabe:
Befunge 98 Ausgabe:
Längen:
2576
. Keiner der Charaktere zwischen den Saiten ist derselbe. Wenn ich die Herausforderung also richtig verstanden habe, ist meine Punktzahl164 - 2576 = -2412
(ja, ich hätte zielen sollen0
, aber das hat mehr Spaß gemacht). Wenn ich es so machen muss, dass jedes Zeichen in jeder Zeichenkette einzigartig und voneinander verschieden ist, kann ich das, bitte sag es mir.quelle
Powershell, "Bessere" Wertung, -163 (15 - 178 char diff = -163)
Powershell V2
Powershell V3
quelle
PHP, Score: 0 (bester Fall)
Wow, das wird lustig zu erklären sein.
Laut dieser Website
srand()
scheint die Funktion von PHP 5.1.5 auf PHP 5.3.14 unterbrochen zu sein . Daher werden wir PHP 4.4.9 und eine zufällige Version von PHP 5, die in das oben angegebene Versionsintervall fällt, weiter untersuchen.PHP 4.4.9 Ausgabe:
1505335290
Ich glaube nicht, dass dies gegen Regeln verstößt. Da es sich um einen Fehler zu sein scheint, die Ausgabe sollte gleich sein, aber es ist nicht. Unsere andere PHP-Version überspringt einfach die
srand()
Funktion und gibt eine Zufallszahl aus.quelle
Java (ungefähr -2.000.000.000)
Die Java-Versionen werden manchmal als 1.x bezeichnet, aber ich denke, es liegt immer noch innerhalb der Regeln.
Auf einfache Weise können Sie überprüfen, ob eine Klasse vorhanden ist, die in einer bestimmten Version eingeführt wurde.
(Hängt ein wenig von Ihrem Terminal ab, ob es möglich ist, 2 Milliarden Zeichen in zwei Sekunden auszugeben.) / Ersetzen Sie für die neue Wertung
Integer.MAX_VALUE
.)Dieser Code hängt von der Version des verwendeten VM / JDK ab (zählt das?)
Es druckt
z
s für Java 6 und frühere JDKs unda
s für neuere Versionen.quelle
JavaScript (ES3 vs ES5) - 9 Punkte
Länge
10
+ Längendifferenz0
- Ausgabedifferenz1
Ausgaben
1
für moderne Browser, die Array.prototype.map unterstützen. Ausgänge0
in älteren Browsern. Ich habe das mit IE8 getestet.Mit alten Regeln: 0 Punkte
Länge
26
- Längenunterschied26
Ausgaben
00000000000000000000000000
in modernen Browsern. Und leere Zeichenfolge auf alt.quelle
Python - 0
Python 2 druckt ein Quine, während Python 3 nichts druckt.
EDIT: Aktualisiert, behoben.
quelle
APL (5- (1988894-1) = -1988888)
In APLs alten Stils (wie Dyalog if
⎕ML=0
*)↑
bedeutet mix , was auf einem eindimensionalen Vektor nichts bewirkt. In APL2-ähnlichen APLs bedeutet wie GNU APL (oder Dyalog if⎕ML=3
) zuerst↑
, dass das erste Element eines Vektors genommen wird.Somit wird die folgende
5
Bytes (der APL charset tut fit in einem Byte),gibt
1988894
Bytes (die durch Leerzeichen getrennte Liste von Zahlen von 1 bis 3e5) in APL-Dialekten alten Stils aus,und
1
Byte (nur die erste Zahl in der Liste, die1
und daher von Länge ist1
) in APL2-artigen APL-Dialekten.Anmerkungen:
⎕ML
bedeutet Migrationsebene . Je höher Sie in Dyalog APL einstellen⎕ML
, desto mehr APL2-ähnliche Funktionen werden aktiviert. Der Standardwert ist0
. (Und es ist eine globale Variable! Spaß!)3e5
war der höchste 3-Zeichen-Wert, den Dyalog APL akzeptieren würde⍳
.4e5
gab mir eineLIMIT ERROR
. Diese Einschränkung ist wahrscheinlich vom Interpreter abhängig. (GNU APL hatte keine Probleme mit höheren Werten.)quelle
Bash 7 (14 Bytes Programmlänge + 0 Unterschied in der Ausgabelänge - 7 Unterschied in eindeutigen Zeichen in der Ausgabe)
Bezogen auf @ Gilles Antwort, aber eine andere Erweiterungsfunktion und verschiedene Versionen. Bewertung gemäß der bearbeiteten Frage:
Ausgabe für Bash 3.x:
Ausgabe für Bash 4.x:
quelle
PHP: −134217684 (43 - 134217727)
Verwendung:
In PHP5 + gibt dies nichts aus, da ip2long mit ungültigem Argument in false umgewandelt wird, was zu Null wird. In PHP4 gibt es
ip2long("")
-1 zurück und wir füllen den leeren String mit 128MB og aufa
.Die Maske ist so angebracht, dass sie lange vor den 2 Sekunden auf meiner Maschine zurückkehrt. Wenn Sie es in 2s nicht schaffen, kaufen Sie bessere Hardware!
Mit neuen Regeln: 0 (40 - 40. Näher an Null kommt man nicht heran.)
Ausgänge:
quelle
C89 / C99 Kommentar-Exploit, 45 Zeichen, 0 Punkte
c89 ausgang
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
- 45 Zeichenc99 ausgang
MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
- 45 Zeichenquelle
printf
zuputchar
gewechselt. Am schlimmsten ist, dass ich für R5 die Regeln falsch verstanden und versehentlich neue und alte Wertung kombiniert habe. Die Ausgabe für [r5, r6] ist ein Fehler. r3 in der anderen C-Antwort enthält genau den gleichen Fehler. Wenn Sie sich die Zeitstempel ansehen, werden Sie sehen, dass es R5 war, das hier gepostet wurde, als die andere Antwort aktualisiert wurde. Nicht, dass es darauf ankommt, da dies Codegolf ist und dieser Eintrag die Herausforderung in weniger Zeichen, Punkt, erfüllt.C ++ 98 / C ++ 11
Bei einem standardkonformen C ++ 98-Compiler wird das 199711-fache des Buchstabens 'x' ausgegeben, während bei einem standardkonformen C ++ 11-Compiler das 201103-fache des Buchstabens 'x' ausgegeben wird. Der Längenunterschied der Ausgabe beträgt daher 1392 Zeichen. Dies bedeutet, dass es sich nicht lohnt, den Quellcode zu spielen, da ein viel größerer Effekt erzielt werden kann, indem man ihn nur durch
"x"
eine längere Saite ersetzt oder__cplusplus
mit einer bestimmten Zahl multipliziert .quelle
SmileBASIC 3 / SmileBASIC 2, Score: -5 (ursprüngliche Wertung)
In modernen Versionen von SB wird dies
1000000000
wie erwartet gedruckt, in Version 2 und früher jedoch10
aufgrund eines Fehlers.quelle
TI-Basic 83 Plus gegen 84 Plus, Ergebnis 5-1 = 4
Ausgaben
2
auf dem TI-83 Plus, bei denen dasselbe Programm als etwas analysiert wird, das aussiehtlength("?►DMS
, weil diesetTime(
Befehl noch nicht eingeführt wurde. Die Zeichenfolge enthält also zwei 1-Byte-Token, ihre Länge beträgt 2.Ausgabe
1
auf dem TI-84 Plus, da eine Zeichenfolge, die ein einzelnes 2-Byte-Token enthält, die Länge 1 hat.quelle
Gehe zu 1.9-> 1.10. Ergebnis = 1 - 1 = 0
Ab 1.10 Anmerkungen :
1,8:
256
1.9:
1024
1,10:
10340
quelle