임의 길이의 카레


53

함수, 쓰기 f양의 정수에 소요 함수를 반환합니다.

반환 된 새 함수는와 동일해야합니다 f. 그러나 "종료 호출"이 발생하면 f전달 된 모든 정수의 합계를 반환해야합니다.

예를 들어 g=f(4)( f첫 번째 기능인 경우) g다른 기능으로 설정해야 합니다. h=g(3)똑같이 할 것입니다. 그러나 h인수없이 호출하면 (자세한 내용은 아래 참조) 이전 함수 인수의 합계이므로 7을 출력해야합니다. 다시 말하면 f(3)(4)() == 7.

이것은와 같지 않습니다 f(3,4)().

"Termination Call"은 다음 옵션 중 하나입니다 (선택).

  • 인수없이 호출
  • 인수로 null
  • 양수가 아닌 값

임의의 양의 함수 호출이 지원되어야하며, 사전 정의 된 한계는 없습니다.

총합이 1'000보다 크지 않아야합니다.

"종료 호출"전에 하나 이상의 호출이 있다고 가정 할 수 있습니다.

코드는 프로그램 별 정적 변수를 사용해서는 안되므로 동일한 런타임에서 실험을 여러 번 실행하고 정확히 동일한 동작을 관찰 할 수 있어야합니다.

예 :

f(1)() == 1
f(4)(2)(7)() == 13
f(4)(2)(7)(5)(2)() == 20

4
@LuisMendo 일반적으로 f(4)새 함수 를 반환 한다는 의미입니다 . 새 함수가 인수없이 호출되면이 함수는을 반환 4하지만 다른 인수로 호출 된 경우 동일한 의미론을 갖지만 새 인수가 추가 된 등의 새로운 함수를 다시 반환합니다 4.
Martin Ender

6
@LuisMendo 실제로 Eugene에 달려 있지만, 흥미로운 부분은 상태 저장 기능을 만드는 것이 아니라 고차 기능을 만들기 때문에 반복되는 호출을 허용하면 문제에서 크게 벗어날 것이라고 생각합니다.
Martin Ender

6
@MartinEnder 많은 의미가 있습니다. 유진, 그 의도라면 도전의 말을 바꿔주세요. 무한히 호출 할 수있는 함수를 작성 한다고해서 함수가 함수를 반환하는 것은 아닙니다.
Luis Mendo

4
한 번에 하나의 콜 체인 인스턴스 만 있다고 가정 할 수 있습니까? 예를 들어 q = f(2)(3); b = f(1)(2)(3); q(); b()?
코너 오브라이언

3
최근에 Haskell을 집어 들었으므로 Haskell에서 이것이 가능한지 관심이 있습니다. 강력한 타입 시스템은 그렇지 않다고 생각합니다.
CAD97

답변:


49

자바 스크립트 (ES6), 18 바이트

f=n=>m=>m?f(m+n):n

잘못된 값을 전달하여 합계를 검색하십시오. 2 바이트의 비용으로 0을 허용 할 수 있습니다.

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

언 골프 드 :

f = function(n) {
    return function(m) {
        if (m) {
            return f(m+n);
        } else {
            return n;
        }
    }
}

화려한 제출!
유진 D. 구벤 코프

21

하스켈 (GHC), 118 바이트

이것은 코드의 경우 98 바이트이고 GHC 컴파일러 플래그의 -XFlexibleInstances경우 20 바이트이며 , 이는 유형 시스템 확장을 가능하게합니다.

class F a where f::Int->a
instance F(()->Int)where f n()=n
instance F a=>F(Int->a)where f=(f.).(+)

이것은 "함수"를 정의하는데 f,이 함수 는 임의의 수의 정수와 그 뒤에 unit을 호출 ()하여 정수를 반환 할 수 있습니다. 타입 주석이 필요합니다. 온라인으로 사용해보십시오!

설명

Haskell의 엄격한 타입 시스템이이를 가능하게하기 위해서는 약간의 마술, 즉 유연한 타입 클래스 인스턴스를위한 GHC 확장이 필요합니다. 이것이 작동하는 방식은 f유형 클래스 제약 조건에 의해 제한되는 파라 메트릭 다형성 함수입니다 F a => Int -> a. 유형은 입니다. 이것은 f정수 를 취하여 typeclass에 속하는 a모든 유형에 대해 type 값을 리턴 함을 의미합니다 . 함수를 제공하는 typeclass의 이름 일뿐입니다 . 첫 줄에 선언되어 있습니다.aFFf

