XKCD Türlerine uyan bir arayüz oluşturun


34

colors.rgb ("mavi"), "# 0000FF" değerini verir. colors.rgb ("sarımsı mavi"), NaN verir. colors.sort () "gökkuşağı" verir

Resimde belirtilen kuralları ve başlık metnini (burada alıntı yapılan) kullanarak, verilen tüm girişi kabul eden ve uygun çıktıyı görüntüleyen bir program oluşturun.

  • Giriş, stdin veya en yakın eşdeğeri ile alınabilir. Yazmak gibi bir satır olmalı [n]>ve nher komuttan 1 artar. 1'den başlamalı.

  • Sonuç stdout veya en yakın eşdeğer kullanılarak gösterilmelidir. Her =>çıktı satırında bir satır olmalıdır .

13 koşulun tümü, artı başlıktaki 3 (alıntı) çalışmalıdır.

Bu kod golf, bu yüzden en kısa cevap kazanır.


16
Arayüz ne kadar genel olmalı? Mesela, döşeme fonksiyonu sağlanan herhangi bir düzlük için çalışmak zorunda mıdır yoksa sadece geçilebileceğini varsayabilir miyiz 10.5?
ankh-morpork,

1
Çıktı için>, n büyüdükçe ve girdi> sağa doğru ilerledikçe, girdi için> ile hizalı mı?
Sparr

1
Bu çizgi roman potansiyel olarak birkaç şekilde yorumlanabilir. Uygulamamız gereken belirli tür ve işlemlerin bir listesini verebilir misiniz?
BrainSteel

5
Neden n1 oranında artmalı? Bu çizgi romanın yaptığı şey değil ... ;-)
Monica'yı yeniden yerleştirme 23

3
Öyle @WolframH - bu 12. 14 değil görüntüler böylece ama o komuta 11'de 2 = 4 yaptı
Tim

Yanıtlar:


21

Python 3, 700 698 697 689 683 639 611

Girinti olarak sekmeler.

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

Bu bir çıplak kullandığı için Ctrl-C olamaz. Ctrl-Z ve %% iş olsa öldür

Koşulların bazıları genelleştirildi, diğerleri ise yalnızca tam girdiyle çalışacak.

  1. A+"B" sadece ne zaman değil, herhangi bir A ve B ile çalışacak A == B
  2. "A"+[] Bir int dönüştürülebilir herhangi bir A için çalışacaktır (onaltılık ve ikili dizeleri içerir örneğin 0xff ve 0b01010)
  3. (A/0)DivideByZeroErrorDışında işlenen herhangi bir A, Değerlendirme Nedeniyle çalışacaktır.
  4. (A/0)+BHerhangi bir A veya B ile çalışacaktır literal_eval(E) bir hataya neden olur.
  5. ""+""sadece + işareti için çalışır. Başka bir şey NaN, NaP veya NaN.00 yazdıracak ...
  6. [A, B, C]+Dkontrol ederek çalışır, D == C+1böylece herhangi bir liste ve numara için çalışır.
  7. ^^
  8. 2/(2-(3/2+1/2)), Sonradan -bir +yere sahip olan ayrıştırılamayan herhangi bir şey NaN.000 ... 13 üretecektir
  9. RANGE(" ") Hardcoded
  10. +A herhangi bir A. Ouputs için çalışacak "current_line_number+A"
  11. A+A aynı oldukları ve bulitin python tipleri olduğu sürece herhangi bir A için çalışır
  12. RANGE(1,5) Kodlanmış.
  13. FLOOR(A) herhangi bir A için çalışıyor
  14. colors.rgb("blue")Eval içindeki ilk adım gb("blue"), bunun kodlanmış bir cevabı olduğu halini alır .
  15. colors.rgb("yellowish blue")Değerlendirmedeki lstrip, tartışmanın içinde varsa, NaN'ye dönüşen bir hataya neden gb("yellowish blue")olması durumunda var olmayan bir değişkeni kullanmaya çalıştığını gösterir.y
  16. colors.sort()Lstrip, t()kodlanmış bir cevabı olan bu duruma dönüşüyor .

Brainsteel, 10. kural için varsayımımda bir hata olduğunu belirtti.


Çok temiz. Ben # 10, düşünüyorum, "+ A" çıkışına amaçlanmıştır görünüyor satır numarasını + A yerine sadece 1. prepending
BrainSteel

Ahh evet, açıkça belirtildiği açık. Bu, int'nin tek bir harf işlevi olarak daha iyi olacağı anlamına gelir. Bir veya iki bayt kaydedebilir.
Daniel Wakefield,

re # 9: RANGE(" ")çift ​​tırnak karakterinden \ x22 çift karakterden \ x20 boşluk karakterine ve geri karakterden oluşan bir aralıktır.
John Dvorak

3
atlama yeniden: Randall ayarlamak için 2için 4hat 11, 2 geç 4 ve 12, bu aynı zamanda satır numaraları için de geçerlidir hemen 14'tür.
John Dvorak

2
Girintiniz için boşluk, sekme ve sekme + boşluk kullanarak bazı baytları kaydedebilirsiniz.
Tyilo,

16

Python, 1110 bayt

Operatör aşırı yükleme kötü değil, değil mi?

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

Amacım mümkün olduğu kadar jenerik hale getirdiği kadar açık değildi. Çok az kodlanmış. Gibi şeyler deneyin RANGE(10), 9*1ve RANGE("A"), (2/0)+14ve "123"eğlenceli sonuçlar için!

İşte örnek bir oturum:

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 bayt

Bu temelde kodlanmış, ancak şu ana kadarki tüm cevaplar bir şeyleri eksikti ...

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

Çıktı:

[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

Her şey kodlanmış, ancak giriş, daha sonra bir dizgeye dönüştürülen ve cevaplarını izleyen tüm bu sayıları içeren büyük bir dizgide aranan bir sayıya dönüştürülür.

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 bayt

Mutlak kodlamanın söz konusu olmadığı için işte çözümüm.

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

Sabit kodlama iyi, ancak varsayılan olarak yasaklanan boşlukların varsayılan olarak yasak olduğunu düşünüyorum . : P
lirtosiast

@ThomasKwa Burada yasak bir kaçamak olan bir şey görmüyorum. Var mı?
Ethan Bierlein,

1
Her şey bana uyumlu görünüyor. Daha önce bir boşluktan yararlandığınızı sanıyordum, çünkü “standart boşluklardan söz edilmediğini” söylediniz.
lirtosiast 11:15

1
Bence yaratıcı, ama bir cevap değil. Soru, girdi ve çıktı hakkında açıkça konuşur: "verilen tüm girdiyi kabul eden ve uygun çıktıyı gösteren bir program yaratın"
agtoever

2
Her iki teklifi de kullanarak iyi miktarda tasarruf edebilirsiniz. "2+\"2\""olur '2+"2"'. Bir sayaç değişkeni eklerseniz, içe aktarma sayısı da kaldırılabilir.
Daniel Wakefield,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.