สร้างอินเทอร์เฟซที่เหมาะกับประเภท XKCD


34

colours.rgb ("สีน้ำเงิน") ให้ผลตอบแทน "# 0000FF" colors.rgb ("สีน้ำเงินเหลือง") ให้ผล NaN colors.sort () ให้ผล "รุ้ง"

ใช้กฎที่กำหนดไว้ในภาพและข้อความชื่อ (อ้างถึงที่นี่) สร้างโปรแกรมที่ยอมรับอินพุตที่กำหนดทั้งหมดและแสดงผลลัพธ์ที่เหมาะสม

  • สามารถป้อนข้อมูลด้วย stdin หรือเทียบเท่าที่ใกล้ที่สุด ควรมีบรรทัด[n]>ที่จะพิมพ์และnเพิ่มขึ้นทีละ 1 คำสั่ง ควรเริ่มต้นที่ 1

  • ควรแสดงผลลัพธ์โดยใช้ stdout หรือใกล้เคียงที่สุด ควรจะมี=>ในแต่ละบรรทัดของการส่งออก

เงื่อนไขทั้งหมด 13 ข้อรวมทั้ง 3 ข้อในชื่อ (ที่ยกมา) จะต้องใช้งานได้

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดจึงชนะ


16
อินเตอร์เฟสทั่วไปควรเป็นอย่างไร ตัวอย่างเช่นฟังก์ชั่นพื้นต้องทำงานกับโฟลตที่ให้มาหรือเราคิดว่ามันจะผ่านไปได้10.5หรือไม่?
ankh-morpork

1
> สำหรับเอาท์พุทที่สอดคล้องกับ> สำหรับอินพุทเมื่อเติบโตขึ้นและอินพุท> เลื่อนไปทางขวามากขึ้นหรือไม่?
Sparr

1
การ์ตูนเรื่องนี้สามารถตีความได้หลายวิธี คุณสามารถระบุรายการประเภทและการดำเนินงานเฉพาะที่เราจำเป็นต้องใช้งานได้หรือไม่?
BrainSteel

5
ทำไมต้องnเพิ่มขึ้น 1 นั่นไม่ใช่สิ่งที่การ์ตูนทำ ... ;-)
Reinstate Monica

3
@ WolframH มัน - แต่เขาสร้าง 2 = 4 ในคำสั่ง 11 ดังนั้นมันจึงแสดง 14 ไม่ใช่ 12
Tim

คำตอบ:


21

Python 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 และ kill %% ทำงานได้

เงื่อนไขบางอย่างเป็นแบบทั่วไปและอื่น ๆ จะทำงานกับอินพุตที่แน่นอนเท่านั้น

  1. A+"B" จะทำงานกับ A และ B ใด ๆ ไม่ใช่แค่เมื่อ A == B
  2. "A"+[] จะทำงานกับ A ใด ๆ ที่สามารถแปลงเป็น int (รวมสตริง hex และไบนารีเช่น 0xff และ 0b01010)
  3. (A/0)จะใช้งานได้สำหรับสาเหตุ A, Eval ใด ๆDivideByZeroErrorที่ได้รับการจัดการในข้อยกเว้น
  4. (A/0)+Bจะทำงานร่วมกับ A หรือ B ใด ๆliteral_evalทำให้เกิดข้อผิดพลาด
  5. ""+""ใช้งานได้กับเครื่องหมาย + เท่านั้น อะไรก็ได้ที่จะพิมพ์ NaN, NaP หรือ NaN.00 ...
  6. [A, B, C]+Dทำงานได้โดยการตรวจสอบว่าD == C+1จะทำงานกับความยาวของรายการและหมายเลขใด ๆ
  7. ^^
  8. 2/(2-(3/2+1/2))สิ่งใดก็ตามที่ไม่สามารถแจงส่วนที่มี-กับ+ที่ไหนสักแห่งหลังจากนั้นมันจะแสดงผล NaN.000 ...
  9. RANGE(" ") hardcoded
  10. +A จะทำงานให้กับ A. Ouputs ใด ๆ "current_line_number+A"
  11. A+A ใช้งานได้กับ A ตราบใดที่มันเหมือนกันและเป็น Bulitin Python
  12. RANGE(1,5) hardcoded
  13. FLOOR(A) ใช้ได้กับ A. ทุกชนิด
  14. colors.rgb("blue")lstrip ใน eval เปลี่ยนสิ่งนี้gb("blue")ซึ่งมีการตอบกลับแบบฮาร์ดโค้ด
  15. colors.rgb("yellowish blue")lstrip ใน eval เปลี่ยนสิ่งนี้gb("yellowish blue")ซึ่งพยายามใช้ตัวแปรที่ไม่มีอยู่หากyมีอยู่ในการโต้เถียงทำให้เกิดข้อผิดพลาดที่ยกเว้นกลายเป็น NaN
  16. colors.sort()lstrip เปลี่ยนสิ่งนี้เป็นt()สิ่งที่มีการตอบสนองแบบ hardcoded

