Ваша власна інструкція «за»


38

Ваша власна інструкція "за"

Припустимо, що у вас є наступний вклад: a, b, c, d

Введення може бути в одному рядку, використовуючи будь-який формат "a / b / c / d" або "a, b, c, d" тощо.

Ви також можете мати 4 входи.

Ви повинні кодувати таку поведінку (псевдокод тут):

var i = <a>
while (i <b> <c>)
    print i
    i = i + <d>
    print "\n"

Ось кілька тестів:

input : 1,<,10,1
output :
1
2
3
4
5
6
7
8
9

Ще один :

input : 20,>,10,1
output :
20
21
22
23
24
25
26
27
...
infinite loop / program crashes
  • aце ціле число , початкове значення i.

  • bце рядок або char , це не може бути чимось іншим, порівняльником, що використовується в кінцевому стані forциклу.

    bможе бути і має бути однією з таких рядків:

    - ">"
    - "<"
    
  • cявляє собою ціле число , число, яке використовується в кінцевому стані for циклу.

  • dце ціле число, яке додається до i в кожному циклі.

Це код-гольф, найкоротша відповідь виграє!


1
Чи можна повернути числа з функції у вигляді списку / послідовності, а не надрукувати в stdout?
smls

@smls Не шкода, вихід має бути як приклади!
Сигмей

1
У ній написано, що мій код повинен відповідати псевдокоду, і там є print "\n", але я використовую попередження JavaScript для кожного рядка. Це буде прийнятним, чи мені доведеться використовувати console.log замість того, щоб зробити свою відповідь довшою?

2
Ви можете використовувати функцію оповіщення як спосіб вимкнення, але ви не можете використовувати кілька сповіщень. Щось подібне alert("23\n24\n25");працювало б, тоді як alert("23"); alert("24"); alert(25);ні
Сигмей

Відповіді:


25

JavaScript (ES6),  44  43 56 байт

Збережено 1 байт завдяки редакції ETHproductions
: виправлено відповідно до вимог виводу

(a,b,c,d)=>{for(s='';eval(a+b+c);a+=d)s+=a+`
`;alert(s)}

Тест


Приємне використання сфери застосування!
ETHproductions

Я думаю, ви можете змінити перестановку, evalщоб зберегти байт:(a,b,c,d)=>{for(;eval(a+b+c);a+=d)alert(a)}
ETHproductions

@ETHproductions Ага, так. Хороший!
Арнольд

5
Це 44 з туту!
1717

Це не відповідає технічним умовам, коли вихід виводиться по рядку з U + 000A після кожного рядка.
Джої

17

Javascript (ES6), 47 42 48 байт

Хотів зробити для версії, але хтось був швидшим, тож ось рекурсивна версія.

(b,c,d)=>F=a=>eval(a+b+c)&&console.log(a)|F(a+d)

Потрібно додати f=раніше і назвати його так f(b,c,d)(a).

Велике спасибі Арнольду за приголомшливий гольф.

alertзмінено на console.logспецифікацію виходу


@Arnauld Спасибі, це досить крутий гольф. Я просто запитав його, тож давайте подивимось, чи приймає він це.

Радий бачити, що це прийнято. ;)
Арнольд

Це не відповідає технічним умовам, коли вихід виводиться по рядку з U + 000A після кожного рядка.
Джої

@Joey Це просто псевдо-код, але я про це попрошу ОП.

@Masterzagh: Уже виникло питання щодо альтернативних форматів виводу, у яких відмовили.
Joey


13

Желе , 12 байт

Ṅ+⁶µ⁴;⁵¹vµ¿t

Спробуйте в Інтернеті!

У Jelly є багато способів, щоб поступово зробити ітерацію, створити діапазони тощо. Однак, дзеркальне відображення поведінки C ++ є досить важким, оскільки особливі випадки, такі як приріст 0, цикл закінчується перед його початком (через нерівність, яка повертається назад ), і приріст йде в неправильному напрямку (значить, умова виходу циклу не може бути виконана природно). Таким чином, це рішення є в основному прямим перекладом C ++, хоча це робить його більш низьким рівнем, ніж це звичайно програма Jelly. На щастя, у C ++ є невизначена поведінка щодо підписаного цілого переповнення (питання використовується int), це означає, що програма може робити що завгодно в цьому випадку, і тому немає необхідності намагатися імітувати поведінку переповнення.

