For
os loops são usados extensivamente em muitos idiomas, mas o que você faria se nenhum idioma os suportasse?
Criar uma forma de executar uma base for
de loop sem o uso de quaisquer estruturas de repetição ( for
, foreach
, while
, do
, etc.).
O loop for básico que você precisa replicar é configurado assim
for(i=0;i<1000;i++)
Você deve poder replicar isso sem usar estruturas de repetição. Ele também deve executar o código em seu idioma que estaria no corpo do loop. Qualquer forma de eval
é permitida, embora não possa executar o for
loop por si só.
Você pode testar seu código imprimindo-o i
com um espaço de 100 vezes; adicione este caso de teste ao final da sua resposta para verificar seu código com outras pessoas.
Não há restrições sobre o que exatamente deve ser, tudo o que precisa fazer é replicar o for
loop.
O vencedor será decidido com base em votos no momento em que for escolhido.
fonte
Respostas:
C, 45 caracteres sem ir, se, para, ...
Não é a solução mais pequena, mas acho essa maneira bastante interessante em C :)
Não usa
goto
,if
,for
, ou qualquer outro tipo de estruturas de controle.A função por si só (45 caracteres):
Um programa de trabalho compilável:
fonte
while
,do
,for
,if
...int (*a[])()={m,exit}
é uma matriz de ponteiros de função.m
é chamado que incrementa e imprimei
(definido como 1, 2, 3, ...) e chama uma função da matriz de ponteiros de função. A chamada(*a[i>999])();
será expandida para(*a[0])();
ou(*a[1])();
uma vez que C usará o valori>999
como um número inteiro, dependendo de ser verdadeiro ou falso (1 ou 0). Ele ligarám
até quei>999
seja verdadeiro e depois sair. Bom uso de ponteiros de função.Haskell, 33 caracteres
É mais como inventar o loop for, porque não existe esse absurdo em Haskell: P.
fonte
forM_
é apenasmapM_
com os argumentos invertidos, então isso pode ser trapaça. ;)GCC -
10695 caracteresDiferente das outras soluções C em que você deve declarar um retorno de chamada, este faz isso automaticamente para você:
Ele funciona usando a extensão de função aninhada do GCC . Ou seja, ele declara a função aninhada para a frente
F
, passa-a para a função de loopL
e inicia a definição deF
, deixando os colchetes para o usuário adicionar.Uma coisa bonita das funções aninhadas no GCC é que elas suportam funções descendentes, o que significa que a ilusão está quase completa:
Há uma ressalva importante: se você usar
FOR
duas vezes no mesmo escopo, obterá um conflito (isto é, ele será compilado, mas todos osFOR
loops compartilharão um corpo de loop). Para permitir vários loops FOR no mesmo escopo, precisaremos de mais6965 caracteres:175160 caracteres:fonte
C, 21 caracteres
Por exemplo:
Saídas:
fonte
main()
no primeiro bloco, o código não será vinculado. Portanto, acho que deve ser incluído na entrada.main()
neste caso, porque a pergunta diz: "Crie uma maneira de executar", não "faça um programa completo", como em outros problemas.void
, serão26
apenas caracteres.C # - sem recursão, sem ir
(usando o combinador Y do cálculo lambda)
fonte
montagem x86,
12instruções de 11 bytesfonte
loop
instrução:mov cx, 1000\nx: ... loop x
Mais uma variante do Scala
Como Scala permite usar caracteres não ASCII, podemos implementar real para :) (
o
é cirílico).Teste:
fonte
JavaScript, 34 caracteres
Isso pressupõe que a função de impressão real não faz parte do
for
loop.recursão parametrizada (43) :
recursão reversa (36) :
assume
max >= 0
operador ternário (34)
fonte
function f(m,c){m&&c()&f(--m,c)}
- Você poderia fazer que 32 bytes :)Ruby 1.9 - 51 caracteres
Isso é muito maior que outras entradas, mas acho que captura melhor a essência da questão. Com efeito, isso permite que você escreva código quase exatamente como no exemplo:
fonte
C #,
7057 caracteresO C # não é a arma preferida para o código de golfe, mas pensei em experimentar:
Isso não apenas executa a tarefa de contar até 1000; em vez disso, ele tenta replicar o
for
comportamento do loop para qualquer tarefa. Isso parecia um pouco mais próximo da intenção do desafio, mas talvez seja apenas eu.Expandido:
O uso está muito próximo da sintaxe do loop for:
fonte
Python
Caso específico:
E em geral:
onde 'f' é o seu código. Provavelmente não funciona para todos os casos.
fonte
for
loop funciona.;i=+1
depois da vírgula. Eu disse que não funcionaria com todos os casos.exec 'i=0;'+1000*'print i;i+=1;'
faria o trabalho.C: 33 caracteres para a base do loop (assumindo que goto é permitido)
fonte
Sentirei muita vergonha por isso, mas aqui está no shell do Linux:
40 caracteres.
fonte
Aqui está o seu loop usando o Brainfuck, que provavelmente está trapaceando:
fonte
JavaScript - 39 caracteres no caso de teste
Chrome, Opera e IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Isso falha com o "tamanho da pilha de chamadas excedido" no Safari e "muita recursão" no Firefox.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. Isso usa o recurso "fechamento de expressão" não padrão da Mozilla para eliminar um par de chaves.Nota: Altere
print(i++)
paraalert(i++)
se necessário. Você pode alterar1e3
para100
reduzir o número de iterações para o Safari.fonte
print
chamada dentro daeval
chamada é realmente inteligente.QBasic (24 caracteres)
expande para:
Nota: Isso pressupõe que
i
ainda tenha seu valor original de 0.fonte
J, <10 caracteres
Em J não há (quase) loops; em vez disso, geralmente se usa matrizes e loops implícitos através deles. Por exemplo, para somar os números inteiros 1..100, você aplica (/) o "verbo" mais (+) à matriz 1..100 (i.101)
Para exibir os números 0..99, apenas construímos a matriz:
^:
é o verbo "poder";f^:1000
é algo comoexec()*1000
em python.fonte
C #, 58 caracteres
Atualização: D'oh ... parece que esta é uma resposta praticamente idêntica à Eelvex que me venceu por alguns minutos.
Não é muito inteligente - apenas recursão simples no .NET.
Ou retirando o corpo do "loop for" (35 caracteres):
Permite propagar o valor inicial e o valor máximo.
fonte
Scala
Inspirado na resposta de Nemo157 :
E isso pode ser usado assim:
Golfe (62):
Ou:
fonte
PowerShell 18
1 - 10
Sim, é completamente inútil e você deve reescrever a função para fazer algo útil. Mas esse não é o ponto? :)
fonte
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Substitua a impressão pela função a executar.
Use (inc 100) ou 101 para o último valor.
fonte
Perl, 21 caracteres
fonte
Perl mais simples - 18 caracteres (ok, trapaça)
saída: 0 1 2 3 ... 998 999
mas:
Perl regex / goatse op (real pseudoloop) - 39 (16) caracteres
o 'loop base' sendo 16 caracteres
saída: 0 1 2 3 ... 998 999
Saudações
rbo
fonte
Javascript - 86 caracteres
Talvez não seja a solução javascript mais curta, mas replica a declaração do iterador, a manipulação do iterador e uma condição de loop.
Exemplo de caso de uso:
fonte
C (sem recursão, sem goto)
Completamente de acordo com a definição, não é?
fonte
fonte
LISP, 91 caracteres
Pode ser mais curto com etiquetas.
Exemplo de uso:
fonte
bater:
14 caracteres.
fonte
Python3 - 27 caracteres
fonte
print(" ".join(map(str,range(1000))))
Arquivo em lote do Windows, 65
Arquivo de teste:
Pode salvar dois bytes se o loop sempre iniciar em 0.
fonte