당신 자신 만의“for”강의


38

당신 만의 "for"강의

다음과 같은 입력이 있다고 가정합니다. 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.

  • bA는 문자열 이나 문자가 , 그것은 뭔가 다른,의 종료 조건에 사용 된 비교가 될 수 없습니다 for루프.

    b있어야 다음 문자열 중 하나가 될 수 :

    - ">"
    - "<"
    
  • c 루프 의 종료 조건에 사용되는 숫자 인 integerfor 입니다.

  • d모든 루프에서 i에 추가 되는 정수 입니다.

이것은 코드 골프입니다. 최단 답변이 이깁니다!


1
stdout에 인쇄하지 않고 함수에서 목록 / 시퀀스로 숫자를 반환 할 수 있습니까?
smls

@smls 죄송합니다. 출력은 예제와 같아야합니다!
Sygmei

1
내 코드는 의사 코드를 따라야하며가 print "\n"있지만 각 줄에 대해 자바 스크립트의 경고를 사용하고 있습니다. 괜찮을까요, 아니면 대답을 더 길게 만드는 console.log를 사용해야합니까?

2
경고 기능을 출력 방법으로 사용할 수 있지만 여러 경고를 사용할 수는 없습니다. 같은 뭔가 alert("23\n24\n25");반면 일하는 것이는 alert("23"); alert("24"); alert(25);않을 것
Sygmei

답변:


25

자바 스크립트 (ES6),  44  43 56 바이트

ETH 프로덕션 덕분에 1 바이트 절약
편집 : 출력 요구 사항을 준수하도록 수정

(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 아, 그렇습니다. 좋은 것!
Arnauld

5
투투와 44입니다!
16:16

이것은 출력이 라인마다 U + 000A 씩 라인 단위 인 사양을 따르지 않습니다.
Joey

17

자바 스크립트 (ES6), 47 42 48 바이트

for 버전을 만들고 싶었지만 누군가 더 빨랐으므로 재귀 버전이 있습니다.

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

f=전에 추가 하고처럼 호출해야합니다 f(b,c,d)(a).

멋진 골프에 대해 Arnauld에게 감사드립니다.

alertconsole.log출력 사양으로 변경


@Arnauld 감사합니다. 정말 멋진 골프입니다. 나는 방금 그에게 물었다. 그래서 그가 받아들이는지 보자.

받아 들여서 다행입니다. ;)
Arnauld 2016 년

이것은 출력이 라인마다 U + 000A 씩 라인 단위 인 사양을 따르지 않습니다.
Joey

@Joey 그것은 의사 코드 일 뿐이지 만 이것에 대해 OP에게 물어볼 것이다.

@ Masterzagh : 이미 거부 된 대체 출력 형식에 대한 질문이있었습니다.
Joey


13

젤리 , 12 바이트

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

온라인으로 사용해보십시오!

젤리는 반복적으로, 범위를 만드는 등 많은 방법을 가지고 있습니다. 그러나 C ++의 동작을 미러링하는 것은 증분이 0, 루프가 시작하기 전에 끝나는 등의 특수한 상황 (불평등이 뒤 바뀌기 때문에)으로 인해 매우 어렵습니다. ) 및 잘못된 방향으로 진행되는 증분입니다 (따라서 루프의 종료 조건을 자연스럽게 충족 할 수 없음을 의미 함). 따라서이 솔루션은 기본적으로 J ++ 프로그램보다 낮은 수준으로 만들어 지더라도 기본적으로 C ++을 직접 변환하는 것입니다. 운 좋게도 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아무런 충돌이 없습니다. 대기열에서 제외되면 빈 목록이 표시되어 젤리의 암시 적 인쇄에서 아무것도 출력되지 않습니다.
Jonathan Allan

@JonathanAllan : 실제로는 실제로 2에서 주어진 값까지의 범위를 만드는 것이 아닙니다. 이것은 암시 적 인쇄에서 분명히 볼 수 있습니다.

아, 나는 부정적인 이론으로 끝나는 고리로 그 이론을 테스트 했어야합니다. 실제로 범위는 암시 적으로 생성됩니다.
Jonathan Allan

음, 이것은 12 자이지만 12 바이트가 아닙니다?
Cruncher

@Cruncher : Jelly는 언어에서 사용하는 각 문자가 단일 바이트로 표시되는 고유 한 인코딩 을 사용합니다 (256 개의 다른 문자 만 사용함). 코드 페이지 437과 같이 더 잘 알려진 것을 사용하지 않는 이유는 입력하기가 쉽기 때문입니다. 즉, 입력하기가 쉽지 않지만 gs2와 같은 언어보다 쉽습니다. 이 프로그램의 16 진 덤프 길이는 12 바이트입니다.



