거의 Lisp입니다!


14

도전

당신의 도전은 리스프와 같은 언어를위한 통역사를 디자인하는 것입니다. GLisp . GLisp 의 프로그램 코드 는 다음과 같은 형식으로 대괄호로 표시되는 임의의 양의 중첩 표현식으로 구성됩니다.

(func arg1 arg2 ...)

인터프리터는 대괄호, 함수 및 인수 앞뒤에 공백 문자를 허용해야합니다.

종류

정수, 목록, 부울 및 함수의 네 가지 유형을 구현합니다. 자체 구문을 사용하여 정수 및 부울 값을 소스 코드에 명시 적으로 삽입 할 수 있습니다. 인터프리터는 숫자 문자가 정수를 나타내는 것으로 가정해야합니다 (음수를 명시 적으로 삽입하기 위해 구문을 구현할 필요는 없습니다). 귀하의 인터프리터는 것을 가정해야 true하고 false부울 값을 지정합니다. 함수는 사용자가 명시 적으로 정의 할 수 없으며 항상 단일 값 (모든 길이의 목록이 단일 값으로 계산 됨)을 리턴합니다.

기능

다음 기능을 구현해야하며 Function , Arity 형식으로 되어 있습니다. Arity n가 더하기 부호로 진행 되면, 이는 n하나 이상의 인수 를 나타냅니다 . 달리 명시되지 않는 한 함수에 제공된 모든 인수는 동일한 유형이라고 가정 할 수 있습니다. certian 유형에 대해 동작이 지정되지 않은 경우 해당 함수의 인수가 해당 유형의 인수가 아니라고 가정 할 수 있습니다. 인수는 다음 다이어그램에서 언급됩니다.

(func argument1 argument2 ... argumentn)

  • + , 2+

    • 모든 인수가 Integer 유형 인 경우 인수의 합계를 리턴해야합니다.
    • 모든 인수가 List 유형 인 경우 인수의 연결을 오름차순 ( arg1+arg2+ ...) 으로 리턴해야합니다.
    • 모든 인수가 Boolean 유형 인 경우 논리적 인 모든 인수 시퀀스를 리턴해야합니다.
    • (+ 1 2 3 4 5) -> 15
    • (+ (list 1 2) (list 3 4)) -> (list 1 2 3 4)
    • (+ true true true) -> true
  • - , 2+

    • 모든 인수가 Integer 유형 인 경우 인수의 차이 ( arg1-arg2- ...)를 리턴해야합니다.
    • 모든 인수가 Boolean 유형 인 경우 논리 인수의 모든 인수 를 리턴해야합니다.
    • (- 8 4 3) -> 1
    • (- 0 123) -> -123
    • (- true false false true false) -> true
  • * , 2+

    • 모든 인수가 Integer 유형 인 경우 인수의 곱을 리턴해야합니다
    • 하나의 인수가 List 유형 이고 다른 하나의 인수가 Integer 유형 인 경우 (주어진 인수 만 가정 할 수 있음) 반복 된 항목으로 항목과 함께 새 List 를 리턴해야합니다 .arg1arg2
    • (* 1 2 3 4 5) -> 120
    • (* (list 1 2 3) 2) -> (list 1 2 3 1 2 3)
  • / , 2+

    • 모든 인수가 Integer 유형 인 경우 인수의 몫을 리턴해야합니다 ( arg/arg2/ ...) (분할이 순차적으로 수행되고 모든 단계에서 소수 부분이 잘 린다고 가정 할 수 있음)
    • 하나의 인수가 List 유형 이고 다른 인수가 Function 유형 인 경우 모든 값에 대해 맵핑 된 후 결과 List를 리턴해야합니다.arg2
    • (/ 100 10 3) -> 3
    • (/ (list 1 2 3) inc) -> (list 2 3 4)
  • % , 2

    • 모든 인수가 Integer 유형 인 경우 인수의 계수를 리턴해야합니다.
    • (% 4 2) -> 0
  • = , 2+

    • 만약 모든 인수의 유형과 값이 같은, 당신은 진정한 반환해야합니다. 그렇지 않으면 false를 반환하십시오.
    • (= 0 0 0) -> true
    • (= 0 false (list)) -> false
  • list , 0+

    • 유형에 관계없이 모든 인수 목록을 리턴해야합니다. 인수가 없으면 빈 목록을 반환해야합니다.
    • (list 3 4 (list 5)) -> (list 3 4 (list 5))
  • inc , 1

    • 인수가 유형 인 경우 Integer 1 씩 증가한 Integer 를 리턴해야합니다.
    • 인수가 List 유형 인 경우 시계 방향으로 한 번 회전 한 List를 단일 회전으로 반환해야합니다.
    • (inc 1) -> 2
    • (inc (list 1 2 3)) -> (list 3 1 2)
  • 12 월 1 일

    • 인수가 정수 유형 인 경우 1 씩 감소한 정수 를 리턴해야합니다.
    • 인수가 List 유형 인 경우 시계 반대 방향으로 회전 한 List를 단일 회전으로 반환해야합니다.
    • (dec 1) -> 0
    • (dec (list 1 2 3)) -> (list 2 3 1)
  • 만약 3

    • 모든 유형의 인수가 세 개인 경우 :의 arg1true 값 이 true이면 return arg2, 그렇지 않으면 returnarg3
    • (if (not (list 1)) 8 false) -> false
  • 아니 , 1

    • 임의의 유형의 인수가 제공되면 true 값 arg1이 False이면 return true, 그렇지 않으면 return false.
    • (not (list)) -> true
  • , 1

    • 형의 인수 주어진 경우 목록 의 길이를 반환arg1
    • (len (list 4 2 true (list 3) (list))) -> 5