다음 두 줄은 F서로 다른 유형 의 두 인스턴스입니다 a. 두 번째 행은 ()정수 에서 정수 까지의 함수 유형이 속해 있으며 F(여기서 ()멤버 만 값을 갖는 단위 유형 ()임) 구현은 다음과 같습니다 f n () = n. 이 함수는 첫 번째 인수를 반환합니다. 마지막 줄에 a속하면 F정수에서 a다음까지의 함수 유형도 나타납니다. 함수에서 f :: Int -> a다른 함수를 생성 할 수 있습니다 f :: Int -> Int -> a. 구현은 f m n = f (m+n)(코드는 콤비 네이터를 사용하여 더 짧게 만듭니다), f왼쪽은 새 것이고 f오른쪽은 오래된 것입니다. 이것은 본질적으로f다음 정수에 추가되는 새로운 정수 인수 여러 인수는 다음과 같이 요약됩니다.

  f  a1   a2   a3   a4   a5  ()
= f (a1 + a2)  a3   a4   a5  ()
= f (a1 + a2 + a3)  a4   a5  ()
= f (a1 + a2 + a3 + a4)  a5  ()
= f (a1 + a2 + a3 + a4 + a5) ()
=    a1 + a2 + a3 + a4 + a5

f각 행에 다른 유형이 있습니다.

Haskell 함수는 자동으로 커리되므로 f정수만 제공 하면 함수를 얻게됩니다.


1
어쩌면 나는 nitpicking하고 있지만 도전이 요구하는 것은 아닙니다. f작업을 수행하는 단일 함수가 아닌 두 (!) 함수를 정의 하고 있습니다. 그러나 이것은 Haskell에서 얻을 수있는 한 가깝습니다. 엄격한 유형 시스템으로 인해 단일 기능으로 작업을 해결할 수 있다고 생각하지 않습니다.
nimi

3
@nimi라는 두 개의 함수가 f아니라라는 많은 함수를 정의합니다 f. (가능한 개수의 인수마다 하나씩)이 함수 (무한한 계열의 함수)에는 두 가지 종류의 정의가 있습니다. 하나는 인수 수가 0 인 경우와 다른 하나는 그렇지 않은 경우입니다.
ShreevatsaR

@ShreevatsaR : 나는 두 가지 정의를 참조 f n()=n하고 f=(f.).(+), 그래서 두 개의 함수를 정의 호출 것입니다.
nimi

7
@nimi 두 가지 정의가 있지만 두 가지 기능은 없습니다. 정의의 개수는 함수의 개수 일 필요는 없습니다. 예를 들어, 두 개의 정의를 계승 함수를 정의 할 수 있습니다 g 0 = 1g n = g (n-1) * n두 개의 정의하지만, 하나 개의 기능이 있습니다. 여기에는 두 가지 정의가 있지만 무한히 많은 함수가 있습니다. (각각 다른 유형입니다.)
ShreevatsaR

1
@nimi BTW의 ghci로드 위의 시도 :t f- 그것은 말할 것이다 f :: F a => Int -> a(경우 즉 a클래스의 인스턴스 f, 다음 f함수이다 Int -> a). 따라서 우리는 이것을 하나의 함수 또는 무한히 많은 것으로 생각할 수 있지만 (계승 함수와 마찬가지로) 두 종류의 정의가 있지만 두 함수로 간주하기위한 좋은 근거는 없습니다.
ShreevatsaR

15

파이썬 2, 42 41 36 바이트

파이썬은 임의 정밀도 정수를 지원하기 때문에이 솔루션은 절대 오버플로가 없습니다. "특별한 가치"는 0입니다.

f=lambda n:lambda m:m and f(m+n)or n

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

언 골프 드 :

def f(n):
    def g(m=''):
        return f(m+n)if m<''else n
    return g

14

C, 62 58 바이트, 경계선 경쟁

Kevin 덕분에 4 바이트가 절약되었습니다! (typedef를 호출하기 위해 필요한 것이기 때문에 여전히 typedef를 제거하지 마십시오.)

typedef(*(*B)(_))(_);q;f(x,o,_){x=x?(q+=x,f):(x=q,q=0,x);}