9

자바, 58 바이트

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

14
만들어야 할 이유가 i있습니까? 초기화 부분을 건너 뛰고 그냥 사용할 수 a있습니까? 또한 ASCII 값 '>'(62)을 사용하면 바이트가 저장됩니다.
Riley

6
라일리의 의견에 따라, 당신은 할 수 있습니다b>61
Kritixi Lithos

나는 이것이 컴파일되는 것을 믿지 않는다.
ChiefTwoPencils 2016 년

@ChiefTwoPencils 함수입니다. 컴파일하려면 테스트 프로그램을 작성해야합니다.
wizzwizz4

@ wizzwizz4입니다. 그러나 여전히 작동하지 않습니다. 기회를주세요. 또한 내 이해는 그것을 실행하는 데 필요한 모든 바이트입니다.
ChiefTwoPencils 2016 년

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

READ1 바이트를 절약 하면서 명령문을 사용할 수 있습니다 .
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하고 건너 뛰고 iASCII 값 '>'을 사용할 수 있습니다 . for(;b==62?a>c:a<c;a+=d)
Riley

작동하지 않습니다f(1,'<'3,1);
Roman Gräf

Ack ... 네, 양쪽에 수학이 필요합니다. 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 를 오른쪽 인자로 취하는 2 차원 링크입니다 . 출력은 무한하며 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를 사용 F하려면 배열을 평평하게 하려면를 삽입해야합니다 .
Dennis

2
이제 나머지 절반을 유지하면서 더 이상 사용되지 않는 주석의 절반을 삭제하고 싶습니다. 나는 관련 절반을 반복하고 나머지 부분을 삭제하겠다고 생각한다. "오, 당신은 PPCG 규칙에 따라 암시 적 출력을 무시할 수 있도록 함수로 정의했습니다. 나는 그것을 생각해야했습니다."


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

파이썬 3, 61 바이트

짧막 한 농담:

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

사이트에 오신 것을 환영합니다! 새로운 리터럴 문자열 보간 기능을 사용합니다. \t공백 으로 바꾸면 바이트를 절약 할 수 있다고 생각합니다 .
0 '

() 제 E 후 \ n \ t 제거한 후 you.still에게 동일한 크기 감사
G-Ox7cd


3

