XKCD 유형에 맞는 인터페이스 만들기


34

colors.rgb ( "blue")는 "# 0000FF"를 생성합니다. colors.rgb ( "황 청색")은 NaN을 생성합니다. colors.sort ()는 "무지개"를 생성합니다

이미지와 제목 텍스트 (여기에 인용)에 명시된 규칙을 사용하여 주어진 모든 입력을 허용하고 적절한 출력을 표시하는 프로그램을 작성하십시오.

  • 입력은 stdin 또는 가장 가까운 해당 항목으로 가져올 수 있습니다. [n]>입력 할 줄과 같은 줄이 있어야하며 n각 명령마다 1 씩 증가합니다. 1에서 시작해야합니다.

  • 결과는 stdout 또는 가장 가까운 해당 항목을 사용하여 표시되어야합니다. =>각 출력 줄에 있어야합니다 .

13 개의 조건과 제목에 인용 된 3 개의 조건이 모두 작동해야합니다.

이것은 코드 골프이므로 최단 답변이 이깁니다.


16
인터페이스는 얼마나 일반적이어야합니까? 예를 들어, 플로어 함수는 제공된 플로트에 대해 작동해야 10.5합니까, 아니면 전달 될 것이라고 가정 할 수 있습니까?
ankh-morpork

1
n이 커지고 입력이 오른쪽으로 더 멀리 이동함에 따라 출력의>가 입력의>와 정렬되어 있습니까?
Sparr

1
이 만화는 여러 가지 방법으로 해석 될 수 있습니다. 구현해야하는 특정 유형 및 작업 목록을 제공 할 수 있습니까?
BrainSteel

5
n1 씩 증가 해야 합니까? 그것은 만화가하는 일이 아니다 ... ;-)
복원 Monica Monica

3
@WolframH 그것은-그러나 그는 명령 11에서 2 = 4를 만들었으므로 14가 아닌 14를 표시합니다.
Tim

답변:


21

파이썬 3, 700 698 697 689 683 639 611

들여 쓰기로 탭합니다.

from ast import*
E=literal_eval
O='=>%s\n'
P=print
I=int
def Q(a):P(O%a)
def W(a):Q('"%s"'%str(a))
def gb(a):W(_ if'y'in a else'#0000FF')
def t():W('rainbow')
def FLOOR(n):P(O%'|'*3+(O%'|{:_^10}').format(n))
def RANGE(*a):Q([('"','!',' ','!','"'),(1,4,3,4,5)][len(a)])
c=0
while 1:
    try:
        c+=1;A,*B=input('[%d]>'%c).split('+')
        if not A:W(c+I(B[0]))
        elif A=='""':Q("'\"+\"'")
        elif B:
            A=E(A);B=E(B[0])
            if A==B:Q('DONE')
            elif type(A)==list:Q(A[-1]==B-1)
            elif type(B)==list:W([I(A)])
            else:W(A+I(B))
        else:eval(A.lstrip('colrs.'))
    except:Q('Na'+['N','P','N.%s13'%('0'*13)][('-'in A)+len(B)])

이것은 베어를 사용하기 때문에 Ctrl-C 할 수는 없습니다. Ctrl-Z 및 % % 작동 중지

일부 조건은 일반화되고 다른 조건은 정확한 입력으로 만 작동합니다.

  1. A+"B" 언제뿐만 아니라 모든 A 및 B와 함께 작동합니다 A == B
  2. "A"+[] int로 변환 할 수있는 모든 A에서 작동합니다 (16 진수 및 이진 문자열을 포함합니다 (예 : 0xff 및 0b01010))
  3. (A/0)DivideByZeroError제외하고 처리되는 모든 A, Eval 원인에 대해 작동합니다.
  4. (A/0)+BA 또는 B와 함께 작동합니다. literal_eval(E) 오류가 발생합니다.
  5. ""+""+ 부호에 대해서만 작동합니다. 다른 것은 NaN, NaP 또는 NaN.00을 인쇄합니다 ...
  6. [A, B, C]+DD == C+1목록의 길이와 숫자에 상관없이 작동하는지 확인하여 작동합니다.
  7. ^^
  8. 2/(2-(3/2+1/2))그 파싱 실패 뭐든지 갖는다 -로모그래퍼 +가 출력 NaN.000 ... 13 것 후 어딘가
  9. RANGE(" ") 하드 코드
  10. +A A. Ouputs에서 작동합니다 "current_line_number+A"
  11. A+A 그들이 같고 bulitin python 유형이라면 모든 A에서 작동합니다.
  12. RANGE(1,5) 하드 코딩되었습니다.
  13. FLOOR(A) 모든 A에서 작동합니다.
  14. colors.rgb("blue")eval의 lstrip은 gb("blue")하드 코딩 된 응답 이있는 이것을 전환합니다 .
  15. colors.rgb("yellowish blue")eval의 lstrip 은 인수에 존재하는 gb("yellowish blue")경우 존재하지 않는 변수를 사용하려고 시도 y하여 예외가 NaN으로 바뀌는 오류를 발생시킵니다.
  16. colors.sort()lstrip은 이것을 t()하드 코딩 된 응답이있는 것으로 바꿉니다 .