Пояснення

Ṅ+⁶µ⁴;⁵¹vµ¿t
   µ     µ¿   While loop; while ((⁴;⁵¹v) counter) do (counter = (Ṅ+⁶)counter).
    ⁴;⁵       Second input (b) appended to third input (c), e.g. "<10"
        v     Evaluate, e.g. if the counter is 5, "<10" of the counter is true
       ¹      No-op, resolves a parser ambiguity
Ṅ             Output the counter, plus a newline
 +⁶           Add the fourth input (d)
           t  Crashes the program (because the counter is not a list)

Збій програми - це найкоротший спосіб вимкнути неявний вихід Jelly (інакше він виведе остаточне значення лічильника); це створює купу помилок помилок на stderr, але ми зазвичай вважаємо це дозволеним.

До речі, лічильник циклу ініціалізується з поточним значенням до початку циклу. Коли цикл з'явиться на початку програми, це буде першим входом.


Ви можете змінити tНЕ має ніякого аварії. Декеювання приводить до порожнього списку, для якого неявний друк Джеллі не дає нічого.
Джонатан Аллан

@JonathanAllan: Це не так, що насправді робиться, це створити діапазон від 2 до заданого значення, яке, безумовно, видно на неявній друку.

Ах, я, мабуть, перевірив цю теорію з петлею, що закінчується на негативній території; дійсно діапазон неявно створюється.
Джонатан Аллан

Гм, це 12 символів, але це не 12 байт, правда?
Cruncher

@Cruncher: Jelly використовує власне кодування, в якому кожен символ, що використовується мовою, представлений одним байтом (він використовує лише 256 різних символів). Причина, коли він не використовує щось більш відоме, як кодова сторінка 437, - це полегшити введення тексту (я маю на увазі, це не так просто вводити, але це простіше, ніж мова, як gs2). Шістнадцяткова дама цієї програми триватиме 12 байт.



9

Java, 58 байт

(a,b,c,d)->{for(;b>61?a>c:a<c;a+=d)System.out.println(a);}

14
Чи є причина для створення i? Не могли б ви пропустити частину ініціалізації та просто використовувати a? Також, використовуючи значення ASCII '>' (62), зберігається байт.
Райлі

6
Після коментаря Райлі, ви можете зробитиb>61
Kritixi Lithos

Я не вірю в це компіляція.
ChiefTwoPencils

@ChajaTwoPencils Це функція. Ви повинні написати програму тестування навколо неї, щоб скласти її.
wizzwizz4

@ wizzwizz4, очевидно. Але це все ще не працює. Дай постріл. Плюс, моє розуміння - це всі байти, необхідні для його запуску.
ChiefTwoPencils

7

05AB1E , 22 20 байт

[D²`'>Q"‹›"è.V_#D,³+

Спробуйте в Інтернеті!

Пояснення

[                       # start loop
 D                      # copy top of stack (current value of a)
  ²`                    # push b,c to stack
    '>Q                 # compare b to ">" for equality
       "‹›"             # push this string
           è            # index into the string with this result of the equality check
            .V          # execute this command comparing a with c
              _#        # if the condition is false, exit loop (and program)
                D,      # print a copy of the top of the stack (current value of a)
                  ³+    # increment top of stack (a) by d

1
Будь-який формат введення приймається, тому друга версія в порядку :)
Sygmei

7

SmileBASIC, 53 байти

INPUT A,B$,C,D
S=ASC(B$)-61WHILE S*A>S*C?A
A=A+D
WEND

Пояснення:

INPUT A,B$,C,D
IF B$=="<" THEN S=-1 ELSE S=1 'get comparison direction
I=A
WHILE S*I>S*C 'loop while I is less than/greater than the end
 PRINT I
 INC I,D
WEND

Для цього використовується той факт, що X<Yте саме, що-X>-Y