진리표 : 0, (list), false -> false여기서 (list)빈 목록을 나타냅니다. 다른 모든 것입니다 true.

인터프리터는 stdin 또는 파일에서 소스 입력을 읽는 전체 프로그램이거나 소스를 문자열로 가져 와서 출력 값을 반환하는 함수일 수 있습니다.

전자를 선택하는 경우 정수 의 출력 은 단순히 숫자이고 부울true또는의 경우 false, 목록은 공백으로 구분 된 값의 대괄호로 묶인 일련의 값입니다 (예 : (1 2 3 4 (5 6 7))표시 (list 1 2 3 4 (list 5 6 7))).

후자를 선택하는 경우 구현 언어의 해당 유형으로, 또는 유사한 유형이없는 경우 사용자 정의 유형으로 값을 리턴해야합니다. 목록은 언어가없는 경우 배열 또는 벡터로 반환 할 수 있습니다 목록 유형을, 부울는 언어 부울 유형 또는 언어를 지원하지 않는 경우 사용자 정의 형식으로 반환해야합니다.

테스트 사례

(list 1 2 3 (list 4 5 true))  -> (1 2 3 (4 5 true))
(/ 4000 (+ 1 2 3 4 (* 5 8)))  -> 80
(+ (not (- (len (list 5 6 7)) (/ 10 3))) true)  -> true
(if (           len (list )  ) 4 (if    (+ (= 8 8    8) (not (list 4))) 8 5))  -> 5

설명

  • 통역사는 선택한 방식으로 유효하지 않은 입력을 처리 할 수 ​​있지만 예외를 발생 시키지 않아야합니다 (오류 메시지를 인쇄하고 부드럽게 종료 될 수 있음)
  • 함수는 항상 왼쪽에서 오른쪽으로 인수를 평가합니다
  • 유효하지 않은 입력은 구문 상 올바르지 않은 입력입니다. 여기에는 불일치 한 대괄호, 0으로 나누기 및 부분적으로 적용되는 기능이 포함되지만 이에 국한되지는 않습니다 (보너스 제외)
  • 의 경우 =, 값이 다르거 유형이 다른 경우false

보너스

  • 부분적으로 적용된 기능을 지원하는 경우 * 0.8을 기록 하십시오. 예를 들어, ((+ 2) 3)같은 것 (+ 2 3),하지만 같은 것들을 할 수 있습니다 (/ (list 1 2 3) (+ 2)). 함수가 최소 인수 수보다 적은 수의 함수를 수신하면 부분적으로 적용되었다고 가정 할 수 있습니다.
  • 인수 if가 반환되지 않는 한 적용된 인수를 평가하지 않으면 점수 * 0.85

이것은 코드 골프이므로 바이트 수가 가장 적은 인터프리터가 승리합니다!


어떻게 해석 (if (not (array 1)) 8 false) -> false합니까?
feersum

@feersum 좋은 캐치, 8이어야합니다.
globby