Brainsteel ชี้ให้เห็นข้อผิดพลาดในการสันนิษฐานของฉันสำหรับกฎ 10


เรียบร้อยมาก ฉันคิดว่าใน # 10 ดูเหมือนว่า "+ A" มีวัตถุประสงค์เพื่อส่งออกหมายเลขบรรทัด + A แทนที่จะเป็นเพียงแค่การเตรียม 1
BrainSteel

อ่าใช่แล้วตอนนี้มันชัดเจนแล้ว นั่นหมายความว่า int จะดีกว่าเมื่อใช้ฟังก์ชันตัวอักษรตัวเดียว อาจบันทึกหนึ่งหรือสองไบต์
Daniel Wakefield

re # 9: RANGE(" ")เป็นช่วงของอักขระจากอักขระเครื่องหมายคำพูดคู่ \ x22 ถึงอักขระเว้นวรรค \ x20 และย้อนกลับ
John Dvorak

3
การกระโดดอีกครั้ง: เนื่องจาก Randall ถูกตั้งค่า2เป็น4ในบรรทัดที่ 11, 2 คือตอนนี้ 4 และ 12 ตอนนี้ 14 ซึ่งใช้กับหมายเลขบรรทัดเช่นกัน
John Dvorak

2
คุณสามารถบันทึกไบต์โดยใช้พื้นที่แท็บและแท็บ + ช่องว่างสำหรับการเยื้องของคุณ
Tyilo

16

Python 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 ไบต์

นี่คือ hardcoded โดยทั่วไป แต่คำตอบอื่น ๆ ทั้งหมดที่หายไปบางสิ่งบางอย่าง ...

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

Python 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

Python 3, 542 484 bytes

เนื่องจากไม่มีการกล่าวถึงการเข้ารหัสแบบเด็ดขาดนี่เป็นคำตอบของฉัน

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 นั้นใช้ได้ แต่ฉันคิดว่าช่องโหว่ที่ถูกห้ามโดยค่าเริ่มต้นนั้นเป็นสิ่งต้องห้ามตามค่าเริ่มต้น : P
lirtosiast

@ThomasKwa ฉันไม่เห็นอะไรที่นี่ซึ่งเป็นช่องโหว่ที่ต้องห้าม มีอะไรบ้าง
Ethan Bierlein

1
ทุกอย่างดูเป็นไปตามฉัน ก่อนหน้านี้ฉันคิดว่าคุณใช้ช่องโหว่เพราะคุณบอกว่ามี "ไม่มีการเอ่ยถึงช่องโหว่มาตรฐาน [... ]"
lirtosiast

1
ฉันคิดว่ามันสร้างสรรค์ แต่ไม่ใช่คำตอบ คำถามพูดอย่างชัดเจนเกี่ยวกับอินพุทและเอาท์พุท: "สร้างโปรแกรมที่รับอินพุตที่กำหนดทั้งหมดและแสดงเอาท์พุทที่เหมาะสม"
ตลอดไป

2
คุณสามารถบันทึกจำนวนเงินที่ดีโดยใช้คำพูดทั้งสอง จะกลายเป็น"2+\"2\"" '2+"2"'การนับการนำเข้ายังสามารถลบได้หากคุณเพิ่มตัวแปรตัวนับ
Daniel Wakefield
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.