Я вам довіряю для цього, у мене немає 3DS для тестування :)
Sygmei

У мене є Petit Computer, така класна ідея! Я спробую щось подібне десь ...
python-b5

Ви можете використовувати READоператор, зберігаючи 1 байт.
ckjbgames

@ckjbgames як?
12Me21

@ 12Me21 Перевірте посібники SmileBASIC. Це має бути в списку інструкцій для SmileBASIC.
ckjbgames

6

Складено , 34 байти

@d@c@b[show d+][:c b tofunc!]while

Спробуйте в Інтернеті! (Тестування включено.) Це функція, яка очікує, що стек виглядатиме так:

a b c d

Наприклад:

1 '<' 10 2
@d@c@b[show d+][:c b tofunc!]while

Пояснення

@d@c@b[show d+][:c b tofunc!]while
@d@c@b                               assign variables
               [............]while   while:
                :c                   duplicate "i" and push c
                   b tofunc!         convert b to a function and execute it
      [.......]                      do:
       show                          output "i" without popping
            d+                       and add the step to it

4

C ++, 80

Ну, це C++не так C. Трохи розгубився питання.

void f(int a,char b,int c,int d){for(;b==62?a>c:a<c;a+=d)cout<<a<<endl;}

Це C або C ++?
betseg

10
Яка реалізація C ++? (Мені цікаво, як ви отримуєте щось схоже на using namespace stdбезкоштовно).
H Walters

Не iпотрібно починати a, чи не так 0? Ви можете просто використовувати aта пропустити iцілком і використовувати значення ASCII '>'. for(;b==62?a>c:a<c;a+=d)
Райлі

Не працює дляf(1,'<'3,1);
Роман Граф

Ак ... так, потрібна математика з обох сторін; for(b-=61;b*a>b*c;a+=d)працює на один байт; але це робить for(;b-62?a<c:a>c;a+=d).
H Walters



4

Піп , 14 байт

W Va.b.ca:d+Pa

Бере чотири аргументи командного рядка. Підтримує від’ємні та числа з плаваючою комою та оператори порівняння < > = <= >= !=. Спробуйте в Інтернеті!

                a,b,c,d are cmdline args
W               While loop with the following condition:
  Va.b.c          Concatenate a,b,c and eval
            Pa  Print a with newline (expression also returns value of a)
        a:d+    Add d to that and assign back to a

4

Желе , 8 байт

ḢṄ+⁹;µV¿

Це діадичне посилання, яке вважає аргумент a, b, c як лівий аргумент, а d - як праве. Вихід може бути нескінченним і переходить до STDOUT.

Спробуйте в Інтернеті!

Як це працює

ḢṄ+⁹;µV¿  Dyadic link.
          Left argument:  a,b,c (integer, character, integer)
          Right argument: d     (integer)

       ¿  While...
      V     the eval atom applied to a,b,c returns 1:
     µ       Combine the links to the left into a chain and apply it to a,b,c.
Ḣ              Head; pop and yield a from a,b,c.
 Ṅ             Print a, followed by a linefeed.
  +⁹           Add a and the right argument (d) of the dyadic link.
    ;          Concatenate the result and the popped argument of the chain,
               yielding a+d,b,c.

В аргументах командного рядка використовується синтаксис Python і не вдається розрізнити символ і рядок. Якщо ви хочете використовувати CLA, вам потрібно вставити a, Fщоб вирівняти масив.
Денніс

2
Тепер я хочу видалити половину свого коментаря, оскільки він застарілий, зберігаючи іншу половину. Я думаю, що я просто повторю відповідну половину і видаляю решту: "О, Бле, ви визначили це як функцію, щоб ви могли нехтувати неявним результатом у правилах PPCG. Я повинен був подумати про це".

4

Python 2 , 45 байт

exec"i=%d\nwhile i%c%d:print i;i+=%d"%input()

Спробуйте в Інтернеті!

Дуже буквальна реалізація специфікації. Бере шаблон коду, замінює на входах за допомогою форматування рядків і виконує його.


4

Простий TeX, 88 байт

\newcount\i\def\for#1 #2 #3 #4 {\i#1\loop\the\i\endgraf\advance\i#4\ifnum\i#2#3\repeat} 