1
우리는 어떻게 평가해야 (+ 3 (if false 5))합니까? 일반적으로 "무언가를 돌려주는 것"은 무엇입니까? 재조정 할 단위 유형을 지정하지 않았습니다
자랑스러운 Haskeller

3
1. (+ bool bool...)논리 AND와 (- bool bool...)논리 OR 이 다른 이유는 무엇 입니까? 표준 링 표기법은 +OR 및 *AND에 사용됩니다. 2. "유효하지 않은 입력" (/ 2 0)은 구문 적으로 올바른 경우를 다루기위한 것 입니까? 에 대해 =, 값이 모두 같지 않으면 false?를 반환해야 합니까? 4. 정의는 not거꾸로 나타납니다. 5. 토큰은 무엇입니까? 인터프리터는 여분의 공백을 처리해야하지만 어떤 공백을 사용할 수 있는지 말하지 않습니다. 이와 같은 복잡한 질문의 경우 사양을 확인할 수 있도록 샌드 박스를 사용해야합니다.
피터 테일러

1
부분 응용 프로그램의 작동 방식이 확실하지 않습니다. ((+ 2 3) 4)9거나 오류입니까? 특히 var-arg 함수의 경우 언제 응용 프로그램을 부분적으로 고려해야하는지 명확하지 않습니다. 그것은 같은 것들로도 muddier를 얻을 수((if true (+ 2 3) (- 5)) 4)
MtnViewMark

답변:


6

하스켈, 1370 1263 1179 1128 1163 1107 1084 바이트 * 0.8 * 0.85 = 737.12

import Text.Parsec
data V=I Int|L[V]|T|F|P[V]|X|A|S|M|D|U|E|Q|J|K|C|N|W deriving Eq
m Q=0;m C=3;m f|f`elem`[J,K,N,W]=1;m _=2
l=length
x v=[n|I n<-v]
y v=[l|L l<-v]
z v=[0<1|T<-v]++[1<0|F<-v]
(&)f=l.f>>=(.l).(==)
b a|a=T|0<1=F
s(I n)=show n
s(L v)='(':tail(v>>=(' ':).s)++")"
s T=d!!0;s F=d!!1;s _="error"
i(L v)=e$i%v
i v=v
e(P v:a)=e$v++a
e(f:a)|m f>l a=P(f:a)
e(A:a)|x&a=I$sum$x a|y&a=L$concat$y a|z&a=b$and$z a
e(S:a)|x&a=I$f$x a|z&a=b$or$z a
e(M:a)|x&a=I$product$x a
e[M,v,I n]=e$A:replicate n v
e(D:a)|x&a=I$v$x a
e[D,L v,f]=L$map(\a->e[f,a])v
e[U,I a,I b]=I$a`mod`b
e(E:a:v)=b$all(==a)v
e(Q:a)=L a
e[J,I a]=I$a+1
e[J,L[]]=L[]
e[J,L v]=L$last v:init v
e[K,I a]=I$a-1
e[K,L v]=L$drop 1 v++take 1 v
e[C,a,b,c]|a`elem`[I 0,L[],F]=c|0<1=b
e[N,a]=e[C,a,F,T]
e[W,L v]=I$l v
e _=X
f(a:b)=a-sum b
v(a:b)=foldl div a b
(%)f=fmap f
p=k$choice$try%([(I .read)%many1 digit,L%between(w"(")(k$w")")(many$try p)]++zipWith((.return).(>>).w)d[T,F,A,S,M,D,U,E,Q,J,K,C,N,W])
k=(spaces>>)
w=string
d=words"true false + - * / % = list inc dec if not len"
g=either show(s.i).parse p""
main=interact g

전체 프로그램, 읽기 stdin및 쓰기 stdout. g함수 버전이기도합니다.

의 부분 함수와 지연 평가를 모두 구현합니다 if.

기능 버전의 샘플 실행 :

λ: g "(list 1 2 3 (list 4 5 true))"
(1 2 3 (4 5 true))

λ: g "(/ 4000 (+ 1 2 3 4 (* 5 8)))"
80

λ: g "(+ (not (- (len (list 5 6 7)) (/ 10 3))) true)"
true

λ: g "(if (           len (list )  ) 4 (if    (+ (= 8 8    8) (not (list 4))) 8 5))"
5

λ: g "(if false (/ 1 0) 5)"
5

λ: g "((+ 2) 3)"
5

λ: g "(/ (list 1 2 3) (+ 2))"
(3 4 5)

