Twoim wyzwaniem jest napisanie poliglota, który działa w różnych wersjach Twojego języka. Po uruchomieniu zawsze wyświetla wersję językową.
Zasady
- Twój program powinien działać w co najmniej dwóch wersjach Twojego języka.
- Wyjście twojego programu powinno być tylko numerem wersji. Brak obcych danych.
- Twój program może użyć dowolnej metody w celu ustalenia numeru wersji. Jednak wynik musi być zgodny z regułą 2; niezależnie od tego, jaki numer wersji zostanie określony, wyjściem musi być tylko liczba.
- Twój program musi tylko wypisać główną wersję języka. Na przykład, w FooBar 12.3.456789-beta, twój program będzie musiał tylko wypisać 12.
- Jeśli Twój język umieszcza słowa lub symbole przed lub po numerze wersji, nie musisz ich wypisywać, a tylko numer. Na przykład w C89 twój program musi tylko drukować
89
, aw C ++ 0x twój program musi tylko drukować0
. - Jeśli zdecydujesz się wydrukować pełną nazwę lub drobne numery wersji, np. C89 w przeciwieństwie do C99, musisz wydrukować tylko nazwę.
C89 build 32
jest ważny, aerror in C89 build 32: foo bar
nie jest. - Twój program nie może używać wbudowanych, makr lub niestandardowych flag kompilatora do określania wersji językowej.
Punktacja
Twój wynik będzie równy długości kodu podzielonej przez liczbę wersji, w których działa. Najniższy wynik wygrywa, powodzenia!
(number of languages)^3 / (byte count)
.Odpowiedzi:
Poważnie i faktycznie , 3 bajty, wynik 1,5
Wypróbuj online: Właściwie , poważnie
Wyjaśnienie:
u
aD
funkcjonalność na łańcuchach została dodana tylko w rzeczywistości (czyli Seriously v2).źródło
v1
gałęzi. Przed poważnym zaniechaniem faktycznie mieszkał wv2
oddziale. Dodatkowo, poważnie używane1.x
numery wersji w wydaniach , podczas gdy faktycznie używa2.x
(zarówno tam, jak i na PyPI ).Python 3.0 i Python 2, wynik 6
(12 bajtów, 2 wersje)
Wypróbuj online:
Python 2
Python 3
Opiera się na tym, że Python 3+ domyślnie korzysta z podziału zmiennoprzecinkowego, w przeciwieństwie do Pythona 2, który używa podziału podłogowego.
źródło
Your program should work in at least two versions of your language.
Działa w co najmniej dwóch wersjach 2.7 i 3.0. Wybrałamto print the full name or minor version numbers
.from __future__ import division
, problem rozwiązany :)Java, 189 bajtów, 10 wersji, wynik = 18,9
Obsługiwane wersje:
1.0
,1.1
,1.2
,1.3
,1.4
,1.5
,1.6
,1.7
,1.8
i9
(W przypadku poprzednich wyników sprawdź historię !)
Uruchom na Javie 8
Uruchom na Javie 9 lub nowszej
Bez golfa
Należy pamiętać, że część kodu
return v<9?"1."+v:v;
(wcześniejreturn(v<9?"1.":"")+v;
) należy sprawdzić pod kątem dowolnej wersji zawartej między Java 1.0 a Java 1.3. Nie mam do dyspozycji żadnej instalacji Java 1.3 lub wcześniejszej, aby przetestować tę składnię.Wprowadzenie
Wersja Java ma specjalną historię. Wszystkie wersje historycznie
1.x
obejmowały1.0
. Ale ... począwszy od Java 9 i JEP223 , schematy wersji zmieniły się z używania1.x
nax
. Jest to wersja znana wewnętrznie. Mamy więc następującą tabelę (razem z Javadoc i Wikipedią ):Ten wpis wyzwania pasuje do kolumny wersji w powyższej tabeli, która jest zawarta we właściwości systemu
"java.version"
.Wyjaśnienie
Celem jest sprawdzenie, z której wersji klasa zaczyna istnieć, ponieważ Java przestaje kodować, ale nigdy go nie usuwa. Kod został napisany specjalnie w Javie 1.0, aby był zgodny ze wszystkimi wersjami, ponieważ JDK jest (przeważnie) kompatybilny ze źródłowymi źródłami .
Implementacja próbuje znaleźć najkrótsze nazwy klas wprowadzone przez każdą wersję. Chociaż, aby uzyskać bajty, należy spróbować wybrać wspólny sub-pakiet. Jak dotąd znalazłem najbardziej wydajny pakiet,
java.util
ponieważ zawiera kilka naprawdę krótkich klas rozmieszczonych we wszystkich wersjach Javy.Teraz, aby znaleźć rzeczywisty numer wersji, nazwy klas są sortowane według wprowadzenia wersji. Następnie próbuję po kolei zainicjować każdą klasę i zwiększyć indeks tablicy. Jeśli klasa istnieje,
try
przechodzimy do następnej, w przeciwnym razie pozwalamy na przechwycenie wyjątku przez -block. Po zakończeniu generowany jest kolejny wyjątek, ponieważ nie ma już klas, których istnienie musimy sprawdzić.W każdym razie wątek opuści
try
blok z wyjątkiem. Wyjątek ten nie zostanie złapany, ale po prostu zawieszone dziękifinally
-blok, co z kolei nadpisuje wyjątek on-hold przez rzeczywiście powrocie wartość, która jest"1."+v
tam gdziev
jest wskaźnik używany wcześniej. Zdarza się również, że dostosowaliśmy ten indeks do mniejszego numeru wersji Java.Ważną częścią gry w golfa było znalezienie najkrótszej nowej nazwy klasy w pakiecie
java.util
(lub dowolnym pakiecie dla dzieci) dla każdej wersji. Oto tabela, której użyłem do obliczenia tego kosztu.Kredyty
-Box-try-catch myślenie!finally
sztuczka.return(i<9?"1.":"")+i;
zreturn i<9?"1."+i:i;
(powinno być aktualizowane na 1,0 lub co najwyżej 1,3, gdyż nie zmienia się składni przed 1.4)Z wbudowanymi
Jeśli wbudowane były dozwolone:
54 bajty dla 13 wersji (od 1,0 do 12), więc wynik wyniósłby 4,1538.
źródło
return"...
bez miejsca jest możliwe we wszystkich wersjach tbh.)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 bajtów / 15 wersji = wynik 40,4
-67 bajtów (lol) dzięki NoOneIsHere.
Dostępne wersje to 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 aa oraz 3.6 .
Wyrazy uznania dla niesamowitej odpowiedzi SP3000 jest . Końcowy znak nowej linii jest konieczny.
Whee, fajnie było grać w golfa. Powinno to działać (tak, zainstalowałem każdą z tych wersji), ale mogłem przypadkowo coś zepsuć. Jeśli ktoś znajdzie błąd, daj mi znać.
źródło
print'0.9.1'
niepoprawnej składni.print
połączeniu ... Dziękuję za informację!except
s naexcept:
).x=<string inside eval>
zamiast ręcznie sprawdzać kod?1/0
, ale potem zdałem sobie sprawę. Dzięki!C ++ 11/14/17, wynik = 147/3 = 49
Aby rozróżnić C ++ 11 i C ++ 14/17, wykorzystuje zmianę domyślnej funkcji funkcji
const
składowychconstexpr
w C ++ 14 (dzięki przykładowi na https://stackoverflow.com/questions/23980929/ what-zmiany-wprowadzone-w-c14-może-potencjalnie-złamać-program-napisany w-c1 ). Aby odróżnić C ++ 14 od C ++ 17, wykorzystuje fakt, że C ++ 17 wyłączał trygrafy.Nie golfowany:
(Testowane przy użyciu Debiana gcc 7.1.0 przy użyciu
-std=c++{11,14,17}
.)źródło
include
„<
in” w instrukcjach dołączania#include<iostream>
.__cplusplus
makra) - to w celu odróżnienia C ++ 17 od C ++ 14 skłaniam się ku zastosowaniu zmiany w zakresie dla semantyki. Może stwórz minimalne klasy iteratora / wartownika wboost::integer_iterator
taki sposób, aby konwersja wartownika na iterator miała „zaskakujące” zachowanie.return 0;
jest niejawny,main
więc możesz tam zapisać 9 bajtów. Również wedługwc -c
twojego rozwiązania używa 251 bajtów, a nie 252 (twój edytor mógł wstawić nowy wiersz na końcu).return *
=>return*
EcmaScript 3/5/2015/2016/2017 w przeglądarce, 59 bajtów / 5 wersji = 11,8 punktów
Zaoszczędź 1 bajt dzięki GOTO 0
źródło
-!
zamiast tego,+!!
gdzie ma to sens (i odpowiednio zmienić stałe liczbowe).JavaScript (ES5 i ES6), 14 bajtów / 2 wersje = 7
0o
-stałe ósemkowe są nowe w ES6; ES5 rzutuje ciąg, naNaN
który nie wpływa na wynik bitowego XOR.źródło
JavaScript (ES 2, 3 i 5 -
89)59/6 = 9,83375/7 = 10,714Może również przesłać rozwiązanie z większą liczbą wersji, nawet jeśli jego wynik będzie nieco wyższy niż w przypadku rozwiązania 2-wersyjnego.
Wypróbuj online
Sprawdza obecność różnych metod w prototypach Array, RegExp i String, neguje je, dając wartość logiczną, i odejmuje tę wartość logiczną od wartości początkowej 9. Mnożenie
![].map
kont za fakt, że ES4 został porzucony.dotAll
Nieruchomość (i związane zs
flag) dla wyrażeń regularnych został wprowadzony w ES2018 (v9).padEnd
Sposób ciąg wprowadzono ES2017 (V8).includes
Array została wprowadzona w ES2016 (v7).keys
Array została wprowadzona w ES2015 (v6).map
Array została wprowadzona w ES5.1 (v5).pop
Array została wprowadzona w ES3 (v3).źródło
PHP 5/7, wynik 5,5
3V4L to online!
PHP 5.3.9 / 5.3.11, wynik 10
3V4L to online!
Wersja online jest dłuższa, ponieważ stare wersje PHP w piaskownicy nie mają włączonych krótkich tagów.
źródło
Befunge:
1511 bajtów / 2 wersje = 5.54 bajty wygolone przez @ Pietu1998
Wypróbuj online:
Befunge 93
Befunge 98
Używa wyłącznego operatora średników Befunge 98 („przejdź do następnego średnika”) w celu rozróżnienia wersji. Oba wydrukują „9”. Befunge 93 zignoruje średniki, odejmie 5 od „8” (wartość pozostawiona na górze stosu), wydrukuje wynikowe „3” i zakończy. Z kolei Befunge 98 przeskoczy, wydrukuje „8” i zakończy działanie.
źródło
"89",;5-;,@
dla 11 bajtów;
część.Pyth 4/5 - 6 bajtów / 2 wersje = 3
W Pyth 5 parzysta ilość spacji na początku wiersza jest ignorowana do użycia przy wcięciach, podczas gdy w Pyth 4 działa tylko jak pojedyncza spacja i uniemożliwia wydrukowanie
5
. W Pyth 4 średniki kończą instrukcje, co pozwala na4
wydrukowanie, podczas gdy w Pyth 5 spacja i średnik sprawiają, że reszta wiersza jest komentarzem.źródło
Python 3 i Python 2.0, 18 bajtów, wynik 18/2 = 9
Zaokrąglanie bankiera w Pythonie 3, standardowe zaokrąglanie w Pythonie 2.
Wypróbuj online - Python 3!
Wypróbuj online - Python 2!
źródło
Sześciennie, 4 bajty, wynik 4 / ∞
Działa w każdej wersji twojego systemu ma wystarczającą ilość pamięci do uruchomienia. Nie konkuruje, bo jest kiepski. Ważne dla tego posta .
Zasadniczo B3 obraca jeden rząd od lewej powierzchni do górnej powierzchni. F3 działałoby równie dobrze, jak F₁3 lub B₁3. Ponieważ jeden rząd w Cubical 3x3x3 ma trzy sześciany za jednym sześcianem, to umieszcza trzy
1
z nich w górnej powierzchni, co daje mu sumę twarzy 3.%0
drukuje sumę górnej powierzchni, drukując 3 dla Cubical 3 x3x3.W Cubically 4x4x4 rzędy to 4x1 cubies. Umieszcza 4 1 w górnej powierzchni, dając sumę 4.
źródło
x86 16/32/64-bitowy kod maszynowy: 11 bajtów, wynik = 3,66
Ta funkcja zwraca bieżący tryb (domyślny rozmiar argumentu) jako liczbę całkowitą w AL. Zadzwoń do niego z C z podpisem
uint8_t modedetect(void);
Kod maszynowy NASM + lista źródeł (pokazująca, jak to działa w trybie 16-bitowym, ponieważ
BITS 16
mówi NASM, aby zebrał źródłowe mnemoniki dla trybu 16-bitowego).Uzasadnienie :
Kod maszynowy x86 oficjalnie nie ma numerów wersji, ale myślę, że to spełnia cel pytania, ponieważ trzeba wytwarzać określone liczby, zamiast wybierać to, co jest najwygodniejsze (zajmuje to tylko 7 bajtów, patrz poniżej).
Oryginalny procesor x86, Intel 8086, obsługiwał tylko 16-bitowy kod maszynowy. 80386 wprowadził 32-bitowy kod maszynowy (dostępny w 32-bitowym trybie chronionym, a później w trybie kompatybilności w 64-bitowym systemie operacyjnym). AMD wprowadziło 64-bitowy kod maszynowy, który można stosować w trybie długim. Są to wersje języka maszynowego x86 w tym samym sensie, co Python2 i Python3 to różne wersje językowe. Są w większości kompatybilne, ale z celowymi zmianami. Możesz uruchamiać 32-bitowe lub 64-bitowe pliki wykonywalne bezpośrednio w 64-bitowym jądrze systemu operacyjnego w taki sam sposób jak w programach Python2 i Python3.
Jak to działa:
Zacznij od
al=64
. Przesuń go w prawo o 1 (tryb 32-bitowy) lub 2 (tryb 16-bitowy).16/32 a 64-bitowe: 1-bajtowe
inc
/dec
kodowanie to przedrostki REX w wersji 64-bitowej ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W nie wpływa w ogóle na niektóre instrukcje (np. Ajmp
lubjcc
), ale w tym przypadku, aby uzyskać 16/32/64, chciałemecx
raczej dodać lub zdecydowaćeax
. To także ustawiaREX.B
, co zmienia rejestr docelowy. Ale na szczęście możemy to zrobić, ale konfigurujemy tak, aby 64-bit nie musiał się zmieniaćal
.Instrukcje, które działają tylko w trybie 16-bitowym, mogą zawierać a
ret
, ale nie uważam tego za konieczne ani pomocne. (I uniemożliwiłoby wstawienie jako fragment kodu, na wypadek gdybyś chciał to zrobić). Może to być równieżjmp
funkcja.16-bit vs. 32/64: natychmiastowe są 16-bitowe zamiast 32-bitowe. Zmiana trybów może zmienić długość instrukcji, więc tryby 32/64 bit dekodują kolejne dwa bajty jako część instrukcji bezpośredniej, a nie oddzielnej instrukcji. Uprościłem to, używając tutaj instrukcji 2-bajtowej, zamiast zsynchronizować dekodowanie, aby tryb 16-bitowy dekodował z innych granic instrukcji niż 32/64.
Powiązane: Prefiks wielkości operandu zmienia długość natychmiastowego (chyba że jest to 8-bitowe bezpośrednie rozszerzenie z rozszerzeniem znaku), podobnie jak różnica między trybami 16-bitowymi i 32/64-bitowymi. Utrudnia to równoległe dekodowanie długości instrukcji; Procesory Intel mają przeciągnięcia dekodujące LCP .
Większość konwencji wywoływania (w tym psABI x86-32 i x86-64 System V) pozwala na wąskie zwracane wartości, które zawierają śmieci w wysokich bitach rejestru. Pozwalają również na clobbering CX / ECX / RCX (i R8 dla wersji 64-bitowej). IDK, jeśli było to powszechne w 16-bitowych konwencjach wywoływania, ale jest to kod golfowy, więc zawsze mogę po prostu powiedzieć, że jest to zwyczajowa konwencja wywołań.
Demontaż 32-bitowy :
Demontaż 64-bitowy ( wypróbuj online! ):
Powiązane: mój kod maszynowy x86-32 / x86-64 poliglota - pytania i odpowiedzi dotyczące SO.
Kolejna różnica między 16-bitem a 32/64 polega na tym, że tryby adresowania są kodowane inaczej. np.
lea eax, [rax+2]
(8D 40 02
) dekoduje jaklea ax, [bx+si+0x2]
w trybie 16-bitowym. Jest to oczywiście trudne do wykorzystania dla code-golf, zwłaszcza, żee/rbx
ie/rsi
są zadzwonić zachowane w wielu konwencjach telefonicznych.Zastanawiałem się również nad użyciem 10-bajtowego
mov r64, imm64
, którym jest REX +mov r32,imm32
. Ale ponieważ miałem już rozwiązanie 11-bajtowe, byłoby to w najlepszym razie równe (10 bajtów + 1 dlaret
).Kod testowy dla trybu 32 i 64-bitowego. (Właściwie nie wykonałem go w trybie 16-bitowym, ale deasemblacja mówi ci, jak będzie dekodować. Nie mam skonfigurowanego emulatora 16-bitowego).
Ten program Linux kończy działanie z kodem wyjścia =
modedetect()
, więc uruchom go jako./a.out; echo $?
. Złóż i połącz go w statyczny plik binarny, np7 bajtów (wynik = 2,33), jeśli mogę numerować wersje 1, 2, 3
Brak oficjalnych numerów wersji dla różnych trybów x86. Po prostu lubię pisać odpowiedzi na asm. Myślę, że naruszałoby to cel pytania, gdybym tylko wywołał tryby 1,2,3 lub 0,1,2, ponieważ chodzi o to, aby zmusić cię do wygenerowania niewygodnej liczby. Ale jeśli było to dozwolone:
Który dekoduje w trybie 32-bitowym jako
i 64-bitowy jak
źródło
python2
kontrapython3
interpretatory w tym samym programie Python. Nowe procesory x86 zawsze zawierają tryb kompatybilny ze starszymi procesorami (jest to ich jedyna wymówka dla użycia tak skomplikowanego, trudnego do odkodowania formatu kodu maszynowego!), Ale 326-bitowy tryb chroniony 386 i długi tryb x86-64 są naprawdę nowe wersje kodu maszynowego x86. Tryb długi nawet usunął niektóre kody, co czyni je nieważnymi.Brachylog / Brachylog v1 , 5/2 = 2,5
Wypróbuj online! (Brachylog)
Wypróbuj online! (Brachylog v1)
Wyjaśnienie dotyczące Brachylog:
Wyjaśnienie dotyczące Brachylog v1:
źródło
2,1
w Brachylog v2 nie konstruuje listy[2,1]
(2;1
zrobiłby), ale raczej liczbę21
(która nie zmienia sposobu, w jaki chciałeś, aby twoja odpowiedź działała).2;1
nie działałby w Brachylog v1, co;
oznacza logiczne LUB tam.C89 / C99, 25 bajtów, 2 wersje, wynik = 12,5
//
komentarze do stylu nie są rozpoznawane w C89.Wersja golfowa:
Wypróbuj online: C89 , C99
źródło
int v()
zmain()
, jest krótszy i będzie faktycznie skompilować jako kompletny program!Perl 5 i Perl 6,
23 bajty19 bajtów, wynik 9,5grep
Pierwsze działanie w Perlu 5 jest zawsze traktowane jako wyrażenie regularne, a nie w Perlu 6.źródło
Bash, wszystkie 4 wersje,
727132 bajty ⇒ wynik = 8Ten fragment kodu wykorzystuje różne interpretacje
$'...'
ciągów w każdej wersji Bash.Wysyła główny numer wersji - i to wszystko.
Doc znaleźć tutaj .
Nie golfowany:
Ta odpowiedź jest w połowie domysłem; Testowałem go tylko w bash 4 i 3, ale powinien działać również na innych wersjach.
Daj mi znać, jeśli to robi / nie działa, spróbuję z innymi wersjami, jak tylko będę dostępny.
-1 char dzięki Jens.
-29 bajtów dzięki Digital Trauma (cały
expr
pomysł)!źródło
;;
ostatniej alternatywy. Służy;
do golenia bajtu.$'\xN
wydaje się, że funkcja interpretacji została dodana w wersji 2.01.1 ... Będę musiał zaktualizować swoją odpowiedź. Pracuję nad tyms="$'\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
. Działa to na wersjach v3 i v4. Nie mam teraz działających starszych wersji do wypróbowania.R, wersje 2 i 3, wynik: 10,5 punktu
Ta komenda zwraca
2
dla wersji R 2.xx i3
R 3.xx Funkcjacite
została dodana w wersji R 3.0.0. Dlatego polecenieexists("cite")
zwracaFALSE
dla R 2.xx iTRUE
R 3.xxR, wszystkie wersje (1, 2 i 3), wynik: 12⅓ punktów
Funkcja
eapply
została wprowadzona w wersji 2.0.0.źródło
R.version$major
. 15 znaków. Nie wiem od kiedy to istnieje.Python , 196 bajtów / 16 wersji = wynik 12,25
Wersje to 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 i 3.6
Niestety musiałem pominąć 2.7, ponieważ nie ma żadnych modułów (o ile wiem) nie ma ich w wersji 2.6, ale w wersji 3.0.
Przechodzimy przez kilka modułów, które zostały wprowadzone w różnych wersjach Pythona, a przy pierwszym błędzie wychodzimy i zwracamy wersję. Luki między głównymi wersjami są uzupełniane przez wielokrotne importowanie
os
. Test dla Pythona 1.5 polega nastring.split
tym, że nie jest obecny do 1.6.Kredyt na odpowiedź Olivier Gregoire jest dla idei testowania nowych Zajęcia / modułów w pętli.
W końcu przetestowałem wszystkie odpowiednie wersje Pythona ... które wymagały edycji kodu źródłowego 1.5, aby go skompilować ...
źródło
Plik wsadowy systemu Windows , 35 bajtów / 2 wersje = wynik 17,5
Drukuje
DOS
na MS-DOS (duh) iNT
na Windows NT. (duh)Teraz trochę wyjaśnienia.
System Windows ma skrypty wsadowe od czasów MS-DOS i od tego czasu niewiele się zmieniło. Jednak gdy pojawił się Windows NT , Microsoft zmienił domyślny interpreter skryptów wsadowych z
COMMAND.COM
nacmd.exe
(teraz zezwala również na rozszerzenie.cmd
jako alternatywę dla oryginału.bat
).Dzięki temu zaimplementowali także kilka zmian , takich jak
/i
flaga ignorująca wielkość liter w warunkach. To znaczy, choćZ==z
jest fałszywe,/i Z==z
jest prawdą.Wykorzystujemy to, że DOS nie rozróżnia wielkości liter i porównujemy wielkie litery
Z
z małymiz
. Używając/i
flagi, otrzymujemyZ==z
(fałsz) zależny od DOS iz==z
(prawda) w NT.Teraz zdaję sobie sprawę, że wyzwanie określa, że należy wydrukować numer wersji. Ale, o ile mi wiadomo, nie ma „numeru wersji” do skryptowania wsadowego, więc jest to najbliższy możliwy sposób.
Testowane na Windows 10, DOSBox i vDos:
Windows 10:
(uruchom,
cmd /k
aby uniemożliwić zamknięcie oknaexit
)DOSBox:
vDos:
źródło
7
jest krótszy niż WindowsNT
.7
tak naprawdę nie jest wersją językową, jest taka sama we wszystkich systemach Windows od wersji 3.1. Więc nie sądziłem, że byłoby to sprawiedliwe nazwać to,7
kiedy powinno być3.1
Wolfram Language / Mathematica 10/11, 37 bajtów / 2 wersje = 18,5
Zastanów się
(Length@DateRange[{1},{1}][[1]]+27)/3
, przy 37 bajtach i pracy z 2 wersjami, daje mi wynik 18,5.i
Jestem pewien, że istnieje bardziej skuteczny sposób, ale ostatnio rozbieżność między danymi wyjściowymi DateRange ugryzła mnie w tyłek, więc postanowiłem to wykorzystać.
Jako kontynuację, ktoś prawdopodobnie mógłby skorzystać z
Length@DateRange[{1}, {1}][[1]]
ewaluacji1
w wersjach Mathematica 1- ~ 8, ale nie miałem czasu, aby to uwzględnić.źródło
$Version
:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
$Version
do wykazania, że wyświetla prawidłowy wynik w poprawnej wersji,$Version
nie jest częścią mojej odpowiedzi ...$VersionNumber
, ale zamiast tego nazywasz to$Version
. Moim zdaniem, podczas gdy mięso twojego programu toLength@DateRange
rzeczy, które nie działałyby bez$Version
dostarczenia pełnej informacji o wersji, którą następnie przetwarzasz, co narusza reguły.{1} Tr[1^#&@@%~DateRange~%]/3+9
(31 bajtów), a nawet7+Length@Now
(12 bajtów)Ruby 1.x i 2.x, 20 bajtów, wynik 10
Na podstawie
to_h
metody wprowadzonej wArray
klasie w Ruby 2.źródło
p [].to_h&&2rescue 1
jest nieco krótszy.Erlang, 180 bajtów, 11 wersji, wynik 16,36
Z wcięciem i podziałami linii:
Testowane na jednym mniejszym wydaniu każdej głównej wersji od 10:
Chodzi o to, że każda ważna wersja dodawała co najmniej jeden nowy dopuszczalny argument dla funkcji
erlang:system_info
, więc spróbujmy tych z listy, policz, ile z nich uległo awarii, i odejmij liczbę awarii od 20, czyli bieżącej wersji.źródło
Julia 0,4, 0,5, 46 bajtów, wynik 22
Julia zmieniła nazwę typu konkretnych i abstrakcyjnych typów ciągów w wielu wersjach.
Ten kod w szczególności wykorzystuje:
Julia 0.4 :
ASCIIString
,AbstractString
,String
.Julia 0.5 :
String
,ASCIIString
,AbstractString
(choć nie ma to tutaj znaczenia)Zobacz także moje nowsze, bardziej skuteczne rozwiązanie oparte na różnych zasadach
źródło
Japt (1 i 2),
86/2 =43Test v1 | Test v2
Wyjaśnienie
Przed wersją 2 Japt używał niestandardowej składni RegEx, dzięki czemu możemy to wykorzystać.
Liczba 1 jako ciąg.
Zamień (
r
) poniżej na2
.Japt 2 widzi to jako RegEx
/\S/g
, który pasuje do1
. Japt 1 ignoruje\
znak ucieczki i po prostu widziS
, która jest stałą Japt dla znaku spacji i, oczywiście, nie pasuje do1
.źródło
Befunge, wynik = 3,5
7 bajtów, 2 wersje
Wypróbuj online w Befunge-93
Wypróbuj online w Befunge-98
"]"
jest literałem ciągu w obu wersjach, wypychając 93 (wartość ASCII z[
) na stos.'b
jest dosłowną postacią w Befunge-98, wypychając 98 (wartość ASCIIb
), ale są to nieprawidłowe instrukcje w Befunge-93, więc są po prostu ignorowane. W ten sposób kończymy z 93 na górze stosu w Befunge-93 i 98 w Befunge-98..@
zapisuje wartość na górze stosu, a następnie kończy działanie.źródło
]"[email protected]'
lub][email protected]'
też pracaRubin 1.x (<1,9) i 2.x,
108 bajtów, wynik = 4Spróbuj:
Działa to poprzez wykorzystanie różnych zachowań
?x
między Ruby 1.xi 2.x. W Ruby 1.x?A
(na przykład) zwraca65
(wartość ASCII znakuA
), ale w Ruby 2.0 zwraca łańcuch jednoznakowy"A"
.Powyższy kod jest równoważny z tym:
W Ruby 1.x (<1.9) wartością
val
jest50
(wartość ASCII znaku2
), Fixnum.Fixnum#%
jest operatorem modulo, więc50 % 7
zwraca1
.W Ruby 2.x
val
jest ciągiem"2"
.String#%
jest wersją przedrostkowąsprintf
, więc"2" % 7
jest równoważne zsprintf("2", 7)
, gdzie"2"
jest ciąg formatu. Ponieważ ciąg formatu nie zawiera żadnych sekwencji formatujących (np.%d
), Kolejne argumenty są odrzucane i"2"
zwracane.Wreszcie
$>
jest pseudonimem$stdout
, więc$> << ...
drukuje wynik.źródło
?A==66?1:2
zanim natknąłem się na twoją odpowiedźPython 2 i Python 3 ,
3634 bajtów, wynik1817W Pythonie 2 skrót ujemnej nieskończoności wynosi -271828, ale w Pythonie 3 jest to -314159. Edycja: Zapisano 2 bajty, 1 punkt wyniku, dzięki @ArBo.
źródło
hash
raz pierwszy naprawiono go do pracy na nieskończonościach zmiennoprzecinkowych, odpowiedni programista użył pi * 1e5 i e * -1e5 jako wartości skrótu. W pewnym momencie w Pythonie 3 wartość hash dla nieskończoności została zmieniona na negację wartości hash dla nieskończoności.Python 3 , Python 2 , wynik 17,5
(35 bajtów, 2 wersje)
Python 2 , 35 bajtów
Wypróbuj online!
Python 3 , 35 bajtów
Wypróbuj online!
Zaoszczędzono 5 bajtów dzięki produktom ETH
Nie jest to dobra odpowiedź na golfa, ale ogromna zmiana!
źródło
try:exec("print 2")\nexcept:print(3)