Rzućmy okiem na typową pętlę, która zwykle wykonuje 8 iteracji:
for (int x=0; x<8; ++x);
Musisz uczynić to nieskończonym!
To konkurs popularności dla wszystkich języków obsługujących taką formę for
pętli. Tak więc wygrywa rozwiązanie z najwyższym wynikiem (głosowanie pozytywne i głosowanie negatywne).
Jeśli Twój język ma inną formę for
pętli, ale jesteś pewien, możesz zrobić z nim coś fajnego, opublikuj odpowiedź i oznacz ją jako niekonkurencyjną. Zastrzegam sobie prawo do rozszerzenia zakresu dostępnych konstrukcji i języków, ale nigdy się nie zmniejszy, więc nie bój się upuścić wcześniej poprawnych rozwiązań.
Co to jest rozwiązanie
Rozwiązanie składa się z dwóch programów.
Pierwszy program to czysty program. Jest to typowy program w Twoim języku z for
pętlą wykonującą 8 iteracji. Powinien to być normalny program, który mógł napisać każdy programista. Żadnych specjalnych hacków do celów przygotowawczych. Na przykład:
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Drugi program jest rozszerzony. Ten program powinien zawierać cały kod z czystego programu i trochę dodatkowego kodu. Liczba punktów rozszerzeń jest ograniczona , szczegółowe informacje można znaleźć w pełnej sekcji reguł. Może być rozszerzonym programem dla powyższego czystego programu
inline bool operator < (const int &a, const int &b)
{
return true;
}
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
To tylko przykład (niekompilowalny w C ++), aby pokazać pomysł. Prawdziwie poprawny program rozszerzony musi być kompatybilny, działać i mieć nieskończoną pętlę.
Kompletne zasady
Oba programy:
- Każdy język z obsługą takich
for
pętli jest w porządku. - Korpus pętli musi być pusty. Mówiąc dokładniej, możesz umieścić jakiś wynik lub inny kod w pętli, ale zachowanie pętli powinno być takie samo w przypadku pustej pętli.
Czysty program:
Pętla używa licznika liczb całkowitych lub liczbowych i wykonuje 8 iteracji:
for (int x=0; x<8; ++x); // C, C++, C# for (var x=0; x<8; ++x); // C#, Javascript for (auto x=0; x<8; ++x); // C, C++ for (auto signed x=0; x<8; ++x); // C, C++ for (register int x=0; x<8; ++x); // C, C++
Typy zdefiniowane przez użytkownika są niedozwolone.
- Używanie właściwości (oprócz zmiennej globalnej) zamiast zmiennej pętli jest niedozwolone.
Deklaracja zmiennej może znajdować się wewnątrz lub na zewnątrz pętli. Poniższy kod jest w porządku:
int x; for(x=0; x<8; ++x);
Można użyć przyrostu przedrostka lub przyrostka.
Limit pętli
8
należy zapisać jako stały literał bez zapisywania nazwanej stałej lub zmiennej. Ma na celu zapobieganie rozwiązaniom opartym na zadeklarowaniu zmiennej lub stałej równej 8, a następnie zmianie przypisania, zastąpienia lub zacienienia przez inną wartość:const double n = 8; int main() { const double n = 9007199254740992; for (double x=0; x<n; ++x); return 0; }
Program rozszerzony:
- Musi zawierać cały kod z czystego.
- Powinien rozszerzyć czysty program w ograniczonej liczbie punktów rozszerzenia.
- Musi wykonać tę samą
for
pętlę, co sama pętla nieskończona.
Umieszczenie pętli w innej nieskończonej konstrukcji nie jest w porządku. - Dopasowanie kodu w czasie wykonywania lub kompilacji jest dozwolone, o ile jego tekstowa reprezentacja pozostaje niezmieniona.
- Umieszczanie konstrukcji w sznurku i przechodzenie do niej
eval
jest zabronione.
Punkty rozszerzenia:
- W dowolnym miejscu poza fragmentem z czystym kodem, w tym innymi plikami lub innymi zestawami.
for
oświadczenie (jako pojedynczy element -for
konstrukcja i jego korpus) musi pozostać niezmienione.- Deklaracja zmiennej musi pozostać taka sama.
- Dowolne miejsce między prostymi instrukcjami może być wykorzystane jako punkt rozszerzenia.
- Jeśli i tylko jeśli zmienna została zadeklarowana poza pętlą i bez natychmiastowego przypisania wartości, takie przypisanie można dodać.
/* extension point here */
int main()
/* extension point here */
{
/* extension point here */
int x /* extension point for assignment here */;
/* extension point here */
for (x=0; x<8; ++x);
/* extension point here */
return 0;
/* extension point here */
}
/* extension point here */
int main()
{
/* BEGIN: No changes allowed */ int x = 0; /* END */
/* extension point here */
/* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
return 0;
}
PS: Jeśli to możliwe, proszę podać link do internetowego IDE.
java.lang.Integer
? 2. Lepiej byłoby to przy odpowiednim kryterium wygranej.Odpowiedzi:
Python3
Czysty program:
To tylko standardowe odliczanie podczas pętli.
Program rozszerzony:
Używa int cache przedefiniować
8
jak9
co skutecznie sprawia, żen -= 1
nie-Op, od9-1 = 8
której po prostu ustawian
z powrotem9
ponownie, powodując nieskończoną pętlę.Można zobaczyć w akcji int cache internetowego tutaj (choć oczywiście bez nieskończoną pętlę bo jej w Internecie).
źródło
8
aby9
Python 3.5.2 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux
Python 3
Czysty program:
Standardowy sposób zrobienia czegoś 8 razy w Pythonie to:
Program rozszerzony:
Jeśli jednak zastąpimy funkcję generatora zasięgu, aby uzyskać nieskończenie wartość 1, staje się ona nieskończoną pętlą ...
Możemy pójść dalej i stworzyć funkcję generatora, która zamiast nieskończenie dawać 1, liczy się na zawsze:
Przetestuj na repl.it
źródło
Perl
Czysty
Rozszerzony
Ideone .
źródło
$i
staje się aliasem specjalnej zmiennej, która jest w stanie pomieścić booleany, więc gdy osiągnie 1, staje się odporny na zwiększanie.ES5 + (JavaScript)
EDYCJA : Usunięto jawną deklarację zmiennej, ponieważ w przeciwnym razie została podniesiona i utworzono nieokonfigurowalną właściwość window.x (chyba że uruchomiono wiersz po wierszu w konsoli REPL).
Wyjaśnienie:
Korzysta z faktu, że dowolna zmienna o zasięgu globalnym jest również własnością obiektu window , i redefiniuje właściwość „window.x”, aby miała stałą wartość 1.
Czysty
Rozszerzony
UWAGA : Aby wykonać tę pracę w node.js, wystarczy wymienić „okno” z „globalne” (testowane w node.js 6.8.0)
źródło
var
Crome. Ale możesz usunąćvar
z obu programów - wszystko będzie dobrze.var
podnośniki, więc w momencie korzystania zdefineProperty
niego już wychodzimy. Ale jeśli umieścisz te 2 wiersze w różnych skryptach (nawiasem mówiąc, jest to dozwolone), zadziałałoby, ponieważ właściwość zostanie utworzona jako pierwsza, avar
następnie zostanie zignorowana. Dowód: i.stack.imgur.com/lSwbE.pngdo
Czysty program
Rozszerzony program
źródło
Must execute same for loop as an infinite loop itself. Placing of the loop into another infinite construction is not ok.
Jawa
Czysty program:
Program rozszerzony:
Ustawia liczbę całkowitą w pamięci podręcznej liczb całkowitych, która powinna zawierać od 1 do 0, skutecznie
i++
nie rób nic (ustawiai
na buforowaną liczbę całkowitą, która powinna zawierać 1, ale ponieważ ta liczba całkowita faktycznie zawiera 0, nic się nie zmienia).źródło
int
raczej rozpakowanego niż stosunkowo ciężkiegoInteger
.C ++
bool
może być tylko 0 lub 1. Zainspirowany odpowiedzią Perla primo .źródło
Python 3 (3.5.0)
Czysty program:
Rozszerzony
To rozwiązanie różni się od innych napisanych w Pythonie, ponieważ w rzeczywistości zmienia kod źródłowy w locie. Wszystkie elementy w pętli for można zmienić na dowolny kod.
Kod zmienia kod operacji od drugiego do ostatniego na
113
lub bardziej czytelny -JUMP_ABSOLUTE
. Zmienia operand na160
- instrukcję, w której rozpoczyna się pętla for, w efekcie tworząc instrukcję GOTO na końcu programu.Rozszerzony program drukuje liczby
0..7
nieskończenie wiele razy bez przepełnienia stosu itp.źródło
PHP
Myślę, że jest to zgodne z zasadami punktu rozszerzenia; Nie jestem całkowicie jasny w punkcie 4. Jest bardzo podobny do odpowiedzi perla @ primo, więc myślę, że to się liczy.
Czysty
Rozszerzony
PHP pozwala zwiększać niektóre ciągi, takie jak:
Wszystkie te ciągi mają wartość 0, więc zapętla się praktycznie na zawsze (z wyjątkiem braku pamięci).
źródło
Perl
Wyczyść kod
Kod rozszerzony
Większość zmiennych Perla to tylko zmienne. Jednak język ma również
tie
funkcję, która pozwala skutecznie podawać zmienne pobierające i ustawiające. W tym programie zmieniam główny pakiet (którego nazwa to łańcuch zerowy) w ekwiwalent klasy z języka obiektowego, jednocześnie mając przy tym program. To pozwala mi powiązaćfor
licznik pętli z samym programem. WdrożenieTIESCALAR
pozwalatie
odnieść sukces; zwracana wartośćTIESCALAR
ma być odniesieniem do dowolnego stanu wewnętrznego, który musimy utrzymywać powiązanego ze zmienną, ale ponieważ nie potrzebujemy żadnego, zwracamy puste odwołanie do tablicy jako symbol zastępczy. Następnie podajemy najprostsze możliwe implementacje metody pobierającej i ustawiającej; żadne z nich nic nie robi, więc próbuje to przypisać$x
nie mają żadnego efektu, a próby jego odczytania zawsze powracająundef
, czyli liczbowo mniej niż 8.źródło
WinDbg
Czysty
Rozszerzony
Takie podejście tworzy alias dla
<
as|
, więc gdy<
napotkamy w kodzie, alias jest rozwijany do|
i bitowo - lub jest wykonywany zamiast mniej niż. W WinDbg wszystkie niezerowe wartości są prawdziwe, więcanything | 8
zawsze jest prawdziwe.Uwaga: Nie
.block
jest tak naprawdę potrzebny, jeśliaS
i.for
są wprowadzane jako dwie różne linie, jak pokazano tutaj, jest wymagany tylko wtedy, gdyaS
i.for
znajdują się w tej samej linii.źródło
Matematyka
Czysty
Rozszerzony
źródło
Common Lisp
Wyczyść kod
Rozszerzony
Makro o nazwie
keyword:dotimes
aka:dotimes
(patrz 11.1.2.3 Pakiet KEYWORD ) jest zdefiniowane i rozwija się jako nieskończona pętla. Tedefmacro
powroty makro nazwa makro jest zdefiniowane, co może być doprowadzoneshadowing-import
. Tak więc ten nowydotimes
symbole przesłaniają standardowy (który nie powinien być przedefiniowywany ani leksykalnie związany z innym makrem w programach przenośnych).Rozszerzony (2)
Kiedy czytamy znak 8, zastępujemy go znakiem
(loop)
. Oznacza to, że powyższe odczytuje jako(dotimes (i (loop)))
i dlatego kod nigdy nie kończy obliczania górnej granicy. Wpływa to na wszystkie wystąpienia 8, nie tylko na jedno w pętli. Innymi słowy, 8 naprawdę oznacza nieskończoność. Jeśli jesteś ciekawy, gdy modyfikowalny jest tekst do odczytu jak wyżej, to znak 8 „kończy się” i odłącza się od innych obecnie czytanych liczb / symboli:... brzmi jak:
Możesz uruchomić testy na Ideone: https://ideone.com/sR3AiU .
źródło
Rubin
Czysty
Tego rodzaju pętla for nie jest zbyt często używana w Rubim, ale typowy samouczek powie ci, że jest to odpowiedni sposób:
Rozszerzony
Pętla for po prostu wywołuje
(1..8).each
dany blok kodu, dlatego zmieniamy tę metodę:źródło
Haskell
Czysta wersja:
Wersja rozszerzona:
Jest to dość proste, naprawdę: po prostu zdefiniować własny typ
T
tak, że jegoenumFromTo
wystąpienie jest nieskończony ciąg, a następnie użyć typu wywiązał tak że typ-adnotacją un-wartości0
i8
są traktowane jako typT
.źródło
///
W
for
/// nie ma wyraźnych pętli, ale można je zasymulować (mimo wszystko jest to zakończone).Czysty:
Rozszerzony:
Co się dzieje?
Podczas, gdy pierwsza Program odlicza od 8 do 0, drugi z nich jest
/0/0/
zasada zastąpi0
przez0
aż do wieczności.źródło
/0/1//1/2/.../7/8//8/8/8
zamiast tego zrobisz coś takiego, jak liczyć.JavaScript ES6
OK, oto wersja, która działa przy użyciu ES6 for ... konstrukcji pętli. Dam ci nawet czystą tablicę, abyśmy byli pewni, że nie ma śmiesznego interesu:
Czysty
Oczywiście nie powstrzymuje to nikogo przed bałaganem przy użyciu prototypu Array ...
Rozszerzony
Działa to poprzez nadpisanie domyślnego iteratora, aby nigdy się nie kończył, blokując wszystko w nieskończonej pętli. Kod nie ma nawet szansy uruchomić rzeczy w pętli.
źródło
var
w pętli.C ++
Wykorzystuje 2 punkty rozszerzenia:
Czysty program jest taki sam jak w opisie.
źródło
Brainfuck
Drukuję „0” dla każdej iteracji, aby ułatwić jej policzenie. Ale można wstawić dowolny kod bez zmiany sposobu działania pętli.
Czysty
Wypróbuj online
Wersja rozszerzona opiera się na wspólnej implementacji Brainfuck z 8-bitowymi komórkami. W tych implementacjach „przyrost” jest w rzeczywistości „przyrostem (mod 256)”. Tak więc, aby znaleźć pętlę, która będzie iterować dokładnie 8 razy w wersji czystej i nieskończonej w wersji rozszerzonej, możemy po prostu znaleźć rozwiązanie następującego systemu nierówności.
W tym przypadku dopuszczamy a = 128, b = 16 i c = 1. Oczywiście 128 + 16 * 8 = 256 (i 256 (mod 256) = 0) i 128> 0, a ponieważ b jest parzyste, c + a + b * n jest nieparzyste dla każdego nieparzystego a + c, a zatem nigdy nie będzie parzystą wielokrotnością 256 w takich przypadkach. Dla uproszczenia wybieramy c = 1. Zatem jedyną potrzebną nam zmianą jest jedna
+
na początku programu.Rozszerzony
Wypróbuj online
Zostawiam OP, aby ustalić, czy ten wpis jest konkurencyjny. Brainfuck nie ma wyraźnej pętli for, ale forma pętli, której użyłem, jest tak bliska, jak to tylko możliwe.
++++++++
jest również tak dosłowne,8
jak to tylko możliwe; Zawarłem sporo z nich.Czysta wersja prawie na pewno stanowi typowy program napisany w tym języku, ponieważ nawet najkrótszy znany Brainfuck Hello World zależy od modułowej relacji powtarzalności do pracy.
źródło
Haskell
Czysty
Rozszerzony
Zastępuje zwykły operator aplikacji funkcji operatorem,
$
który powtarza pętlę za każdym razem, gdy się kończy. Uruchomienie czystej wersji drukuje od 0 do 8, a następnie zatrzymuje się; wersja rozszerzona drukuje od 0 do 8, a następnie od 0 do 8 i tak dalej.Trochę oszukuję,
forM_ [0..8] $ \i -> print i
niekoniecznie jest to „najczystszy” sposób na napisanie tej pętli w Haskell; wielu Haskellerów zmniejszyłoby ciało pętli, aby uzyskać,forM_ [0..8] print
a wtedy nie można było$
pominąć. W mojej obronie skopiowałem czysty kod z odpowiedzi Cactus , który nie potrzebował tej właściwości, więc przynajmniej jeden programista Haskell napisał ten kod bez motywacji do niepotrzebnego dodawania$
!źródło
C ++
Pozwala
x
ocenić na 7. Nie działa w C, ponieważ wymaga wartości przy przypisywaniu i zwiększaniu.źródło
Nim
Wersja idiomatyczna, wykorzystująca
countup
:Czysty
Rozszerzony
Prosta i bardzo podobna do odpowiedzi w języku Python, która redefiniuje
range
. Przedefiniowujemycountup
, idiomatyczny sposób Nim iteracji z jednej int (włącznie) na drugą, aby dać 8s nieskończenie.Bardziej interesująca wersja, wykorzystująca operator zasięgu
..
:Czysty
Rozszerzony
Bardzo podobne do poprzedniego rozwiązania, z tą różnicą, że redefiniujemy operator zakresu
..
, który normalnie dawałby tablicę[1, 2, 3, 4, 5, 6, 7, 8]
iteratorowi wcześniej.źródło
GolfScript
Czysty
Rozszerzony
Przypisuje funkcję zwracającą n + 1 do zmiennej 8
źródło
tcl
Normalna:
Rozszerzony:
Chodzi o to, aby przedefiniować
incr
polecenie używane do zwiększania zmienneji
, tak aby nie zwiększać!Można przetestować na: http://rextester.com/live/QSKZPQ49822
źródło
Montaż x86_64
Czysty program:
Rodzaj pętli, jakiej używałby każdy programista asemblera, po której następowałaby syscall wyjścia, aby nie umożliwić dodawania
jmp loop_start
instrukcji później.Program rozszerzony:
Przepraszam również, jeśli źle, że czysty program nie ma punktu wejścia lub
section .text
źródło
JavaScript
Czysty:
Rozszerzony:
źródło
C ++
Czysty program
Ładna, normalna pętla, powtarzająca się od liczb od 0 do 7.
Program rozszerzony
Preprocesor C ++ jest dość niebezpieczną funkcją ...
Jedyny wiersz, który musieliśmy dodać, to
#define short bool
. To powoduje,i
że logiczna zamiast krótkiej liczby całkowitej, więc operator inkrementacji (i++
) nie robi nic poi
osiągnięciu 1. Dane wyjściowe wyglądają następująco:źródło