Czy to nie denerwujące, gdy znajdziesz kawałek kodu i nie wiesz, w jakim języku został napisany? To wyzwanie próbuje nieco rozwiązać ten problem.
Wyzwanie
Będziesz musiał napisać program, który po uruchomieniu w dwóch różnych językach wyświetli ciąg znaków:
This program wasn't written in <language program compiled/interpreted in>, it was built for <other language the program can be run in>!
W danych wyjściowych nazwy języków powinny mieć oficjalne wielkie litery. np .: CJam, C ++
Żaden program nie powinien pobierać żadnych danych wejściowych od użytkownika.
W przypadku uruchamiania w obu językach, wyjście powinno być standardowe lub równoważne.
W żadnym programie nie powinno być wyjścia do stderr.
Możesz używać komentarzy w dowolnym języku.
Dwie różne wersje tego samego języka liczą się jako różne języki.
Jeśli tak się stanie, program powinien wypisać główny numer wersji, a jeśli działa na dwóch różnych mniejszych wersjach, powinien również zgłosić wersję mniejszą.
Nie należy używać wstępnie wbudowanych funkcji wersji (obejmuje to zmienne, które zostały już ocenione w czasie wykonywania).
Przykładowe dane wyjściowe:
Perl i Ruby:
Perl:
This program wasn't written in Perl, it was built for Ruby!
Rubin:
This program wasn't written in Ruby, it was built for Perl!
Python i C:
Pyton:
This program wasn't written in Python, it was built for C!
DO:
This program wasn't written in C, it was built for Python!
Python 2 i Python 3:
Python 2:
This program wasn't written in Python 2, it was built for Python 3!
Python 3:
This program wasn't written in Python 3, it was built for Python 2!
Python 2.4 i Python 2.7:
Python 2.4:
This program wasn't written in Python 2.4, it was built for Python 2.7!
Python 2.7:
This program wasn't written in Python 2.7, it was built for Python 2.4!
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.
argv[0]
?Odpowiedzi:
Foo / CJam, 70 bajtów
W Foo, jak wielu się dowiedziało, po prostu drukuje wszystko w podwójnych cudzysłowach i ignoruje większość innych znaków lub robi coś, co nie wpływa na wynik w większości przypadków. Krótko mówiąc,
\@
nic nie robi, a wszystkie ciągi znaków są drukowane w niezmienionej postaci.W CJam
\
zamienia dwa górne elementy i@
przenosi trzeci element na górę, które układają łańcuchy we właściwej kolejności. A po zakończeniu programu wszystko, co pozostało na stosie, jest automatycznie drukowane.źródło
R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
"This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/
dla Clip / CJam.C89 / C99,
171152136114111107105 bajtówDzięki za @Hurkyls, @Qwertiys, @ jimmy23013 i @MD XF za podpowiedzi.
wersja golfowa:
wersja bez golfa:
Mały opis:
Wersje C z poprzedniej wersji C99 miały po prostu taki komentarz wielowierszowy:
wraz z C99 wprowadzono komentarz jednowierszowy. lubię to:
więc jeśli skompilujesz taką linię:
dla kodu związanego z kompilacją c99 byłoby:
podczas gdy odpowiednim kodem dla kompilatora c89 byłoby:
(ponieważ pierwszy
/
nie jest częścią komentarza i nie traktuje go jak operatora)źródło
//**/
. W C89 jest to operator podziału, po którym następuje pusty komentarz. W C99//
rozpoczyna komentarz jednowierszowy, więc reszta wiersza jest pusta. Dlatego w C89 staje(90-(-4.5/-4.5))
się 89, podczas gdy w C99 staje(90-(-4.5-4.5))
się 99,188-c
zamiastc==99?89:99
.JavaScript / Ruby, 170 bajtów
Może być tylko 2.0, nie działa przynajmniej w wersji 2.1.5 ... Edytuj: Aktualizacje zgodnie z radą @Jordan, mam nadzieję, że działa teraz w kilku innych wersjach!
Nadużywa
~
operatora, ponieważ Ruby będzie traktować=~
jako dopasowanie wyrażenia regularnego zwracając pozycję pierwszego dopasowania w ciągu (0
), ale JavaScript będzie traktować to,=
~/1/
co jest-1
(ponieważ/1/
jest konwertowaneNaN
na operacje liczbowe, które mają0
wartość).źródło
NoMethodError: undefined method `log' for :log:Symbol
eval
powraca:log
. Myślę, że możesz to naprawić, wkładając;c
późniejend
. Jednak=~
/= ~
trick jest świetny!$><<s
zamiastputs s
i za pomocą podwójnych cudzysłowów, dzięki czemu można upuścić ukośnik odwrotnywasn\'t
.\'
podwójnych cudzysłowów, a$><<
to oznacza, że mogę zastosować poprawkę, o której wspomniałeś, i zachować tę samą liczbę bajtów!Python 2 / Python 3, 92
Używa „standardowego” sprawdzania wersji Pythona (liczba całkowita vs. dzielenie zmiennoprzecinkowe).
źródło
Wędkarstwo / > <>
233217 bajtówWędkarstwo jest językiem opartym na wędrującym rybaku łowącym ryby. Aby stworzyć program w tym języku, który najpierw musi zdefiniować dok, po którym chodzi. Stacja dokująca zapewnia tylko sterowanie przepływem do programu. Stacja dokująca w tym programie to:
Za każdym razem, gdy
C
polecenie zostanie znalezione, rybak rzuca swoją linię, aby złapać instrukcję.+
I-
instrukcje zmniejszyć lub zwiększyć długość jego linii odpowiednio.v
zmienia kierunek rzucania w dół. Ryby, które łapie w tym programie to:> <> to język oparty na rybach poruszających się w wodzie.
v
Polecenie uruchamia ryby ruchu w dół, gdzie jest ona następnie odbija w prawo z\
polecenia. Wszystko między cudzysłowami jest wypychane na stos. Po popchnięciu sznurka na stos, ryba owija się na drugą stronę, gdzie odbija się w dół\
. Następnie drukuje zawartość stosu za pomocą:źródło
23 / Malbolge, 5688 bajtów
Zauważ, że program wymaga końcowego podawania linii. Żadna linia nie zawiera końcowych białych znaków, więc kopiowanie / wklejanie powinno działać dobrze.
Weryfikacja
Aby przetestować kod Malbolge w tym internetowym tłumaczu , wklej go w obszarze Kod Malbolge i kliknij Load/Reset, a następnie Execute.
Aby przetestować kod 23 w tym internetowym tłumaczu , wklej go w obszarze Źródło , naciśnij, Enteraby wstawić końcowe podawanie wiersza, wpisz
23
w obszarze Konsoli (aby przełączyć z domyślnej notacji 23.dezsy na automatyczne wykrywanie) i kliknij Run Interpreter!.źródło
Lua / C -
182164 bajtówKorzysta z funkcji, w której Lua traktuje znak krzyżyka w pierwszym wierszu jako komentarz, aby uwzględnić uniksowe shebangi. W przeciwnym razie otacza komentarze drugiego języka własnymi komentarzami.
Aby golić bajty, polegam na zachowaniu niejawnym, które emituje tylko ostrzeżenia w GCC i Clang: niejawna deklaracja int dla głównej i niejawnej definicji printf.
źródło
//
komentarza w części C? Oszczędza 2 bajty.JavaScript / Haskell,
158 bajtów147 bajtówOgólny pomysł: przekradnij składnię komentarza każdego do drugiego.
W jednej linii:
Jak to wygląda dla Haskell:
Jak to wygląda w JavaScript:
źródło
alert
jest golfistą.Brainfuck / Foo, 769 bajtów
Niezwykle skomplikowana i złożona odpowiedź ... czy nie.
źródło
,
tekstu na końcu. Uważam, że jest to sprzeczne z zasadami przydziału.,
po prostu ustawia komórkę na 0, dla EOFC / Python, 238 znaków
To nie drukuje w 100% dokładnie tego, co jest wymagane, ale dość blisko.
Ponowne uruchomienie mojej karty walentynkowej .
źródło
def
i:
późniejdef main()
, a tak naprawdę nie otwierasz funkcji dla main. Czy próbowałeś skompilować swoją odpowiedź w C?#define def main(){0?
Brakuje linii#define return
sprawia, że płaczę trochę ...C / C ++, 136
Dodano nowe linie do formatowania. Wypróbuj w C lub C ++ .
źródło
struct{}s;z=2*sizeof s
Befunge / > <> ,
141138134133130 130 bajtów3 bajty zapisane dzięki @Cole .
Mówiąc dokładniej, używam Befunge-98.
Wykorzystując fakty, które:
\
jest lustrem w> <> i zamienia się w Befunge'string'
jest ciągiem w> <> i'c
jest znakiem w Befungeźródło
?!;>ol
PHP / MySQL, 147 bajtów
źródło
SELECT"This program wasn't written in MySQL, it was built for PHP!";
Python 3 / > <> ,
177173172167 bajtówDzięki @mathmandan za zgolenie 5 bajtów!
Cóż, to było doświadczenie, które też było trudne. Wszelkie sugestie dotyczące golfa są mile widziane, ponieważ jest to dość długi czas. Starałem się jak najlepiej wykorzystywać tekst, ale było to dość trudne.
Technicznie rzecz biorąc, to Python 3 powinien wypisać ten program (i mógłbym to zmienić, gdybym nie spełniał specyfikacji - ale w przykładzie wyjście Python / C
Python
wymieniono ).Wypróbuj go w internetowym> <> tłumaczu i w Pythonie 3 ( interpreter > <> wymaga ręcznego wprowadzenia kodu)
Zwroty
w> <> i
w Pythonie.
Wyjaśnienie (Python)
Po stronie Pythona jest to dość proste. Oto kod, na którym nam zależy (w zasadzie kod bez komentarzy, które są oznaczone przez
#
w Pythonie). Zwróć uwagę, że w Pythonie\
jest to znak ucieczki, gdy jest używany w ciągach, więc\"
zwraca wartość"
w ciągu.Najważniejsze są tutaj operacje wykonywane na zmiennej
aa
:Instrukcja print ocenia w ten sposób
Objaśnienie (> <>)
Teraz przechodzimy do trudniejszej części. Jeszcze raz oto kod z usuniętymi niepotrzebnymi bitami.
Linia 1:
Stos w tej chwili (jeśli jest wydrukowany):
\This program wasn't written in
Linia 2:
Zauważ, że linia 2 zaczyna się z
/
powodu pozycji wskaźnika od linii 1 i przesuwa się od prawej do lewej.Stos w tej chwili:
><> ni nettirw t'nsaw margorp sihT
Wiersz 3:
Podobnie jak poprzednia linia, ta zaczyna się od
\
, czyli tam, gdzie linia 2 wysyła wskaźnik. Zauważ, że ponieważ wskaźnik owija się wokół linii, gdy osiągnie pierwsząa
, będę pisać wyjaśnienie w kolejności, w której idzie wskaźnik (a więc co jest wykonywane)Stos w tej chwili (
x
to postać utworzona przez dodanie „r” i spacji. - to nie jest rzeczywista postać, tylko symbol zastępczy ode mnie):xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Wiersz 4:
Wskaźnik po prostu przesuwa się w dół, więc linia ta nie wymaga dalszych wyjaśnień.
Wiersz 5:
Zaczynając od
/
lewej strony.Stos w tej chwili (wyjście odwrócone):
!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
I to powinno być na wyjaśnienie. Daj mi znać, jeśli istnieje jakaś niespójność między wyjaśnieniem / kodem lub jeśli zrobiłem coś złego; Grałem trochę w golfa, gdy byłem w trakcie pisania objaśnienia, więc mogłem mieszać fragmenty starego i nowego kodu.
źródło
aa[:-2][::-1]
zaa[-3::-1]
. W tym przypadku może to oczywiście zakłócać formatowanie> <>, ale może warto rozważyć, jeśli jeszcze tego nie zrobiłeś. W szczególności jestem prawie pewien, że potrzebujesz spacji poniżejv
poprzedniej linii, ale wygląda na to,print(aa[-3::-1]+"Pytho"
że zmieści się w 24 znakach poniżeja=", it was built for "+
, a następnie możesz wstawić spację, po której następuje+"n"+a)
. Nie jestem pewien, czy to zepsułoby coś innego, ale jeśli to zadziała, zaoszczędzi kilka bajtów.print aa[-3::-1]+"Pytho" +"n"+a
. Jeszcze jedno pytanie: w wersji> <> co dzieje się z1
oryginalnie wypchniętym na stos?Plik wsadowy .BAT / Plik wsadowy .CMD,
194185 bajtówEdycja: Zapisano 9 bajtów i poprawiono brakujące
!
dzięki DLoscTak, istnieją różnice między plikami BAT i CMD. Odniesienie. Zasadniczo CMD ustawia
ERRORLEVEL
się naSET
komendę, a BAT nie, co oznacza, że w tym przypadkuERRORLEVEL
zestaw przez zniekształconegomd
polecenia zostanie wyczyszczone przezSET v=1
w jednej wersji, ale nie innych. Ten skrypt jest oparty na przykładzie podanym przez „Ritchie” w tym wątku grupy dyskusyjnej.Zauważ, że powyższy skrócony skrypt zakłada
ENABLEEXTENSIONS
sięON
(jest domyślnie na każdej platformie). Rozszerzony skrypt poniżej wyraźnie go ustawia, aby zagwarantować poprawną funkcjonalność. Bez tegoSET
polecenie polecenia CMD nie zezwala na wszystkie rozszerzenia i (w niektórych systemach, być może) może nie ustawićERRORLEVEL
odpowiednio.Rozszerzony i zauważony
źródło
JavaScript / C,
148146143 znakówC:
http://codepad.org/u8UimGLchttp://codepad.org/Y80M5jpchttp://codepad.org/m4DB2NddJavascript: po prostu skopiuj kod do konsoli przeglądarki
źródło
CJam / GolfScript,
8178 bajtówOryginalna 81-bajtowa wersja:
źródło
PHP / Perl,
9896 bajtówNie wiem, czy to oszustwo, czy nie, ponieważ o ile mogę powiedzieć, jedynym sposobem na uruchomienie PHP bez otwierającego
<?
tagu jest coś takiegophp -r $(cat codefile.php)
. Ale zakładanie, że jest to zgodne z prawem ...//
jest komentarzem PHP, ale w Perlu jest wyrażeniem regularnym (które samo w sobie nic nie robi). Reszta powinna być dość oczywista.Edycja: Teraz używa słowa bez słów w części tylko dla Perla. Chciałem używać ich przede wszystkim dla obu języków, ale PHP wyświetla ostrzeżenie, gdy to robisz, w przeciwieństwie do „Stderr nie powinien generować żadnych danych wyjściowych”.
źródło
<?'>#';
jest poprawna składnia w obu językach.Ruby / Python, 105 znaków
źródło
JavaScript 1.8 / JavaScript 1.7, 89 bajtów
Ponieważ Array.prototype.reduce jest nowy w wersji 1.8
EDYCJA: Wyodrębniono 7 bajtów, bezpośrednio inicjując
a
zamiast używaćreverse()
EDYCJA:
JavaScript
można zapisać jakoJS
, oszczędzając 8 bajtówEDYTOWAĆ: Dzięki Hedi za wskazanie, że mogę zaoszczędzić 3 więcej bajtów, jeśli nie użyć zmiennej
b
więcejEDYCJA: Wyodrębniono 6 bajtów, obliczając
7+a
i8-a
,a=1
jeśli zdefiniowano redukcję (JS 1.8) ia=0
jeśli nie jest zdefiniowana (JS 1.7)EDYCJA: Hedi odłożył jeszcze 6 bajtów, co sugeruje użycie ciągu szablonu
EDYCJA: ETHprodukcje sugerowały 2 bajty
a=!![].reduce;
zamiasta=[].reduce?1:0;
EDYCJA: no1xsyzy zagrał jeszcze jeden bajt, sugerując odwrócenie czeku boolowskiego
źródło
a=[].reduce?1:0;
naa=!![].reduce;
.a
utrzymać wartość1
lub0
, nietrue
lubfalse
SWI-Prolog 6 / SWI-Prolog 7, 156 bajtów
Wykorzystuje fakt, że podwójne cudzysłowy
""
są kodami ciągów (tj. Listą kodów znaków) w wersjach SWI-Prolog starszych niż 7 i są poprawnym typem Łańcuchów w wersji 7. Wis_list("")
związku z tym w wersji 7 będą fałszywe, a we wcześniejszych wersjach prawdziwe.źródło
BF / SPL, 5342 bajtów
Jestem prawie pewien, że jest to pierwszy poliglot Szekspira w tej witrynie.
Prawdopodobnie nie wygra żadnych nagród. Działa poprzez przekradanie kodu BF do tytułów akt / sceny / programu. Kod SPL używa wykrzykników zamiast kropek, z wyjątkiem kilku przypadków. Programy nie powinny pobierać danych wejściowych, więc przecinki w deklaracjach znaków są „komentowane” przez zerowanie komórek i umieszczanie nawiasów kwadratowych wokół przecinków. Ta sama procedura obowiązuje w przypadku ukrywania nawiasów kwadratowych wokół instrukcji enter / exeunt.
Przetestuj BF na https://repl.it/E8Hh/23 .
Kod SPL został przetestowany w kompilatorze znalezionym tutaj: https://github.com/drsam94/Spl/ .
źródło
Ruby 1.8 / Ruby 1.9, 87
W Ruby 1.8
?9
jest wartością ASCII „9”, czyli 8 modulo 49. W Ruby 1.9 jest to ciąg „9” i%49
jest operacją formatowania, która nic nie robi, ponieważ „9” nie zawiera żadnych ciągów formatujących to.źródło
Python 2.7.9 / Python 2.7.10, 127 bajtów
Mieliśmy kilka postów, które wykorzystywały pomniejsze wersje, ale żadne nie przeszło na wyższy poziom niżej ...
Wypróbuj na Ideone (Python 2.7.10) i repl.it (technicznie Python 2.7.2, ale powinien dać taki sam wynik jak 2.7.9).
Python 2.7.10, zgodnie z dziennikiem zmian :
Liczba ta wzrosła
len(dir(types))
z 42 do 43, dając liczbową różnicę, którą możemy wykorzystać do wygenerowania pożądanego wyniku.źródło
Python / QBasic,
160142 bajtówTestowane z Python 3 i QBasic 1.1 . Nie będzie działać w Pythonie 2 bez dodawania
from __future__ import print_function
do wiersza 4.1#
jest to wyrażenie1
(no-op), po którym następuje komentarz. W QBasic jest to numer linii (z sufiksem typu oznaczającym go jako aDOUBLE
).DEFSTR
Oświadczenie mówi QBasic że wszystkie zmienne, których nazwy zaczynają sięA
lubB
(wielkość liter) są zmienne znakowe. W ten sposób możemy wywoływać nasze zmiennea
ib
zamiasta$
ib$
(które nie działałyby w Pythonie).'
rozpoczyna komentarz. W Pythonie''
jest pusty ciąg (no-op). Następnie zamieniamy nazwy języków i definiujemy alias dlaprint
funkcji (ponieważ słowa kluczowe QBasic są automatycznie formatowane wielkimi literami).Jeśli mogę wyłączyć autoformatter (który jest opcją w QB64 , choć nie w oryginalnym QBasic), mogę sprowadzić go do 114 bajtów za pomocą Pythona 2 :
źródło
Perl / Ruby, 129 bajtów
Żadnych nadużyć wyrażeń regularnych w tym, po prostu wykorzystując fakt, że 0 jest zgodne z Ruby
eval
w definicjisort
(która faktyczniereverse
jest) iprintf
ing. Ruby nie lubiła używać listy jako argumentów, więc musiałem zrobić każdy z osobna.źródło
a
musi być zmienną instancji, a nie lokalną?@
sigil na zmiennej w Perlu oznacza, że jest to lista, w Perlu przechowywanie, powiedzmy$a
zamiast tego, nie daje wyników./// i Retina , 95 + 3 = 98 bajtów
+3 bajty dla
-s
flagi w Retina.Wyjaśnienie dla ///
Pierwsza instrukcja to
usuwa wszystkie znaki nowej linii z pozostałej części kodu, co powoduje
Wszystko do tego
!
jest dosłowne i drukowane do STDOUT. Następna instrukcja toAle
?.
nie można znaleźć szukanego ciągu, więc nic się nie dzieje. Następnie pozostały kod jest//!
niekompletną instrukcją, więc program kończy działanie, po wydrukowaniu poprawnego ciągu.Wyjaśnienie dotyczące siatkówki
Mówi siatkówka do zastąpienia
/
z//
. Ale dane wejściowe są puste, więc nic nie pasuje.To zastępuje dane wejściowe ciągiem w drugim wierszu.
Dopasowuje ciąg
\/\/\/, it was built for Retina!
i zastępuje go,Retina, it was built for ///!
aby dać poprawny wynik.źródło
-s
, choć powiedzenie tego, co zrobiłem, zepsuje zabawę! : Dsed / Hexagony 251 Bytes
sed: Wypróbuj online!
Heksagonia: Wypróbuj online!
W sed drukuje prawidłowy ciąg znaków, jeśli pasuje do pustego ciągu na końcu (zawsze). Drugi wiersz to komentarz. Wymaga to ciągu znaków na STDIN, ale może być pusty ( dozwolone na podstawie tego konsensusu ).
Przykład:
W Hexagony pierwsze
/
przekierowuje na lewy dolny róg, podąża za lewą stroną do miejsca, w którym zaczyna się część sed, a następnie po prostu owija od lewej do prawej, wzdłuż linii, od prawej do lewej, wzdłuż linii i tak dalej. Rozwinięty hex wygląda następująco:źródło
;
pobiera bieżącą modę komórki 256 do ustalenia wartości bajtu (np. Możesz wydrukować spacjęP0;
niezależnie od bieżącej wartości komórki). Ten skrypt CJam generuje wszystkie pary: cjam.tryitonline.net/…Python / Retina,
133120119117115 bajtówTeraz, gdy wiem więcej o Retinie i wyrażeniach regularnych, grałem w nią trochę dłużej. Teraz też działa.
Python po prostu drukuje instrukcję. Retina zastępuje wszystko poleceniem print Pythona, a następnie usuwa
print
cudzysłowy. Potem zamienićPython
aRetina
i usunąć#
.Spróbuj w Pythonie | Spróbuj w siatkówce
źródło
JavaScript / CoffeeScript,
125124 bajtówW CoffeeScript
a==b
jest kompilowany doa===b
, co powoduje, że warunek pośredni jest fałszywy. Użyłem odrobiny magii, aby przekonwertować wartość logiczną na liczbę całkowitą.Zaoszczędzono 1 bajt dzięki @DomHastings!
Wersja 125-bajtowa:
źródło
+(b=0=='0')
zamiast+0
!b^1
myślę, że możesz użyć~b
undefinedScript
.~1 == -2
. Ale(b=0=='0')+0
można zapisać jako+(b=0=='0')
. Lubb=+(0=='0')
. To powinno odciąć 1 bajt.