Ihre Herausforderung besteht darin, einen Polyglot zu schreiben, der in verschiedenen Versionen Ihrer Sprache funktioniert. Beim Ausführen wird immer die Sprachversion ausgegeben.
Regeln
- Ihr Programm sollte in mindestens zwei Versionen Ihrer Sprache funktionieren.
- Die Ausgabe Ihres Programms sollte nur die Versionsnummer sein. Keine fremden Daten.
- Ihr Programm kann die Versionsnummer nach Belieben ermitteln. Die Ausgabe muss jedoch Regel 2 entsprechen. Wie auch immer Sie die Versionsnummer bestimmen, die Ausgabe muss nur die Nummer sein.
- Ihr Programm muss nur die Hauptversion der Sprache ausgeben. In FooBar 12.3.456789-beta müsste Ihr Programm beispielsweise nur 12 ausgeben.
- Wenn Ihre Sprache Wörter oder Symbole vor oder nach der Versionsnummer einfügt, müssen Sie diese und nur die Nummer nicht ausgeben. In C89 muss Ihr Programm beispielsweise nur drucken
89
, und in C ++ 0x muss Ihr Programm nur drucken0
. - Wenn Sie den vollständigen Namen oder kleinere Versionsnummern drucken möchten, z. B. C89 im Gegensatz zu C99, muss nur der Name gedruckt werden.
C89 build 32
ist gültig, solangeerror in C89 build 32: foo bar
nicht. - Ihr Programm verwendet möglicherweise keine eingebauten, Makro- oder benutzerdefinierten Compiler-Flags, um die Sprachversion zu ermitteln.
Wertung
Ihre Punktzahl ergibt sich aus der Codelänge geteilt durch die Anzahl der Versionen, in denen es funktioniert. Die niedrigste Punktzahl gewinnt, viel Glück!
(number of languages)^3 / (byte count)
.Antworten:
Ernsthaft und tatsächlich , 3 Bytes, 1,5 Punkte
Probieren Sie es online aus: Wirklich , im Ernst
Erläuterung:
u
undD
mit Funktionalität für Zeichenfolgen wurde nur in Actually (das ist Seriously v2) hinzugefügt.quelle
v1
Filiale. Vor Ernsthaft veraltet, hat er sich tatsächlich in derv2
Filiale aufgehalten . Darüber hinaus1.x
werden in Releases ernsthaft verwendete Versionsnummern verwendet , während Tatsächlich verwendet2.x
(sowohl dort als auch auf PyPI ).Python 3.0 und Python 2, Punktzahl 6
(12 Bytes, 2 Versionen)
Probieren Sie es online aus:
Python 2
Python 3
Beruht auf der Tatsache, dass Python 3+ standardmäßig Float-Division verwendet, im Gegensatz zu Python 2, das Floor-Division verwendet.
quelle
Your program should work in at least two versions of your language.
in den mindestens zwei Versionen 2.7 und 3.0. Ich habe gewähltto print the full name or minor version numbers
.from __future__ import division
, Problem gelöst :)Java, 189 Bytes, 10 Versionen, Score = 18,9
Unterstützte Versionen:
1.0
,1.1
,1.2
,1.3
,1.4
,1.5
,1.6
,1.7
,1.8
und9
(Für frühere Ergebnisse überprüfen Sie den Verlauf !)
Führen Sie es auf Java 8 aus
Führen Sie es auf Java 9 oder höher aus
Ungolfed
Bitte beachten Sie, dass der Codeteil
return v<9?"1."+v:v;
(zuvorreturn(v<9?"1.":"")+v;
) mit allen Versionen zwischen Java 1.0 und Java 1.3 verglichen werden muss. Ich habe keine Java 1.3 oder frühere Installation zur Verfügung, um diese Syntax zu testen.Einführung
Die Java-Versionierung hat eine besondere Geschichte. Alle Versionen wurden historisch
1.x
einschließlich1.0
. Aber ... ab Java 9 und JEP223 wurde das Versionsschema von "using" auf "1.x
to" geändertx
. Das ist die intern bekannte Version. Wir haben also die folgende Tabelle (zusammengestellt mit Javadoc und Wikipedia ):Dieser Herausforderungseintrag entspricht der Versionsspalte in der obigen Tabelle, die in der Systemeigenschaft enthalten ist
"java.version"
.Erläuterung
Ziel ist es zu überprüfen, ab welcher Version eine Klasse existiert, da Java Code nicht mehr unterstützt, aber niemals entfernt. Der Code wurde speziell in Java 1.0 geschrieben, um mit allen Versionen kompatibel zu sein, da das JDK (größtenteils) Source-Forward-kompatibel ist .
Die Implementierung versucht, die kürzesten Klassennamen zu finden, die von jeder Version eingeführt wurden. Um jedoch Bytes zu erhalten, muss versucht werden, ein gemeinsames Unterpaket auszuwählen. Bisher fand ich das effizienteste Paket,
java.util
weil es mehrere wirklich kurz benannte Klassen enthält, die auf alle Java-Versionen verteilt sind.Um die tatsächliche Versionsnummer zu ermitteln, werden die Klassennamen nach der Einführung der Version sortiert. Dann versuche ich, jede Klasse nacheinander zu instanziieren und den Array-Index zu erhöhen. Wenn die Klasse existiert, fahren wir mit der nächsten fort, andernfalls lassen wir die Ausnahme vom
try
-block abfangen. Wenn dies erledigt ist, wird eine weitere Ausnahme ausgelöst, da es keine Klassen mehr gibt, deren Existenz wir überprüfen müssen.In jedem Fall verlässt der Thread den
try
-block mit einer Ausnahme. Diese Ausnahme wird nicht abgefangen, sondern dank desfinally
Blocks "-block" einfach in den Wartezustand versetzt. Dadurch wird die Ausnahmebedingung in den Wartezustand versetzt, indem tatsächlich ein Wert zurückgegeben wird,"1."+v
bei demv
es sich um den zuvor verwendeten Index handelt. Es kommt auch vor, dass dieser Index mit der Nebenversionsnummer von Java übereinstimmt.Ein wichtiger Teil des Golfspiels bestand darin,
java.util
für jede Version den kürzesten neuen Klassennamen im Paket (oder in einem beliebigen Kinderpaket) zu finden. Hier ist die Tabelle, die ich verwendet habe, um diese Kosten zu berechnen.Credits
Box-Try-Catch-Denken!finally
Trick.return(i<9?"1.":"")+i;
durchreturn i<9?"1."+i:i;
(dies muss gegen 1.0 oder höchstens 1.3 validiert werden, da vor 1.4 keine Syntaxänderungen stattgefunden haben)Mit eingebauten
Wenn Builtins erlaubt wären:
54 Bytes für 13 Versionen (von 1,0 bis 12), die Punktzahl würde also 4,1538 betragen.
quelle
return"...
ohne Leerzeichen in allen Versionen tbh möglich ist.)String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
finally{return"1."+i;}
.Python , 606 Bytes / 15 Versionen = Punktzahl 40,4
-67 Bytes (lol) dank NoOneIsHere.
Die Versionen sind 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2.5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 und 3.6 .
Alles Verdienst der erstaunlichen Antwort von Sp3000 . Der abschließende Zeilenumbruch ist erforderlich.
Whee, das hat Spaß gemacht, Golf zu spielen. Dies sollte funktionieren (ja, ich habe jede dieser Versionen installiert), aber möglicherweise habe ich versehentlich etwas kaputtgemacht. Wenn jemand einen Fehler findet, lassen Sie es mich bitte wissen.
quelle
print'0.9.1'
da die Syntax ungültig ist.print
Anruf Klammern setzt ... Vielen Dank, dass Sie es mich wissen lassen!except
s durch ersetzenexcept:
).x=<string inside eval>
den Code nicht einfach manuell auswerten?1/0
, aber dann wurde mir klar. Vielen Dank!C ++ 14.11.17, Score = 147/3 = 49
Zur Unterscheidung zwischen C ++ 11 und C ++
const
14/17 wird die Änderung der Standardeinstellung der Elementfunktionenconstexpr
in C ++ 14 verwendet (das Beispiel hierzu finden Sie unter https://stackoverflow.com/questions/23980929/). Was-ändert-in-c14-eingeführt-kann-möglicherweise-ein-in-c1 ) geschriebenes-Programm-brechen . Zur Unterscheidung zwischen C ++ 14 und C ++ 17 wird die Tatsache verwendet, dass C ++ 17 Trigraphen deaktiviert hat.Ungolfed:
(Getestet mit Debian gcc 7.1.0 unter
-std=c++{11,14,17}
.)quelle
include
und<
in den include-Anweisungen als Golf spielen können#include<iostream>
.__cplusplus
Makro verwenden) zu verbieten, würde ich, um C ++ 17 von C ++ 14 zu unterscheiden, die Änderung in bereichsbasiert verwenden für die Semantik. Erstellen Sie möglicherweise minimale Iterator- / Sentinel-Klassen in der Art,boost::integer_iterator
dass das Konvertieren von Sentinel in Iterator ein "überraschendes" Verhalten aufweist.return 0;
ist implizit fürmain
so können Sie 9 Bytes dort speichern. Ebenfalls verwendetwc -c
Ihre Lösung 251 Bytes und nicht 252 (Ihr Editor hat möglicherweise eine neue Zeile am Ende eingefügt).return *
=>return*
EcmaScript 3/5/2015/2016/2017 im Browser, 59 Bytes / 5 Versionen = 11,8 Punkte
1 Byte sparen dank GOTO 0
quelle
-!
anstatt+!!
wo es Sinn macht (und die numerischen Konstanten entsprechend ändern).JavaScript (ES5 & ES6), 14 Byte / 2 Versionen = 7
0o
-Stil-Oktalkonstanten sind neu in ES6; ES5 wandelt den String um, aufNaN
den sich das Ergebnis des bitweisen XOR nicht auswirkt.quelle
JavaScript (ES 2, 3 & 5 -
89),59/6= 9,833 75/7 = 10,714Kann die Lösung auch mit mehr Versionen einreichen, auch wenn sie etwas höher ist als die Lösung mit zwei Versionen.
Probieren Sie es online aus
Überprüft das Vorhandensein verschiedener Methoden in den Array-, RegExp- und String-Prototypen, negiert sie mit einem Booleschen Wert und subtrahiert diesen Booleschen Wert von einem Anfangswert von 9. Die Multiplikation der
![].map
Konten für die Tatsache, dass ES4 aufgegeben wurde.dotAll
Eigenschaft (und das zugehöriges
Flag) für reguläre Ausdrücke wurde in ES2018 (v9) eingeführt.padEnd
String-Methode wurde in ES2017 (v8) eingeführt.includes
Array-Methode wurde in ES2016 (v7) eingeführt.keys
Array-Methode wurde in ES2015 (v6) eingeführt.map
Array - Verfahren wurde eingeführt ES5.1 (v5).pop
Array-Methode wurde in ES3 (v3) eingeführt.quelle
PHP 5/7, Score 5.5
3V4L es online!
PHP 5.3.9 / 5.3.11, Punktzahl 10
3V4L es online!
Die Online-Version ist länger, da in alten PHP-Versionen auf der Sandbox keine kurzen Tags aktiviert sind.
quelle
Befunge:
1511 Bytes / 2 Versionen = 5.54 Bytes von @ Pietu1998 abgeschnitten
Probieren Sie es online aus:
Befunge 93
Befunge 98
Verwendet den Befunge 98-exklusiven Semikolon-Operator ("zum nächsten Semikolon springen"), um Versionen zu unterscheiden. Beide geben "9" aus. Befunge 93 ignoriert die Semikolons, subtrahiert 5 von "8" (Wert links oben auf dem Stapel), gibt die resultierende "3" aus und beendet den Vorgang. Befunge 98 hingegen überspringt, druckt "8" und beendet.
quelle
"89",;5-;,@
für 11 Bytes;
Teil herausgefunden.Pyth 4/5 - 6 Bytes / 2 Versionen = 3
In Pyth 5 wird eine gerade Anzahl von Leerzeichen am Zeilenanfang beim Einrücken ignoriert, während sie in Pyth 4 nur wie ein einzelnes Leerzeichen fungiert und das Drucken der Zeichen verhindert
5
. In Pyth 4 beenden Semikolons nur Anweisungen, die das4
Drucken ermöglichen, während in Pyth 5 ein Leerzeichen und ein Semikolon den Rest der Zeile zu einem Kommentar machen.quelle
Python 3 und Python 2.0, 18 Bytes, erzielen 18/2 = 9
Bankerrundung in Python 3, Standardrundung in Python 2.
Probieren Sie es online aus - Python 3!
Probieren Sie es online aus - Python 2!
quelle
Kubisch 4 Bytes, Punktzahl 4 / ∞
Funktioniert in jeder Version, in der Ihr System über genügend Arbeitsspeicher verfügt. Wettbewerbsverbot, weil es lahm ist. Gültig für diesen Metapost .
Grundsätzlich dreht B3 eine Reihe von der linken Seite in die obere Seite. F3 würde genauso gut funktionieren wie F & sub1; & sub3; oder B & sub1; & sub3 ;. Da eine Reihe in Cubically 3x3x3 aus drei Würfeln pro Würfel besteht, werden drei Würfel
1
in die obere Fläche eingefügt, sodass eine%0
Flächensumme von 3 entsteht. Diese obere Flächensumme wird gedruckt, wobei 3 für Cubically 3 x3x3 gedruckt wird.In Cubically 4x4x4 sind Zeilen 4x1 Cubies. Setzt 4 Einsen auf die Oberseite und ergibt eine Summe von 4.
quelle
x86 16/32/64-Bit-Computercode: 11 Byte, Score = 3,66
Diese Funktion gibt den aktuellen Modus (Standardoperandengröße) als Ganzzahl in AL zurück. Nennen Sie es von C mit Unterschrift
uint8_t modedetect(void);
NASM-Maschinencode + Quellenliste (zeigt, wie es im 16-Bit-Modus funktioniert, da
BITS 16
NASM angewiesen wird, die Quellmnemoniken für den 16-Bit-Modus zusammenzustellen.)Begründung :
Der x86-Maschinencode hat offiziell keine Versionsnummern, aber ich denke, dies befriedigt die Absicht der Frage, indem bestimmte Nummern erzeugt werden müssen, anstatt zu wählen, was am bequemsten ist (das dauert nur 7 Bytes, siehe unten).
Die ursprüngliche x86-CPU, Intels 8086, unterstützte nur 16-Bit-Maschinencode. 80386 führte den 32-Bit-Maschinencode ein (verwendbar im geschützten 32-Bit-Modus und später im Kompatibilitätsmodus unter einem 64-Bit-Betriebssystem). AMD hat 64-Bit-Maschinencode eingeführt, der im Langzeitmodus verwendet werden kann. Hierbei handelt es sich um Versionen der x86-Maschinensprache in demselben Sinne wie bei Python2 und Python3 um unterschiedliche Sprachversionen. Sie sind größtenteils kompatibel, aber mit absichtlichen Änderungen. Sie können ausführbare 32- oder 64-Bit-Dateien direkt unter einem 64-Bit-Betriebssystemkern ausführen, genauso wie Sie Python2- und Python3-Programme ausführen können.
Wie es funktioniert:
Beginnen Sie mit
al=64
. Verschieben Sie ihn um 1 (32-Bit-Modus) oder 2 (16-Bit-Modus) nach rechts.16/32 vs. 64-Bit: Die 1-Byte
inc
/dec
Codierungen sind REX-Präfixe in 64-Bit ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W beeinflusst einige Anweisungen überhaupt nicht (z. B. einjmp
oderjcc
), aber in diesem Fall wollte ich, um 16/32/64 zu erhalten, eher inc oder dececx
alseax
. Das setzt auchREX.B
, was das Zielregister ändert. Aber zum Glück können wir das schaffen, aber die Einrichtung von 64-Bit muss nicht verschoben werdenal
.Die Anweisung (en), die nur im 16-Bit-Modus ausgeführt werden, können u. A. Enthalten
ret
, ich fand dies jedoch nicht erforderlich oder hilfreich. (Und würde es unmöglich machen, als Code-Fragment inline zu gehen, falls Sie das wollten). Es könnte auch einejmp
innerhalb der Funktion sein.16-Bit vs. 32/64: Sofort sind 16-Bit statt 32-Bit. Durch Ändern der Modi kann die Länge eines Befehls geändert werden. Daher decodieren 32/64-Bit-Modi die nächsten zwei Bytes als Teil des unmittelbaren Befehls und nicht als separater Befehl. Ich habe die Dinge einfach gehalten, indem ich hier einen 2-Byte-Befehl verwendet habe, anstatt die Dekodierung nicht synchron zu machen, damit der 16-Bit-Modus aus anderen Befehlsgrenzen als 32/64 dekodiert.
Verwandte Themen: Das Präfix für die Operandengröße ändert die Länge des Direktzugriffs (sofern es sich nicht um einen vorzeichenerweiterten 8-Bit-Direktzugriff handelt), genau wie der Unterschied zwischen 16-Bit- und 32/64-Bit-Modus. Dies macht es schwierig, eine Befehlslängendecodierung parallel durchzuführen; Intel-CPUs haben LCP-Dekodierungsstopps .
Die meisten Aufrufkonventionen (einschließlich der x86-32- und x86-64-System-V-psABIs) ermöglichen enge Rückgabewerte, die in den hohen Bits des Registers fehlerhaft sind. Sie ermöglichen auch das Clobbern von CX / ECX / RCX (und R8 für 64-Bit). IDK, wenn das in 16-Bit-Aufrufkonventionen üblich war, aber das ist Codegolf, also kann ich immer sagen, dass es sowieso eine benutzerdefinierte Aufrufkonvention ist.
32-Bit-Demontage :
64-Bit-Demontage ( Online ausprobieren! ):
Verwandte: meine x86-32 / x86-64 polyglotten Maschinencode Q & A auf SO.
Ein weiterer Unterschied zwischen 16-Bit und 32/64 besteht darin, dass die Adressierungsmodi unterschiedlich codiert sind. zB
lea eax, [rax+2]
(8D 40 02
) dekodiert wielea ax, [bx+si+0x2]
im 16-Bit-Modus. Dies ist offensichtlich schwierig für Code-Golf zu verwenden, zumale/rbx
unde/rsi
in vielen Call-Konventionen die Call-Erhaltung gewährleistet ist.Ich habe auch überlegt, das 10-Byte-Format zu verwenden
mov r64, imm64
, das REX + istmov r32,imm32
. Da ich aber bereits eine 11-Byte-Lösung hatte, wäre dies bestenfalls gleich (10 Byte + 1 fürret
).Testcode für 32- und 64-Bit-Modus. (Ich habe es noch nicht im 16-Bit-Modus ausgeführt, aber die Disassembly gibt an, wie es dekodiert wird. Ich habe keinen 16-Bit-Emulator eingerichtet.)
Dieses Linux-Programm wird mit exit-status = beendet
modedetect()
. Führen Sie es also aus als./a.out; echo $?
. Bauen Sie es zusammen und verknüpfen Sie es in eine statische Binärdatei, z7 Bytes (Punktzahl = 2,33), wenn ich die Versionen 1, 2, 3 nummerieren kann
Es gibt keine offiziellen Versionsnummern für verschiedene x86-Modi. Ich schreibe einfach gerne asm Antworten. Ich denke, es würde die Absicht der Frage verletzen, wenn ich nur die Modi 1,2,3 oder 0,1,2 nenne, weil der Punkt darin besteht, Sie zu zwingen, eine unbequeme Zahl zu erzeugen. Aber wenn das erlaubt war:
Welches dekodiert im 32-Bit-Modus als
und 64-Bit als
quelle
python2
vs.python3
-Interpretern auf demselben Python-Programm. Neue x86-CPUs enthalten immer einen Modus, der mit älteren CPUs kompatibel ist (dies ist die einzige Entschuldigung für die Verwendung eines derart verschachtelten, schwer zu decodierenden Maschinencode-Formats!), Aber der 32-Bit-geschützte Modus von 386 und der lange Modus von x86-64 sind es wirklich neue Versionen von x86-Maschinencode. Im Langmodus wurden sogar einige Opcodes entfernt, wodurch sie ungültig wurden.Brachylog / Brachylog v1 , 5/2 = 2,5
Probieren Sie es online! (Brachylog)
Probieren Sie es online! (Brachylog v1)
Erklärung für Brachylog:
Erklärung für Brachylog v1:
quelle
2,1
konstruiert Brachylog v2 nicht die Liste[2,1]
(2;1
würde), sondern die Zahl21
(was nicht die Art und Weise ändert, wie Sie Ihre Antwort auf die Arbeit beabsichtigten).2;1
hätte in Brachylog v1 nicht als;
logisches ODER dort gearbeitet.C89 / C99, 25 Bytes, 2 Versionen, Score = 12,5
//
Stilkommentare werden in C89 nicht erkannt.Golf Version:
Versuchen Sie es online: C89 , C99
quelle
int v()
mitmain()
, es ist kürzer und wird tatsächlich als komplettes Programm kompiliert!Perl 5 und Perl 6,
23 Bytes,19 Bytes, Punktzahl 9,5Perl 5
grep
first op wird immer als regulärer Ausdruck behandelt, nicht so in Perl 6.quelle
Bash, alle 4 Versionen,
727132 Bytes ⇒ Score = 8In diesem Codeteil werden
$'...'
in jeder Version von Bash unterschiedliche Interpretationen von Zeichenfolgen verwendet.Gibt die Hauptversionsnummer aus - und das wars.
Doc hier gefunden .
Ungolfed:
Diese Antwort ist zur Hälfte eine Vermutung; Ich habe es nur in Bash 4 und 3 getestet, aber es sollte auch in anderen Versionen funktionieren.
Lassen Sie mich wissen, wenn dies nicht der Fall ist. Ich werde es mit anderen Versionen versuchen, sobald sie verfügbar sind.
-1 char danke an Jens.
-29 Bytes dank Digital Trauma (die ganze
expr
Idee)!quelle
;;
in der letzten Alternative. Verwenden Sie;
diese Option, um ein Byte zu entfernen.$'\xN
funktion scheint in 2.01.1 hinzugefügt worden zu sein ... ich werde meine antwort aktualisieren müssen. Arbeiten darans="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
s=$'\ua\xa\n';expr 5 - ${#s} / 2
. Dies funktioniert auf v3 und v4. Ich habe noch keine älteren Versionen zum Ausprobieren.R, Version 2 und 3, Punktzahl: 10,5 Punkte
Dieser Befehl wird
2
für R 2.xx und3
R 3.xx zurückgegeben. Die Funktioncite
wurde in R Version 3.0.0 hinzugefügt. Daherexists("cite")
kehrt der BefehlFALSE
für R 2.xx undTRUE
für R 3.xx zurückR, alle Versionen (1, 2 und 3), Punktzahl: 12⅓ Punkte
Die Funktion
eapply
wurde in R 2.0.0 eingeführt.quelle
R.version$major
. 15 Zeichen. Ich nicht seit wann es existiert.Python , 196 Bytes / 16 Versionen = Punktzahl 12,25
Die Versionen sind 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5 und 3.6.
Leider musste ich 2.7 weglassen, da keine Module enthalten sind es ist (soweit ich das beurteilen kann) nicht in 2.6 sondern in 3.0.
Wir durchlaufen eine Reihe von Modulen, die in verschiedenen Versionen von Python eingeführt wurden, und beim ersten Fehler beenden wir die Version und geben sie zurück. Die Lücken zwischen den Hauptversionen werden durch wiederholtes Importieren geschlossen
os
. Der Test für Python 1.5 basiert daraufstring.split
, dass er erst ab 1.6 verfügbar ist.Dank an Olivier Grégoire für die Idee, neue Klassen / Module in einer Schleife zu testen.
Ich habe jetzt endlich alle relevanten Versionen von Python getestet ... was das Bearbeiten des 1.5-Quellcodes erforderte, um es zu kompilieren ...
quelle
Windows-Batchdatei , 35 Byte / 2 Versionen = Punktzahl 17,5
Druckt
DOS
unter MS-DOS (duh) undNT
Windows NT. (duh)Nun zur Erklärung.
Windows verwendet seit MS-DOS-Zeiten Batch-Skripte und hat sich seitdem kaum verändert. Als Windows NT hinzukam, änderte Microsoft jedoch den Standardinterpreter für Stapelskripte von
COMMAND.COM
aufcmd.exe
(und erlaubte nun auch die Erweiterung.cmd
als Alternative zum Original.bat
).Damit haben sie auch einige Änderungen implementiert , wie z. B. das
/i
Flag zum Ignorieren von Groß- und Kleinschreibung bei Bedingungen. Das heißt, währendZ==z
es falsch ist,/i Z==z
ist es wahr.Wir nutzen aus, dass DOS keine Unterscheidung zwischen Groß-
Z
und Kleinschreibung aufwies, und vergleichen Groß- und Kleinschreibungz
. Durch die Verwendung des/i
Flags erhalten wir eineZ==z
(falsche) Bedingung für DOS undz==z
(true) für NT.Jetzt ist mir klar, dass die Herausforderung angibt, dass eine Versionsnummer gedruckt werden soll. Soweit ich weiß, gibt es jedoch keine 'Versionsnummer' für Batch-Skripte. Dies ist also die nächstgelegene, die ich bekommen könnte.
Getestet unter Windows 10, DOSBox und vDos:
Windows 10:
(mit
cmd /k
ausführen, um das Schließen des Fensters zu verhindernexit
)DOSBox:
vDos:
quelle
7
ist kürzer als WindowsNT
.7
ist es nicht wirklich eine Sprachversion, es ist seit 3.1 auf allen Windows gleich. Ich dachte nicht, dass es sehr fair wäre, es einen zu nennen,7
wenn es vielleicht sogar so sein sollte3.1
Wolfram Language / Mathematica 10/11, 37 Bytes / 2 Versionen = 18.5
Betrachten Sie
(Length@DateRange[{1},{1}][[1]]+27)/3
, bei 37 Bytes und der Arbeit mit 2 Versionen, gibt mir eine Punktzahl von 18,5.und
Ich bin mir sicher, dass es einen effizienteren Weg gibt, aber die Diskrepanz zwischen der DateRange-Ausgabe hat mich kürzlich in den Hintern gebissen, also war ich entschlossen, das zu verwenden.
In der Folge könnte wahrscheinlich jemand die Vorteile einer
Length@DateRange[{1}, {1}][[1]]
Evaluierung1
in Mathematica-Versionen 1 bis 8 nutzen, aber ich hatte keine Zeit, dies zu berücksichtigen .quelle
$Version
:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
$Version
zu demonstrieren, dass es das richtige Ergebnis in der richtigen Version ausgibt,$Version
ist nicht Teil meiner Antwort ...$VersionNumber
, aber stattdessen nennen Sie es$Version
. Meiner Meinung nach ist das Fleisch Ihres Programms dasLength@DateRange
Zeug, das nicht funktionieren würde, wenn Sie nicht$Version
nur die Vollversionsinformationen bereitstellen, die Sie dann verarbeiten, was daher gegen die Regeln verstößt.{1} Tr[1^#&@@%~DateRange~%]/3+9
(31 Bytes) oder sogar7+Length@Now
(12 Bytes)Ruby 1.x und 2.x, 20 Bytes, 10 Punkte
Basierend auf der
to_h
Methode, dieArray
in Ruby 2 für die Klasse eingeführt wurde .quelle
p [].to_h&&2rescue 1
etwas kürzer.Erlang, 180 Bytes, 11 Versionen, 16,36 Punkte
Mit Einrückung und Zeilenumbrüchen:
Getestet auf einer Nebenversion jeder Hauptversion seit 10:
Die Idee ist, dass jede Hauptversion mindestens ein neues zulässiges Argument für die Funktion hinzugefügt hat. Probieren Sie
erlang:system_info
also die in der Liste aufgeführten aus, zählen Sie, wie viele von ihnen fehlschlagen, und subtrahieren Sie die Anzahl der Fehler von 20, der aktuellen Version.quelle
Julia 0,4, 0,5, 46 Bytes, Punktzahl 22
Julia hat den Typnamen der konkreten und abstrakten String-Typen in vielen Versionen geändert.
Dieser Code bietet insbesondere folgende Vorteile:
Julia 0.4 :
ASCIIString
,AbstractString
,String
.Julia 0.5 :
String
,ASCIIString
,AbstractString
(obwohl das hier keine Rolle spielt)Siehe auch meine neuere effektivere Lösung, die auf verschiedenen Prinzipien basiert
quelle
Japt (1 & 2),
86/2 =43Test v1 | Test v2
Erläuterung
Vor Version 2 verwendete Japt eine angepasste RegEx-Syntax, sodass wir diese nutzen können.
Die Nummer 1 als Zeichenfolge.
Ersetzen Sie (
r
) das unten stehende durch a2
.Japt 2 sieht dies als den RegEx an
/\S/g
, der dem entspricht1
. Japt 1 ignoriert das\
Escape-Zeichen und sieht nur dasS
, was die Japt-Konstante für ein Leerzeichen ist und offensichtlich nicht mit dem übereinstimmt1
.quelle
Befunge, score = 3.5
7 Bytes, 2 Versionen
Versuchen Sie es online in Befunge-93
Versuchen Sie es online in Befunge-98
"]"
ist in beiden Versionen ein String-Literal, das 93 (den ASCII-Wert von[
) auf den Stack schiebt .'b
ist ein Zeichenliteral in Befunge-98, das 98 (den ASCII-Wert vonb
) drückt , aber dies sind ungültige Anweisungen in Befunge-93, sodass sie einfach ignoriert werden. Wir beenden also mit 93 oben auf dem Stapel in Befunge-93 und 98 in Befunge-98..@
Schreibt den Wert oben auf den Stapel und beendet ihn dann.quelle
]"[email protected]'
oder][email protected]'
auch arbeitenRuby 1.x (<1,9) und 2.x,
108 Bytes, Score = 4Versuch es:
Dies funktioniert, indem die unterschiedlichen Verhaltensweisen von
?x
Ruby 1.x und 2.x ausgenutzt werden . In Ruby 1.x wird?A
(zum Beispiel)65
der ASCII-Wert des Zeichens zurückgegebenA
, in Ruby 2.0 jedoch die Zeichenfolge mit einem Zeichen"A"
.Der obige Code ist äquivalent dazu:
In Ruby 1.x (<1,9), der Wert
val
ist50
(der ASCII - Wert des Zeichens2
), ein Fixnum.Fixnum#%
ist der Modulo-Operator, also50 % 7
kehrt er zurück1
.In Ruby 2.x
val
ist die Zeichenfolge"2"
.String#%
ist eine Infix-Version vonsprintf
,"2" % 7
entspricht alsosprintf("2", 7)
, wo"2"
ist der Format-String. Da der Formatstring keine Formatsequenzen enthält (z. B.%d
), werden nachfolgende Argumente verworfen und"2"
zurückgegeben.Ist schließlich
$>
ein Alias für$stdout
, so wird$> << ...
das Ergebnis gedruckt.quelle
?A==66?1:2
bevor ich auf Ihre AntwortPython 2 und Python 3 ,
3634 Bytes, Punktzahl1817In Python 2 ist der Hash mit der negativen Unendlichkeit -271828, in Python 3 -314159. Bearbeiten: 2 Bytes, 1 Punkt, dank @ArBo gespeichert.
quelle
hash
verwendete der relevante Entwickler als Hash-Werte pi * 1e5 und e * -1e5, als es das erste Mal festgelegt wurde, um an Gleitkomma-Unendlichkeiten zu arbeiten. Irgendwann in Python 3 wurde der Has-Wert für die negative Unendlichkeit in die Negation des Hash-Werts für die Unendlichkeit geändert.Python 3 , Python 2 , Punktzahl 17,5
(35 Bytes, 2 Versionen)
Python 2 , 35 Bytes
Probieren Sie es online!
Python 3 , 35 Bytes
Probieren Sie es online!
5 Bytes gespart dank ETHproductions
Keine gute Code Golf Antwort, aber eine massive Veränderung!
quelle
try:exec("print 2")\nexcept:print(3)