호출 할 함수는 f; 당신은 그것을 호출을 중지하고 같은 양수가 아닌 번호로 호출하여 결과를 얻을 수 0있습니다. 온라인 테스트 하네스를 사용해보십시오!

따라서 내가 알 수있는 한 여러 반환 유형이있는 함수를 "커리"하는 유일한 방법은 다음 중 하나를 수행하는 것입니다.

  1. 결과를 함수로 캐스트하여 결과를 다시 호출하려는 컴파일러에 알리십시오.
  2. 또는 and function / self-referential 하위 유형이 있는 union/ struct유형을 작성하십시오 int.

나는 (2)를 시도했지만 문제의 정신에 약간 어긋나는 것처럼 보였으며 솔직히 취소 할 수 없었습니다. 따라서 도전의 정신에 따라, 나는 옵션 (1)을 선택했다. 이를 위해서는 반환 된 각 함수를 함수로 캐스트해야 사용할 수 있습니다.

이 "커링"구문은 조금 이상해 보이지만 상당히 유사합니다. 에뮬레이션하려면 f(21)(1)글을 써야 ((B)((B)f(21))(1))(0)합니다. B형식을 정수를 취하는 함수로 정의하고 정수를 취하는 함수에 대한 포인터를 반환합니다. 확장하면 다음과 같습니다.

   ( (B)( (B) f(21) )(1) )(0)
//            f(21)            - call f with 21
//        (B)                  - cast to B, a function pointer
//      (           )(1)       - call with 1
//   (B)                       - cast to a function pointer
// (                     )(0)  - call with 0

0에서만 종료한다고 말하면 캐스팅 (C가 자신을 반환하는 함수를 올바르게 정의 할 수 없기 때문에 C에서 수행)이 필요하고 호출자에게 실행 사이의 전역을 지우십시오 ( 나는 완전히 합리적이라고 생각합니다 q;f(x){return x?(q+=x,f):q;}.) 전체를 단순화 할 수 있습니다 .
Kevin


1
@Kevin은 아직 사이트 규칙에 따라 기능을 재사용 할 수 있어야합니다. q매번 실행 한 후에 0으로 설정하지 않으면 이 기능을 더 이상 사용할 수 없습니다.
Conor O'Brien

아마도 함수 포인터? 당신은 항상 참조해야하지만 체크 아웃 가치가있을 수 있습니다
Downgoat

1
@ ConorO'Brien 방금 귀하의 노동 조합 접근 방식을 구현했습니다 . 이 것보다 길지만 멀지 않습니다.
Jakob

13

Mathematica, 25 바이트

f[x_]@y_=f[x+y]
f[x_][]=x

온라인으로 사용해보십시오! (수학 사용)

JavaScript 답변을 이식하여 3 바이트를 줄일 수는 있지만 더 관용적 인 Mathematica 솔루션을 제시하고 싶었습니다. 이것은 @약간의 구문 설탕이며 솔루션을 다음과 같습니다.

f[x_][y_]=f[x+y]
f[x_][]=x

그래서 그래 아이디어는 매스 매 티카에서 그냥 함수를 정의 할 수 없다는 것입니다 f[x_]하지만 당신이 직접 포함하는 더 복잡한 표현에 값을 첨부 할 수 있습니다 f예를 들어, f[x_]다른 인수를 전달되는. 이를 위해 두 가지 정의를 설정하면 원하는 동작을 얻을 수 있습니다.

  • 첫 번째 정의는 하나의 f[x][y]호출을로 축소 f[x+y]하여 하나의 "호출"을 소비하고 내부에 인수를 추가합니다. 이 규칙은에 남을 때까지 적용됩니다 f[sum][].
  • 두 번째 정의는 평가할 전체 항목을 정의하여이 최종 사례의 압축을 풉니 다 sum.

1
<3 상징적 프로그래밍
Julian Wolf

8

C ++, 72 바이트

#define O(P)operator()(P){return{P+a};}int
struct F{F O(int(m))O()a;}f;

이 타입 정의 F요구 함수로서 작용 가변 f유형의 호출 할. C ++ 11부터 유효하며 온라인 버전의 GCC, clang, icc 및 VC ++에서 작동합니다.

용법:

int main() {
  return f(1)(2)(3)(); // returns 6
}

설명:

전처리 및 재 포맷 후 다음과 같습니다.

struct F {
  F operator()(int(m)) { return{int(m)+a}; }
  int operator()() { return {+a}; }
  int a;
} f;

