For
les boucles sont largement utilisées dans de nombreuses langues, mais que feriez-vous si aucune langue ne les supportait?
Créer un moyen d'exécuter une base for
boucle sans utiliser de structures de répétition ( for
, foreach
, while
, do
, etc.).
La boucle for de base que vous devez répliquer est configurée comme ceci
for(i=0;i<1000;i++)
Vous devez pouvoir répliquer cela sans utiliser de structures de répétition. Il doit également exécuter du code dans votre langage qui serait dans le corps de la boucle. Toute forme de eval
est autorisée, bien qu'elle ne puisse pas exécuter la for
boucle seule.
Vous pouvez tester votre code en le faisant imprimer i
avec un espace 100 fois, ajoutez ce cas de test à la fin de votre réponse pour vérifier votre code avec les autres.
Il n'y a aucune restriction sur ce qu'il doit être exactement, tout ce qu'il doit faire est de répliquer la for
boucle.
Le gagnant sera décidé en fonction des votes positifs au moment où il sera choisi.
la source
Réponses:
C, 45 caractères sans goto, si, pour, ...
Pas la plus petite solution, mais je trouve cette façon de faire assez intéressante en C :)
Ne pas utiliser
goto
,if
,for
ou tout autre type de structures de contrôle.La fonction en elle-même (45 caractères):
Un programme de travail compilable:
la source
while
,do
,for
,if
...int (*a[])()={m,exit}
est un tableau de pointeurs de fonction.m
est appelée qui incrémente et imprimei
(définie sur 1, 2, 3, ...) et appelle une fonction à partir du tableau de pointeurs de fonction. L'appel(*a[i>999])();
sera étendu à(*a[0])();
ou(*a[1])();
puisque C utilisera la valeur dei>999
comme un entier selon qu'il est vrai ou faux (1 ou 0). Il appelleram
jusqu'à ce quei>999
soit vrai, puis appellera exit. Belle utilisation des pointeurs de fonction.Haskell, 33 caractères
C'est plus comme inventer la boucle for, car il n'y a pas un tel non-sens dans Haskell: P.
la source
forM_
est justemapM_
avec les arguments retournés, donc cela pourrait être de la triche. ;)GCC -
10695 caractèresContrairement aux autres solutions C où vous devez déclarer un rappel, celle-ci le fait automatiquement pour vous:
Il fonctionne en utilisant l' extension de fonction imbriquée de GCC . À savoir, il déclare en avant la fonction imbriquée
F
, la transmet à la fonction de boucleL
, puis démarre la définition deF
, laissant les accolades à l'utilisateur pour l'ajouter.Une belle chose à propos des fonctions imbriquées dans GCC est qu'elles prennent en charge les funargs descendants, ce qui signifie que l'illusion est presque terminée:
Il y a une mise en garde majeure: si vous utilisez
FOR
deux fois dans la même portée, vous obtiendrez un conflit (à savoir, il se compilera, mais toutes lesFOR
boucles partageront un corps de boucle). Pour autoriser plusieurs boucles FOR dans la même étendue, nous aurons besoin de6965 caractères supplémentaires:175160 caractères:la source
C, 21 caractères
Par exemple:
Les sorties:
la source
main()
dans le premier bloc, le code ne sera pas lié. Par conséquent, je pense que cela devrait être inclus dans l'entrée.main()
dans ce cas parce que la question dit "Créer un moyen d'exécuter" et non "faire un programme complet" comme dans d'autres problèmes.void
alors ce ne seront26
que des caractères.C # - pas de récursivité, pas de goto
(en utilisant le combinateur Y du lambda calcul)
la source
assemblage x86,
12instructions de 11 octetsla source
loop
instruction:mov cx, 1000\nx: ... loop x
Encore une autre variante Scala
Puisque Scala permet d'utiliser des caractères non ASCII, nous pouvons implémenter réel pour :) (
o
est cyrillique).Tester:
la source
JavaScript, 34 caractères
Cela suppose que la fonction d'impression réelle ne fait pas partie de la
for
boucle.récursion paramétrée (43) :
récurrence inverse (36) :
suppose
max >= 0
opérateur ternaire (34)
la source
function f(m,c){m&&c()&f(--m,c)}
- Vous pourriez faire ça 32 octets :)Ruby 1.9 - 51 caractères
C'est beaucoup plus grand que les autres entrées, mais je pense que cela capture mieux l'essence de la question. En effet, cela vous permet d'écrire du code presque exactement comme dans l'exemple:
la source
C #,
7057 caractèresC # n'est pas l'arme de choix pour le golf de code, mais j'ai pensé l'essayer:
Cela n'effectue pas seulement la tâche de compter jusqu'à 1000; il tente plutôt de répliquer le
for
comportement de la boucle pour n'importe quelle tâche. Cela semblait un peu plus proche de l'intention du défi, mais c'est peut-être juste moi.Étendu:
L'utilisation est très proche de la syntaxe de boucle for:
la source
Python
Cas spécifique:
Et en général:
où «f» est votre code. Probablement ne fonctionne pas dans tous les cas.
la source
for
boucle.;i=+1
après la virgule. J'ai dit que cela ne fonctionnerait pas avec tous les cas.exec 'i=0;'+1000*'print i;i+=1;'
ferait le travail.C: 33 caractères pour la base de la boucle (en supposant que goto est autorisé)
la source
Je vais en avoir honte, mais ici, c'est dans le shell Linux:
40 caractères.
la source
Voici votre boucle en utilisant Brainfuck, qui triche probablement:
la source
JavaScript - 39 caractères dans le cas de test
Chrome, Opera et IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Cela échoue avec "la taille de la pile d'appels dépassée" sur Safari et "trop de récursivité" sur Firefox.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. Cela utilise la fonction de «fermeture d'expression» non standard de Mozilla pour éliminer une paire d'accolades.Note: Changement
print(i++)
dealert(i++)
si vous avez besoin. Vous pouvez modifier1e3
pour100
réduire le nombre d'itérations pour Safari.la source
print
appel à l'intérieur de l'eval
appel est vraiment intelligent.QBasic (24 caractères)
s'étend à:
Remarque: Cela suppose que
i
sa valeur d'origine est toujours 0.la source
J,? <10 caractères
En J, il n'y a (presque) pas de boucles; à la place, on utilise généralement des tableaux et des boucles implicites à travers eux. Par exemple, pour additionner les entiers 1..100, vous appliquez (/) le "verbe" plus (+) au tableau 1..100 (i.101)
Pour afficher les nombres 0..99, nous construisons simplement le tableau:
^:
est le verbe "pouvoir";f^:1000
est quelque chose commeexec()*1000
en python.la source
C #, 58 caractères
Mise à jour: D'oh ... semble que c'est une réponse pratiquement identique à Eelvex qui m'a battu de quelques minutes.
Pas très intelligent - juste une récursivité simple dans .NET.
Ou en retirant le corps de la boucle "for" (35 caractères):
Permet de semer la valeur initiale et la valeur max.
la source
Scala
Inspiré de la réponse de Nemo157 :
Et cela peut être utilisé comme ceci:
Golfé (62):
Ou:
la source
PowerShell 18
1 - 10
Oui, c'est complètement inutile et vous devez réécrire la fonction pour faire quelque chose d'utile. Mais n'est-ce pas le sujet? :)
la source
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Remplacez print par la fonction à exécuter.
Utilisez (inc 100) ou 101 pour la dernière valeur.
la source
Perl, 21 caractères
la source
Perl le plus simple - 18 caractères (ok, triche)
sortie: 0 1 2 3 ... 998 999
mais:
Perl regex / goatse op (pseudoloop réel) - 39 (16) caractères
la 'boucle de base' avec 16 caractères
sortie: 0 1 2 3 ... 998 999
Cordialement
rbo
la source
Javascript - 86 caractères
Ce n'est peut-être pas la solution javascript la plus courte, mais elle reproduit la déclaration de l'itérateur, la manipulation de l'itérateur ainsi qu'une condition de boucle.
Exemple d'utilisation:
la source
C (pas de récursivité, pas de goto)
Tout à fait selon la définition, n'est-ce pas?
la source
la source
LISP, 91 caractères
Il pourrait être plus court avec des étiquettes.
Exemple d'utilisation:
la source
frapper:
14 caractères.
la source
Python3 - 27 caractères
la source
print(" ".join(map(str,range(1000))))
Fichier de commandes Windows, 65
Fichier de test:
Peut enregistrer deux octets si la boucle commence toujours à 0.
la source