For
циклы широко используются во многих языках, но что бы вы сделали, если бы их не поддерживали никакие языки?
Создать способ выполнить основную for
петлю без использования какой - либо повторение структуры ( for
, foreach
, while
, do
и т.д.).
Базовый цикл for, который нужно скопировать, настроен так
for(i=0;i<1000;i++)
Вы должны быть в состоянии повторить это без использования структур повторения. Он также должен выполнять код на вашем языке, который будет в теле цикла. eval
Разрешается любая форма , хотя она не может выполнять for
цикл самостоятельно.
Вы можете проверить свой код, напечатав i
его 100 раз, добавив этот контрольный пример в конец своего ответа, чтобы проверить свой код с другими.
Нет никаких ограничений на то, что именно это должно быть, все, что нужно сделать, это повторить for
цикл.
Победитель будет определен на основе голосов против в то время, когда он выбран.
источник
Ответы:
C, 45 символов без goto, если, для, ...
Не самое маленькое решение, но я нахожу такой способ сделать это довольно интересным в C :)
Не используйте
goto
,if
,for
или любой другой вид структур управления.Функция сама по себе (45 символов):
Компилируемая рабочая программа:
источник
while
,do
,for
,if
...int (*a[])()={m,exit}
это массив указателей на функции.m
Вызывается, который увеличивает и печатаетi
(установлен в 1, 2, 3, ...) и вызывает функцию из массива указателей функций. Вызов(*a[i>999])();
расширится до(*a[0])();
или,(*a[1])();
так как C будет использовать значениеi>999
как целое число в зависимости от того, является ли оно истинным или ложным (1 или 0). Он будет звонитьm
до тех пор, пока неi>999
станет истиной, а затем вызвать выход. Хорошее использование функциональных указателей.Haskell, 33 символа
Это больше похоже на изобретение цикла for, потому что в Haskell нет такой ерунды: P.
источник
forM_
простоmapM_
с переброшенными аргументами, так что это может быть обманом. ;)GCC -
10695 символовВ отличие от других C-решений, где вы должны объявить обратный вызов, это делает это автоматически:
Он работает с использованием расширения вложенных функций GCC . А именно, он заранее объявляет вложенную функцию
F
, передает ее в функцию зацикливанияL
, а затем начинает определениеF
, оставляя пользователю фигурные скобки для добавления.Одна прекрасная особенность вложенных функций в GCC заключается в том, что они поддерживают нисходящие фунгары, что означает, что иллюзия почти завершена:
Есть одно важное предостережение: если вы
FOR
дважды используете одну и ту же область видимости, вы получите конфликт (а именно, он скомпилируется, но всеFOR
циклы будут иметь одно тело цикла). Чтобы разрешить несколько циклов FOR в одной и той же области, нам нужно еще6965 символов:175160 символов:источник
C, 21 символов
Например:
Выходы:
источник
main()
в первом блоке код не будет ссылаться. Поэтому я думаю, что это должно быть включено в запись.main()
в данном случае это справедливо, потому что в вопросе написано «Создать способ выполнения», а не «создать полную программу», как в других задачах.void
тогда это будут26
только символы.C # - нет рекурсии, нет goto
(используя Y комбинатор из лямбда-исчисления)
источник
сборка x86,
12инструкций по 11 байтисточник
loop
инструкцию:mov cx, 1000\nx: ... loop x
Еще один вариант Scala
Поскольку Scala позволяет использовать не-ASCII символы, мы можем реализовать real for :) (
o
кириллица).Тест:
источник
JavaScript, 34 символа
Это предполагает, что фактическая функция печати не является частью
for
цикла.параметризованная рекурсия (43) :
обратная рекурсия (36) :
предполагает
max >= 0
троичный оператор (34)
источник
function f(m,c){m&&c()&f(--m,c)}
- Вы могли бы сделать это 32 байта :)Ruby 1,9 - 51 символов
Это намного больше, чем другие записи, но я думаю, что это лучше отражает суть вопроса. По сути это позволяет писать код почти так же, как в примере:
источник
C #,
7057 символовC # не лучшее оружие для гольф-кода, но я решил попробовать:
Это не только выполняет задачу подсчета до 1000; скорее он пытается фактически воспроизвести
for
поведение цикла для любой задачи. Это казалось несколько ближе к цели вызова, но, возможно, это только я.Expanded:
Использование очень близко к синтаксису цикла for:
источник
питон
Конкретный случай:
И вообще:
где 'f' - твой код Вероятно, не работает для всех случаев.
источник
for
цикл.;i=+1
после запятой. Я сказал, что это не будет работать во всех случаях.exec 'i=0;'+1000*'print i;i+=1;'
сделал бы работу.C: 33 символа для основы для цикла (при условии, что goto разрешен)
источник
Мне будет очень стыдно за это, но вот это в оболочке Linux:
40 символов.
источник
Вот ваш цикл с использованием Brainfuck, который, вероятно, обманывает:
источник
JavaScript - 39 символов в тестовом случае
Chrome, Opera и IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Это терпит неудачу с «превышением размера стека вызовов» в Safari и «слишком большой рекурсией» в Firefox.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. При этом используется нестандартная функция закрытия выражений в Mozilla для устранения пары фигурных скобок.Примечание: измените
print(i++)
на,alert(i++)
если вам нужно. Вы можете изменить1e3
на,100
чтобы уменьшить количество итераций для Safari.источник
print
вызова внутриeval
вызова действительно умный.QBasic (24 символа)
расширяется до:
Примечание. Предполагается, что
i
исходное значение по-прежнему равно 0.источник
J, <10 символов
В J нет (почти) петель; вместо этого обычно используются массивы и неявные циклы через них. Например, чтобы сложить целые числа 1..100, вы применяете (/) «глагол» плюс (+) к массиву 1..100 (i.101)
Чтобы отобразить числа 0..99, мы просто создаем массив:
^:
глагол "сила";f^:1000
это что-то вродеexec()*1000
в питоне.источник
C #, 58 символов
Обновление: D'Oh ... кажется, это практически идентичный ответ для Eelvex, который избил меня на несколько минут.
Не очень умно - просто простая рекурсия в .NET.
Или вынимаем тело цикла for (35 символов):
Позволяет заполнить начальное значение и максимальное значение.
источник
Scala
Вдохновленный ответом Nemo157 :
И это можно использовать так:
Гольф (62):
Или:
источник
PowerShell 18
1 - 10
Да, это совершенно бесполезно, и вы должны переписать функцию, чтобы сделать что-нибудь полезное. Но не в этом ли дело? :)
источник
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Замените печать на функцию для выполнения.
Используйте (вкл. 100) или 101 для последнего значения.
источник
Perl, 21 персонаж
источник
Perl самый простой - 18 символов (хорошо, измена)
выход: 0 1 2 3 ... 998 999
но:
Perl regex / goatse op (real pseudoloop) - 39 (16) символов
«базовая петля» из 16 символов
выход: 0 1 2 3 ... 998 999
С уважением
БВ
источник
Javascript - 86 символов
Возможно, не самое короткое решение javascript, но оно копирует объявление итератора, манипулирование итератором, а также условие зацикливания.
Пример использования:
источник
C (нет рекурсии, нет goto's)
Полностью в соответствии с определением, не так ли?
источник
источник
LISP, 91 персонаж
Это может быть короче с этикетками.
Пример использования:
источник
Баш:
14 символов
источник
Python3 - 27 символов
источник
print(" ".join(map(str,range(1000))))
Пакетный файл Windows, 65
Тестовый файл:
Может сохранить два байта, если цикл всегда начинается с 0.
источник