ASCII Sanat Maya Rakamları


14

Bu zorluk basit. Bir sayı verildiğinde, Maya Base-20 rakam sistemini kullanarak sayının ascii-art temsilini çıktılayın.

Maya sistemi nedir?

Mayalar sayıları depolamak için taban 20'yi kullandılar, bu yüzden ilk pozisyon 1s yeri, diğeri 20s yeri, sonra 400s vb.

Yani Maya sayı 1olduğu 110 tabanına ama 10aslında 2010 tabanında, 207olduğu 807vb tabanı 10'da ..

Ve sayılarını piktogram olarak, özel bir sembolle temsil ettiler 0.

 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 

Onların sıfırı buydu. (en azından yarım picascii sanatsallığımın yarısı ascii sanat versiyonu)

Bu, Maya sıfır sembolünün gerçek bir resmi. 1

Bu onların beşiydi:

--------------------------------
|                              |
--------------------------------

Ve 4:

 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  

Son olarak, bir araya getirmek için:

 ----   ----   ----  
|    | |    | |    | 
|    | |    | |    | 
 ----   ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

Bu yüzden x//5çubukları ve çubukların x%5üstünde noktalar var. Ve eğer x=0, boşluk yerine kabuk / somun kullanırlar.

Daha fazla resim için Maya numaralı resimlerin Wikimedia Commons sayfasını deneyin .

Ama bu sadece sayılara kadar 19. Tek bir 'öykü'de'4 çubuk ve 4noktadan daha fazlasına sahip olmamıza izin verilmiyor ... Yani yukarı çıkıyoruz!

20 için çıktı:

 ----
|    |
|    |
 ----



 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 

Aynı anda hem a 1hem de a olduğu için bunun normalde geçersiz olacağını unutmayın 0. Ancak, ortalama yeni bir yer değerinden 3önce (cevabınızın en az 3 olması gerekir) yeni satırlar 0.

Alt katmanda noktalar, anlam 1ve çubuklar anlamlar var 5. Ama aslında nokta anlamı 20^0ve anlam çubuğu var 20^0 * 5.

Her hikaye bir güç artar. İkinci hikaye noktaları 20( 20^1) ve 100( 20^1 * 5) anlamına gelir .

Böylece sayı 506şu şekilde temsil edilebilir:

 ----  
|    | 
|    | 
 ----  




--------------------------------
|                              |
--------------------------------




 ----  
|    | 
|    | 
 ----  
--------------------------------
|                              |
--------------------------------