Команда \forзабезпечує запитувану функцію. Збережіть це як, for.texа потім запустіть його та введіть значення змінних у командному рядку: pdftex '\input for \for 1 < 5 1 \bye'Значення змінної повинні бути розділені пробілами.


4

Python 3, 61 байт

Один вкладиш:

e=input;exec(f'i={e()}\nwhile i{e()}{e()}:print(i);i+={e()}')

Ласкаво просимо на сайт! Добре використовувати нову функцію інтерполяції буквальних рядків. Я думаю, що ви, можливо, зможете зберегти байт, замінивши \tпробіл.
0

Дякую.будьте той самий розмір після видалення \ n \ t після третього e ()
G-Ox7cd


3

Bash (+ інструменти Unix), 29 байт

Гольф

bc<<<"for(x=$1;x$2$3;x+=$4)x"

Тест

./forloop 1 '<' 10 1
1
2
3
4
5
6
7
8
9

1
Ха. Я ось-ось збирався розмістити абсолютно те саме! +1
Цифрова травма


3

Лисп звичайний, 82 80 79 73 64 байти

(defmacro f(a b c d)`(do((i,a(+ i,d)))((not(,b i,c)))(print i)))

Тест

(f 1 < 10 1)

1 
2 
3 
4 
5 
6 
7 
8 
9 
NIL
CL-USER> 

-9 байт завдяки PrzemysławP.


Можливо, ви можете зберегти 9 байт, визначивши макрос. (defmacro f(a b c d)<insert backqoute here>(do((i,a(+ i,d)))((not(,b i,c)))(print i)))Використання:(f 1 < 10 1)

@ PrzemysławP Ще раз дякую!
coredump

3

PHP, 69 65 байт

for(list(,$i,$b,$c,$d)=$argv);$b<"="?$i<$c:$i>$c;$i+=$d)echo"$i
";

Виконати з '-r'; надати аргументи командного рядка як вхідні дані.

Для одного байта більше більше 4 байта, я можу взяти кожен оператор:

for(list(,$i,$b,$c,$d)=$argv;eval("return $i$b$c;");$i+=$d)echo"$i
";

Так, злий евал. Чи знали ви, що це може щось повернути?


Швидке руйнування знизило [,$i,$b,$c,$d]=$argv;б ще 4 байти;
але PHP 7.1 після вирішення проблеми.


Акуратно! Я не був впевнений, коли створював виклик, чи повинен я включати всіх спільних операторів, тоді я згадав, що вони не однакові (~ = для! = У
Луї,

Вау, евал ЗЛО.
кібербіт

Мені здається, ви можете використовувати PHP 7.1, щоб скоротити його. Якщо це не так, використання listекономить 4 байти плюс 4 байти з коротким синтаксисом
Jörg Hülsermann

@PHP 7.1 відповідає завданням; але дякую за list().
Тит

2

Perl 6 , 44 байти

{.say for $^a,*+$^d...^*cmp$^c!= $^b.ord-61}

Як це працює

{                                          }  # A lambda.
          $^a                                 # Argument a.
             ,*+$^d                           # Iteratively add d,
                   ...^                       # until (but not including the endpoint)
                       *cmp$^c                # the current value compared to c
                                              # (less=-1, same=0, more=1)
                              != $^b.ord-61.  # isn't the codepoint of the b minus 61.
 .say for                                     # Print each number followed by a newline.

Якщо нормально повернути (потенційно нескінченну) послідовність чисел як значення типу Seq, замість того, щоб друкувати числа в stdout, .say forчастину можна було видалити, зменшивши її до 35 байт.


2

Clojure, 66 63 байт

#(when((if(= %2"<")< >)% %3)(println %)(recur(+ % %4)%2 %3 %4))

-3 байти шляхом відрахування значення loop . Я "зловживаю" параметром init, щоб діяти як працюючий акумулятор.

Рекурсивний розчин (з ТСО). Дивіться коментарі в попередньо гольф-коді. Я спробував рекурсивне рішення, що не містить TCO, і воно склало 67 байт.

Я хотів би бачити цей ритм у Clojure! Я думаю, що це найменше, що я можу отримати.

(defn my-for [init-num com-str com-num inc-num]
  (let [op (if (= com-str "<") < >)] ; Figure out which operator to use
    (when (op init-num com-num) ; When the condition is true, print and recur
      (println init-num)
      (recur (+ init-num inc-num) com-str com-num inc-num))))
    ; Else, terminate (implicit) 

О, я не помітив цієї відповіді. #(when(({">">"<"<}%2)% %3)(println %)(recur(+ % %4)%2 %3 %4))було б 61 байт, поєднуючи ваше whenз моїм ({">">"<"<}%2).
NikoNyrh

2

Groovy, 51 байт

{a,b,c,d->while(Eval.me("$a$b$c")){println a;a+=d}}

Це неназване закриття. Спробуйте в Інтернеті!

Увага! Якщо ви хочете перевірити це groovy console, переконайтеся, що ви знищили весь процес, коли введення викликає нескінченний цикл. Я помітив це після того, як він спожив ~ 5 гігів оперативної пам'яті.


2

QBIC , 51 40 байт

:;::{?a┘a=a+c~A=@<`|~a>=b|_X]\~a<=b|_X