이제 설명에서 모든 단위 테스트가 있습니다.

λ: runTests 
passed: g "(+ 1 2 3 4 5)" ==> 15
passed: g "(+ (list 1 2) (list 3 4))" ==> (1 2 3 4)
passed: g "(+ true true true)" ==> true
passed: g "(- 8 4 3)" ==> 1
passed: g "(- 0 123)" ==> -123
passed: g "(- true false false true false)" ==> true
passed: g "(* 1 2 3 4 5)" ==> 120
passed: g "(* (list 1 2 3) 2)" ==> (1 2 3 1 2 3)
passed: g "(/ 100 10 3)" ==> 3
passed: g "(/ (list 1 2 3) inc)" ==> (2 3 4)
passed: g "(% 4 2)" ==> 0
passed: g "(= 0 0 0)" ==> true
passed: g "(= 0 false (list))" ==> false
passed: g "(list 3 4 (list 5))" ==> (3 4 (5))
passed: g "(inc 1)" ==> 2
passed: g "(inc (list 1 2 3))" ==> (3 1 2)
passed: g "(dec 1)" ==> 0
passed: g "(dec (list 1 2 3))" ==> (2 3 1)
passed: g "(if (not (list 1)) 8 9)" ==> 9
passed: g "(not (list))" ==> true
passed: g "(len (list 4 2 true (list 3) (list)))" ==> 5
passed: g "(list 1 2 3 (list 4 5 true))" ==> (1 2 3 (4 5 true))
passed: g "(/ 4000 (+ 1 2 3 4 (* 5 8)))" ==> 80
passed: g "(+ (not (- (len (list 5 6 7)) (/ 10 3))) true)" ==> true
passed: g "(if (           len (list )  ) 4 (if    (+ (= 8 8    8) (not (list 4))) 8 5))" ==> 5
passed: g "(if false (/ 1 0) 5)" ==> 5
passed: g "((+ 2) 3)" ==> 5
passed: g "(/ (list 1 2 3) (+ 2))" ==> (3 4 5)

b e[K,L _]당신이 drop 1 안전한 버전으로 tail사용 take하고 head다음 두 가지 정의에 e[K,L _]
합의

당신은 기능을 사용할 수 있습니다 notElem당신이 할 수 있습니다 .another 팁을 s=string대신 모두의 사용 stringchar( s"C"char 'C'). 또 다른 팁 : ifs 대신 가드 사용
자랑스런 Haskeller

내가 생각한 또 다른 것 : Maybe목록으로 값을 인코딩 할 수 있습니다 . Nothing이다 []하고 Just x있다 [x]. 이 긴 생성자를 제거 얻고 좀 더 기능을 추가 if p then Just x else Nothing하다 [x|p], (==Nothing)이다 null,리스트 모나드는 아마 등 모나드와 같은된다.
자랑스런 Haskeller

@proudhaskeller 감사합니다, 모두 적용되었습니다!
MtnViewMark

4

파이썬 2, 1417 * 0.8 * 0.85 = 963.56

from operator import*
A=type;K="list"
def E():print"E";exit()
def R(G):
 len(G)or E();T=G.pop(0);L=[]
 if"("==T:
  G or E()
  while")"!=G[0]:L+=[R(G)];G or E()
  G.pop(0);return L
 if")"==T:E()
 try:
  x=eval(T.title())
  if Q(x)<2:return x
  E()
 except:return T
H="+ - * / = % if inc dec not len"
Z=lambda y:lambda x:reduce(y,x)
D=dict(zip(H.split(),[[sum,any,0,lambda x:sum((y[1:]for y in x),[K])],[Z(sub)],[Z(mul),all,0,lambda x:x[0][:1]+x[0][1:]*x[1]],[Z(div),lambda x:[K]+map(lambda z:S([x[1],z]if Q(x[1])==2else x[1]+[z]),x[0][1:])],[lambda x:len(set(map(str,x)))<2]*6,[lambda x:x[0]%x[1]],[lambda x:S(x[2])if S(x[0])in[0,[K]]else S(x[1])]*6,[lambda x:x[0]+1,0,0,lambda x:x[0][:1]+x[0][-1:]+x[0][1:-1]],[lambda x:x[0]-1,0,0,lambda x:x[0][:1]+x[0][2:]+[x[0][1]]],[lambda x:x[0]in[0,[K]]]*6,[0]*3+[lambda x:len(x)-1]]))
H=H[:15]+H+" if"
def Q(x):
 t=A(x);w=int,bool,str
 if t in w:return w.index(t)
 if t==list and x:return 5-(2*(x[0]==K)+(str==A(x[0])and len(x)<H.count(x[0])+1))
 E()