일반적으로 다음과 같이 작성됩니다.

struct F {
  F operator()(int m) { return {m+a}; }
  int operator()() { return a; }
  int a;
} f;

return a;return {+a};단항과 같이, 같은 일을 +값을 변경하지 않으며, 반환 값 주위 중복 중괄호가 허용됩니다. int mint(m)변수 이름 주위에 여분의 괄호가 허용 될 때 함수 매개 변수를 포함하여, 같은 일을. return {m+a};return {int(m)+a};의 주조로, 같은 일을 m에서 intint그 값을 변경하지 않습니다. 이러한 변경 사항으로 인해 두 개의 operator()과부하가 구문에 더 가까워져 단일 매크로 정의를 두 번 호출 할 수 있습니다. 세 멤버에 대한 올바른 순서를 선택하면 다음 줄의 첫 단어 ( int)가 매크로 정의에도 포함될 수 있습니다.


1
아름다운. 그리고 골프 솔루션뿐만 아니라 ... operator()이 작업을하기 위해 과부하 가 특히 시원했습니다.
Ray Toal

6

루비, 23 바이트

f=->n{->m{m ?f[n+m]:n}}

용법:

f[1][2][3][nil]
=> 6

6

C, 104 96 바이트

#define a(i)s(i)|b
#define b(i)u(i)|c
#define c(i)u(i)|b
b,c,d;s(i){b=c=i;i=d;}u(i){c=b+=i;i=d;}

@JulianWolf가 공유 한 링크의 메소드를 사용합니다. 마지막 인수는 0이어야합니다.

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


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Dennis

4

Math.JS, 38 바이트

f(x)=i(x,0)
i(x,y)=x<0?y:j(z)=i(z,y+x)

전화 해 f(number_a)(number_b)(...)(negative_number)

초기 호출을 지정할 수 있으면 12 바이트 ( f(x)=i(x,0)\n)를 삭제할 수 있습니다.i(number_one,0)(number_two)(...)(negative_number)

시도 해봐!

설명

LaTeX!

위의 LaTex에 표시된 것처럼 f(x)단순히을 호출 i(x,0)한 다음 if 가 0보다 작은 i(x,y)값 또는 하나의 인수를 취하는 함수를 반환합니다 . 의 가치를 더 합니다.yxj(z)=i(z,x+y)y


4

C, 232206 바이트

#include<string.h>
#include<stdlib.h>
#define f(X)s(""#X)?0:g
#define g(X)u(""#X)?0:h
#define h(X)u(""#X)?0:g
g=0,h=0;s(char*s){g=h=atoi(s);return 0;}u(char*s){char*a=strlen(s)?s:"0";g=h+=atoi(a);return 0;}

이것은 아마도 골프를 치는 일 이겠지만, 마법의 가치보다는 인수없이 호출함으로써이 문제를 해결하기 위해 언어 확장 *없이 C를 사용할 수 있다는 개념의 증거로 작용해야합니다.

* @hvd는 gcc를 사용하여 즉시 작동하지만 일부 동작은 C 표준에 정의되어 있지 않으므로 이식성이 없을 수도 있습니다. 자신의 책임하에 사용하십시오!

언 골프 드 :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define f(X) start("" #X) ? 0 : f0
#define f0(X) update("" #X) ? 0 : f1
#define f1(X) update("" #X) ? 0 : f0

long f0 = 0;
long f1 = 0;

int start(const char *s) {
    f0 = f1 = strtol(s, NULL, 10);

    return 0;
}

int update(const char *s) {
    const char *a = strlen(s) ? s : "0";
    f0 = f1 += strtol(a, NULL, 10);

    return 0;
}

int main() {
    printf("f(1)()          -> %ld\n", f(1)());
    printf("f(1)(2)(0)(3)() -> %ld\n", f(1)(2)(0)(3)());
    printf("f(1)(-2)(3)()   -> %ld\n", f(1)(-2)(3)());
    printf("f()             -> %ld\n", f());

    return 0;
}

gcc arbitrary-length-currying.c -o arbitrary-length-currying && ./arbitrary-length-currying출력으로 컴파일 및 실행 (일부 경고 후)

f(1)()          -> 1
f(1)(2)(3)(0)() -> 6
f(1)(-2)(3)()   -> 2
f()             -> 0

"어떤 언어 확장없이"- 번갈아의 트릭 gh그 지정의로 매크로 호출 체인을 계속하는이 작업에 보장되지 않으므로 다음 여부 g최초의 확장의 맥락에서 나타납니다 g. C11은 6.10.3.4에 예제를 추가하여 지정되지 않았 음을 표시합니다. (IIRC, TenDRA의 전처리 기는 원하는 방식으로 확장하지 않는 것입니다.) 그 외에도 언어 버전은 빈 매크로 인수와 암시 적 int를 모두 지원하지 않으므로 유효한 C 프로그램이 두 가지를 모두 사용할 수 없습니다. :) 여전히 좋은 답변입니다. 더 골프를 원하십니까?
hvd