І через три хвилини після публікації я зрозумів, що можу спростити логіку термінатора ...

:;::      Consecutively read a, A$, b and c from the command line
{?a┘      Start an infinite loop; print a, add a newline to the source
a=a+c     increment a
~A=@<`|   If we are in LESS THAN mode
  ~a>=b   and IF we are no longer LESS
    |_X]  THEN QUIT, end if.
  \       ELSE (we're in GREATER THAN mode)
    ~a<=b IF we are no longer GREATER
    |_X   THEN QUIT
          The last IF and the loop are auto-closed

2

Пакетна, 94 байти

@set i=%1
@set o=gtr
@if "%~2"=="<" set o=lss
:g
@if %i% %o% %3 echo %i%&set/ai+=%4&goto g

Якби не поведінка другого параметра, це можна зробити в 53 байтах:

@for /l %%i in (%1,%4,%n%)do @if not %%i==%3 echo %%i

Це просто нічого не робить, якщо крок має неправильний знак. Додатковий тест полягає в тому, що forцикл Батха дозволяє змінній циклу дорівнювати кінцевому значенню.


2

Clojure, 66 байт

#(loop[i %](if(({">">"<"<}%2)i %3)(do(println i)(recur(+ i %4)))))

Це могло бути 55 байт як <і >є функціями в Clojure:

(def f #(loop[i %](if(%2 i %3)(do(println i)(recur(+ i %4))))))
(f 1 < 10 1)

Мені подобається використання карти тут. Я б ніколи не думав, що це перебило б мій шлях. Також цікаво, що обидва наші початкові підрахунки були однаковими, незважаючи на трохи різні підходи.
Carcigenicate

Якщо дозволити b функцією, це дало б несправедливу перевагу для деяких мов :)
Sygmei

Щоправда, але я думаю, що більшість мов, які я знаю, не отримали б великої користі від дозволу, <а "<"не Clojure.
NikoNyrh

@Sygmei Правда. Це було б дивно солодко. Не можу звинувачувати те, що ви телефонуєте.
Carcigenicate

ОП вказаних символів добре замість рядків для операторів порівняння btw. Це повинно заощадити пару байт.
Carcigenicate

2

TI-Basic, 41 34 байт

Prompt A,Str2,Str3,D
While expr("A"+Str2+Str3
Disp A
A+D->A
End

1
У тому, як працює калькулятор TI, багато символів зберігаються як один байт. Prompt , Str2, Str3, While , expr(, Disp , ->, І Endвсе символи однобайтні. Я рахую 29 байт.
Павло

@Pavel Дякуємо за ваш інтерес! Хоча це правда, що TI-Basic є токенізованим, не всі жетони є одним байтом. Так , наприклад, Str2, Str3, і expr(все два байта маркери. Щоб побачити список однобайтних жетонів, перегляньте tibasicdev.wikidot.com/one-byte-tokens
Timtech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.