def S(G):
 if Q(G)<2:return G
 G or E();c=G[0];r=G[1:];c==K or r or E()
 if c!="if":r=[x if Q(x)in{2,4}else S(x)for x in r]
 if c==K:return[c]+r
 k=map(Q,r);m=min(k);M=max(k);v=[m,[-1,3][{m,M}=={4,5}]][m!=M]
 try:return D[c][v](r)
 except:E()
def C(x):return"(%s)"%" ".join(map(C,x))if A(x)==list else str(x).lower()
def I(G):
 for c in"+-*/%=()":G=G.replace(c," %s "%c)
 return C(S(R(G.strip().split())))
print I(raw_input())

전체 점검. 이전 버전을 보려면 편집 기록을 확인하십시오 .

골프를 더 많이해야합니다. 나는 천천히 노력하고 있습니다.

zlib / base64를 사용하면 1093 * 0.8 * 0.85 = 743.24가됩니다 .

import base64,zlib
exec zlib.decompress(base64.b64decode("eJx9VE1P4zAQvedXGEuV7MbttgX2kOADAtSugANbTljWKqSuNku+5Lg0BfHfd8ZJCwjt9tLpdN6bmTczXtuqIFVtbOIqS7KirqwbBufS7WoTX0uaZ42jwcqsyRXjUW2z0tErGps2c4x7/08251FAclOCARwQF9/L+biuajbh8Y1UOiDZmjIq5T0EkjnposDc/s5yQzk9knM10dFNKBXS6fhDzIHJGrexJbnxbNyz+Qhnd0jbSvOc5Ox+7DKXG8YRm63JHWv52SzqwS04Pci0qand3n0fLCQNyYgMyTciyQCBWZmSlUlJWTlsjgYPMk+Kx1VCdlFvtIBfbVLDdqLlwaVcZaljL1nNFuOmzlEhoVSzKURS7sREHFDgYmynppFeQ5s7SEVaCL3WXAv1wJrNY2cUm5yLJM8/YlsQSkVTHXoDKIatmmofvsqe+Xsg0IVFUrPe8RItmcJQ8aI7WcDmUs5M3hiCP0L1ornY02IFBy4cbmMcQ77GWeiWg6h6+P1DDAIHfS0H5xLSzDSHhGhNwCrVBDvVPu2yq+IrUTiFnv/Z9Qjq2/c/+pwQvaP/gmeAVR1Yf4EeyvMlTfTwOPysQssxISzXQi6A81SHi5DiQvpbwGWDXXTyHIx4K+FaxGNV5QJEw7UlDme93a/ddpyVK9Myx7s/pcRzI0m58qvlY05HbDb02kl5zUOUXyI9iomBXVFni3FabUrX+cMpbv9Vf6DL7kD90OcfbmEeHE4xTv0Bxha+QFv4Ka/xL3s4Q0CnR5JCo5GVqt1fVla+zsTJ236YHPe5xR6t7jBA1OdTqQ5BhCeJS3QnLI8LWWQle+LxLfhaNJ6lKgSMVxxr9VqI2zcpX0/E6ZvWqjiSt7o79r7+S2BUz5rZ93Pet3yBc+jCKBs0nA4ooeM/FaTD7Be4wFAdTqnX3HcA2oJnnFdbY3umH5142FcKfdFwNPw2kIzTaA5vnDV1nsD9p4KSQUPoIIVa+vIu2JLBYzYGUngR+P5FgE/gn1Ggtsn2V1bWG3T/BUW+qRU="))

참고 : 내 점수가 올라가는 것을 볼 경우 아마 몇 가지 버그를 발견했기 때문일 수 있습니다


코드 골프보다 코드 챌린지가 더 많지만 여전히 4872 * 0.8 = 3897,6
Def

3

공통 리스프, 868 바이트 * 0.85 = 737.8

Lisp로 Lisp를 구현하는 것이 부정적입니까? 여전히 여기에서 최적화해야 할 것이 많습니다.

