For
Schleifen werden in vielen Sprachen häufig verwendet, aber was würden Sie tun, wenn keine Sprachen sie unterstützen?
Erstellen eine Art und Weise einen Grund auszuführen for
Schleife ohne Wiederholungsstrukturen unter Verwendung von ( for
, foreach
, while
, do
, usw.).
Die grundlegende for-Schleife, die Sie replizieren müssen, ist wie folgt eingerichtet
for(i=0;i<1000;i++)
Sie müssen dies replizieren können, ohne Wiederholungsstrukturen zu verwenden. Außerdem muss Code in Ihrer Sprache ausgeführt werden, der sich im Hauptteil der Schleife befinden würde. Jede Form von eval
ist zulässig, obwohl die for
Schleife möglicherweise nicht alleine ausgeführt wird.
Sie können Ihren Code testen, indem Sie ihn drucken lassen i
100-mal mit einem Leerzeichen Fügen Sie diesen Testfall am Ende Ihrer Antwort hinzu, um Ihren Code bei anderen zu verifizieren.
Es gibt keine Einschränkungen, was genau es sein muss. Alles, was es tun muss, ist die for
Schleife zu replizieren .
Der Gewinner wird auf der Grundlage der Upvotes zum Zeitpunkt seiner Auswahl ermittelt.
quelle
Antworten:
C, 45 Zeichen ohne goto, wenn, für, ...
Nicht die kleinste Lösung, aber ich finde diese Vorgehensweise in C sehr interessant :)
Nicht verwenden
goto
,if
,for
, oder jede andere Art von Kontrollstrukturen.Die Funktion für sich (45 Zeichen):
Ein kompilierbares Arbeitsprogramm:
quelle
while
,do
,for
,if
...int (*a[])()={m,exit}
ist ein Array von Funktionszeigern.m
wird aufgerufen, was inkrementiert und druckti
(auf 1, 2, 3, ... gesetzt) und eine Funktion aus dem Array von Funktionszeigern aufruft. Der Aufruf(*a[i>999])();
wird auf(*a[0])();
oder erweitert,(*a[1])();
da C den Wert voni>999
als Ganzzahl verwendet, je nachdem, ob er wahr oder falsch ist (1 oder 0). Es ruft auf,m
bisi>999
es wahr ist, und ruft dann exit auf. Gute Verwendung von Funktionszeigern.Haskell, 33 Zeichen
Das ist eher so, als würde man die for-Schleife erfinden , weil es in Haskell keinen solchen Unsinn gibt: P.
quelle
forM_
mapM_
Wird nur mit den Argumenten gewendet, so könnte dies schummeln. ;)GCC -
10695 ZeichenIm Gegensatz zu den anderen C-Lösungen, bei denen Sie einen Rückruf deklarieren müssen, erledigt diese Lösung dies automatisch für Sie:
Es funktioniert mit der geschachtelten Funktionserweiterung von GCC . Es deklariert nämlich die verschachtelte Funktion vorwärts
F
, übergibt sie an die SchleifenfunktionL
und startet dann die Definition vonF
, wobei der Benutzer die geschweiften Klammern hinzufügen kann.Eine schöne Sache an verschachtelten Funktionen in GCC ist, dass sie Abwärtsfunktionen unterstützen, was bedeutet, dass die Illusion nahezu vollständig ist:
Es gibt eine wichtige Einschränkung: Wenn Sie
FOR
zweimal im gleichen Bereich verwenden, tritt ein Konflikt auf (das heißt, es wird kompiliert, aber alleFOR
Schleifen teilen sich einen Schleifenkörper). Um mehrere FOR-Schleifen im selben Bereich zuzulassen, benötigen wir69 bis65 weitere Zeichen:175160 Zeichen:quelle
C, 21 Zeichen
Beispielsweise:
Ausgänge:
quelle
main()
im ersten Block wird der Code nicht verknüpfen. Deshalb denke ich, dass es im Eintrag enthalten sein sollte.main()
in diesem Fall fair, darauf zu verzichten , da die Frage "Erstellen einer Ausführungsmethode" lautet und nicht "Erstellen eines vollständigen Programms" wie bei anderen Problemen.void
Sie dann nur die26
Zeichen.Keine Rekursion, keine goto
(mit dem Y-Kombinator aus der Lambda-Rechnung)
quelle
x86-Assembly,
12Anweisungen im Wert von 11 Bytequelle
loop
Anweisung verwenden:mov cx, 1000\nx: ... loop x
Noch eine Scala-Variante
Da Scala die Verwendung von Nicht-ASCII-Zeichen erlaubt, können wir real für :) implementieren (
o
ist kyrillisch).Prüfung:
quelle
JavaScript, 34 Zeichen
Dies setzt voraus, dass die eigentliche Druckfunktion nicht Teil der
for
Schleife ist.parametrisierte Rekursion (43) :
umgekehrte Rekursion (36) :
nimmt an
max >= 0
ternärer Operator (34)
quelle
function f(m,c){m&&c()&f(--m,c)}
- Sie könnten das 32 Bytes machen :)Ruby 1,9 - 51 Zeichen
Das ist viel größer als bei anderen Einträgen, aber ich denke, es fängt das Wesentliche der Frage besser ein. Auf diese Weise können Sie Code fast genau wie im folgenden Beispiel schreiben:
quelle
C #,
7057 ZeichenC # ist nicht die Waffe der Wahl für Code-Golf, aber ich dachte, ich würde es ausprobieren:
Dies erledigt nicht nur die Aufgabe, bis zu 1000 zu zählen. Vielmehr wird versucht, das
for
Schleifenverhalten für jede Aufgabe tatsächlich zu replizieren . Das schien etwas näher an der Absicht der Herausforderung zu liegen, aber vielleicht bin das nur ich.Erweitert:
Die Verwendung kommt der for-loop-Syntax sehr nahe:
quelle
Python
Sonderfall:
Und allgemein:
wo 'f' ist dein Code. Funktioniert wahrscheinlich nicht in allen Fällen.
quelle
for
Schleife nicht.;i=+1
nach dem Komma stehen. Ich habe gesagt, es würde nicht in allen Fällen funktionieren.exec 'i=0;'+1000*'print i;i+=1;'
würde den Job machen.C: 33 Zeichen für die Base for-Schleife (vorausgesetzt, goto ist zulässig)
quelle
Ich werde mich dafür sehr schämen, aber hier ist es in der Linux-Shell:
40 Zeichen.
quelle
Hier ist Ihre Schleife mit Brainfuck, die wahrscheinlich betrügt:
quelle
JavaScript - 39 Zeichen im Testfall
Chrome, Opera und IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Dies schlägt fehl, wenn in Safari die Größe des Aufrufstapels überschritten und in Firefox die Rekursion zu groß ist.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. Hierbei wird die nicht standardmäßige "Ausdrucksschließung" von Mozilla verwendet, um ein Paar geschweifte Klammern zu entfernen.Hinweis: Ändern Sie
print(i++)
zu ,alert(i++)
wenn Sie müssen. Sie können auf ändern1e3
,100
um die Anzahl der Iterationen für Safari zu verringern.quelle
print
Anruf in deneval
Anruf einzubinden.QBasic (24 Zeichen)
erweitert um:
Hinweis: Es wird davon ausgegangen, dass
i
der ursprüngliche Wert von 0 erhalten bleibt.quelle
J, <10 Zeichen
In J gibt es (fast) keine Schleifen; Stattdessen werden normalerweise Arrays und implizite Schleifen verwendet. Um beispielsweise die Ganzzahlen 1..100 zu summieren, wenden Sie (/) das "Verb" plus (+) auf das Array 1..100 (i.101) an.
Um die Zahlen 0..99 anzuzeigen, konstruieren wir einfach das Array:
^:
ist das "Macht" -Verb;f^:1000
ist so etwas wieexec()*1000
in Python.quelle
C #, 58 Zeichen
Update: D'oh ... anscheinend ist dies eine nahezu identische Antwort für Eelvex, der mich um einige Minuten geschlagen hat.
Nicht sehr clever - nur einfache Rekursion in .NET.
Oder den Body der "for loop" (35 Zeichen) herausnehmen:
Ermöglicht das Setzen des Anfangswerts und des Maximalwerts.
quelle
Scala
Inspiriert von der Antwort von Nemo157 :
Und das kann so verwendet werden:
Golfen (62):
Oder:
quelle
PowerShell 18
1 - 10
Ja, es ist völlig nutzlos und Sie müssen die Funktion neu schreiben, um etwas Nützliches zu tun. Aber ist das nicht der Punkt? :)
quelle
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Ersetzen Sie print durch die auszuführende Funktion.
Verwenden Sie (inc 100) oder 101 für den letzten Wert.
quelle
Perl, 21 Zeichen
quelle
Perl am einfachsten - 18 Zeichen (ok, betrügen)
Ausgang: 0 1 2 3 ... 998 999
aber:
Perl regex / goatse op (echtes Pseudoloop) - 39 (16) Zeichen
Die Basisschleife hat 16 Zeichen
Ausgang: 0 1 2 3 ... 998 999
Grüße
rbo
quelle
Javascript - 86 Zeichen
Vielleicht nicht die kürzeste Javascript-Lösung, aber sie repliziert die Iterator-Deklaration, die Iterator-Manipulation sowie eine Schleifenbedingung.
Anwendungsbeispiel:
quelle
C (Keine Rekursion, keine Goto)
Ganz nach der Definition, nicht wahr?
quelle
quelle
LISP, 91 Zeichen
Bei Etiketten könnte es kürzer sein.
Anwendungsbeispiel:
quelle
bash:
14 Zeichen.
quelle
Python3 - 27 Zeichen
quelle
print(" ".join(map(str,range(1000))))
Windows-Batchdatei, 65
Testdatei:
Kann zwei Bytes speichern, wenn die Schleife immer bei 0 beginnt.
quelle