Tạo giao diện phù hợp với các loại XKCD


34

colors.rgb ("blue") mang lại "# 0000FF". colors.rgb ("màu xanh vàng") mang lại NaN. colors.sort () mang lại "cầu vồng"

Sử dụng các quy tắc được nêu trong hình ảnh và văn bản tiêu đề của nó (được trích dẫn ở đây), tạo một chương trình chấp nhận tất cả các đầu vào đã cho và hiển thị đầu ra thích hợp.

  • Đầu vào có thể được thực hiện với stdin hoặc tương đương gần nhất. Cần có một dòng giống như [n]>trên đó để gõ nó và ntăng thêm 1 mỗi lệnh. Nó sẽ bắt đầu từ 1.

  • Kết quả sẽ được hiển thị bằng thiết bị xuất chuẩn hoặc tương đương gần nhất. Cần có một =>trên mỗi dòng đầu ra.

Tất cả 13 điều kiện, cộng với 3 trong tiêu đề (trích dẫn) phải hoạt động.

Đây là mã golf, vì vậy câu trả lời ngắn nhất sẽ thắng.


16
Giao diện nên như thế nào? Ví dụ, chức năng sàn có phải hoạt động cho bất kỳ số float nào được cung cấp không hoặc chúng ta có thể cho rằng nó sẽ chỉ được thông qua 10.5không?
ankh-morpork

1
Là> cho đầu ra được căn chỉnh với> cho đầu vào, khi n tăng lên và đầu vào> di chuyển xa hơn về bên phải?
Sparr

1
Truyện tranh này có khả năng có thể được giải thích theo nhiều cách. Bạn có thể cung cấp một danh sách các loại và hoạt động cụ thể mà chúng tôi cần phải thực hiện?
BrainSteel

5
Tại sao nên ntăng 1? Đó không phải là những gì truyện tranh làm ... ;-)
Tái lập lại

3
@WolframH Đó là - nhưng anh ấy đã thực hiện 2 = 4 trong lệnh 11 để nó hiển thị 14 chứ không phải 12
Tim

Câu trả lời:


21

Trăn 3, 700 698 697 689 683 639 611

Tab như thụt.

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)])

Vì điều này sử dụng trần trừ bạn không thể Ctrl-C. Ctrl-Z và giết %% hoạt động mặc dù

Một số điều kiện được khái quát hóa và những điều kiện khác sẽ chỉ hoạt động với đầu vào chính xác.

  1. A+"B" sẽ làm việc với bất kỳ A và B nào không chỉ khi A == B
  2. "A"+[] sẽ hoạt động cho mọi A có thể được chuyển đổi thành int (Bao gồm các chuỗi hex và nhị phân, ví dụ 0xff và 0b01010)
  3. (A/0)sẽ làm việc cho bất kỳ Nguyên nhân A, Eval DivideByZeroErrornào được xử lý ngoại trừ
  4. (A/0)+Bsẽ làm việc với bất kỳ A hoặc B. literal_eval(E) nào phát sinh lỗi.
  5. ""+""chỉ hoạt động cho dấu +. Bất cứ điều gì khác sẽ in NaN, NaP hoặc NaN.00 ...
  6. [A, B, C]+Dhoạt động bằng cách kiểm tra xem D == C+1như vậy sẽ hoạt động cho bất kỳ độ dài của danh sách và bất kỳ số nào.
  7. ^^
  8. 2/(2-(3/2+1/2)), Bất cứ điều gì mà không phân tích rằng có -một +đâu đó sau khi nó sẽ ra NaN.000 ... 13
  9. RANGE(" ") Mã hóa cứng
  10. +A sẽ làm việc cho bất kỳ A. Ouputs "current_line_number+A"
  11. A+A hoạt động cho bất kỳ A nào miễn là chúng giống nhau và là loại trăn bulitin
  12. RANGE(1,5) Mã hóa cứng.
  13. FLOOR(A) làm việc cho bất kỳ A.
  14. colors.rgb("blue")Các lstrip trong eval biến điều này trong gb("blue")đó có một phản ứng mã hóa cứng.
  15. colors.rgb("yellowish blue")Lstrip trong eval biến điều này trong gb("yellowish blue")đó cố gắng sử dụng một biến không tồn tại nếu ycó trong tranh luận gây ra lỗi mà ngoại trừ biến thành NaN
  16. colors.sort()Lstrip biến điều này thành t()một phản ứng mã hóa cứng.