@ hvd : 예, 아마 며칠 안에 다시 돌아와서 골프를 칠 수 있는지 볼 것입니다. 이것이 분명하지 않은 행동이라는 것은 옳습니다. 그러나 여기서 표준 처리는 언어가 gcc와 함께 작동하는 한 구현에 의해 정의된다는 것입니다.
Julian Wolf

나는 당신이 당신의 답변에 포함 된 의견을 언어 확장에 의존하지 않는다고 말하고있었습니다. 예, 언어 확장을 사용하더라도 여기에 대한 답변으로 완벽하게 유효하지만 달리 제안하는 것은 아닙니다.
hvd

아, 그건 공평합니다. 추가 플래그가 필요하지 않지만 이식 할 수는 없다는 것을 명시해야합니다.
Julian Wolf

*s대신 빈 문자열을 테스트 할 수 있습니다 strlen(s). C 문자열은 암시 적 길이이며 charwith 값으로 종료됩니다 0. 멋진 매크로 해킹으로 인수없이 / 통화없이 통화 할 수 있습니다!
Peter Cordes

4

8086 머신 코드, 27 바이트

00000000  bb 00 00 85 c0 74 13 01  d8 be 00 01 89 e7 47 47  |.....t........GG|
00000010  57 b9 1b 00 f3 a4 5b 89  47 01 c3                 |W.....[.G..|
0000001b

이 기계 코드는 주소 0x100에 있어야하며 작은 코드 모델 (cs = ds = es = ss)을 가정합니다. 그러나 추가 바이트 비용없이 함수 위치를 변경할 수 있습니다. 오프셋에 넣으면 0바이트가 절약 xor si,si됩니다 ( 대신 mov si, 0x100)

필요한 통화 규칙

이것은 호출자가 스택에서 최소 27 바이트를 미리 할당했다고 가정합니다. 에 숫자를 사용 ax하고에 함수 포인터를 반환합니다 bx. 로이 포인터를 호출 ax=0하면 체인 이 종료되고에 합계가 반환됩니다 bx.
첫 번째 전화의 경우 :

mov bp, sp
sub sp, 28
mov ax, number_to_add
call function
; new function pointer in bx

그런 다음 각 후속 호출에 대해 다음을 수행하십시오.

sub sp, 28
mov ax, number_to_add
call bx
; new function pointer in bx

종료하려면 :

mov ax, 0
call bx
; result in bx
mov sp, bp

Ungolfed (기계 코드의 주석 처리 된 분해) :

00000000  BB0000            mov bx,0x0      ; 0 is replaced after copying
00000003  85C0              test ax,ax
00000005  7413              jz 0x1a         ; if(ax==0) ret (with value in bx)
00000007  01D8              add ax,bx       ; arg += total
00000009  BE0001            mov si,0x100    ; address of the original: ds:0x100
0000000C  89E7              mov di,sp
0000000E  47                inc di
0000000F  47                inc di          ; dst = sp+2 = above return address
00000010  57                push di
00000011  B91B00            mov cx,0x1b
00000014  F3A4              rep movsb         ; copy the function code.
00000016  5B                pop bx            ; bx = start of copy destination
00000017  894701            mov [bx+0x1],ax   ; update total in the copied code
0000001A  C3                ret               ; with bx = function pointer

0이 아닌 AX로 이것을 호출 bx = sp하면 버퍼는의 머신 코드의 수정 된 사본으로 채워집니다 function. 첫 번째 명령어의 16 비트 즉시 합계가 유지됩니다. (이전의 마지막 명령으로 작성되었습니다 ret.)

push di/ pop bxmov bx, di(이전 rep movsb) 로 대체하여 더 간단하지만 비용을 절감 할 수는 없습니다.

호출자가 dst 버퍼에 포인터를 전달하도록 요구 di 4 바이트를 절약 할 수 sp있습니다.

함수 시작 주소를 함수 크기와 동일하게하면 바이트 ( mov cx, si) 가 절약 됩니다.


머신 코드 바이트의 디스 어셈블리를 포함하면 더 나은 답변입니다. 기계 코드 답변에는 분명히 ungolfed 버전이 필요합니다. 예 : objdump -b binary대신 사용hexdump -C
Peter Cordes

주석 처리 된 분해로 업데이트되었습니다. 가능한 절약 : 호출자가 dst 포인터 di(4 바이트) 를 전달해야합니다 . mov cx, si대신 함수 시작 주소 = 크기 : 로 설정하십시오 mov cx, 0x1b.
Peter Cordes

2

C #, 62 바이트

dynamic f(int n)=>(System.Func<int,dynamic>)(m=>m<0?n:f(n+m));

통화를 끝내려면 음수로 전달하십시오. 예 :

f(1)(2)(3)(-1) == 6

통과 시켜서 작동시키고 싶습니다. null매개 변수를 하거나 종료하지 않고 . 그러나 내가 시도한 모든 방법은 훨씬 길었다
TheLethalCoder

!m대신에 사용 하거나 m<0통과 할 수 있습니까null0 마지막 매개 변수로?
betseg

C #의 @betseg No는 a로만 Boolean사용할 수 있습니다 Boolean...와 함께 시도 null했지만 더 길어졌습니다. ??LHS가 null 인 경우 RHS를 수행하는 경우 의미 를 사용 하고 싶었지만 LHS가 null이 아닌 경우 RHS를 수행하는 경우 필요하지 않습니다.
TheLethalCoder

2

스칼라, 58 자

case class f(n:Int){def apply(m:Int)=f(n+m)
def apply()=n}

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

언 골프 드 :

case class f(n:Int){
  def apply(m:Int)=f(n+m)
  def apply()=n
}

설명:

이 코드는 case class생성자를 int로 사용 하여 호출 된 f를 정의합니다 . equals, hashcode, toString 및 copy 메소드와 new키워드가 없는 오브젝트 작성을 가능하게하는 동일한 이름의 컴패니언 오브젝트를 생성 할 케이스 클래스를 정의하십시오 .

이 클래스에는 오버로드 된 apply 메소드가 있습니다. 하나는 다른 정수를 사용하여 업데이트 된 합계가있는 새 오브젝트를 작성하고 인수가없는 인수는 합계를 가져옵니다.

스칼라에서는 apply 메소드가있는 객체를 메소드처럼 호출 할 수 있습니다. o.apply(x) 할 수 있습니다 o(x). 이것은 Function1익명 함수로 구현 된 배열, 목록, 맵 및 특성 에 대한 표준 라이브러리에서 사용됩니다.



2

펄 5, 36 바이트

sub f{my$n=pop;sub{@_?f($n+pop):$n}}

say f(1)->(); # 1
say f(1)->(2)->(3)->(); # 6

이건 -M5.016어때요? 삭제 -M5.016my몇 바이트를 삭제 하고 저장할 수 있어야 합니다. 그냥 say이면 -E대신 플래그 를 사용하면 활성화되지 않으므로을 use strict삭제할 수 있습니다 my.
Chris

@Chris 당신 말이 맞습니다. 5.16 필요하지 않습니다. 초기 개정 (을 사용 __SUB__)했지만 제출하기 전에 변경했으며 5.16에 대한 비트를 제거하지 않았습니다. 제거하겠습니다. 그래도 삭제 my가 정확 하다고 생각하지 않습니다 .
hobbs

(아니요, say코드의 일부로 계산하지 않습니다. 단지 설명을위한 것입니다)
hobbs

1
당신이 제거하면 my않고 use strict, $n암시 적으로 전역 변수입니다. 적절한 펄 스크립트에서는 좋지 않은 형태이지만, 한 줄짜리에서 일반적으로 사용되며 여기에서 작동하는 것 같습니다.
Chris

2

브레인 플락 , 6 바이트

사실 난 그냥 이후 눈치 서비스 약관이 유효한 반환 형식 터지는 0 정말 2 바이트를 저장하는 필요하지 않습니다 :

({{}})

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

원본 제출, 8 바이트

0특수한 값으로 사용 합니다 :

({{}}{})

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

설명

인수 감안할 때 1을 , 2 , ..., N , 0 스택은 처음과 같습니다 :

                                                       N

                                                       

                                                       2

                                                       1

                                                       0

모든 팝업에 다음 코드는 간다 난을 그들을 축적의 팝업 0 을 추가하고 결과를 밀어 넣는다 :

(      )  -- push the following value:
 {  }     --   while ToS ≠ 0 (sums the runs):
  {}      --     pop 1 element
     {}   --   pop the remaining 0 & add it

대체 솔루션, 8 바이트

0 을 팝하고 합계에 추가하는 대신 오른쪽 스택이 비어 있기 때문에 스택을 교환 할 수도 있습니다.

({{}}<>)

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

-r플래그를 사용하면 0 이 스택의 맨 위에 있으므로 먼저 팝 할 수 있습니다.

({}{{}})

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

{}({{}})

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


오 세상에 ... 대단해!
유진 D. 구벤 코프

2

C (GCC), 83 바이트

내 첫 C 골프! 다른 C 솔루션이 몇 가지 있지만 이것은 약간 다릅니다. 전 처리기 사용은 순전히 화장품입니다. 이 접근법은 Conor O'Brien 's answer here 에서 처음 논의되었습니다 .

#define r union r
t=0;r{int v;r(*f)();};r e;r f(a){t+=a;e.v=a?f:t;t*=a>0;return e;}

터미널 값은 0입니다. 반환 값은, 그래서 그 결과를 전화 필드를 사용하는 조합입니다 f필드를 사용하고 최종 값에 액세스하는 데 v, 예를 들어,

f(1).f(2).f(3).f(0).v

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

한계

전역 변수는 누계를 보유합니다. 이는 명시 적으로 허용되지 않지만 제출은 반복 된 호출 (터미널 호출에서 전체가 재설정 됨)을 지원하므로 글로벌 상태에 대한 금지 이유가됩니다.

에 대한 포인터 fint멤버를 통해 반환 된 공용체에 저장 되므로 이식성이 명확하지 않습니다. 이것이 모든 플랫폼 또는 Linux 또는 x86 또는 ELF 또는 GCC에서 GCC에서 작동하는지 확실하지 않습니다. 누군가 이것에 대한 자세한 내용을 알고 있다면 의견을 말하거나 메시지를 보내십시오!


2

APL (Dyalog Classic) , 48 47 46 44 32 바이트

r←(a f)x
r←⍎'(a+x)f'↓⍨-0=x

0f

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

0을 전달하여 종료합니다. 호출 구문 :((0 f 1) 2) 0

@ngn 덕분에 -15 바이트

필요 ⎕IO←0

모든 골프 팁을 환영합니다!


당신이 종료 값으로 0을 사용할 수있는 경우, 변경 :If x<0:If×x하고 "만약"과 "다른"조항 교환
NGN

Derp. 나는 그것이 "긍정적이지 않다"고 말하는 것을 보지 못했습니다
Zacharý

이 트릭을 알고 있습니까? r←⍎condition⊃'else' 'then'
ngn


22라고 생각했습니다 ...> _ <
Zacharý


1

Dyvil , 34 바이트

infix int apply(i:int,j:int=0)=i+j

사용법 :

0() // = 0
0(1)() // = 1
0(1)(2)() // = 3

후행 ()은 생략 할 수 있습니다.

설명 :

두 개의 정수를 가져 와서 더하는 병렬 연산자를 정의합니다. 매개 변수 j에는 0인수없이 호출을 지원 하는 기본값이 있습니다. 0예에서 위의 이름,하지만 문자가 아닙니다.


1

Julia v0.5 +, 52 바이트

type F n end
F()=0
(f::F)()=f.n
(f::F)(x)=(f.n+=x;f)

로 전화하십시오 F. 적은 OO 방법을 채택하면 아마도 훨씬 짧아 질 수 있지만 항상이 관용구를 사용할 기회를 얻는 것을 좋아합니다.

"종료 호출 전에 적어도 하나의 호출이 수행된다"고 가정 할 수있는 경우, 두 번째 행을 제거하여 6 바이트를 절약 할 수 있습니다.



1

R, 40 바이트

f=function(x)function(y)`if`(y,f(x+y),x)

여기서 0은 정지 값으로 작동합니다. 2 바이트를 더 생략하면 생략 할 수 있습니다.

문제는 R에 간결한 내장 람다가 없다는 것입니다. 그러나 하나를 추가 하면 코드를 26 바이트로 가져올 수 있습니다 .

f=x->(y->`if`(y,f(x+y),x))

(예, 유효한 R입니다. 가져 오기만하면됩니다.)


1

PHP, 44 바이트

아이디어 @ user63956

종료 전화 0

function f($i){return[$_GET[0]+=$i][$i]?:f;}

온라인 버전

NULL요구가있는 해지 전화[$i] 로를[+$i]

PHP, 47 바이트

function f($i){global$s;return$i?f.!$s+=$i:$s;}

온라인 버전

PHP, 52 바이트

NULLPHP에서 종료 호출 또는 다른 값

function f($i){global$s;$i?$s+=$i:print$s;return f;}

출력 print$sdie("$s")+ 2 바이트로 교체 된 후 프로그램이 종료되어야하는 경우

온라인 버전


1
함수가 반환되지 않아야한다고 생각합니다 (인쇄하지 않음) $s. 그래서 당신은 return$i?f:$s마지막에 같은 것을 할 수 있습니다
Conor O'Brien

@ ConorO'Brien 확실하지 않지만 생각이 옳다면 5 바이트를 절약 할 수 있습니다. 감사합니다
Jörg Hülsermann

1
수퍼 글로벌 변수를 사용하여 몇 바이트를 저장할 수 있습니다 function f($i){return[$_GET[0]+=$i][$i]?:f;}.
user63956

@ user63956 아주 좋은 아이디어
Jörg Hülsermann

1

PowerShell, 86 바이트

$f={$n=$args[0];$f=(gv f).value;{if($args){&$f($args[0]+$n)}else{$n}}.getnewclosure()}

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

테스트 코드 :

&(&(&(&(&(&$f 4)2)7)5)2)

출력 : 20


아주 좋아요 PPCG에 오신 것을 환영합니다! $n="$args"대신 에 수행하여 바이트를 저장할 수 있습니다 $n=$args[0]. 그러나 다른 것에서는 작동하지 않습니다 $args[0]. 왜냐하면 더하기보다는 문자열 연결을 얻게 될 것입니다.
AdmBorkBork


1

파이썬, 69 바이트

def f(a=0,s=[]):
    if a:
        return lambda b=0:f(b,s+[a])
    return sum(s)

1
나는 이것이 파이썬이라고 가정하고 있습니까? 답변에 사용 된 언어를 명시해야합니다.
corvus_192

당신은 당신의 대답을 더 골프하려고 할 수 있습니까? 그것이 의미하는 바와 같이, 그것은 잘 골프되지 않습니다.
Rɪᴋᴇʀ


1

R, 54 52 바이트

f=function(x){g=function(y='')'if'(y>'',f(x+y),x);g}

MickyT 덕분에 2 바이트를 절약했습니다!

파이썬 답변 중 하나와 유사합니다. 언 골프 드 :

f=function(x){
  g=function(y=''){
    if(y>''){
      f(y+x)
      }
      else{x}
  }
  g
}

다음으로 실행

> f(1)(2)(4)()
[1] 7

1
잘 했어. if 절 주위의 내부 괄호를 제거 할 수 있습니다. f=function(x){g=function(y='')'if'(y>'',f(x+y),x);g}
MickyT

나는 왜 당신의 "ungolfed"버전이있는 지 약간 의아해합니다 return. returnR의 언어는 다른 언어와 동일하지 않으며 조기 중단을 수행합니다. 사용하지 않는 return것은 관용적입니다. 다른 한편으로, 당신의 ungolfed 버전은 여전히 ​​골프를 가지고 if있습니다.
Konrad Rudolph

@KonradRudolph 골프 if는 게으름 이었지만 return가독성을위한 것 return입니다.
BLT

@BLT 흠. 나는 R이 무의미 return 하면 가독성을 떨어 뜨린다 는 것을 강하게 느낀다. 왜냐하면 그것이 잘못된 것을 신호하고 (초기 출구) 화물 컬트 프로그래밍 의 사례이다 .
Konrad Rudolph

쿨, 나는 새로운 것을 다시 배웠다. 그것이 내가 계속 돌아 오는 한 가지 이유입니다. 감사합니다 @KonradRudolph, 또한이 스택 오버플로 질문은 흥미 롭습니다 : stackoverflow.com/questions/11738823/…
BLT

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.