Brainsteel은 규칙 10에 대한 가정에서 오류를 지적했습니다.


매우 깔끔합니다. # 10에서, "+ A"는 단지 1을 앞에
붙이기

아, 그렇습니다. 이제 지적되었습니다. 그것은 int가 단일 문자 기능으로 더 좋을 것임을 의미합니다. 한두 바이트를 절약 할 수 있습니다.
Daniel Wakefield

re # 9 : RANGE(" ")는 큰 따옴표 문자 \ x22에서 공백 문자 \ x20까지의 문자 범위입니다.
John Dvorak

3
점프를 다시 : 랜달 설정 때문 2으로 4라인 (11)에, 2는 이제 4, 12이 또한, 행 번호 적용 이제 14이다.
John Dvorak

2
들여 쓰기에 공백, 탭 및 탭 + 공백을 사용하여 일부 바이트를 저장할 수 있습니다.
Tyilo

16

파이썬, 1110 바이트

연산자 오버로딩은 악하지 않습니다.

from re import*
class V(str):
 def __add__(s,r):return s[:-1]+chr(ord(s[-1])+r)
class S(str):
 def __str__(s):return "'"+s+"'"if '"'in s else'"'+s+'"'
 def __repr__(s):return str(s)
 def __add__(s,r):s=str(s)[1:-1];return S('['+s+']'if type(r)==L else '"+"' if(s,r)==('','')else s+r)
class I(int):
 def __add__(s,r):return type(r)(int(s)+int(r))if s!=r else V('DONE')
 def __div__(s,r):return N if r==0 else int(s)/int(r)
 def __pos__(s):return s+c*10
 def __mul__(s,r):return V('NaN.'+'0'*13+'13')if r==1 else int(s)*int(r)
class L(list):
 def __add__(s,r):return V(str(r==s[-1]+1).upper())
def RANGE(a,b=0):return 2*(a,S(chr(ord(a)+1)))if b==0 else tuple([a]+[b-1,a+2]*((b-a)/4)+[b-1,b])
def FLOOR(n):return V('|\n|\n|\n|___%s___'%n)
def colorsrgb(c):
 m={'blue':V('#0000FF')}
 return m.get(c,N)
def colorssort():return V('rainbow')
N=V('NaN')
c=1
while True:
 try:l=raw_input('[%d] >'%c)
 except:break
 l=sub(r'(?<!"|\.)(\d+)(?!\.|\d)',r'I(\1)',l)
 l=sub(r'"(.*?)"',r'S("\1")',l)
 l=sub(r'\[(.*?)\]',r'L([\1])',l)
 l=sub(r'/\(','*(',l)
 l=sub('s\.','s',l)
 for x in str(eval(l)).split('\n'):print ' =',x
 c+=1

내 목표는 가능한 한 일반적인 것으로 만드는 것만 큼 (당연히) 승리하지 못했습니다. 하드 코딩이 거의 없습니다. 같은 물건을 시도 RANGE(10), 9*1그리고 RANGE("A"), (2/0)+14그리고 "123"재미있는 결과!

샘플 세션은 다음과 같습니다.

ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >1+1
 = DONE
[2] >2+"2"
 = "4"