Brainsteel đã chỉ ra một lỗi trong giả định của tôi cho quy tắc 10.


Rât gọn gang. Tôi nghĩ, ở số 10, có vẻ như "+ A" được dự định xuất số dòng + A, thay vì chỉ trả trước 1.
BrainSteel 11/07/2015

Ahh vâng, rõ ràng bây giờ nó chỉ ra. Điều đó có nghĩa là int sẽ tốt hơn khi là một hàm chữ cái duy nhất. Có thể lưu một hoặc hai byte.
Daniel Wakefield

re # 9: RANGE(" ")là một loạt các ký tự từ ký tự trích dẫn kép \ x22 đến ký tự khoảng trắng \ x20 trở lại.
John Dvorak

3
lại nhảy: vì Randall thiết lập 2để 4phù hợp 11, 2 tại là 4 và 12 tại là 14. Điều này cũng áp dụng đối với số dòng.
John Dvorak

2
Bạn có thể lưu một số byte bằng cách sử dụng khoảng trắng, tab và tab + khoảng trắng để thụt lề.
Tyilo

16

Python, 1110 byte

Toán tử quá tải không phải là xấu, phải không ??

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

Mục tiêu của tôi không phải là chiến thắng nhiều (rõ ràng) vì nó làm cho nó càng chung chung càng tốt. Rất ít được mã hóa cứng. Hãy thử những thứ như thế RANGE(10), 9*1RANGE("A"), (2/0)+14"123"cho kết quả thú vị!

Đây là một phiên mẫu:

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 byte

Điều này về cơ bản là mã hóa cứng, nhưng tất cả các câu trả lời khác cho đến nay đều thiếu một cái gì đó ...

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");}}

Đầu ra:

[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

Con trăn 3, 298

Mọi thứ đều được mã hóa cứng, nhưng đầu vào được chuyển thành một số sau đó được chuyển đổi thành một chuỗi và tìm kiếm trong một chuỗi lớn chứa tất cả các số này theo sau là câu trả lời của chúng.

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

Python 3, 542 484 byte

Vì không có đề cập đến mã hóa tuyệt đối ở đây là giải pháp của tôi.

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

Hardcoding là tốt, nhưng tôi nghĩ rằng các lỗ hổng bị cấm theo mặc định bị cấm theo mặc định. : P
lirtosiast

@ThomasKwa Tôi không thấy bất cứ điều gì ở đây là một lỗ hổng bị cấm. Lanhung?
Ethan Bierlein

1
Tất cả mọi thứ có vẻ phù hợp với tôi. Trước đây tôi cho rằng bạn đang khai thác kẽ hở vì bạn nói rằng "không đề cập đến [...] sơ hở tiêu chuẩn".
lirtosiast

1
Tôi nghĩ đó là sáng tạo, nhưng không phải là một câu trả lời. Câu hỏi nói rõ về đầu vào và đầu ra: "tạo ra một chương trình chấp nhận tất cả đầu vào đã cho và hiển thị đầu ra phù hợp"
bất chấp

2
Bạn có thể tiết kiệm một khoản tiền tốt bằng cách sử dụng cả hai dấu ngoặc kép. "2+\"2\""trở thành '2+"2"'. Nhập số cũng có thể được loại bỏ nếu bạn thêm một biến đếm.
Daniel Wakefield
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.