For
Pętle są szeroko stosowane w wielu językach, ale co byś zrobił, gdyby żaden język ich nie obsługiwał?
Stworzyć drogę do wykonywania podstawowej for
pętli bez użycia jakichkolwiek struktur powtarzania ( for
, foreach
, while
, do
, etc).
Podstawowa pętla for, którą musisz replikować, jest skonfigurowana w ten sposób
for(i=0;i<1000;i++)
Musisz być w stanie powielić to bez użycia struktur powtórzeń. Musi także wykonać kod w twoim języku, który byłby w treści pętli. Dowolna forma eval
jest dozwolona, chociaż może nie wykonywać for
pętli samodzielnie.
Możesz przetestować kod, drukując go i
spacją 100 razy, dodaj ten test na końcu swojej odpowiedzi, aby zweryfikować swój kod z innymi.
Nie ma ograniczeń co do tego, czym dokładnie musi być, wystarczy replikować for
pętlę.
Zwycięzca zostanie wyłoniony na podstawie upvotes w momencie jego wyboru.
źródło
Odpowiedzi:
C, 45 znaków bez goto, jeśli ...
Nie jest to najmniejsze rozwiązanie, ale uważam, że ten sposób robienia tego jest całkiem interesujący w C :)
Nie używa
goto
,if
,for
, lub innego rodzaju struktur kontrolnych.Sama funkcja (45 znaków):
Kompilowalny, działający program:
źródło
while
,do
,for
,if
...int (*a[])()={m,exit}
to tablica wskaźników funkcji.m
jest wywoływane, które zwiększa i drukujei
(ustawione na 1, 2, 3, ...) i wywołuje funkcję z tablicy wskaźników funkcji. Wywołanie(*a[i>999])();
zostanie rozwinięte do(*a[0])();
lub(*a[1])();
ponieważ C użyje wartościi>999
jako liczby całkowitej w zależności od tego, czy jest to prawda, czy fałsz (1 lub 0). Będzie dzwonił,m
ażi>999
będzie prawdą, a następnie wywoła wyjście. Dobre wykorzystanie wskaźników funkcji.Haskell, 33 znaki
To bardziej przypomina wynalezienie pętli for, ponieważ w Haskell nie ma takich bzdur: P.
źródło
forM_
jest po prostumapM_
z odrzuconymi argumentami, więc może to być oszustwo. ;)GCC -
10695 znakówW przeciwieństwie do innych rozwiązań C, w których musisz zadeklarować oddzwonienie, to robi to za Ciebie automatycznie:
Działa przy użyciu rozszerzenia funkcji zagnieżdżonych GCC . Mianowicie, deklaruje do przodu zagnieżdżoną funkcję
F
, przekazuje ją do funkcji zapętleniaL
, a następnie rozpoczyna definicjęF
, pozostawiając nawiasy klamrowe dla użytkownika do dodania.Jedną piękną rzeczą związaną z funkcjami zagnieżdżonymi w GCC jest to, że obsługują one spadki, co oznacza, że iluzja jest prawie kompletna:
Jest jedno ważne zastrzeżenie: jeśli użyjesz
FOR
dwa razy w tym samym zakresie, pojawi się konflikt (mianowicie, to się skompiluje, ale wszystkieFOR
pętle będą współdzielić jedno ciało pętli). Aby zezwolić na wiele pętli FOR w tym samym zakresie, potrzebujemy6965 dodatkowych znaków:175160 znaków:źródło
C, 21 znaków
Na przykład:
Wyjścia:
źródło
main()
pierwszego bloku kod nie będzie łączył się. Dlatego uważam, że powinien on zostać uwzględniony we wpisie.main()
w tym przypadku jest to sprawiedliwe pominięcie, ponieważ pytanie brzmi „Stwórz sposób wykonania”, a nie „stwórz kompletny program” jak w przypadku innych problemów.void
to będą26
tylko postacie.C # - bez rekurencji, bez goto
(przy użyciu kombinatora Y z rachunku lambda)
źródło
x86 montaż,
12wart 11 bajtów instrukcjiźródło
loop
instrukcji:mov cx, 1000\nx: ... loop x
Kolejny wariant Scali
Ponieważ Scala pozwala na używanie znaków spoza ASCII, możemy zaimplementować real dla :) (
o
jest cyrylica).Test:
źródło
JavaScript, 34 znaki
Zakłada się, że faktyczna funkcja drukowania nie jest częścią
for
pętli.sparametryzowana rekurencja (43) :
odwrotna rekurencja (36) :
zakłada
max >= 0
operator trójskładnikowy (34)
źródło
function f(m,c){m&&c()&f(--m,c)}
- Mógłbyś zrobić te 32 bajty :)Ruby 1.9 - 51 znaków
To jest znacznie większy niż inne wpisy, ale myślę, że lepiej oddaje istotę pytania. W efekcie pozwala to na napisanie kodu prawie dokładnie tak jak w przykładzie:
źródło
C #,
7057 znakówC # nie jest bronią z wyboru do golfa kodowego, ale pomyślałem, że wypróbuję to:
Nie tylko wykonuje to zadanie liczenia do 1000; raczej próbuje odtworzyć
for
zachowanie pętli dla dowolnego zadania. To wydawało się nieco bliższe celowi wyzwania, ale może to tylko ja.Rozszerzony:
Użycie jest bardzo zbliżone do składni for-loop:
źródło
Pyton
Przypadek szczególny:
I na ogół:
gdzie „f” jest twoim kodem. Prawdopodobnie nie działa we wszystkich przypadkach.
źródło
for
działa pętla.;i=+1
po przecinku. Powiedziałem, że to nie zadziała we wszystkich przypadkach.exec 'i=0;'+1000*'print i;i+=1;'
wykonałby zadanie.C: 33 znaki dla podstawy pętli (przy założeniu, że goto jest dozwolone)
źródło
Będę z tego powodu wstydzić, ale tutaj jest w powłoce Linux:
40 znaków.
źródło
Oto twoja pętla za pomocą Brainfuck, która prawdopodobnie oszukuje:
źródło
JavaScript - 39 znaków w przypadku testowym
Chrome, Opera i IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Nie udaje się to w przypadku przekroczenia „stosu połączeń” w przeglądarce Safari i „zbyt dużej rekurencji” w przeglądarce Firefox.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. Wykorzystuje to niestandardową funkcję „zamykania wyrażeń” Mozilli, aby wyeliminować parę nawiasów klamrowych.Uwaga: Zmień
print(i++)
na,alert(i++)
jeśli potrzebujesz. Możesz zmienić1e3
na,100
aby zmniejszyć liczbę iteracji w Safari.źródło
print
połączenia wewnątrzeval
połączenia jest naprawdę sprytne.QBasic (24 znaki)
rozwija się do:
Uwaga: Zakłada się, że
i
nadal ma oryginalną wartość 0.źródło
J,? <10 znaków
W J nie ma (prawie) żadnych pętli; zamiast tego zwykle używa się tablic i niejawnych pętli przez nie. Na przykład, aby zsumować liczby całkowite 1..100, zastosujesz (/) „czasownik” plus (+) do tablicy 1..100 (i.101)
Aby wyświetlić liczby 0..99, po prostu konstruujemy tablicę:
^:
jest czasownikiem „moc”;f^:1000
jest cośexec()*1000
w stylu Pythona.źródło
C #, 58 znaków
Aktualizacja: D'oh ... wydaje się, że jest to praktycznie identyczna odpowiedź dla Eelvex, który pokonał mnie o kilka minut.
Niezbyt sprytny - zwykła rekurencja w .NET.
Lub wyjmowanie treści „for loop” (35 znaków):
Pozwala zaszczepić wartość początkową i maksymalną.
źródło
Scala
Inspirowany odpowiedzią Nemo157 :
Można to wykorzystać w następujący sposób:
Gra w golfa (62):
Lub:
źródło
PowerShell 18
1–10
Tak, jest to całkowicie bezużyteczne i musisz przepisać funkcję, aby zrobić coś pożytecznego. Ale czy nie o to chodzi? :)
źródło
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Zamień wydruk na funkcję do wykonania.
Użyj (inc 100) lub 101 dla ostatniej wartości.
źródło
Perl, 21 znaków
źródło
Perl najprostszy - 18 znaków (ok, oszukiwanie)
wyjście: 0 1 2 3 ... 998 999
ale:
Perl regex / goatse op (real pseudoloop) - 39 (16) znaków
„pętla podstawowa” składa się z 16 znaków
wyjście: 0 1 2 3 ... 998 999
pozdrowienia
rbo
źródło
JavaScript - 86 znaków
Być może nie jest to najkrótsze rozwiązanie JavaScript, ale replikuje deklarację iteratora, manipulację iteratorem oraz warunek zapętlenia.
Przykład zastosowania:
źródło
C (Bez rekurencji, bez gotów)
Zupełnie zgodnie z definicją, prawda?
źródło
źródło
LISP, 91 znaków
Może być krótszy z etykietami.
Przykładowe użycie:
źródło
grzmotnąć:
14 znaków.
źródło
Python3 - 27 znaków
źródło
print(" ".join(map(str,range(1000))))
Plik wsadowy Windows, 65
Plik testowy:
Można zapisać dwa bajty, jeśli pętla zawsze zaczyna się od 0.
źródło