Zainspirowany tym pytaniem na temat SO , Twoim zadaniem jest stworzenie programu, który będzie działał w (co najmniej) dwóch głównych wersjach wybranego języka, które generują różne wyniki.
Zasady
- Można użyć dowolnego języka, który ma więcej niż jedną wersję główną.
- Na potrzeby tego wyzwania sugerowałbym, że „wersja główna” to miejsce, w którym zmienia się pierwsza liczba w numerze wersji.
- PHP 4 i PHP 5 są różne, PHP 5.3 i PHP 5.4 nie są.
- Ponieważ jednak nie znam schematu wersjonowania dla wszystkich języków, jeśli możesz wystarczająco dobrze argumentować w swojej sprawie, jestem pewien, że społeczność określi, czy sam rzetelnie określiłeś „główną wersję”.
- Na potrzeby tego wyzwania sugerowałbym, że „wersja główna” to miejsce, w którym zmienia się pierwsza liczba w numerze wersji.
- Kod należy skompilować i uruchamiać za pomocą tych samych flag i wprowadzać za każdym razem
- Z wyjątkiem zmiany wersji języka, jeśli jest to istotne
- Błędy nie liczą się jako dane wyjściowe, a odpowiedzi, które powodują błędy, są dyskwalifikowane (zamiast tego wynik błędu jest po prostu ignorowany)
- Program nie powinien pobierać danych innych niż wymagane do uruchomienia.
- Dla każdej danej wersji wynik powinien być zawsze taki sam
- Chodzi o to, aby zmiana była konsekwencją zmiany specyfikacji języka, a nie specyfikacji VM lub metadanych środowiskowych
Punktacja
- ocena typu golf-kod dla długości, więc
+1
dla każdego znaku / bajtu -1
dla każdej różnicy w długości wyjściowej.- np. wyjścia w wersji 1
abcde
(5 znaków), wyjścia w wersji 2123abc
(6 znaków) =-1
- np. wyjścia w wersji 1
Inne zasady
- Obowiązują standardowe wyjątki - bez programów zewnętrznych, żądań internetowych itp.
- Twój program powinien zakończyć się (w ciągu 2 sekund)
- Najniższy wynik wygrywa.
Punktacja „lepsza”
Zachowaj oryginalne odpowiedzi, w trosce o sprawiedliwość, oznaczę zwycięzcę na podstawie oryginalnych zasad.
Ponieważ moja pierwotna punktacja jest zasadniczo zepsuta, dlaczego nie powtórzyć punktacji / spróbować ponownie za pomocą następującego systemu punktacji:
- ocena typu golf-kod dla długości, więc
+1
dla każdego znaku / bajtu +1
dla każdej różnicy długości wydrukuabcde
i123456
->+1
-1
dla każdej unikalnej różnicy znaków na wyjściu (ograniczona do długości najkrótszego wyniku)abcde
i123456
->-5
12345
i123456
->-1
12345
i123455
->0
- Wyniki najbliższe zerowej wygranej
- W przypadku drugiego remisu wygrywa prosty wynik golfowy .
code-challenge
James Webster
źródło
źródło
zzzz
iaaaa
czy to mi da-4
? Tak mi się wydaje.Odpowiedzi:
Poprawiona odpowiedź na „lepszy” system punktacji
C89 / C99, wynik: 0
Mój program ma 52 znaki i używa tego samego mechanizmu, co w mojej oryginalnej odpowiedzi, aby uzyskać różne wyniki. Działa to, ponieważ C89 nie traktuje
//
jako komentarza:Wyniki:
Stara odpowiedź:
C89 / C99, wynik: -Nieskończoność?
Nie jestem do końca pewien, czy ten program nie łamie zasad, ale nieważne. Ten program wykorzystuje fakt, że w C89
//
nie jest poprawnym komentarzem, ale/* ... */
jest.Za pomocą sztuczki komentowania wykonywana jest inna funkcja. W C89 funkcja drukuje tylko,
"trolololol..."
aż stos się przepełni (więc może zakończyć się w ciągu 2 sekund).C99
C89
źródło
Scores closest to zero win
więc w rzeczywistości jest to bardzo dalekie od zera.Python - 10 punktów mniej niż kolejna najlepsza odpowiedź
W Pythonie 2 to wypisze całą listę liczb całkowitych od 0 do 99.
W Pythonie 3
range
jest generatorem, więc wypisze tylko „zakres (0,100)”.Ponieważ nigdy nie spotkałem się z ograniczeniem wielkości liczb w Pythonie, mogę zastąpić to 100 znacznie większą liczbą (na przykład 2 ** 1000) i uzyskać praktycznie nieskończoną różnicę w wynikach.
Edytowane, aby odzwierciedlić fakt, że chociaż mogę uzyskać nieskończenie niski wynik dla dowolnego praktycznego celu, nie mogę osiągnąć faktycznej nieskończoności za pomocą programu, który kończy się poniżej 2 sekund
W przypadku zaktualizowanego systemu punktacji rozstrzygającego przesyłam:
Wydajność:
Python 2:
[0, 1, 2, 3]
Python 3:
range(0, 4)
Pierwszy wydruk ma 5 unikalnych znaków (
[123]
), drugi wydruk ma 8 unikalnych znaków (range(4)
), różnica w długości wydruku wynosi 1, kod ma 15 znaków, najkrótszy wynik to 11 znaków ... zasady te są dość mylące, ale Myślę, że to prowadzi mnie do końcowego wyniku 15 + 1 min (11,5 + 8) = 5.źródło
Python - 0 punktów
Nie mam pojęcia, jak to działa: P Natknąłem się na niego podczas wypróbowywania losowego kodu.
W Pythonie 3 jest
<class 'int'>
i w Pythonie 2<type 'int'>
(przy użyciu konsoli interaktywnej)Wynik „Lepszy”: 3 (długość) + 1 (różn. Char.) - 4 (unikatowe znaki)
Starsze Python 1 - 7 punktów
Ogromne podziękowania dla @grc za tę wersję i pomoc w odjęciu czterech punktów!
W Pythonie 2 ta instrukcja jest interpretowana jako
print ()
drukująca pustą krotkę()
.W Pythonie 3
print
jest funkcją i powoduje, że nic nie jest drukowane.Wynik „Lepszy”: 7 (długość) + 2 (róż. Char.) - 2 (unikalne znaki)
Starsze Python 2 - 13 punktów:
Wynik „Lepszy”: 12 (długość) + 2 (char diff. O / p) - 1 (unikatowe znaki o / p)
Wiem, że to nie wygra, ale nadal dałem odpowiedź, ponieważ jest to moja pierwsza próba w Pythonie :)
źródło
print()
.dict.itertools()
DO#
Zmieniłem również algorytmy wnioskowania typu metody ogólnej między C # 2, 3 i 4. Na przykład:
W metodzie C # 2 wnioskowanie o typach mówi, że T nie może być jednocześnie
int
iint?
, i tak wytwarza2
. W metodzie C # 3 wnioskowanie typu mówi „najlepszy kompromis pomiędzyint
iint?
jestint?
”, dlatego wybieraM<int?>
i wytwarza 1.źródło
Rubinowy, 4 znaki + 0 różnic długości znaków - 3 unikalna różnica znaków = wynik 1
Na Ruby 1.9 zostanie wydrukowane
"d"
. Na 1.8 drukuje100
.Objaśnienie:
?d
jest"d"
w wersji 1.9, a100
(kod ASCII dla d) w wersji 1.8.p x
jest równoważne zputs x.inspect
.*
to zarówno powtarzanie ciągów, jak i mnożenie.Wersja „zoptymalizowana” dla starej punktacji:
Ruby, 8 znaków - 999999989 różnica znaków = wynik -999999981
Drukuje
33000000000.0
dla 1.8 i"!!!!!!
...!!!"
dla 1.9. (?!
jest33
w wersji 1.8 i"!"
1.9 i*
jest zarówno powtarzaniem, jak i mnożeniem).Naprawdę, możesz pomnożyć tak daleko, jak chcesz, zależy to tylko od tego, jak szybki jest twój komputer.
źródło
Bash - -∞ (do praktycznych limitów)
Skutecznie, niezależnie od tego, ile masz pamięci. Np. Z około 10 GB:
Bash 2: nie obsługuje zakresów w rozszerzaniu nawiasów, więc drukuje
{0..999999999}
.Bash 3:
Dowolny język - -∞ (do praktycznych ograniczeń)
Będziesz mieć to w prawie każdym języku, nawet jeśli skończy się to nieco bardziej skomplikowanym. Gdy tylko możesz utworzyć dwie różne wartości, możesz napisać kod, który generuje dowolnie różne dane wyjściowe. Lepsza metoda punktacji zignorowałaby różnice w danych wyjściowych.
źródło
…
wersji „dowolny język” oznacza wszelkie sztuczki, których używasz, aby twój program zależał od zmian w specyfikacji językowej. Jest to wykrywanie wersji, czy to robisz,if $version >= 3
czyif isinstance(range(0),list)
.DO#
Poniższy kod wygeneruje różne dane wyjściowe dla C # 5.0 i poprzednich wersji C #
Wyjście: C # 5.0
Wyjście: C # 4.0
Przyczynę wyjaśniono w poście na blogu Erica Lipperta
Zamykanie przez zmienną pętli uważane jest za szkodliwe
źródło
Python, -14 punktów (różnica długości 3 - 17 znaków = -14)
Wyjścia Python 2:
0
Wyjścia Python 3:
0.6666666666666666
Wersja Better Scoring, 5 punktów (różnica długości 3 + 2 znaków = 5)
Wyjścia Python 2:
1
Wyjścia Python 3:
1.5
źródło
DO#
Dodałem kowariancję i kontrawariancję do C # 4, więc programy w postaci:
Produkowałby
false
w C # 2 i 3 oraztrue
w C # 4.Można jednak argumentować, że to się nie liczy, ponieważ biblioteka zawierająca definicję
IEnumerable<T>
również musiała się zmienić.źródło
C ++ 98/11 - Punktacja „Lepsza” (115 znaków - 115 unikalnych różnic postaci w wyniku = wynik 0)
Lekko zredagowana wersja zgodna z nowymi zasadami punktacji
Gra w golfa:
Wersja bez golfa:
Nowe rozwiązanie niewiele różni się od starego. W nowym rozwiązaniu dane wyjściowe zarówno w C ++ 11, jak i C ++ 98 mają 116 znaków jednakowej długości, ale jedynym wspólnym znakiem jest nowy znak linii dołączony przez funkcję puts.
Dla C ++ 98
u8
inu8"\x7E"[0]
będzie nadal zamieniane, ale teraz z"\x0B"
. Tak więc wartość wynikowa po przetwarzaniu wstępnym będzie"\x0B""\x7E"[0]
. Oba łańcuchy zostaną połączone"\x0B\x7E"
i operator indeksu dolnego uzyska dostęp do pierwszego elementu, w tym przypadku znaku o wartości 11 w kodowaniu znaków. Dodatkowoi
zostanie dodana wartość, która początkowo wynosi 114. Tak więc znak o wartości 125 zostanie zapisany w wynikowej tablicy. Gdyi
dojdzie do zera, wszystkie wartości od 125 do 11 zostaną zapisane w tablicy iputs
wydrukują wszystkie znaki o wartościach od 11 do 125, a także końcowy nowy wiersz.W C ++ 11
u8"\x7E"[0]
będzie interpretowany jako ciąg UTF-8 składający się z pojedynczego znaku o wartości szesnastkowej 7E. Operator indeksu dolnego będzie teraz uzyskiwał dostęp do tego znaku, a jego wartośći
dodawana jest do niego, co daje wartość dziesiętną 241 podczas pierwszej iteracji. Gdyi
dojdzie do zera, wszystkie wartości do 126 zostaną zapisane w tablicy iputs
wydrukują znaki o wartościach od 126 do 241, plus nowy wiersz.W zależności od użytego zestawu znaków spowoduje to różne wyniki, ponieważ większość zestawów znaków ma tylko pierwsze 128 znaków wspólnych.
W przypadku ISO-8859-2 dane wyjściowe byłyby następujące:
C ++ 98:
C ++ 11:
C ++ (106 znaków - 107 różnica w wynikach = wynik -1) (STARE ZASADY)
Gra w golfa:
Wersja bez golfa:
Skompilowane z
g++ -std=c++98 main.cpp
ig++ -std=c++11 main.cpp
.W rzeczywistości można zastąpić
108
dowolną liczbą dodatnią z zakresu liczb całkowitych, aby uzyskać wyniki ujemne. Tak długo, jak jest większy niż 108;)W C ++ 98
#define u8 "f"
spowoduje, że preprocesor do zastąpieniau8""[0]
z"f"""[0]
. Spowoduje to, że w"f"[0]
końcu stanie się pojedynczym znakiem'f'
zapisanym w tablicy.puts(c)
wypisze wynikową tablicę składającą się z i-1'f'
.W C ++ 11
u8""[0]
spowoduje, że pusty ciąg zostanie zinterpretowany jako ciąg UTF-8, więc nie jest wykonywana konkatenacja ciągu. Ponieważ jest to ciąg C, operator indeksu dolnego uzyska dostęp do kończącego zerowego bajtu i zapisze go w tablicy.Na koniec
puts(c)
wydrukuje wynikową tablicę, która składa się tylko z pustych bajtów. Ale gdyputs
przestanie czytać dane wejściowe, gdy tylko napotka pusty bajt, wypisze tylko nowy wiersz i nic więcej.źródło
?
(przynajmniej na moim (Mac) systemie)CSS2 vs CSS3 48 punktów
Renderowane jako
ABCDEFGHIJKLMNOPQRSTUVWXYZ
(małe litery) w przeglądarkach CSS3Renderowane jak
abcdefghijklmnopqrstuvwxyz
w przeglądarkach innych niż CSS374 znaki - 26 unikalnych różnic znaków = 48
źródło
Perl, 24 znaki - (9 * (10 ^ 9)) - 1 różnica znaków = wynik - ((9 * (10 ^ 9)) - 1) +24
Drukuje 9e9 razy
a
dla wszystkich wersji poniżej 5, drukujea
dla wszystkich wersji powyżej 5. Możesz sprawić, że wynik będzie nieskończenie niski, po prostu dodając więceja
s do drugiego wyjścia.źródło
Befunge, 36 - 378 = -342; 164 - 2576 = -2412
W Befunge 93 to dałoby 3 spacje, a
<v
następnie 76 spacji, a<v
następnie 76 spacji<v
, następnie 76 spacji, następnie<v
77 spacji, av
następnie 78 spacji. Długość:3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395
Można to w prosty sposób rozszerzyć, dodając dodatkowe linie podobne do pierwszych 5 linii.W Befunge 98 byłoby to wyjście
<v <v <v <v v
.Różnica w długości:
395 - 17 = 378
. Wynik byłby (według starych zasad):-342
Uwaga: Mógłbym uzyskać jeszcze większą różnicę, gdybym użył
.
zamiast,
; różnica byłaby-684
Zmiana reguły:
To jest trochę trudniejsze.
Wyjście Befunge 93:
Wyjście Befunge 98:
Długości:
2576
. Żadna z postaci między strunami nie jest taka sama, więc jeśli poprawnie zrozumiałem wyzwanie, mój wynik to164 - 2576 = -2412
(tak, miałem celować0
, ale to było fajniejsze). Jeśli muszę to zrobić, aby każdy znak w każdym ciągu był niepowtarzalny i różny od siebie, mogę to zrobić, proszę mi powiedzieć.źródło
Powershell, punktacja „Better”, -163 (15 - 178 char diff = -163)
PowerShell V2
PowerShell V3
źródło
PHP, wynik: 0 (najlepszy przypadek)
Wow, wyjaśnienie będzie zabawne.
Według tej strony ,
srand()
funkcja wydaje się być uszkodzony z PHP 5.1.5 do PHP 5.3.14 . Dlatego będziemy brać pod uwagę PHP 4.4.9 i jedną losową wersję PHP 5, która mieści się w określonym powyżej przedziale czasowym.Wyjście PHP 4.4.9:
1505335290
Nie sądzę, że jest to łamanie zasad; Ponieważ wydaje się to być błędem, wynik powinien być taki sam, ale tak nie jest. Nasza inna wersja PHP po prostu pominie
srand()
funkcję i wyświetli losową liczbę.źródło
Java (około -2 000 000 000)
Wersje Java są czasami nazywane 1.x, ale myślę, że nadal są zgodne z regułami.
Prostym sposobem jest sprawdzenie, czy istnieje klasa, która została wprowadzona w określonej wersji.
(Zależy trochę od terminala, czy możliwe jest wyprowadzenie 2 miliardów znaków w ciągu dwóch sekund / W przypadku nowej punktacji zamień
Integer.MAX_VALUE
na liczbę bajtów programu, aby uzyskać doskonały wynik zero.)Ten kod zależy od używanej wersji VM / JDK (czy to się liczy?)
Drukuje
z
s dla JDK Java 6 i wcześniejszych oraza
s dla najnowszych wersji.źródło
JavaScript (ES3 vs ES5) - 9 punktów
długość
10
+ różnica długości0
- różnica wyjściowa1
Wyjścia
1
dla nowoczesnych przeglądarek, które wspierają Array.prototype.map. Dane wyjściowe0
w starszych przeglądarkach. Testowałem to z IE8.Przy starych zasadach: 0 punktów
długość
26
- różnica długości26
Dane wyjściowe
00000000000000000000000000
w nowoczesnych przeglądarkach. I pusty sznur na starym.źródło
Python - 0
Python 2 drukuje quine, podczas gdy Python 3 nic nie drukuje.
EDYCJA: zaktualizowana, naprawiona.
źródło
APL (5 - (1988894-1) = -1988888)
W APL w starym stylu (jak Dyalog if
⎕ML=0
*)↑
oznacza mix , co w przypadku 1-wymiarowego wektora nic nie robi. W APL-ach w stylu APL2, takich jak GNU APL (lub Dyalog if⎕ML=3
),↑
oznacza pierwszy , który bierze pierwszy element wektora.W ten sposób następuje
5
bajtów (Charset APL nie mieszczą się w bajcie)wyświetli
1988894
bajty (lista cyfr od 1 do 3e5 oddzielona spacjami) w dialektach APL w starym stylu,i
1
bajt (tylko pierwszy numer na wspomnianej liście, który jest1
i dlatego ma długość1
), w dialektach APL typu APL2.Uwagi:
⎕ML
oznacza poziom migracji . W Dyalog APL, im wyższa wartość⎕ML
, tym więcej funkcji w stylu APL2 jest włączonych. Domyślnie jest to0
. (I to zmienna globalna! Zabawa!)3e5
była najwyższą 3-znakową wartością, którą akceptowałaby Dyalog APL⍳
.4e5
dał miLIMIT ERROR
. Ograniczenie to prawdopodobnie zależy od tłumacza. (GNU APL nie miał problemów z wyższymi wartościami).źródło
Bash 7 (14-bajtowa długość programu + 0 różnic w długości wyjściowej - 7 różnic w unikatowych znakach w danych wyjściowych)
Powiązane z odpowiedzią @Gilles, ale inną funkcją rozszerzenia i różnymi wersjami. Punktacja według edytowanego pytania:
Dane wyjściowe dla bash 3.x:
Dane wyjściowe dla bash 4.x:
źródło
PHP: −134217684 (43-134217727)
Stosowanie:
W PHP5 + to nic nie wydrukuje, ponieważ ip2long z niepoprawnym argumentem zamienia się w false, który jest zerowany. W PHP4
ip2long("")
zwraca -1 i wypełniamy pusty ciąg 128 MB oga
.Maska jest dopasowana, dzięki czemu wraca na długo przed 2 sekundami na mojej maszynie. Jeśli nie dasz rady w 2 sekundy, kup lepszy sprzęt!
Z nowymi zasadami: 0 (40 - 40. Nie możesz zbliżyć się do zera.)
Wyjścia:
źródło
Wykorzystanie komentarza C89 / C99, 45 znaków, 0 punktów
wyjście c89
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
- 45 znakówwyjście c99
MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
- 45 znakówźródło
printf
naputchar
; najbardziej potępiające jest to, że dla r5 źle odczytałem zasady i przypadkowo połączyłem nowe i stare punkty. Wyjście dla [r5, r6] jest błędem. r3 w drugiej odpowiedzi C zawiera dokładnie ten sam błąd. Jeśli spojrzysz na znaczniki czasu, zobaczysz, że został opublikowany tutaj r5 , gdy inna odpowiedź została zaktualizowana. Nie ma to znaczenia, ponieważ jest to kod golfowy , a ten wpis spełnia wyzwanie w mniejszej liczbie znaków, kropka.C ++ 98 / C ++ 11
W przypadku standardowego kompilatora C ++ 98 dane wyjściowe 199711 są większe niż litera „x”, podczas gdy w przypadku standardowego kompilatora C ++ 11 dane wyjściowe 201103 są większe niż litera „x”. Różnica długości danych wyjściowych wynosi zatem 1392 znaki. Oznacza to, że faktyczne odtwarzanie kodu źródłowego w golfa nie jest opłacalne, ponieważ znacznie większy efekt można uzyskać po prostu zastępując
"x"
go dłuższym ciągiem lub mnożąc przez__cplusplus
pewną liczbę.źródło
SmileBASIC 3 / SmileBASIC 2, wynik: -5 (oryginalna ocena)
W nowoczesnych wersjach SB jest to drukowane
1000000000
zgodnie z oczekiwaniami, ale w wersji 2 i wcześniejszej drukowane z10
powodu błędu.źródło
TI-Basic 83 Plus vs. 84 Plus, wynik 5-1 = 4
Wyjścia
2
na TI-83 Plus, gdzie ten sam program jest analizowany jako coś, co wygląda,length("?►DMS
ponieważsetTime(
polecenie nie zostało jeszcze wprowadzone. Więc ciąg zawiera dwa 1-bajtowe tokeny, a jego długość wynosi 2.Dane wyjściowe
1
na TI-84 Plus, ponieważ łańcuch zawierający pojedynczy 2-bajtowy token ma długość 1.źródło
Idź 1.9-> 1.10. Wynik = 1 - 1 = 0
Z 1.10 notatek :
1.8:
256
1.9:
1024
1.10:
10340
źródło