(SETF (READTABLE-CASE *READTABLE*) :PRESERVE)(PRINC(LABELS((B(X)(FIND X'(true false)))(R(X)(IF X'true'false))(V(X)(MEMBER X'(0()false)))(A(&REST X)(R(NOTANY #'V X)))(O(&REST X)(R(NOTEVERY #'V X)))(E(X &KEY N)(IF(LISTP X)(ECASE(FIRST X)(+(APPLY(IF(EVERY'NUMBERP #1=(MAPCAR(IF N #'IDENTITY #'E)(CDR X)))'+(IF(EVERY'LISTP #1#)'APPEND #'A))#1#))(-(APPLY(IF(EVERY'NUMBERP #1#)'- #'O)#1#))(*(IF(LISTP #2=(CAR #1#))(LOOP FOR I TO(1-(CADR #1#))APPEND #2#)(APPLY'* #1#)))(/(IF(LISTP #2#)(LOOP FOR I IN #2#COLLECT(E `(,(CADR #1#),I):N T))(REDUCE'FLOOR #1#)))(%(APPLY'MOD #1#))(=(R(LOOP FOR I IN(CDR #1#)ALWAYS(EQUAL I #2#))))(list #1#)(inc(IF(LISTP #2#)(APPEND(LAST #2#)(BUTLAST #2#))(1+ #2#)))(dec(IF(LISTP #2#)(APPEND(CDR #2#)`(,(FIRST #2#)))(1- #2#)))(if(IF(V(E(CADR X)))(E(CADDDR X))(E(CADDR X))))(not(R(V #2#)))(len(LENGTH #2#)))X)))(OR(IGNORE-ERRORS(OR(E(READ))"()")):E))

입력에 오류가있는 경우 E를 인쇄합니다. 샘플 실행 :

$ sbcl --script glisp.lisp
(list 1 2 3 (list 4 5 true))
(1 2 3 (4 5 true))

$ sbcl --script glisp.lisp
(/ 4000 (+ 1 2 3 4 (* 5 8)))
80

$ sbcl --script glisp.lisp
(+ (not (- (len (list 5 6 7)) (/ 10 3))) true)
true

$ sbcl --script glisp.lisp
(if (           len (list )  ) 4 (if    (+ (= 8 8    8) (not (list 4))) 8 5))
5

$ sbcl --script glisp.lisp
(this is an error)
E

$ sbcl --script glisp.lisp
(if (% 4 2) (this is an error) 42)
42

2
그것이 일종의 평가 함수가 아닌 한 ...
Def

2

하스켈, 972

r=fst.f
f('(':s)|(f:a,b)<-g s=(f%filter(/="")a,b)
f s=span(`notElem`" ()")s
j=dropWhile(==' ')
g""=([],"")
g s|')':l<-r=([x],l)|(y,t)<-g$j r=(x:y,t)where(x,r)=f$j s
"%"%c=show$foldr(mod.read)(maxBound::Int)c
"+"%c|t(c!!0)<1="(list "++tail(c>>=(' ':).drop 6.init)++")"|t(c!!0)<2=show$sum$map read c|0<1=i$all((=='t').head)c
"-"%c|t(c!!0)<2=show$foldl1(-)$map read c|0<1=i$any((=='t').head)c
"*"%c=fst$f$"(+ "++unwords([1..read$last c]>>init c)++")"
"="%c=i$all(==c!!0)c
"/"%c|t(c!!0)<1,[a,b]<-c="list"%map(\x->b%[x])(fst$g$drop 6 a)|0<1=show$foldl1 div$map read c
"if"%[p,a,b]|elem p["0","()","false"]=b|0<1=a
"list"%c="(list "++unwords c++")"
"len"%[c]=show$length(words c)-1
"inc"%[c]|t c>0=show$read c+1|([],_)<-g$drop 6 c="(list)"|(x,_)<-g$drop 6 c="list"%(last x:init x)
"dec"%[c]|t c<1,(x,_)<-g$drop 6 c="list"%(drop 1 x++take 1 x)|0<1=show$read c-1
"not"%[c]="if"%[c,"false","true"]
s%c="?"
i p|p="true"|0<1="false"
t('(':_)=0
t(c:s)|c<':',c>'/'=1|elem c"th"=2
t _=3

꽤 해키 솔루션입니다. 여기에는 모든 것이 출력 가능 형식으로 문자열로 저장됩니다. 유형은 0..9숫자, (목록,t 또는f 부울 및 함수에 대한 모든 .

실행하려면 r기능을 사용하십시오 .

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