For
los bucles se usan ampliamente en muchos idiomas, pero ¿qué haría si no los admitieran?
Crear una forma básica para ejecutar un for
bucle sin utilizar ninguna estructura de repetición ( for
, foreach
, while
, do
, etc).
El bucle básico para que necesita replicar está configurado de esta manera
for(i=0;i<1000;i++)
Debe poder replicar esto sin usar estructuras de repetición. También debe ejecutar código en su idioma que estaría en el cuerpo del bucle. Se eval
permite cualquier forma de , aunque es posible que no ejecute el for
bucle por sí solo.
Puede probar su código haciendo que se imprima i
con un espacio 100 veces, agregue este caso de prueba al final de su respuesta para verificar su código con otros.
No hay restricciones sobre qué tiene que ser exactamente, todo lo que tiene que hacer es replicar el for
ciclo.
El ganador se decidirá en función de los votos a favor en el momento en que se elija.
fuente
Respuestas:
C, 45 caracteres sin ir a, si, para, ...
No es la solución más pequeña, pero encuentro esta forma de hacerlo bastante interesante en C :)
No usa
goto
,if
,for
, o cualquier otro tipo de estructuras de control.La función en sí misma (45 caracteres):
Un programa de trabajo compilable:
fuente
while
,do
,for
,if
...int (*a[])()={m,exit}
es una matriz de punteros de función.m
se llama qué incrementos e impresionesi
(establecido en 1, 2, 3, ...) y llama a una función desde la matriz de punteros de función. La llamada(*a[i>999])();
se expandirá(*a[0])();
ao(*a[1])();
desde que C usará el valor dei>999
como un entero dependiendo de si es verdadero o falso (1 o 0). Llamarám
hasta quei>999
sea cierto, luego llamará a exit. Buen uso de punteros de función.Haskell, 33 caracteres
Esto es más como inventar el bucle for, porque no hay tales tonterías en Haskell: P.
fuente
forM_
es solomapM_
con los argumentos invertidos, por lo que esto podría ser una trampa. ;)GCC -
10695 caracteresA diferencia de las otras soluciones de C donde tiene que declarar una devolución de llamada, esta lo hace automáticamente:
Funciona utilizando la extensión de función anidada de GCC . A saber, declara hacia adelante la función anidada
F
, la pasa a la función de bucleL
y luego comienza la definición deF
, dejando los corchetes para que el usuario los agregue.Una cosa hermosa sobre las funciones anidadas en GCC es que admiten funargs descendentes, lo que significa que la ilusión está casi completa:
Hay una advertencia importante: si usa
FOR
dos veces en el mismo alcance, obtendrá un conflicto (es decir, se compilará, pero todos losFOR
bucles compartirán un cuerpo de bucle). Para permitir múltiples bucles FOR en el mismo alcance, necesitaremos6965 caracteres más:175160 caracteres:fuente
C, 21 caracteres
Por ejemplo:
Salidas:
fuente
main()
en el primer bloque, el código no se vinculará. Por lo tanto, creo que debería incluirse en la entrada.main()
en este caso porque la pregunta dice "Crear una forma de ejecutar" no "hacer un programa completo" como en otros problemas.void
entonces serán26
solo caracteres.C #: sin recursión, sin goto
(utilizando el combinador Y del cálculo lambda)
fuente
Ensamblado x86,
1211 bytes de instruccionesfuente
loop
instrucciones:mov cx, 1000\nx: ... loop x
Otra variante de Scala
Dado que Scala permite usar caracteres no ASCII, podemos implementar real para :) (
o
es cirílico).Prueba:
fuente
JavaScript, 34 caracteres
Esto supone que la función de impresión real no forma parte del
for
bucle.recursión parametrizada (43) :
recursividad inversa (36) :
asume
max >= 0
operador ternario (34)
fuente
function f(m,c){m&&c()&f(--m,c)}
- Podrías hacer esos 32 bytes :)Ruby 1.9 - 51 caracteres
Esto es mucho más grande que otras entradas, pero creo que captura mejor la esencia de la pregunta. En efecto, esto le permite escribir código casi exactamente como en el ejemplo:
fuente
C #,
7057 caracteresC # no es el arma preferida para el golf de código, pero pensé en probarlo:
Esto no solo realiza la tarea de contar hasta 1000; más bien, intenta replicar el
for
comportamiento del ciclo para cualquier tarea. Eso parecía algo más cercano a la intención del desafío, pero tal vez solo soy yo.Expandido:
El uso está muy cerca de la sintaxis for-loop:
fuente
Pitón
Caso específico:
Y en general:
donde 'f' es tu código. Probablemente no funciona para todos los casos.
fuente
for
bucle.;i=+1
después de la coma. Dije que no funcionaría con todos los casos.exec 'i=0;'+1000*'print i;i+=1;'
haría el trabajoC: 33 caracteres para la base para el bucle (suponiendo que se permita goto)
fuente
Tendré mucha vergüenza por esto, pero aquí está en el shell de Linux:
40 caracteres
fuente
Aquí está tu bucle usando Brainfuck, que probablemente sea una trampa:
fuente
JavaScript: 39 caracteres en caso de prueba
Chrome, Opera, y el IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Esto falla con el "tamaño de pila de llamadas excedido" en Safari y "demasiada recursividad" en Firefox.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. Esto utiliza la característica de "cierre de expresión" no estándar de Mozilla para eliminar un par de llaves.Nota: Cambie
print(i++)
aalert(i++)
si es necesario. Puede cambiar1e3
a100
para reducir la cantidad de iteraciones para Safari.fuente
print
llamada dentro de laeval
llamada es realmente inteligente.QBasic (24 caracteres)
se expande a:
Nota: Esto supone que
i
todavía tiene su valor original de 0.fuente
J, <10 caracteres
En J no hay (casi) bucles; en su lugar, generalmente se usan matrices y bucles implícitos a través de ellos. Por ejemplo, para sumar los enteros 1..100, aplica (/) el "verbo" más (+) a la matriz 1..100 (i.101)
Para mostrar los números 0..99, simplemente construimos la matriz:
^:
es el verbo "poder";f^:1000
Es algo así comoexec()*1000
en Python.fuente
C #, 58 caracteres
Actualización: D'oh ... parece que esta es una respuesta prácticamente idéntica a Eelvex que me ganó por unos minutos.
No es muy inteligente, solo una simple recursión en .NET.
O sacando el cuerpo del "bucle for" (35 caracteres):
Permite sembrar el valor inicial y el valor máximo.
fuente
Scala
Inspirado en la respuesta de Nemo157 :
Y esto se puede usar así:
Golfizado (62):
O:
fuente
PowerShell 18
1 - 10
Sí, es completamente inútil y tienes que reescribir la función para hacer algo útil. ¿Pero no es ese el tipo de punto? :)
fuente
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Reemplace print con la función a ejecutar.
Use (inc 100) o 101 para el último valor.
fuente
Perl, 21 caracteres
fuente
Perl más simple: 18 caracteres (ok, trampa)
salida: 0 1 2 3 ... 998999
pero:
Perl regex / goatse op (pseudoloop real) - 39 (16) caracteres
el 'bucle base' con 16 caracteres
salida: 0 1 2 3 ... 998999
Saludos
rbo
fuente
Javascript - 86 caracteres
Quizás no sea la solución de JavaScript más corta, pero replica la declaración del iterador, la manipulación del iterador y una condición de bucle.
Ejemplo de caso de uso:
fuente
C (sin recursividad, sin goto)
Completamente de acuerdo con la definición, ¿no?
fuente
fuente
LISP, 91 caracteres
Podría ser más corto con etiquetas.
Ejemplo de uso:
fuente
golpetazo:
14 caracteres
fuente
Python3 - 27 caracteres
fuente
print(" ".join(map(str,range(1000))))
Archivo por lotes de Windows, 65
Archivo de prueba:
Puede guardar dos bytes si el ciclo siempre comienza en 0.
fuente