Ten pomysł nie jest mój, choć nie wiem, skąd się wziął. Kiedyś spotkałem go w konkursie programistycznym bardzo dawno (1998, jeśli dobrze pamiętam). Zadanie polega na napisaniu programu w swoim ulubionym języku, który będzie generował 2012
i tylko 2012
. Problem polega na tym, że program musi nadal generować dane wyjściowe 2012
po zmodyfikowaniu jednego z jego znaków. Modyfikacja może polegać na wstawieniu, usunięciu lub zastąpieniu. Oczywiście modyfikacja będzie taka, że program będzie nadal poprawny pod względem składniowym.
Ponieważ nie znam wszystkich języków programowania, muszę poprosić odbiorców o pomoc i przetestować przesłane odpowiedzi.
Dodano: Wielu skomentowało, że moja definicja akceptowalnych modyfikacji jest zbyt niejasna. Oto moja druga próba: dozwolone modyfikacje sprawią, że Twój program będzie ważny pod względem składniowym i nie spowoduje awarii. Tam myślę, że powinno to obejmować wszystkie błędy czasu kompilacji, łącza i czasu wykonywania. Chociaż jestem pewien, że i tak będzie jakiś dziwny przypadek w jakimś języku, więc kiedy to się pojawi, przyjrzymy się temu indywidualnie.
Odpowiedzi:
C, 53 znaki
Nieco dłużej niż odpowiada język skryptowy i jest zgodny z tą samą podstawową zasadą. Opiera się na fakcie, że ze względu na ograniczenia składni C jedyne litery, które można zmienić bez unieważnienia programu, znajdują się w łańcuchach!
Edycja: Ogolono 4 znaki.
Reedit: Zwiększono wytrzymałość, ogolono jedną postać.
Re-redit: Dłuższy, ale bardziej wytrzymały. Po prostu spróbuj
&
teraz! (Tym razem poprawnie).Aktualizacja: nieco skrócona; pokonuje większość dotychczasowych podejść.
Aktualizacja: Zmieniono int na void; powinienem pokonać ostatnie możliwe podejście, aby je przełamać.Aktualizacja: Mam ochotę na inne podejście; zamieniając ostatnia
(może gnić) na0
; używanie dwuliterowych nazw powinno rozwiązać ten problem.Aktualizacja: ostatnia aktualizacja odwołana; zakładanie, że zmiany powodujące błędy w czasie wykonywania są niedozwolone;
a
będzie działać dobrze.Aktualizacja: Cofanie trochę; próba wyłuskiwania
*a
również spowoduje segregację; więc użycievoid
do dokuczenia błędu kompilacji nie powinno być konieczne.Aktualizacja: I ostateczne skrócenie; który polega na umieszczeniu ciągu
"2012"
pod jednym adresem (co jest wspólne); i że dosłowne ciągi znaków są tylko do odczytu (również wspólne).Aktualizacja: Kosztowało mnie to dwie postacie, ale pokonałem twoją nędzną średnicę!
źródło
register void
;register
Jest tam, aby zapobiec&
;void
jest tam, aby zapobiec*
.;
pomiędzyputs
i(
.2012
! (Użyłem tylko drukowalnych znaków ASCII do testów wstawiania i podstawiania, ale wątpię, czy poszerzenie repertuaru pomogłoby.)==
na trójkę!=
, to nigdzie cię to nie zaprowadzi ; zamiast wypisywaća
to teraz wypisuje"2012"
.Haskell, 19 lat
lub jako pełny program
29
Dla trochę więcej zabawy:
Aby uzyskać taki, którego nie można zmodyfikować w sposób powodujący jedynie błąd czasu wykonania, możemy zakodować informacje w długości list, których nie można modyfikować przy użyciu zmian tylko jednego znaku, tj.
Aby uczynić go bardziej modyfikowalnym (bezpiecznie), możemy również użyć samego numeru jako elementu listy - wystarczy wprowadzić ciągi znaków, aby zapobiec zamianie przecinków na plus ':
Ponieważ ten ciąg jest tylko wynikiem wyrażenia, możemy go również ponownie zastąpić tym - bez problemu dzięki lenistwu Haskella
6472Te
init
akty jako „jeden minus, ale nie negatywne” tutaj.Możemy również włączyć system typów do schematu redundancji, a następnie zapisać liczbę w sposób, który można zmodyfikować za pomocą zmian jednoznakowych ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Możesz teraz zmienić dowolną
u
nap
odwrotnie, ale to zawsze zepsułoby głębokość układania list w drugim elemencie krotkowym, a tym samym spowodowało błąd kompilacji.Pomysł ten może być dalej rozwijany w taki sposób, że całe teksty mogą być kodowane w sposób zwarty, łatwy do odczytu i edycji, a jednocześnie bezpieczny przed modyfikowaniem pojedynczych znaków.
I jeszcze jeden ...
źródło
a=map(head.show.length)[[a,a],[],[a],[a,a]]
rozwiązania wstawa
pomiędzy[]
. Jednak naprawdę podoba mi się ten post! Bardzo sprytne rozwiązania.[a]
->[]
w rozwiązaniu 64-znakowymJavaScript
Uważam, że jest to dowód na błędy w czasie wykonywania, każda pojedyncza zmiana powinna albo skutkować błędem kompilacji, albo pojedynczym alertem z informacją 2012.
Edycja: Kod popełniłby błąd w czasie wykonywania na czymś takim
if("alert(2012 "==r)
, przesunąłem sekcję try, aby sobie z tym poradzić.Edycja: Nicea Vilx-, ale możliwa do naprawienia :-) Teraz występuje niedopasowanie nawiasów kwadratowych do wstawiania średnika.
Edycja: Ale przecinek może zrobić to samo, co średnik, czyli wiele opcji, myślę, że to naprawiłem, ale teraz jest strasznie dużo kodu.
Edycja: nieco uproszczona.
Edycja: jeszcze jeden w nieskończonej serii poprawek błędów.
Edycja: Ten rodzaj wydaje się bardziej długi i skomplikowany niż kuloodporny, ale powinien przynajmniej zająć się
~eval
i!eval
.źródło
q-")"
zwracaNaN
, do którego eval konwertuje się"NaN"
przed ewaluacją, co po prostu odwracaNaN
. Dziwna rzecz do zrobienia, ale technicznie uzasadniona, aby nie wywoływała połowu.;
pomiędzyeval
i(
.~
przed nimieval
powoduje, że echo2012
dwukrotnie zamiast raz. Nie jestem pewien, czy to nie!
poeval(
powoduje jego przerwanie.Perl, 49 znaków
Na podstawie odpowiedzi JB , ale ta faktycznie spełnia specyfikację . Wyczerpująca kontrola wskazuje, że każde jednoznakowe usunięcie, wstawienie lub zamiana pozostawia wyjście niezmienione lub powoduje awarię programu po uruchomieniu (jak wskazuje niezerowa wartość zwrotna i wyjście do stderr), przynajmniej tak długo, jak wstawienia i zamienniki są ograniczone do drukowalnych znaków ASCII.
(Bez ograniczenia zadanie to nie jest możliwe w Perlu: mało znana funkcja parsera Perla polega na tym, że zatrzymuje się, gdy napotka znak Ctrl-D lub Ctrl-Z, więc wstawianie jednego z nich przed dowolną kolejnością plików w prawidłowy program Perla, który nic nie robi.)
Edycja: Ogoliłem jeszcze jeden znak, zastępując
1==print
go0-print
.źródło
print
zaczyna wracać'true'
zamiast 1 :-Pprint
w żadnej wersji Perla 5, nawet jeśli nie jest to wyraźnie udokumentowane .)Brainfuck
Próbuję się przekonać, że jest to możliwe, i jestem całkiem pewien, że mogłem to trochę za daleko posunąć. Podjąłem kilka założeń dotyczących mojego środowiska:
Niestety obawiam się, że będzie to trudniejsze. Oto moje rozwiązanie:
Zasadniczo możesz zmienić kod wyjściowy lub kod weryfikacyjny, ale nie jedno i drugie. Jedna z nich gwarantuje, że zadziała. Jeśli któryś z nich tego nie zrobi, nastąpi „awaria”.
źródło
Python2
Musiałem nieco zmienić skrypt testowy Raya, aby to przetestować, ponieważ standardowe przekierowanie go zrywało. Przekazywanie pustych dykt do exec pozwala uniknąć zanieczyszczenia przestrzeni nazw
źródło
Brain-Flak , 44 + 3 = 47 bajtów [Nie konkuruje]
Wykorzystuje
-A
flagę Brain-Flak i wysyła znaki2012
do STDOUTWypróbuj online!
Alternatywnie, 50 bajtów
Wypróbuj online!
Wyjaśnienie
Każda modyfikacja jednego z powyższych znaków w jednym znaku spowoduje błąd programu.
źródło
Sisi , niekonkurujący
Wreszcie myślę, że znalazłem jeden z moich języków, który działa. Jest strasznie długi, a język jest nowszy od pytania, ale nadal wydaje się osiągnięciem.
O Sisi
Sisi to język zabawek inspirowany asemblerem i QBasic. Jest dobry na to wyzwanie, ponieważ jego składnia jest bardzo ograniczona.
set
,print
,jump
, ijumpif
.set
instrukcjach. Mogą zawierać (najwyżej) jedną operację, która musi być binarna. W szczególności: zmianaprint xx
naprint -xx
to błąd składniowy.Program
Rdzeniem programu jest ta część:
Przechowujemy
2012
wxx
, a następnie sprawdzamy, czy to się udało, i zapisujemy wynik testuy
. Jeśliy
to prawda, przejdź do wiersza 55. (Przeskakuje do nieistniejących numerów wierszy, po prostu szybko przewiń do następnej linii).Hartowanie radiacyjne
y
nastąpi falsey, skok nie nastąpi, a wiersz 4 ustawi sięxx
na 2012 rok.xx
ustawi się na 2012, niezależnie od tego, czy wykonamy skok, czy nie.print
prędzej czy później trafi on na linię 955. Nie jest możliwe, aby jedna modyfikacja skoczyła do tyłu (tworząc pętlę) lub przekroczyła końca programu.0
ustawione, więc taka modyfikacjaprint ax
nie jest błędem. Brzydkim, ale skutecznym rozwiązaniem są linie 828-954, które przypisują 2012 do każdej możliwej zmiennej z odległością edycji 1 odxx
. Zapewnia to, że wszelkie modyfikacje do wersji ostatecznejprint xx
będą nadal drukowane w 2012 roku.xx
ponownie.źródło
Pyton
Mały pełny (teraz z poprawką dla tego nieznośnego średnika między
print
i(
!):źródło
pop()
wprowadzenie pustego zestawu nie jest samo w sobie błędem, ale powoduje „błąd”.pop
wynikach<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
źródło
Stworzyłem skrypt Pythona, aby oceniać wszystkie rozwiązania Pythona. Skrypt psuje pierwsze i trzecie rozwiązanie Pythona na wiele różnych sposobów.
Drugie rozwiązanie wykorzystujące lambda do obrony, jest niezniszczalne.Drugie rozwiązanie Pythona jest w języku Python 3. Zmodyfikowałem go do formatu Python 2, a następnie program oceniający go zepsuł.Oto skrypt sędziego.
źródło
p2
zawsze zgłasza wyjątek dla Python2. Wynikiem nigdy nie jest 2012. Twój program oceniający nie będzie działał pod Python3, ponieważ używa instrukcji print.p2
jest w Pythonie 3.Mathematica, 23 znaki
Uwaga: "/." oznacza „zamień”
źródło
/.
na//
(formularz postfiksowy).JavaScript -
68, 77, 84, 80 znakówOto rozwiązanie, które powinno zadziałać w tym roku :)
Oto skrzypce testowe .
Aktualizacja 1: Naprawiono problem, w którym eval (+ a) go zepsuł (dzięki eBiznesowi).
Aktualizacja 2: Naprawiono dla „|” sprawa (dzięki jeszcze raz eBiznes).
Aktualizacja 3: Naprawiono przypadek „>” (jeszcze raz dziękuję eBiznesowi). I zepsułem przypadek „1” :(
źródło
eval(+a)
i wiele innych modyfikacji działa idealnie, ale nie robi wiele.eval(+a)
sprawy, którą należy teraz naprawić. Ponadto nie udało mi się znaleźć jednego z przypadków modyfikacji, w których działałby dobrze, ale nie wyświetla danych wyjściowych 2012, więc czy możesz podać mi przykład?eval(0)
ieval(-a)
na przykład robi to samo.||
go|
.alert
naaler=
.Ruby 1.9 - 43 znaki
Nie testowane, więc zerwij.
źródło
Excel, 14 znaków (lekkie oszukiwanie):
Każda poprawna zmiana w tablicy wpłynie na zawartość obu komórek, a próba zmiany tylko jednej komórki spowoduje wyświetlenie komunikatu o błędzie.
Oczywiście to się psuje, jeśli weźmiesz pod uwagę, że tak naprawdę jest to tylko jedna formuła, w przeciwieństwie do 2 formuł, które muszą być identyczne.
źródło
Java 7
Wyjaśnienie:
a
wartość2012
).a
zostanie zmodyfikowana w jakikolwiek sposób, przyjmie następującą ścieżkę: 1 → 3 → 5 (i zwrócib
niezmienioną wartość2012
).b
zostanie zmodyfikowana w jakikolwiek sposób, przyjmie następującą ścieżkę: 1 → 3 → 4 (i zwrócia
niezmienioną wartość2012
).a.equals(b)
na @ 1 zostanie zmieniony naa.equals(a)
,b.equals(b)
lub!a.equals(b)
nadal będzie podążał tą samą ścieżką: 1 → 2 (i zwrócia
niezmienioną wartość2012
).a
zmieni się na @ 2,b
to nadal będzie podążał następującą ścieżką: 1 → 2 (i zwrócib
niezmienioną wartość2012
).a
lubb
przeciwnie, nadal będzie podążał następującą ścieżką: 1 → 2 (i zwrócia
niezmienioną wartość z2012
)a
niezmienioną wartość2012
)M
wclass M
luba
wmain(String[]a)
innej ważnej charakteru można zrobić bez żadnych zmian w funkcjonalności kodu.Wypróbuj wszystkie te modyfikacje tutaj, aby sprawdzić, czy nadal drukują 2012.
Jeśli potrafisz znaleźć sposób na złamanie go zgodnie z zasadami OP, chciałbym wiedzieć, żebym mógł coś wymyślić.
W przeciwieństwie do większości podobnych pytań, w których modyfikowany jest pojedynczy znak, pytanie to pozwala na zachowanie podstawowej struktury języka programowania, aby Java mogła w końcu
konkurować jednymwprowadzeniem (spójrzmy prawdzie w oczy, Java prawie nigdy nie wygra niczego na ten SE xD).źródło
a
? Czy program będzie nadal generował rok 2012, czy też wyda -2012?-
przeda
lubb
. Oto zrzut ekranu błędu kompilacji.Ruby 1.9
Buduję ten krótki, ale prosty program, który możesz złamać zgodnie z powyższymi zasadami. Nie mogłem nawet znaleźć pozycji, w której dane wyjściowe zostałyby zmienione (bez złamania kodu), jeśli
#
wstawiono a, aby skomentować resztę wiersza.źródło
irb
dodaniem minusa przedrx
wynikiem w prawidłowym programie, który wyświetla dane wyjściowe-2012
…puts
naputc
powoduje, że wyświetla to a?
w Ruby 1.9.Scala, 95
(lub 54, jeśli pominą nieistotne części)
źródło
(...),("2012")
chyba to złamałem.DO#
Z pewnością nie jest to takie proste, prawda? ...
Ok, za czym tęsknię?
źródło
if (result += "2012")
uzyskać wynik20122012
?if
instrukcji, a nie ciągu.;
poelse
powoduje, że wyświetla dwa razy.PHP, 30
źródło
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Rozwiązanie przeciwko temu: wstaw nowy wiersz po$i=2012
.Taxi , 396 bajtów
Sformatowany dla ludzi, to jest:
Po przeczytaniu innych odpowiedzi wydaje się, że rozwiązaniem jest wybranie delikatnego języka, ustawienie wartości, sprawdzenie wartości, wydrukowanie wartości.
źródło
SmileBASIC
Po pierwsze, włączamy tryb ścisły. Zmusza to do zadeklarowania wszystkich zmiennych przed ich użyciem i uniemożliwia takie rzeczy jak zmiana? A $ na? B $.
Następnie tworzona jest zmienna łańcuchowa o nazwie „A $”, a wartość jest ustawiana na „@ 2012”. Aby upewnić się, że wartość A $ nie została zmieniona, program spróbuje przeskoczyć do etykiety, a jedyną etykietą w programie jest @ 2012.
Teraz $ to zdecydowanie „@ 2012”, ale przed wydrukowaniem @ należy usunąć. SHIFT () usuwa pierwszy element z łańcucha lub tablicy (podobnie jak pop (), ale z drugiego końca). Aby odrzucić wartość zwróconą przez SHIFT, jest ona przekazywana do bloku IF / THEN, który nic nie robi. Na wypadek, gdyby ktoś próbował skomentować ten wiersz, deklarujemy zmienną „B”, która jest używana później. Jeśli VAR zostanie skomentowane, ostatni wiersz zgłosi błąd Niezdefiniowana zmienna.
Teraz drukowane jest $ i istnieje kolejna zmienna VAR, aby zapobiec komentarzom. Ostatni wiersz tylko upewnia się, że zmienne B i C zostały zadeklarowane.
źródło
?-A$VAR C
- czy to wyjście-2012
??B$VAR C
:? :)Haskell, 65
Perl, 84
Nieudane podejście:
źródło
$&
czymś takim$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
może być bezpieczne dla rozwiązania Haskell.use English
perla, który to naprawi. Myślę, że kilka poprawek działa dla Haskell, w tym przełączanie na ciągi.print
z*rint
,prin:
,p:int
lub#rint
, poprzedzenie=
do pierwszej linii, lub nawet zastąpienies/.*/
zs/./
luby/.*/
(która będzie ustalona przez inicjowanie$ARG
aby2012
zacząć). Ponadto twoja$SUBSEP
sztuczka nadal nie chroni przed wstawieniem*
średnika przed końcowym średnikiem, ale o wiele łatwiejszym rozwiązaniem jest usunięcie tego niepotrzebnego średnika.PHP,
4348źródło
-
między?
i$a
wyniki-2012
są drukowane.date()
, ale program musi działać również po 2012 roku. ;)-
między? i abs. ;-)Rubin (
5736)EDYCJA I jeszcze jeden na 36 znaków.
Wydaje mi się, że używanie łańcuchów jest dość bezpieczne, ponieważ ta minusowa rzecz już nie działa.
EDYTUJ kolejną próbę (36 znaków) [nieważne, dodanie wyników
-
pop
w-2012
]p [2012,2012] .find (2012). pierwsze || 2012Ten będzie działał tylko w tym roku, ale także w przypadku podobnych konkursów w przyszłości :) (15. znaki)
Pamiętaj, że to podstawienie działa również:
57 znaków. Jeśli policzysz także nowe wiersze, będzie to również 76 znaków.
źródło
#
na początku linii. Ostatnie rozwiązanie - wcześniej wpisz nową linięp
. (Uwaga - sam nie znam Ruby, więc może się mylę).$><<
lubputs
zamiast tego. Cokolwiek, nie będę już tego próbował, poddałem się :)P 23
.
itp
źródło
-
)? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
-q){$[2012~m:-2012;m;2012]}` 2012
-q){$[2012~m:2012;m;-2012]}` 2012
;m;
na coś takiego jak;1;
lub;x;
.Hmm .. pozwól mi spróbować:
128 znaków bez białych znaków.
źródło
System.out.println(-i)
(Dla pierwszego wydruku). Uszkodzony również przez np. Zastąpienie pierwszegoprintln(i)
przez npprintln(1)
. Potencjalnie uszkodzony również przez zmianęi == j
nai += j
(lub - = itd.).PHP
Mam nadzieję, że jest niezniszczalny :)
źródło
echo(printf("%s",$a)==4)?die(3
i dostaję20123
.."2012"
na."FAIL"
. :)Groovy: 26
źródło
x=2012;print x^2012?2012:-x
-
?-
jest próba zmodyfikowania kodu za pomocą jednego znaku, aby przestał działać .x=2012;print x^=2012?2012:x
(zmiana^
na^=
) zmienia wyjście na 0.Lua
źródło
-
znaków?2012
na coś innego, to assert spowoduje błąd. Hmm ... wydaje mi się, że zasługujesz na punkty kreatywności za naruszenie zasad. Ale tak na poważnie, nie tak to miało na myśli.