피보나치 수열의 n번째 항을 구하는 코드입니다.

~[0 1]\{\.{+}*+-2>\1-.}do;0=

…죄송합니다.
언어는 Golfscript라는 언어입니다.

1 Like

코드 설명 좀 해주세요. 어떻게 저렇게 코드가 짧은가요??

코드 설명 좀 해주세요. 어떻게 저렇게 코드가 짧은가요?? 2

코드 설명 좀 해주세요. 어떻게 저렇게 코드가 짧은가요?? 3

@LeeMB @devaux @patchouli_knowledge

~ : 필요 없습니다. 백준 인터프리터 문제로 넣은 건데, 기능은 bit not입니다.
[0 1] : 리스트입니다.
\ : 현재 스택에는 인풋으로 넣은 n과 [0 1]이 들어 있습니다. 그 순서를 바꿔 n을 맨 위로 올립니다.
{\.{+}*+-2>\1-.}do 반복문입니다. 상세하게 설명을 하자면
  \ : [0 1] n -> n [0 1]
  . : n [0 1] -> n [0 1] [0 1]
  {+}* :  fold 연산입니다. 스택의 맨 위에 있는 [0 1]에 적용되어 1이 됩니다.
  + :  두 리스트를 하나로 합칩니다. 스택 상태는 n [0 1 1]입니다.
  -2> : 뒤에서부터 두번째까지만 취합니다. 스택 상태는 n [1 1]
  \ : n [1 1] -> [1 1] n
  1- : [1 1] n -> [1 1] n-1
  . : [1 1] n-1 -> [1 1] n-1 n-1
  do의 정의에 따라 스택의 맨 위에 있는 n-1이 pop되며, 이게 0일 때까지 반복합니다.
; : 맨 위에 있는 n-1을 pop합니다. 스택 상태는 [fib(n) fib(n+1)]입니다.
0= : 0번째 인덱스를 취합니다. 이렇게 fib(n)을 구할 수 있습니다.

Golfscript는 후위표기법을 택하고 있으며, 모든 연산을 스택 기반으로 하는 언어입니다. 이점 참고해주시기 바라며, Golfscript 공식 홈페이지는 GolfScript 입니다.

2 Likes

n=0일 경우에는 작동하지 않는 코드지만, 백준 문제에서 입력 범위가 자연수라서 그냥 나뒀습니다.

변태같은 언어네요. 브레인퍽은 정상이었어…

전 다른 난해한 프로그래밍 언어에 비하면 상당히 직관적인 언어라고 생각합니다.
fold, map 같은 고차함수들도 지원되고요. 머릿속에 스택을 넣고 다니는 사람이 아니더라도 익숙해지기만 하면 코드 이해하기가 그렇게 어려운 것도 아닙니다.

백준에서 저런 언어도 지원하나보네욬ㅋㅋㅋ

네. 워낙 숏코딩 변태들이 많아서 ㅎㅎ
근데 위에 ~ 문제에서 나타나듯이 처참합니다.

그리고 Brainfuck과 아희도 지원하는 백준이니 이 정도쯤이야 이상할 것 없지요.

int f(int p){return p<3?1:f(p-1)+f(p-2);}

C는 롱코딩 언어군요. 함수만 짜도 벌써ㅠㅠ

rigid const f64 s = std::sqrt( 5. );
rigid const f64 p = ( s + 1. ) / 2.;

rigid auto fib( int n ) 
{
    return  ( std::pow( p, n + 1. ) - std::pow( 1. - p, n + 1. ) ) / s;
}

금방 터지지만 재미로 올려봄

2 Likes
i64 fib( i64 n )
{
	if( !n ) return  0;
	i64 fn = 0, fo = 1;
	for( int order = 1 << __builtin_clzll( n ) - 1; order ; order >>= 1 )
    {
	    i64 t   = 2 * fn * fo - fn * fn;
	    fo      = fn * fn + fo * fo;
	    if( n & order )
	        fn = fo, fo += t;
	    else
	        fn = t;
    }
    return  fn;
}

O( log N ) 자작해봄요~

1 Like

@codesafer 흑마법은 금지입니다.

여기서 builtin 은 그닥 하는일 없다능. 고작 몇 클럭이 아까워서 쓴 것 뿐.

@codesafer 공부하러 갑니당

~0 1@{.@+}*;
업데이트했습니다.
실수로 익명모드 계정으로 답글 달았네요

$b=1;eval'($_,$b)=($b,$_+$b);'x<>;print

펄입니다. 39bytes
여기에 코드를 붙여넣거나 입력하세요

#include<stdio.h>
int f(int n){
	if(n!=1&&n!=2){
		return f(n-1)+f(n-2);
	}
	return 1;
}
int main(int n){
	scanf("%d",&n);
	printf("%d",f(n));
}

C로 한번 풀어봤습니다…
이게 최선;;