[3] >"2"+2
Traceback (most recent call last):
  File "xktp.py", line 31, in <module>
    for x in str(eval(l)).split('\n'):print ' =',x
  File "<string>", line 1, in <module>
  File "xktp.py", line 7, in __add__
    def __add__(s,r):s=str(s)[1:-1];return S('['+s+']'if type(r)==L else '"+"' if(s,r)==('','')else s+r)
TypeError: cannot concatenate 'str' and 'I' objects
ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >ryan@DevPC-LX:~/golf/xktp$
ryan@DevPC-LX:~/golf/xktp$
ryan@DevPC-LX:~/golf/xktp$
ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >2+"2"
 = "4"
[2] >"2"+[]
 = "[2]"
[3] >"2"+[1, 2, 3]
 = "[2]"
[4] >(2/0)
 = NaN
[5] >(2/0)+2
 = NaP
[6] >(2/0)+14
 = Na\
[7] >""+""
 = '"+"'
[8] >[1,2,3]+2
 = FALSE
[9] >[1,2,3]+4
 = TRUE
[10] >[1,2,3,4,5,6,7]+9
 = FALSE
[11] >[1,2,3,4,5,6,7]+8
 = TRUE
[12] >2/(2-(3/2+1/2))
 = NaN.000000000000013
[13] >9*1
 = NaN.000000000000013
[14] >RANGE(" ")
 = (" ", "!", " ", "!")
[15] >RANGE("2")
 = ("2", "3", "2", "3")
[16] >RANGE(2)
Traceback (most recent call last):
  File "xktp.py", line 31, in <module>
    for x in str(eval(l)).split('\n'):print ' =',x
  File "<string>", line 1, in <module>
  File "xktp.py", line 15, in RANGE
    def RANGE(a,b=0):return 2*(a,S(chr(ord(a)+1)))if b==0 else tuple([a]+[b-1,a+2]*((b-a)/4)+[b-1,b])
TypeError: ord() expected string of length 1, but I found
ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >ryan@DevPC-LX:~/golf/xktp$ # oops
ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >RANGE("2")
 = ("2", "3", "2", "3")
[2] >RANGE(2*1)
Traceback (most recent call last):
  File "xktp.py", line 31, in <module>
    for x in str(eval(l)).split('\n'):print ' =',x
  File "<string>", line 1, in <module>
  File "xktp.py", line 15, in RANGE
    def RANGE(a,b=0):return 2*(a,S(chr(ord(a)+1)))if b==0 else tuple([a]+[b-1,a+2]*((b-a)/4)+[b-1,b])
TypeError: ord() expected a character, but string of length 19 found
ryan@DevPC-LX:~/golf/xktp$ python xktp.py # oops again
[1] >RANGE(1,20)
 = (1, 19, 3, 19, 3, 19, 3, 19, 3, 19, 20)
[2] >RANGE(1,5)
 = (1, 4, 3, 4, 5)
[3] >RANGE(10,20)
 = (10, 19, 12, 19, 12, 19, 20)
[4] >RANGE(10,200)
 = (10, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 12, 199, 200)
[5] >+2
 = 52
[6] >+"99"
Traceback (most recent call last):
  File "xktp.py", line 31, in <module>
    for x in str(eval(l)).split('\n'):print ' =',x
  File "<string>", line 1, in <module>
TypeError: bad operand type for unary +: 'S'
ryan@DevPC-LX:~/golf/xktp$ python xktp.py # oops again and again!
[1] >FLOOR(200)
 = |
 = |
 = |
 = |___200___
[2] >2+2
 = DONE
[3] >3+#
Traceback (most recent call last):
  File "xktp.py", line 31, in <module>
    for x in str(eval(l)).split('\n'):print ' =',x
  File "<string>", line 1
    I(3)+#
         ^
SyntaxError: unexpected EOF while parsing
ryan@DevPC-LX:~/golf/xktp$ python xktp.py
[1] >3+3
 = DONE
[2] >ryan@DevPC-LX:~/golf/xktp$

7

C, 412 바이트

이것은 기본적으로 하드 코딩되어 있지만 지금까지 다른 모든 답변에는 무언가가 빠져 있습니다 ...