배쉬 (+ 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
Digital Trauma


3

dc , 47 바이트

dc , 48 바이트

또한 Bash + Unix 유틸리티, 29 바이트

dc (47 바이트) :

1sb[_1sb]s zz?sdlb*sc[pld+lnx]sl[dlb*lcr<l]dsnx

온라인으로 사용해보십시오!

dc에서 숫자 입력을 허용하는 방식이므로 음수는 빼기 부호 대신 밑줄로 입력해야합니다. 예를 들어 -5 대신 _5를 쓰십시오.


dc는 문자 또는 문자열 입력을 변수로 읽어서 처리 할 수 ​​없지만 (아래에 더 자세한 설명이 있음)이 문제를 해결하는 두 가지 방법을 찾았습니다.

47 바이트 DC 용액 인수 1을 가지며 구분자로 공백으로, 인수 2 반전 입력에 작동한다. 따라서 1에서 10까지 (3을 포함하지 않음)까지의 카운트는 다음과 같이 입력됩니다.

< 1 10 3

인수의 순서를 변경하는 것이 허용되지 않으면 인수 의 원래 순서를 유지 하는 48 바이트 dc 솔루션 도 제공합니다 . 이것은 zz인수 사이의 구분자로 사용 됩니다. 따라서 다시 3 단계로 1에서 10까지 세지 만 다음 입력 줄을 사용합니다.

1zz<zz10zz3

마지막으로, 동일한 아이디어는 29 바이트 bash 솔루션을 제공 합니다.


dc의 문자열 처리 부족에 대한 세부 사항 및이 프로그램이이를 처리하는 방법 :

dc는 대부분의 언어에서와 같이 문자열 또는 문자 입력을 허용하지 않기 때문에 dc에서이 문제를 처리하는 것은 까다 롭습니다. dc가 입력 문자열을 읽으면 해당 문자열을 즉시 dc 프로그램 (매크로)으로 실행 한 다음 해당 문자열을 버립니다. 문자열의 문자를 메모리에 저장하고 나중에 또는 다른 방식으로 처리 할 수 ​​없습니다. 입력에 '<'또는 '>'가 있어야한다는 요구 사항을 방해합니다.

이것에 대해 두 가지 방법을 보여 드리겠습니다. 위의 솔루션 (47 바이트)에서 처음 두 입력의 순서를 전환합니다. 입력 분리 문자는 공백 문자입니다. 예를 들어, 1에서 10까지 (3을 포함하지 않음)까지 세려면 다음을 입력하십시오.

< 1 10 3

이 솔루션의 기본 개념은 다음과 같습니다.

dc의 매크로는 레지스터에 저장되며 레지스터는 단일 문자 이름을 갖습니다. 이름이 공백 문자 인 레지스터에 매크로를 저장합니다.

프로그램은 입력을 얻기 전에 스택에서 0과 1을 밀어서 작동합니다. 그런 다음 입력을 dc 프로그램 (입력 행으로 dc가 수행하는 작업)으로 실행하면 '<'또는 '>'문자가 명령으로 실행됩니다. 이는 이름이 매크로 인 조건부 매크로 실행입니다. '<'또는 '>'다음의 다음 문자 특히 스택의 상위 2 개 항목이 튀어 나옵니다. 첫 번째로 팝업 된 항목이 두 번째로 팝업 된 <(각각>)이면 표시된 매크로가 실행됩니다. 다음 문자 ( '<'또는 '>'뒤)는 공백이므로 레지스터에 이름이 공백 char 인 레지스터에 저장 한 매크로는 조건이 유지되는 경우 실행되는 매크로입니다. 그러나 스택에서 0과 1을 눌렀으므로 첫 번째 항목은 1이고 두 번째 항목은 0입니다. 결과적으로 매크로는 조건 테스트가 <가 아닌> 인 경우에만 실행됩니다. 이를 통해 입력에서 '<'와 '>'을 구별 할 수 있습니다.

행의 나머지 항목은 숫자 일 뿐이며 dc는 해당 숫자를 차례로 스택에 밀어 넣습니다.

자세한 설명은 다음과 같습니다. 대부분의 경우 계수 변수 (문제 설명의 의사 코드의 i)는 스택 맨 위에 저장됩니다.

1sb             Store 1 in register b.  (b will end up being 1 for '<', and -1 for '>').
[_1sb]s         Note that there is a space after the second s.  So the space char is the name of a macro which stores -1 in b.
z               Push 0 on the stack.
z               Push 1 on the stack.
?               Accept input in the format above.  This will:
                    - Store 1 or -1 in b, depending on whether you've typed "<" or ">"
                    - Push each of the three numbers in turn on the stack.
sd              Save the increment in register d.
lb*sc           Save either limit or -limit in register c, depending on whether the input started with "<" or ">".
[pld+lnx]sl     Define a macro called l which is the body of our loop:
                    - Prints the top of the stack
                    - Adds the increment to the top of the stack.
                    - Calls macro n (the loop test).

 [dlb*lcr<l]dsn  Define a macro called n which is the test of the loop:
                    It checks to see if i (at the top of the stack) times b is less than c; if so, it calls macro l (looping back).
 x               Execute the loop test macro initially (a while loop needs to have a test at the top before entering the loop the first time).

반면 OP는 다음과 같이 말했습니다.

Input can be in one-line using any format "a/b/c/d" or "a,b,c,d" etc.

따라서 순서를 전환하는 것이 합법적이지 않고 입력에서 a 앞에 b가 필요합니다.

다음은 a, b, c 및 d를 원래 순서대로 유지하는 대안입니다. 구분자를 사용할 수 있습니다. zz를 구분 기호로 사용하겠습니다. 따라서 3 단계에서 1에서 10까지의 계산은 다음과 같이 입력됩니다.

1zz<zz10zz3

zz로 구분 된 입력을 가진 새로운 프로그램은

dc (48 바이트) :

1sb[_1sb]sz?sdiilb*sci[pld+lnx]sl[dlb*lcr<l]dsnx

이것은 47 바이트의 첫 번째 솔루션보다 1 바이트 더 깁니다.

온라인으로 zz로 구분 된 버전을 사용해보십시오!

개인적으로 다른 순서의 < 1 10 3형식이 문제의 정신에 1zz<zz10zz3더 가깝다고 생각하지만 실제 기술 사양을 더 잘 충족시킬 수 있습니다.

다른 입력 인수 사이에 다른 구분 기호를 허용하면 더 짧은 솔루션을 얻을 수 있지만 문제의 정신에 있다고 생각하지 않습니다.

Bash + Unix 유틸리티, 29 바이트

위의 기본 아이디어를 bash 프로그램 (dc를 호출)으로 바꿀 수 있습니다. 이렇게하면 "<"및 ">"의 모든 어려움을 피할 수 있으며 다양한 숫자 매개 변수 처리를 단순화하므로 @zeppelin의 bash + bc 답변과 동일하게 길이가 29 바이트에 불과합니다.

bash 버전 (29 바이트) :

dc -e[p$4+d$3r$2l]sl$1d$3r$2l

bash 버전을 온라인으로 사용해보십시오!

다음은 bash 프로그램 내부의 dc 프로그램 작동 방식에 대한 설명입니다.

i의 값은 대부분 스택의 맨 위에 저장됩니다.

[      Start of macro (i is at the top of the stack). This macro will be called l.
p      Print i
$4+    i += (4th argument)
d      Duplicate i at the top of the stack.
$3     Push the 3rd argument onto the stack.
r      Swap the top two items on the stack, so i is at the top and arg3 is second
$2l    $2 is "<" or ">", causing the top two items to be popped from the stack, and macro l is then called (effectively looping back) if i < arg3 or i > arg3, respectively.
]sl    End of macro definition; store macro in register l.

$1     Push argument 1 onto the stack (i = 1st argument).
d$3r$2l Just as above, call macro l if i < arg3, or i > arg3, depending on whether arg2 is "<" or ">"

3

일반적인 Lisp, 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> 

PrzemysławP 덕분에 -9 바이트


매크로를 정의하여 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 2018 년

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은 도전 과제를 발표했습니다.


깔끔한! 모든 공통 연산자를 포함시켜야하는지에 대해 도전을 할 때 확실하지 않은 경우, 이들이 모두 동일하지 않다는 것을 기억했습니다 (예 : 루아에서 ~ =는! =)
Sygmei

와, 평가는 악하다.
cyberbit

PHP 7.1을 사용하여 더 짧게 만들 수있는 것 같습니다. 그렇지 않다면 list짧은 구문으로 4 바이트와 4 바이트 를 절약 할 수 있습니다.
Jörg Hülsermann

@PHP 7.1은 도전 과제를 게시합니다. 하지만 감사합니다 list().
Titus

2

펄 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.

Seqstdout에 숫자를 인쇄하는 대신 (잠재적으로 무한한) 숫자 시퀀스를 type 값으로 반환해도 괜찮은 경우 .say for부품을 제거하여 35 바이트로 줄일 수 있습니다.


2

클로저, 66 63 바이트

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

를 빼서 -3 바이트 loop. init 매개 변수를 "남용하여"실행 누적 기 역할을합니다.

재귀 솔루션 (TCO 포함). 사전 골프 코드의 주석을 참조하십시오. 비 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 바이트이며 whenmy와 결합합니다 ({">">"<"<}%2).
NikoNyrh

2

그루비, 51 바이트

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

이것은 이름이없는 폐쇄입니다. 온라인으로 사용해보십시오!

주의 –로 이것을 테스트 groovy console하려면 입력에 무한 루프가 발생할 때 전체 프로세스를 종료해야합니다. ~ 5 기가의 RAM을 사용한 후에 이것을 알았습니다.


2

QBIC , 51 40 바이트

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

그리고 게시 3 분 후에 터미네이터 논리를 단순화 할 수 있음을 깨달았습니다 ...

:;::      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

클로저, 66 바이트

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

이것은 Clojure에서 <와 같이 55 바이트 일 수 있으며 >함수입니다.

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

나는 여기에서지도를 사용하는 것을 좋아합니다. 나는 그것이 내 길을 이길 것이라고 생각하지 않았을 것입니다. 또한 약간 다른 접근법에도 불구하고 두 초기 카운트가 동일하다는 사실도 흥미 롭습니다.
Carcigenicate

b가 함수가되도록 허용하면 일부 언어에는 불공평 한 이점이 있습니다. :)
Sygmei

사실이지만 Clojure를 제외하고 내가 아는 대부분의 언어는 <대신 대신 허용 "<"하면 큰 이점이 없다고 생각 합니다.
NikoNyrh

@Sygmei True. 그래도 괴물처럼 보일 것입니다. 당신이 그 전화를하는 것을 비난 할 수 없습니다.
Carcigenicate

OP는 비교 연산자 btw의 문자열 대신 문자가 좋습니다. 몇 바이트를 절약해야합니다.
Carcigenicate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.