Napisz skrypt, który działa dobrze, gdy w przepływie logiki programu występuje pusty wiersz, ale przerywa lub powoduje nieoczekiwane zachowanie po usunięciu tego wiersza.
Unikaj standardowych luk i głupich odpowiedzi. Twój program powinien zrobić coś „przydatnego”, nawet jeśli wystarczy dodać kilka liczb całkowitych.
Usunięcie pustej linii z ciągu wielowierszowego nie ma znaczenia, chyba że oczekiwane wyjście z tego ciągu wielowierszowego nie powinno się technicznie zmienić (tj .: jeśli usuniesz wszystkie pasujące puste wiersze ^$
).
Głupstwo w białych znakach również nie jest dozwolone; nie rób dziwnych rzeczy ze zwrotami karetki, tabulatorami, spacjami itp.
popularity-contest
underhanded
Naftuli Kay
źródło
źródło
Odpowiedzi:
JavaScript
Otwiera wyskakujące okienko z komunikatem „Witaj, świecie!” jeśli pusta linia istnieje, w przeciwnym razie ostrzega „0”.
Próbny
Wyjaśnienie:
arguments.callee
jest odniesieniem do samoczynnie wykonującej się funkcji anonimowej.Dołączenie pustej tablicy (
[]
) powoduje rzutowanie funkcji na ciąg znaków, co daje kod źródłowy.indexOf
zwraca,-1
jeśli ciąg nie zostanie znaleziony.Wykonywanie bitowej operacji nie (
~
) powoduje-1
przekształcenie w0
wartość falsey.źródło
arguments.callee
zawiera źródło funkcji.arguments.callee
.arguments.callee
. Nawet sprawia, że jest krótszy.do
Ten magiczny program z 8 kulkami będzie nadal działał bez pustej linii, ale będzie nieco bardziej decydujący - żadna z neutralnych odpowiedzi nigdy nie pojawi się na wyjściu.
Wyjaśnienie
źródło
Befunge-93
Mój pierwszy program befunge :)
Odczytuje dwie liczby z wejścia i wypisuje ich sumę. Jeśli usuniesz pusty wiersz, nic nie drukuje.
Wyjaśnienie:
v
ustawia kierunek wykonywania kodu w dół&
czyta liczbę całkowitą+
dodaje liczby razem#
pomija kolejne polecenie.
wypisuje liczbę całkowitą ze stosu@
kończy programJak napisano,
#
przeskakuje pustą linię i kontynuuje.
. Kup po usunięciu pustej linii.
jest pomijany.Wydaje się, że jest miły tłumacz na http://befunge.aurlien.net/
źródło
Ruby / Shell
Działa dobrze, jeśli nowa linia znajduje się na górze, w przeciwnym razie pierwsza linia komentarza jest interpretowana przez powłokę jako zniekształcony shebang.
źródło
ruby youranswer.rb
, nie szukałby shebang, ponieważ jest już uruchomiony w tłumaczu ruby, ale jeśli uruchomiłeś go tak,./youranswer.rb
jakby w ogóle nie działał, ponieważ nie ma shebang ..ruby youranswer.rb
, co może być przydatne do ustawienia niezbędnych przełączników wiersza poleceń w pliku. Więc bez nowej linii dostajęruby: no Ruby script found in input (LoadError)
Scala
Jeśli usuniesz pusty wiersz, wydruk nie zostanie wydrukowany. Co jest najlepsze, ponieważ Twój stos przepełniłby się, gdybyś faktycznie sprawdził
IntWrapper
.źródło
GolfScript
Oblicza GCD dwóch niezerowych liczb całkowitych. Usunięcie pustej linii powoduje uszkodzenie programu.
Wypróbuj online.
Jak to działa
To jest implementacja algorytmu euklidesowego w języku GolfScript:
Jest tylko jeden mały problem:
źródło
#
,{
i}
nie mogą być używane jako nazwy zmiennych, ponieważ są one częścią składni. Każdy inny token jest w porządku, w tym łańcuchy..:-1
przechowuje dane wejściowe-1
, a nie sam znak minus? Hmm ...Składnia szablonu MediaWiki
Zdefiniuj szablon: Foo as
Na innej stronie
źródło
LaTeX (backref)
Poniższy kod LaTeX używa cytatu, który zawiera listę stron, na których cytowany jest wpis. Oto pierwsza strona. Pakiet
hyperref
dodaje również linki PDF, odnośnik do strony jest czerwony, link cytatu jest zielony.Ale LaTeX nie wymaga pustej linii, pusta linia wygląda na zbędną, a przykład nadal będzie działał bez,
hyperref
a pusta linia:Ale linki i referencje zniknęły, dlatego ponownie je wstawiamy:
Ale teraz przykład jest zepsuty i nie będzie się już kompilował :
Co się stało? Pakiet
hyperref
(lub bardziej precyzyjny pakietbackref
, który jest ładowanyhyperref
) chce uzyskać na końcu pozycji bibliografii, aby dodać tylną listę referencyjną. Ale składnia w LaTeX zapewnia tylko początek wpisu\bibitem
, koniec może być wszędzie. W tym pakiecie awaryjnymbackref
dodano ograniczenie, które\bibitem
musi kończyć wpis pustą linią. Następnie pakiet może przedefiniować,\bibitem
aby umieścić referencje na końcu wpisu.Ponieważ brakuje pustej linii, TeX wciąż go szuka, ale zamiast tego znalazł koniec pliku i wyświetla komunikat o błędzie.
źródło
C (częściowo zaciemniony)
Ten mały program pobiera liczbę z wiersza poleceń i oblicza silnię. Zawiera jednak także najnowocześniejsze funkcje AI do weryfikacji środowiska wykonawczego, czy przestrzegane są standardy kodowania firmy, w tym prawidłowe użycie białych znaków i pustych linii. Usunięcie pustej linii spowoduje, że algorytm odrzuci program, który nie nadaje się do utrzymania w wystarczającym stopniu.
Nigdzie nie ma żadnych kontynuacji linii ani kaligrafii. Uważam, że jest to poprawne ANSI C99.
Ze względu na zaawansowaną matematykę, jeśli się kompilujesz
gcc
, pamiętaj o użyciu-lm
.Spojler
źródło
tcc -run
vfry
nie jest rozwinięte w definicji funkcji, naprawdę mnie zaskoczyło.do
Ten program działa zgodnie z oczekiwaniami (jak opisano w komentarzach), chyba że poprzednia pusta linia
foo = 5;
zostanie usunięta.Niestety raz napotkałem błąd prawie dokładnie taki jak ten w kodzie produkcyjnym.
W tym przykładzie użyto
do { ... } while (0)
idiomu do utworzenia instrukcji wielowierszowej w makrze (patrz https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ). Używa także znaku odwrotnego ukośnika, aby rozłożyć#define
wiele linii, wygodnie ustawionych w linii poza zasięgiem wzroku. Jednak robi to również dwie rzeczy źle:while (0)
, a idiom zwykle tego pomija#define
Mając to na miejscu, usuwając pusty wiersz przed
foo = 5;
przyczyn, które zadanie do wykonania poprintf
, ale także po każdym wezwaniemFROB
makro. W rezultacie wynik po usunięciu pustego wiersza to:źródło
C / C ++
Zwraca sukces i może być wykorzystany jako implementacja true . Jeśli pusty wiersz zostanie usunięty, możesz zamiast tego użyć go jako implementacji wartości false .
źródło
PowerShell
Ta funkcja doda dwie liczby.
Usunięcie pustej linii spowoduje awarię funkcji przy:
Unexpected token '$b' in expression or statement.
Wyjaśnienie
źródło
TeX
Bez pustej linii „cześć” nie jest drukowane.
Wyjaśnienie
TeX traktuje pustą linię jako podział akapitu i
\everypar
jest wykonywany na początku nowego akapitu.źródło
Jawa
źródło
Math.pow
?Math.pow
i wydrukowanie wyników oznacza robienie czegoś , prawda?Perl 5
Ten kod jest drukowany
Hello, World!
. Usunięcie pustej linii powoduje błąd składniowy.Wyjaśnienie:
źródło
Partia
Ten kod wyświetli
Hello
i w następnym wierszuWorld
. Po usunięciu jednego lub obu pustych wierszy nic nie wyświetla.Tutaj jest wyjaśnienie .
źródło
Rubin
Usunięcie pierwszego wiersza spowoduje błąd:
źródło
Pyton
Nie wiem, czy to mieści się w standardowych lukach, spojrzałem na listę i tego nie widziałem.
Uruchomienie tego regularnie powraca
Uruchamianie go bez pustej linii w linii 4, tj. Jak poniżej:
nic nie zwraca.
źródło
Python 2.x
Ten program wypisuje piąty znak wprowadzonego ciągu.
To nie jest w żaden sposób ukryte. Jeśli usuniesz pustą linię, daje ona czwarty znak, a szósty, jeśli dodasz jeden.
źródło
Tcl
Funkcja, która dodaje dwie liczby (i sprawdza, czy nowa linia została usunięta):
Nie ma tu nic do ukrycia, robi to, co mówi, więc nie psuję wyjaśnienia. Ta funkcja
info
to szwajcarski scyzoryk introspekcji (co inne języki nazywają odbiciem).info body
zwraca kod źródłowy funkcji (jeśli nie jest napisany w C lub asemblerze).Muszę przyznać, że to mnie zaskoczyło, dopóki nie zobaczyłem rozwiązania javascript.
źródło
do
W pustym wierszu
a
jest zmienną lokalną a, a bez parametru makra ...źródło
Technicznie nie jest to problem z „kodem”, ale problem z serwerem. Jeśli zostanie to wysłane do Apache ze skryptu CGI (który można wygenerować w dowolnym języku), wyśle odpowiedź HTTP do klienta:
Z drugiej strony to się nie powiedzie, ponieważ brakuje pustego miejsca po nagłówku.
źródło
JavaScript
Funkcja
whereami
odpowiada pozycją linii wywołującej względem jej własnej pozycji w kodzie źródłowym.Jeśli jakaś pusta linia w
whereami
funkcji zostanie usunięta. Dane wyjściowe toNaN line(s) confusing me
. (Dodanie linii nie łamie go)źródło
Perl
źródło
Escript
Z powodu błędu w
escript
implementacji poprawny skrypt musi mieć co najmniej trzy linie długości, a pierwsza linia musi być linią shebang lub linią pustą. Zatem poniższy skrypt musi mieć dwie puste linie, w których pierwszy musi być pierwszy:Lub musi być podzielony na dwie linie, ale wciąż musi mieć pierwszą pustą linię.
W przeciwnym razie dostaniesz
źródło
Rubin
Drukuje
2+2=4
, ale podaje błąd składniowy bez pustej trzeciej linii.%q
pozwala dowolnemu znakowi niebędącemu słowem służyć jako ogranicznik łańcucha, nawet znakowi nowej linii. Tak więc pierwsze trzy wiersze kodu są w rzeczywistości równoważneprint %q"2+2="
lub po prostuprint "2+2="
. Ponieważ nowa linia po2+2=
jest używana jako ogranicznik cudzysłowu, nie jest również analizowana jako ogranicznik wiersza , więc potrzebujesz następnej zaraz po niej.źródło
Bezsenność (obie wersje)!
Ten kod wypisuje ~ (nie pytaj dlaczego, bezsenność jest dziwna). Jeśli usuniesz pustą linię, zamiast niej zostanie wydrukowane ÿ.
Nawiasem mówiąc, ta pierwsza litera jest kolcem .
źródło
C ++
To klasyczna i raczej głupia sztuczka. Będziesz wiedział, co to jest, kiedy to zobaczysz, to tylko tutaj, ze względu na zakończenie. Jako taki, zaznaczam to jako odpowiedź wiki społeczności.
Dlaczego to działa
źródło
??/
oznacza to , a\
więc??//
oznacza\/
, a ponieważ linia się nie kończy\
, nie ma kontynuacji linii. Po drugie, zachowanie jest dokładnie takie samo bez względu nareturn 0;
to, czy jest wykonywane, ponieważ jest to standardowe zachowanie, gdy wykonaniemain
zamyka się}
.I know people always use this in these kinds of question
dlatego stworzyliśmy standardową lukęWklej to do pliku HTML i otwórz w przeglądarce. Jest to dość proste, ale trochę trudne, ponieważ wymaga liczby pustych wierszy w dokumencie i indeksuje tablicę w celu wywołania funkcji, która wyświetla alert.
Ten łamie zasady graniczne. Technicznie JavaScript nie ma ciągów wielowierszowych, co jest jedynym powodem, dla którego to działa.
Ponieważ możesz mieć błąd składniowy w jednym znaczniku skryptu bez ingerencji w inne znaczniki skryptu, pokazuje to pozytywny wynik tylko wtedy, gdy na stronie wystąpi błąd. Błąd uniemożliwia uruchomienie drugiego alertu, ponieważ znajduje się w tym samym znaczniku skryptu.
źródło
Rubin
Sekret polega na tym, że nowa linia to tak naprawdę karta, a następnie nowa linia. Nie wiem, czy to się liczy, ale myślałem, że to tasak. Znak po znaku
%
jest również tabulatorem, ale z jakiegoś powodu nie pokazuje się jak jeden. Używam notacji procentowej Ruby, aby utworzyć ciąg, który dodaje pierwsze 2 argumenty przekazane do skryptu. Więcej na ten temat tutaj: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/źródło
\n
trzeba być obecnym i mieć kluczowe znaczenie dla prawidłowego działania programu.