Bu (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506.

Göreviniz, seçmeseniz veya seçmediğinizde (önemli değil), temel-10 sayısının ascii sanat temsilini çıkarmaktır.

Diğer Kurallar:

  • Noktalar, çubuklar ve kabuklar sağlam olduğu sürece öndeki / arkadaki boşluk uygundur.
  • Çubuklar, noktalar ve kabuklar tam olarak test senaryolarının sahip olması gerekir. Yeniden boyutlandırma yok.
  • Baştaki '0'lar iyidir. (çıkışta önde gelen mermiler)
  • Her bir yer değeri veya hikayesi arasında en az 3 yeni satıra sahip olmanız gerekmez.

Test Durumları:

15

--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------  

12

 ----   ----  
|    | |    | 
|    | |    | 
 ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------



4

 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  


0

 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 


24

 ----  
|    | 
|    | 
 ----  




 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  



33



 ----  
|    |  
|    | 
 ----  




 ----   ----   ----  
|    | |    | |    | 
|    | |    | |    | 
 ----   ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------



20



 ----  
|    | 
|    | 
 ----  




 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------| 
|                   |
|                   |
 -------------------  

1: Semboller için tanrıların kafalarını da kullandılar, ancak bu meydan okuma için kabuk / ekmek / zelda sandığı kullanılacak.


but for this challenge the shell/bread will be used.. Kabuk değil, ekmek değil. Geçmiş göğse LOZ bağlantısı.
Bald Bantha


@epicTCK .... bu gerçekten çok benziyor ...
Rɪᴋᴇʀ

Yanıtlar:


4

Yakut, 223 180 177 179 bayt

Anonim işlev, çok satırlı bir dize döndürür.

Gerekli olan bazı ekstra boşlukları ve özyineleme eklemeyi unuttum. Ayrıca etrafında şeyler kaydırarak biraz daha golf.

f=->n{s=?|;e=' ';n<20?(n<1?[t=e+d=?-*19,a=s+(e*4+s)*4,a,s+d+s,b=s+e*19+s,b,t]:((r=n%5)>0?[t=" ----  "*r,m="|    | "*r,m,t]:[])+[a=?-*32,s+e*30+s,a]*(n/5))*$/:f[n/20]+$/*5+f[n%20]}

Siz en golfçüsünüz. Tebrikler!
Rɪᴋᴇʀ

6

Python 3.5, 404 400 392 312 311 308 290 281 285 281 bayt:

( Adnan'a 9 bayt ( ) tasarrufu için bir ipucu için ve Neil'e 4 bayt ( ) için bir ipucu için teşekkürler !290->281285->281 )

def u(z):
 p=[];P=print;S,N,M,X=' -|\n'
 while not p or z:p+=[z%20];z=z//20
 E=lambda i:(S+N*4+S)*i+X+((M+S*4+M)*i+X)*2+(S+N*4+S)*i+X;F=N*32+X+M+S*30+M+X+N*32+X;[P(S+N*19+S+X+M+((S*4+M)*4+X+M)*2+N*19+M+X+(M+S*19+M+X)*2+S+N*19+S+X*3)if y<1else P(E(y%5)+F*(y//5)+X*3)for y in p[::-1]]

Çevrimiçi deneyin! (Ideone)

analiz

Bu analizin amaçları için, 0123456789ABCDEFGHIJtemel 20'deki her bir basamağı temsil etmek için karakter setini kullanacağız.

Bu yüzden, sahip olduğum iki algoritmadan birini kullanarak, temel 10'u temel 20'ye dönüştürmüş olabilirdim. Kullanmayı düşündüğüm ilk algoritma, güç algoritması dediğim şey . Bu kodda kullandığım biri olsa da olması gerekenden daha uzun sürecekti, bu yüzden bu konuda konuşmayacağım. Ancak, burada repl.it üzerinde kullanabileceğiniz bu yöntemi kullanarak sağlanan herhangi bir diğer tabana 10 temel herhangi bir tamsayı dönüştüren bir python komut dosyası oluşturdunuz. Bunun yerine bu meydan okuma için kullandığım , burada oldukça iyi açıklandığını düşündüğüm bölme algoritması diyorum. Ancak temel olarak, sağlanan baz 10 sayısını alır ve sayıyı, bu durumda 20 olan geri kalanını 0 veya 1 olana kadar dönüştürmek için ihtiyacı olan tabana böler. , bu sırayla, son bölme işleminden, ve sonra diğer bölme işlemlerinden kalanların tümü, sondan birinciye doğru sırayla kalır. Tüm bu rakamlar daha sonra birleştirilir ve tersine çevrilen bu birleştirilmiş sıra , temel 20'deki temel 10 numaranızdır! Bunu göstermek için, temel 10 sayısını 431taban 20'ye dönüştürmek istediğinizi varsayalım .

[]=list we will put all remainders and the last quotient in
R = Remainder

1. 431/20 = 21 R11 [B (B=11 in base 20)]
2. 21/20 = 1 R1 [Add the remainder and quotient: B11]

Sonra, nihayet sahip olduğumuz listeyi alacağız, bu durumda bu listeyi içeriyor B11ve tersine çeviriyoruz , böylece şimdi sahip olacağız 11B. Bunu yaparken, nihayet son cevabımızı aldık! Taban 10'da taban 20'ye dönüştürülmüş 431, 11Byukarıdaki bağlantıyı zaten paylaştığım güç algoritmasını kullanan Python betiğimi kullanarak onaylanabilir, ancak burada tekrar yapacağım . İşte bu cevapta açıklanan bölme algoritmasını kullanan ve güçlerle aynı cevabı veren bir algoritma.

Tüm bu süreç bu benim komut ne temelde whiledöngü: while not p or z:p+=[z%20];z=z//20. Tek fark numaraları olmasıdır >9edilir değil ama onun yerine kendileri olarak harfler olarak temsil etti.

Taban 10 numara, arayacak taban 20 tamsayı, her basamak için, tabanın 20 dönüştürüldükten sonra, üzerinde hareket g, g mod 5noktalar basılır ve sonra g//5çubuklar basılır. Ardından program 3 boş satır yazdırır ve bir sonraki basamağa geçer. Ancak, basamak ise 0, tek bir "somun" ve ardından 3 yeni satır yazdırılır ve program bir sonraki basamağa taşınır. Böylece, temel 20 sayısını alarak 11B, ilk basamağa gidiyoruz. İlk hane budur 1ve o zamandan bu yana 0 çubuk ve o zamandan beri 1//5=01 nokta basar 1%5=1. İlk önce şunu elde ederiz:

 ---- 
|    |
|    |
 ---- 

ve sonra 3 yeni satır. İkinci rakama geçildiğinde, 1 olduğunu da görüyoruz, bu yüzden aynı şeyi çıkarır:

 ---- 
|    |
|    |
 ---- 

ve ayrıca 3 yeni hat. Son olarak, son basamağa geçerek bunun bir B. B=11Taban 20'den beri , program 1 nokta 11%5=1ve bu yana 2 çubuk çıktı 11//5=2. Şimdi şunu elde ediyoruz:

 ---- 
|    |
|    |
 ---- 
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

Son olarak, tüm bunları bir araya getirerek, şunu elde ederiz:

 ---- 
|    |
|    |
 ---- 




 ---- 
|    |
|    |
 ---- 




 ---- 
|    |
|    |
 ---- 
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

Ve bu 431 için Maya rakamı! Sonunda temel 10 numaranızı 20 Maya rakamında temsil ediyorsunuz.

Not: Kodumda bu lambdaişlevi fark etmiş olabilir veya olmayabilir . Ne olursa olsun, bu işlev noktaların oluşturulması için kullanılır, çünkü yan yana birden fazla nokta çıkmalıdır.


Bunun mümkün olup olmadığından emin değilim, ama S,N,M,X=' -|\n'bunun yerine yapabilir misin S,N,M,X=' ','-','|','\n'?
Adnan

@Adnan mümkün.
16:16

@Adnan Gerçekten mi? Vay, bunu bilmiyordum. Teşekkürler!
R. Kap

401bir iç sıfır içerir.
Neil

@Neil Oh, doğru. Söylediğin için teşekkürler. Şimdi düzeltildi.
R. Kap

3

Python 3, 243 bayt

s,v,h,x=' |-\n';P=print
t=s+h*19+s+x
def m(n):
 n//20and m(n//20);r=n%20
 if r:
  for a,b,f in[(r%5*' ----  ',r%5*'|    | ',1),('-'*32,'|'+' '*30+'|',r//5)]:P(*((a,b,b,a)*f),sep=x)
 else:P(t+2*(v+(4*s+v)*4+x)+v+h*19+v+x+2*(v+s*19+v+x)+t)
 P(x)

Tartışma

n//20and m(n//20)m()ele alınacak daha yüksek 20 güç varsa tekrar tekrar çağırır . Özyineleme, geçerli yer değerini yazdırmadan önce yapılır, böylece önce daha yüksek güçler yazdırılır.

Geçerli yer değeri sıfır değilse (r! = 0), for a,b,f-loop birimleri ve ardından beşleri yazdırır. abirinci / dördüncü satır ve bikinci / üçüncü satırdır. Hile var print(*((a,b,b,a)*f),sep=x). Birimler print(*(a,b,b,a),sep=x)için, birim sembollerini oluşturan 4 satırı (x bir '\ n') oluşturan f = 1 ile sonuçlanır . Beşleme için f = yazdırılacak beşleme sayısı (r // 5), böylece demet (a, b, b, a) yazdırılacak beşleme sayısı ile çarpılır (yani tekrarlanır). F = 2 ise, print(*(a,b,b,a,a,b,b,a),sep=x)beş için iki sembol basarız.

Geçerli yer değeri 0 ise, sıfır sembolü yazdırılır.


Ödülünü R. Kap'e ödüllendirmem gerekiyordu, ama bu kendi ödülünü hak edebilir! İyi iş!
Rɪᴋᴇʀ

2

Python, 411 bayt

w,m=input(),[]
for i in[20**i for i in range(int(w**0.25))][::-1]:m.append(w/i);w=w%i
for i in m or[0]:print(lambda x,y='\n',w=' ----  ',z='|    | ':w*(x%5)+y+z*(x%5)+y+z*(x%5)+y+w*(x%5)+y+('-'*32+'\n|'+' '*30+'|\n'+'-'*32+y)*(x/5)if x else''' -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- ''')(i),'\n\n\n'

Bunu test senaryoları oluşturmak için oluşturdum, bir referans olarak kullanabilirsiniz. Sorta golf oynadı.


Boşluğu kaldırarak 26 bayt s=math.sqrtve s(s(w))yerine yaparak ve çağırarak 4 bayt çıkarabilirsinizmath.sqrt(math.sqrt(w))
James

@DrGreenEggsandHamDJ teşekkürler. Boşluktan 26 bayt aldığımı sanmıyorum?
16:37 'de Rɪᴋᴇʀ

Pardon, sayma hatası ben 25. Ayrıca anlamına w**0.25bile daha iyi olduğunu s(s(w)). Daha uzun olmasına rağmen?
James

@DrGreenEggsandHamDJ evet, bir şekilde dosyadan yanıtlamak için transit sıfır kabuk dizesini kaybettim.
16:40

2

JavaScript (ES6), 254 bayt

f=(n,r=(s,n=19)=>s.repeat(n))=>(n>19?f(n/5>>2)+`


`:``)+(n%5?`${r(s=` ----  `,n%5)}
${t=r(`|    | `,n%5)}
${t}
${s}
`:``)+r(`${s=r(`-`,32)}
|${r(` `,30)}|
${s}
`,n/5&3)+(n%20?``:` ${s=r(`-`)}
${t=r(`|    `,4)}|
${t}|
|${s}|
|${t=r(` `)}|
|${t}|
 ${s}
`)

Bunu iţletemiyorum? İle hatalar Missing } in template expression. Çok fazla js bilmiyorum, nasıl düzeltebilirim?
16:20

@ EᴀsᴛᴇʀʟʏIʀᴋ Kötüüm, bazı kodları hareket ettirdim ve yanlışlıkla yanlış yere yapıştırdım. Şimdi düzeltildi.
Neil

1

Python 3, 213 bayt

Farklı bir yaklaşım kullanarak daha kısa bir versiyonla geldi:

s,v,h,x=' |-\n'
t=s+h*19+s
k=4*s+v
w=v+4*k
y=v+s*19+v
a=' ----  '
b=v+k+s
c=h*32
d=v+s*30+v
m=lambda n:m(n//20)+([n%5*a,n%5*b,n%5*b,n%5*a][:n%5*4]+n%20//5*[c,d,d,c]if n%20else[t,w,w,v+h*19+v,y,y,t])+[x,x]if n else[]

açıklama

İlk 9 satır, sembolleri yapmak için kullanılan dizeler oluşturur

s,v,h,x = ' |-\n'
k = '    |'

    # parts for a unit
a = ' ----  '
b = '|    | '

    # parts for a five
c = '--------------------------------'
d = '|                              |'

    # parts for a zero
t = ' ------------------- '
w = '|    |    |    |    |'
y = '|                   |'

Çözümün çekirdeği m, çıktıdaki her satır için bir dize, bir dize listesi oluşturan özyinelemeli işlevdir . Şematik olarak, mşuna benzer:

m(n//20) + (ones + fives if n%20 else zero) + [x,x] if n else []

m gibi yeniden yazılabilir:

def m(n):
  if n:
    ans = m(n//20)                             # process high digits first

    if n%20:                                   # if there is a base-20 digit
      ans += [n%5*a,n%5*b,n%5*b,n%5*a][:n%5*4] # add strings for the 'ones' if any
      ans += n%20//5 * [c, d, d, c]            # add strings for the 'fives' if any

    else:
      ans += [t,w,w,v+h*19+v,y,y,t]            # otherwise, add strings for a `zero`

    ans += [x,x]                               # blank lines between digit groups

  else:
    ans = []                                   # base case

  return ans

Özyinelemeli çağrı m(n//20)önce gelir, böylece en önemli basamaklar önce yapılır.

[n%5*a,n%5*b,n%5*b,n%5*a]sembollerin dizesidir. atek bir sembol için en üst satırdır. n%5bu rakam için bir sembolün sayısıdır. Yani, n%5*aüst (ve alt) satırlar için bir dize n%5. Benzer şekilde, 'n% 5 * b` 2. (ve 3.) satır için bir dizedir.

İfadesi [:n%5*4]bir gibi davranan ifherhangi bir 'olanlar' çıkışına bulunmuyorsa çıkışında fazladan boş satırlar önlemek için. Gerekli değildir, ancak çıktıyı daha iyi gösterir.

n%20//5gereken beş sembol sayısıdır. [c,d,d,c]beş için bir sembol yapmak için dizelerdir.

[t,w,w,v+h*19+v,y,y,t] sıfır sembolünü oluşturan dizeler

[x,x] Maya basamak grupları arasına en az üç boş satır koyar


Bunun nasıl çalıştığı hakkında bir açıklama yapabilir misiniz?
Rɪᴋᴇʀ
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.