Cree una interfaz que se ajuste a los tipos XKCD

34

colors.rgb ("azul") produce "# 0000FF". colors.rgb ("azul amarillento") produce NaN. colors.sort () produce "arcoiris"

Usando las reglas establecidas en la imagen y su texto de título (citado aquí), cree un programa que acepte toda la entrada dada y muestre la salida apropiada.

  • La entrada se puede tomar con stdin o el equivalente más cercano. Debería haber una línea como [n]>para escribirlo, yn aumenta en 1 cada comando. Debería comenzar en 1.

  • El resultado debe mostrarse usando stdout o el equivalente más cercano. Debería haber un=> en cada línea de salida.

Las 13 condiciones, más las 3 en el título (citadas) deben funcionar.

Este es el código de golf, por lo que gana la respuesta más corta.

Tim
fuente
16
¿Qué tan general debe ser la interfaz? Por ejemplo, ¿la función de piso tiene que funcionar para cualquier flotador proporcionado o podemos suponer que solo se pasará alguna vez 10.5?
ankh-morpork
1
¿El> para la salida está alineado con el> para la entrada, a medida que n crece y la entrada> se mueve más hacia la derecha?
Sparr
1
Este cómic puede interpretarse potencialmente de varias maneras. ¿Podría proporcionar una lista de los tipos y operaciones específicos que necesitamos implementar?
BrainSteel
55
¿Por qué debería naumentar en 1? Eso no es lo que hace el cómic ... ;-)
Restablece a Monica
3
@WolframH Sí, pero hizo 2 = 4 en el comando 11, por lo que muestra 14 no 12.
Tim

Respuestas:

21

Python 3, 700698697689683639 611

Pestañas como sangría.

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

Como esto usa un Excepto simple, no puede Ctrl-C. Sin embargo, Ctrl-Z y kill %% funcionan

Algunas de las condiciones son generalizadas y otras solo funcionarán con la entrada exacta.

  1. A+"B" funcionará con cualquier A y B, no solo cuando A == B
  2. "A"+[] funcionará para cualquier A que se pueda convertir a int (incluye cadenas hexadecimales y binarias, por ejemplo, 0xff y 0b01010)
  3. (A/0)funcionará para cualquier A, Eval Causes DivideByZeroErrorque se maneja en el excepto
  4. (A/0)+Bfuncionará con cualquier A o B. literal_eval(E) genera un error.
  5. ""+""solo funciona para el signo +. Cualquier otra cosa imprimirá NaN, NaP o NaN.00 ...
  6. [A, B, C]+Dfunciona comprobando que D == C+1funcionará para cualquier longitud de la lista y cualquier número.
  7. ^^
  8. 2/(2-(3/2+1/2)), Cualquier cosa que no se pueda analizar que tenga -un+ algún lugar después generará NaN.000 ... 13
  9. RANGE(" ") Codificado
  10. +A funcionará para cualquier A. Ouputs "current_line_number+A"
  11. A+A funciona para cualquier A siempre que sean iguales y sean tipos de pitón bulitin
  12. RANGE(1,5) Codificado
  13. FLOOR(A) funciona para cualquier A.
  14. colors.rgb("blue")El lstrip en eval convierte esto en gb("blue")que tiene una respuesta codificada.
  15. colors.rgb("yellowish blue")El lstrip en eval convierte esto en el gb("yellowish blue")cual los intentos de usar una variable inexistente si yestá presente en el argumento causando un error que la excepción se convierte en NaN
  16. colors.sort()El lstrip convierte esto en t()que tiene una respuesta codificada.

Brainsteel señaló un error en mi suposición para la regla 10.

Daniel Wakefield
fuente
Muy aseado. Creo que, en el n. ° 10, parece que el "+ A" está destinado a generar el número de línea + A, en lugar de solo preceder 1.
BrainSteel
Ahh sí, obvio ahora que se señaló. Bueno, eso significa que int será mejor como una sola función de letra. Podría salvar un byte o dos.
Daniel Wakefield
re # 9: RANGE(" ")es un rango de caracteres desde el carácter de comillas dobles \ x22 hasta el carácter de espacio \ x20 y viceversa.
John Dvorak
3
re del salto: porque Randall configurado 2para 4en la línea 11, 2 es ahora 4 y 12 es ahora 14. Esto también se aplica a los números de línea.
John Dvorak
2
Puede guardar algunos bytes usando espacio, tabulación y tabulación + espacio para su sangría.
Tyilo
16

Python, 1110 bytes

La sobrecarga del operador no es mala, ¿verdad?

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

Mi objetivo no era tanto ganar (obviamente) como hacerlo lo más genérico posible. Muy poco está codificado. Intenta cosas por el estilo RANGE(10), 9*1y RANGE("A"), (2/0)+14y "123"los resultados de la diversión!

Aquí hay una sesión de muestra:

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$
kirbyfan64sos
fuente
7

C, 412 bytes

Esto está básicamente codificado, pero a todas las otras respuestas hasta ahora les faltaba algo ...

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

Salida:

[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___
Cole Cameron
fuente
5

Pitón 3, 298

Todo está codificado, pero la entrada se convierte en un número que luego se convierte en una cadena y se busca en una cadena grande que contiene todos estos números seguidos de sus respuestas.

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=>"))
Reinstalar a Mónica
fuente
1

Python 3, 542 484 bytes

Como no se mencionó el hardcoding absoluto, esta es mi solución.

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
Ethan Bierlein
fuente
El hardcoding está bien, pero creo que las lagunas que están prohibidas por defecto están prohibidas por defecto. : P
lirtosiast
@ThomasKwa No veo nada aquí que sea una escapatoria prohibida. ¿Esta ahí?
Ethan Bierlein
1
Todo me parece conforme. Anteriormente supuse que estaba explotando una escapatoria porque dijo que "no se mencionaban las lagunas [...] estándar".
lirtosiast
1
Creo que es creativo, pero no una respuesta. La pregunta se refiere claramente a la entrada y salida: "crear un programa que acepte toda la entrada dada y muestre la salida apropiada"
hasta el
2
Puede ahorrar una buena cantidad usando ambas comillas. "2+\"2\""se convierte '2+"2"'. El recuento de importación también podría eliminarse si agrega una variable de contador.
Daniel Wakefield