i;char b[99];main(){for(;;){printf("[%d]>",abs(++i));gets(b);i-=b[2]==50?26:0;printf("=>");puts(*b==82?b[6]==34?"('\"',\"!\",\" \",\"!\",'\"')":"(1,4,3,4,5)":*b==70?"|\n=>|\n=>|\n=>|___10.5___":*b==43?"12":*b==91?b[8]==50?"FALSE":"TRUE":*b==34?b[1]==34?"'\"+\"'":"\"[2]\"":*b==40?b[5]==43?"NaP":"NaN":*b==99?b[7]=='s'?"rainbow":b[12]==98?"#0000FF":"NaN":b[1]==43?b[2]==34?"\"4\"":"DONE":"NaN.000000000000013");}}

산출:

[1]>2+"2"
=>"4"
[2]>"2"+[]
=>"[2]"
[3]>(2/0)
=>NaN
[4]>(2/0)+2
=>NaP
[5]>""+""
=>'"+"'
[6]>[1,2,3]+2
=>FALSE
[7]>[1,2,3]+4
=>TRUE
[8]>2/(2-(3/2+1/2))
=>NaN.000000000000013
[9]>RANGE(" ")
=>('"',"!"," ","!",'"')
[10]>+2
=>12
[11]>2+2
=>DONE
[14]>RANGE(1,5)
=>(1,4,3,4,5)
[13]>FLOOR(10.5)
=>|
=>|
=>|
=>|___10.5___

5

파이썬 3, 298

모든 것이 하드 코딩되었지만 입력은 숫자로 변환 된 다음 문자열로 변환되어이 숫자가 모두 포함 된 큰 문자열에서 찾은 다음 답이 나옵니다.

B="""53"#0000FF"~62DONE~43NaN.000000000000013~25(1,4,3,4,5)~26"rainbow"~49"4"~21"[2]"~29FALSE~15|*|*|*|___10.5___~17'"+"'~1212~60('"',"!"," ","!",'"')~24NaN~31TRUE~64NaN~76NaP"""
i=0
while 1:i+=1;s=input("[%s]>"%i);print("=>"+B[B.find(str(sum(map(ord,s))%81))+2:].split("~")[0].replace("*","\n=>"))

1

파이썬 3, 542 484 바이트

절대 하드 코딩에 대한 언급이 없으므로 여기 내 솔루션이 있습니다.

a={'2+"2"':'"4"','"2"+[]':'"[2]"',"(2/0)":"NaN","(2/0)+2":"NaP",'""+""':"'\"+\"'","[1,2,3]+2":"FALSE","[1,2,3]+4":"TRUE","2/(2-(3/2+1/2))":"NaN.000000000000013",'RANGE(" ")':'(\'"\',"!"," ","!",\'"\')',"+2":"12","2+2":"DONE","RANGE(1,5)":"(1,4,3,4,5)","FLOOR(10.5)":"|\n|\n|\n|___10.5___",'colors.rgb("blue")':'"#0000FF"','colors.rgb("yellowish blue")':"NaN","colors.sort()":'"rainbow"'}
i=1
while 1:b=a[input("[%i]>"%i).replace("\t","")].split("\n");print("=> "+"\n=> ".join(b));i+=1

하드 코딩은 괜찮지 만 기본적 으로 금지 된 허점은 기본적 으로 금지 되어 있다고 생각합니다 . : P
lirtosiast

@ThomasKwa 나는 금지 된 허점이있는 것을 보지 못했습니다. 있습니까?
Ethan Bierlein

1
모든 것이 나에게 적합 해 보입니다. 나는 "[...] 표준 허점에 대한 언급이 없다"고 말했기 때문에 허점을 이용하고 있다고 가정했다.
lirtosiast

1
나는 그것이 창조적이지만 대답은 아니라고 생각합니다. 질문은 입력과 출력에 대해 분명히 이야기합니다 : "주어진 입력을 모두 받아들이고 적절한 출력을 표시하는 프로그램을 만드십시오"
agtoever

2
두 따옴표를 모두 사용하여 많은 양을 절약 할 수 있습니다. "2+\"2\""됩니다 '2+"2"'. 카운터 변수를 추가하면 가져 오기 횟수를 제거 할 수도 있습니다.
다니엘 웨이크 필드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.