Создайте интерфейс, соответствующий типам XKCD


34

colors.rgb ("blue") возвращает "# 0000FF". colors.rgb ("желтовато-синий") дает NaN. colors.sort () возвращает "радугу"

Используя правила, изложенные в изображении и тексте его заголовка (цитируется здесь), создайте программу, которая принимает все заданные входные данные и отображает соответствующие выходные данные.

  • Ввод может быть взят с помощью стандартного ввода или ближайшего аналога. Должна быть строка наподобие [n]>набираемой, которая nувеличивается на 1 для каждой команды. Это должно начаться с 1.

  • Результат должен отображаться с использованием стандартного вывода или ближайшего аналога. Там должно быть =>на каждой строке вывода.

Все 13 условий плюс 3 в названии (указаны) должны работать.

Это код гольф, поэтому самый короткий ответ выигрывает.


16
Насколько общим должен быть интерфейс? Например, должна ли функция floor работать для любого заданного числа с плавающей запятой или мы можем предположить, что он будет пропущен только когда-либо 10.5?
Анк-морпорк

1
Выровнены ли> выход для> с входом>, поскольку n увеличивается, а вход> перемещается дальше вправо?
Спарр

1
Этот комикс потенциально может быть истолкован несколькими способами. Не могли бы вы предоставить список того, какие конкретные типы и операции нам нужно реализовать?
BrainSteel

5
Почему следует nувеличить на 1? Это не то, что делает комикс ... ;-)
Восстановить Монику

3
@WolframH Это - но он сделал 2 = 4 в команде 11, поэтому он отображает 14, а не 12.
Тим

Ответы:


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 (включает шестнадцатеричные и двоичные строки, например, 0xff и 0b01010)
  3. (A/0)будет работать для любых A, Eval причин, DivideByZeroErrorкоторые обрабатываются в
  4. (A/0)+Bбудет работать с любым A или B. literal_eval(E) вызывает ошибку.
  5. ""+""работает только для знака +. Все остальное будет печатать NaN, NaP или NaN.00 ...
  6. [A, B, C]+Dработает, проверяя, что D == 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 работает для любого A, если они одинаковы и имеют типы Python Bulitin
  12. RANGE(1,5) HARDCODED.
  13. FLOOR(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()что имеет жестко закодированный ответ.

Brainsteel указал на ошибку в моем предположении о правиле 10.


Очень аккуратный. Я думаю, что на # 10 кажется, что «+ A» предназначен для вывода номера строки + A, а не просто для добавления 1.
BrainSteel

Ах, да, очевидно теперь, когда это указано. Что ж, это означает, что int будет лучше как функция из одной буквы. Можно сохранить один или два байта.
Даниэль Уэйкфилд

re # 9: RANGE(" ")диапазон символов от символа двойной кавычки \ x22 до символа пробела \ x20 и обратно.
Джон Дворжак

3
повторение: поскольку в строке 11 2для Randall установлено значение 42, теперь 2 равно 4, а 12 - 14. Это также относится к номерам строк.
Джон Дворжак

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 байт

Это в основном жестко закодировано, но все остальные ответы до сих пор что-то упустили ...

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

Python 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 Я не вижу здесь ничего, что является запрещенной лазейкой. Есть?
Итан Бирляйн

1
Все выглядит сообразно со мной. Ранее я предполагал, что вы используете лазейку, потому что вы сказали, что «нет никаких упоминаний о [...] стандартных лазеек».
lirtosiast

1
Я думаю, что это креативно, но не ответ. Вопрос ясно говорит о вводе и выводе: «создайте программу, которая принимает все заданные входные данные и отображает соответствующие выходные данные»
всяком случае,

2
Вы можете сохранить хорошую сумму, используя обе кавычки. "2+\"2\""становится '2+"2"'. Импорт счетчика также можно удалить, если добавить переменную счетчика.
Даниэль Уэйкфилд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.