ตัวเลข ASCII Maya


21

เขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับเป็นจำนวนเต็มบวกเป็น input เอาท์พุทเป็นตัวแทนของจำนวนเต็มว่าในตัวเลขมายา

ตัวเลขมายา

ตัวเลขมายาเป็นเลขฐานยี่สิบระบบ (ฐาน 20) โดยใช้เพียง 3 สัญลักษณ์:

  • < >สำหรับศูนย์ (สัญลักษณ์ที่ถูกต้องคือเชลล์ประเภทหนึ่งที่ไม่สามารถแสดงได้อย่างง่ายดายโดยใช้ ASCII)
  • .สำหรับหนึ่ง
  • ----สำหรับห้า

ตัวเลขจะเขียนแนวตั้งในอำนาจของ 20 และตัวเลขระหว่าง 0 และ 19 ถูกเขียนเป็นกองห้าและคน คุณจะอ้างถึงบทความ Wikipediaสำหรับรายละเอียดเพิ่มเติม

ดังตัวอย่างต่อไปนี้เป็นตัวเลขระหว่าง 0 ถึง 25 คั่นด้วยเครื่องหมายจุลภาค:

                                                                                 .    ..  ...  ....
                                                        .    ..  ...  .... ---- ---- ---- ---- ----  .    .    .    .    .    .
                               .    ..  ...  .... ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
<  >, .  , .. ,... ,....,----,----,----,----,----,----,----,----,----,----,----,----,----,----,----,<  >, .  , .. ,... ,....,----

ปัจจัยการผลิต

  • อินพุตมักเป็นจำนวนเต็มบวกระหว่าง 0 ถึง 2147483647 (2 ^ 31 - 1)
  • คุณสามารถนำเข้าจาก STDIN เป็นอาร์กิวเมนต์บรรทัดคำสั่งพารามิเตอร์ฟังก์ชั่นหรือสิ่งที่คล้ายกัน

เอาท์พุท

  • แต่ละบรรทัดมีความยาวไม่เกิน 4 อักขระ < >และ----ควรพิมพ์ตามที่กำหนดไว้ที่นี่ (ความยาว 4 อักขระแต่ละตัว)
  • คน ( .) ต้องอยู่กึ่งกลางบรรทัด หากมี 1 หรือ 3 .เนื่องจากการจัดแนวแนวนอนที่สมบูรณ์เป็นไปไม่ได้มันไม่สำคัญว่าจะเป็นหนึ่งคอลัมน์ทางด้านซ้ายหรือหนึ่งคอลัมน์ทางด้านขวาหรือกึ่งกลาง
  • จะต้องมีหนึ่งบรรทัดว่างเปล่าอย่างแน่นอนระหว่างพลังที่แตกต่างกันของ 20 โดยไม่คำนึงถึงความสูงของสแต็คในพลังของยุค 20 ตัวอย่างเช่นเอาต์พุตที่ถูกต้องสำหรับ 25 และ 30 คือ:

            .
     .
           ----
    ----   ----
    
  • ไม่อนุญาตให้นำหน้าหรือต่อท้ายบรรทัด

  • ต้องพิมพ์ผลงานพิมพ์ให้ตรงตามตัวอย่างที่ให้มา

กรณีทดสอบ

  • แต่ละหมายเลขระหว่าง 0 และ 25 ที่ระบุไว้เป็นตัวอย่างข้างต้น

  • การป้อนข้อมูล: 42

เอาท์พุท:

 .. 

 .. 
  • การป้อนข้อมูล: 8000

เอาท์พุท:

 .  

<  >

<  >

<  >
  • การป้อนข้อมูล: 8080

เอาท์พุท:

 .  

<  >

....

<  >
  • การป้อนข้อมูล: 123456789

เอาท์พุท:

 .  

... 
----
----
----

 .  
----
----

 .. 
----
----

 .  

....
----
----
----

....
----
  • การป้อนข้อมูล: 31415

เอาท์พุท:

... 

... 
----
----
----

----
----

----
----
----
  • การป้อนข้อมูล: 2147483647

เอาท์พุท:

 .  

... 
----
----

 .  
----
----

 .  

----
----
----

....
----

 .. 

 .. 
----

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ


15 และ 20 ดูเหมือนจะเหมือนกัน
isaacg

@isaacg ขอบคุณจริงฉันมี 15 ปรากฏทั้งที่จุดที่เหมาะสมและระหว่าง 19 และ 20 แก้ไข
ทำให้เสียชีวิต

@ ทำให้ผลลัพธ์ต้องพิมพ์ออกมา (เช่น STDOUT) หรือฟังก์ชั่นของฉันสามารถส่งคืนเอาต์พุตได้หรือไม่?
rink.attendant.6

@ rink.attendant.6 ต้องพิมพ์เหมือนกับที่อยู่ในโพสต์
เสียชีวิต

มันใช้ได้ไหมถ้า 1 คือหนึ่งคอลัมน์ทางด้านขวา แต่ 3 คือหนึ่งคอลัมน์ทางด้านซ้าย?
aragaer

คำตอบ:


3

Pyth, 41 ไบต์

j+bbm|jb_m.[\ 4kc:*d\.*5\.*4\-4"<  >"jQ20

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

                                     jQ20   convert input to base 20
    m                                       map each value d to:
                  *d\.                         string of d points
                 :    *5\.*4\-                 replace 5 points by 4 -s
                c             4                split into groups of 4
         m.[\ 4k                               center each group
        _                                      invert order
      jb                                       join by newlines
     |                         "<  >"          or if 0 use "<  >"
j+bb                                        join by double newlines

5

Perl, 125 117 ไบต์

$-=<>;{$_=($-%20?(""," .
"," ..
","...
","....
")[$-%5]."----
"x($-/5&3):"<  >
").$_;($-/=20)&&($_=$/.$_,redo)}print

ขอบคุณ Dom Hastings ที่ช่วยฉันประหยัด 8 ไบต์


1
สวัสดี samgak บันทึกการเปลี่ยนแปลงไบต์อีกสองสามรายการมากกว่าที่redo,if(int($i/=20))คุณสามารถ~~($i/=20)&&redoใช้ได้ ~~แปลงเป็น int - คุณสามารถใช้0|ที่จุดเริ่มต้น (หรือ|0ตอนท้าย) การแทนที่substr(".... ... .. . ",20-$i%5*5,5)ด้วย(' .', ' ..','...','.'x4)[$i%5-1].$/ดูเหมือนว่าจะใช้ได้ แต่ฉันไม่ได้ทดสอบกรณีทดสอบทั้งหมด ... ถ้าผลงานนั้นคุณลงไปที่ 114 ... ถ้าฉันคิดว่าจะแบ่งปันอะไรอีกฉันจะแจ้งให้คุณทราบ!
Dom Hastings

1
ลองคิดดูถ้าคุณต้องการมีจำนวนเต็มและไม่สนใจส่วนที่เหลือคุณสามารถใช้ตัวแปรเวทย์$-ซึ่งมักจะถูกตัดทอนให้เป็น int ... อาจบันทึกอีกไม่กี่!
Dom Hastings

1
@DomHastings ขอบคุณเคล็ดลับการแปลง int ช่วยประหยัดสองสามไบต์และการกำจัด substr บันทึกอีก 4 บรรทัดขึ้นบรรทัดใหม่ต้องเข้าไปในค่าคงที่สตริงเนื่องจากจะต้องไม่มีการขึ้นบรรทัดใหม่ในกรณีที่ไม่มีจุด
samgak

1
@DomHastings แน่นอนมันขอบคุณอีกครั้ง! ฉันเดาว่าหมายความว่าฉันต้องกำจัดเรื่องตลกสิ้นโลกของฉัน
samgak

4

JavaScript ES6, 143 ไบต์

มีการเพิ่มโหลดจำนวนมากเนื่องจากจำเป็นต้องconsole.logสามารถบันทึกอีก 23 ไบต์หากไม่มี

n=>console.log((d=(x,s='',l=1,j=x/l|0)=>s+(j>19?d(x,s,l*20)+`

`:'')+((j=j%20)?(' '+`.`.repeat(j%5)).slice(-4)+`
----`.repeat(j/5):'<  >'))(n))

4

Mathematica 185 182 171 153

ด้วยขนาด 18 ไบต์ที่บันทึกไว้ต้องขอบคุณคำแนะนำของ Arcinde ที่จะใช้ฟังก์ชั่นที่ไม่ระบุชื่อ

c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&

ตัวอย่าง

c[If[# > 0, {q, r} = #~QuotientRemainder~5; c@{{"", " .", " ..", " ...", "...."}[[r + 1]], c@{{""}, {d = "----"}, {d, d}, {d, d, d}}[[q + 1]]}, "< >"] & /@ #~IntegerDigits~20] &[31415]

เอาท์พุต


การตรวจสอบ

จำนวนทศนิยม 31415 แสดงในฐาน 20 Mathematica ใช้ตัวพิมพ์เล็กสำหรับเรื่องนี้

BaseForm[31415, 20]

ฐาน 20


ตัวเลขทศนิยมที่สอดคล้องกับตัวเลขฐาน 20 ข้างต้น

IntegerDigits[31415,20]

{3, 18, 10, 15}


ตัวอย่างอื่น

IntegerDigits[2147483607, 20]

{1, 13, 11, 1, 15, 9, 0, 7}

c[If[# > 0, {q, r} = #~QuotientRemainder~5;c@{{"", " .", " ..", " ...","...."}[[r + 1]], c@{{""}, {d = "----"}, {d, d}, {d, d, d}}[[q + 1]]},"< >"] & /@ #~IntegerDigits~20] &[2147483607]

EX2


c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ
jcai

@Arcinde ขอบคุณ ฟังก์ชั่นนิรนามที่ดีเก่า
DavidC

3

JavaScript (ES6), 157 ไบต์

บรรทัดใหม่มีความสำคัญและนับเป็น 1 ไบต์ เนื่องจากต้องพิมพ์ไปที่ STDOUT ทำให้console.logฉันเสียค่าใช้จ่ายไปสักสองสามไบต์

f=i=>console.log([...i.toString(20)].map(j=>(!(j=parseInt(j,20))||j%5?[`<  >`,` .`,` ..`,`...`,`....`][j%5]+`
`:'')+`----
`.repeat(j/5)).join`
`.slice(0,-1))

การสาธิต

เพื่อวัตถุประสงค์ในการสาธิตฉันจะเขียน ES5 เวอร์ชันเพื่อให้ทำงานได้ในเบราว์เซอร์ทั้งหมด:

// Snippet stuff
console.log = function(x) {
  O.innerHTML = x;
}
document.getElementById('I').addEventListener('change', function() {
  f(this.valueAsNumber);
}, false);

// Actual function
f = function(i) {
  console.log(i.toString(20).split('').map(function(j) {
    return (! (j = parseInt(j, 20)) || j % 5 ? ['<  >', ' .', ' ..', '...', '....'][j % 5] + '\n' : '') + '----\n'.repeat(j / 5);
  }).join('\n').slice(0,-1));
}
<input type=number min=0 max=2147483647 value=0 id=I>

<pre><output id=O></output></pre>


คนสุดท้าย.joinต้องการวงเล็บหรือไม่?
Downgoat

137 ไบต์: pastebin.com/3Zgg4qtX
Downgoat

@ วิหารที่ไม่ได้เอาท์พุทอะไรมันก็แค่ส่งคืน
rink.attendant.6

ไม่ทราบว่าเป็นข้อกำหนดเนื่องจากอินพุตสามารถผ่านฟังก์ชันได้ pastebin.com/0pS0XtJaสั้นลง 3 ไบต์
Downgoat

2

Python 2.x, 142 ไบต์:

def m(n):
 h=[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]+"----\n"*(n%20/5),"<  >\n"][n%20==0]
 n/=20
 if n>0:
  h=m(n)+"\n\n"+h
 return h[:-1]

ตัวอย่าง:

>>> print m(2012)
----

<  >

 ..
----
----
>>> 

แก้ไข: บรรทัดต่อท้าย ...


ฉันมีการปรับปรุงเล็กน้อยเพื่อแนะนำ ครั้งแรกที่มีการเปลี่ยนแปลงไป[n%20==0] [n%20<1]สองเปลี่ยน[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]เป็นh=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]ด้วยa=n%5ซึ่งย้ายn%5ออกทั้งหมดและเปลี่ยนเงื่อนไขที่จะ*(a>0)ส่งกลับสตริงที่ว่างเปล่าที่a==0สำหรับผลเดียวกัน
Sherlock9

สุดท้ายใส่a, hและในหนึ่งบรรทัดเช่นดังนั้น:n a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20ทั้งหมดนี้จะทำให้คุณมีขนาด 131 ไบต์
Sherlock9

2

CJam, 82 76 ไบต์

li{_K%[""" .
"" ..
""...
""....
"]1$5%='-4*N+2$5/3&*+"<  >
"?N+L+:L;K/}h;L);

โปรแกรม CJam แรกของฉันเป็นเพียงคำทับศัพท์ของคำตอบ Perl ของฉันต่อ CJam

ลองออนไลน์

หลายบรรทัดพร้อมความคิดเห็น:

li            # read input
{             # start of do-while loop
  _K%         # check if this base-20 digit is a zero
    [""" .
    "" ..
    ""...
    ""....
    "]1$5%=   # push dots for 1s onto stack
    '-4*N+2$5/3&*+    # push lines for 5s onto stack

    "<  >
    "         # push zero on stack
  ?           # ternary if test (for digit equals zero)
  N+L+:L;     # pre-concatenate string with output plus newline
  K/          # divide by 20
}h            # end of do while loop
;L);          # push output string on stack, chop off trailing newline

1

PHP, 220 ไบต์

เช่นเดียวกับคำตอบ JavaScript ของฉัน PHP มีฟังก์ชั่นในตัวสำหรับทุกสิ่ง

รับ 1 อินพุตจากบรรทัดรับคำสั่ง (เช่น STDIN) ตามที่เห็นด้วย$argv[1]:

<?=rtrim(implode("\n",array_map(function($j){return(!($j=base_convert($j,20,10))||$j%5?['<  >', ' .', ' ..', '...', '....'][$j%5]."\n":'').str_repeat("----\n",$j/5);},str_split(base_convert($argv[1],10,20)))));

1

C - 149

f(v){v/20&&(f(v/20),puts("\n"));if(v%=20)for(v%5&&printf("%3s%s","...."+4-v%5,v/5?"\n":""),v/=5;v--;v&&puts(""))printf("----");else printf("<  >");}

ใช้การเรียกซ้ำเพื่อพิมพ์ตัวเลขที่สำคัญที่สุดก่อน จากนั้นพิมพ์ศูนย์หรือพิมพ์จุดทั้งหมดด้วยจุดที่ชาญฉลาด หนึ่งจุดprintfและวนทั้งหมดในลูป ฉันไม่แน่ใจว่าสามารถหลีกเลี่ยงการใช้ if-else ที่นี่ได้ไหม

ข้อเสียของ printf ที่ฉลาดคือ 1 และ 3 ไม่ได้เรียงตัวกัน:

ผลลัพธ์สำหรับ 23 คือ:

  .

...

119โซลูชันที่ไม่ถูกต้อง - ขึ้นบรรทัดใหม่

f(v){v/20&&(f(v/20),puts(""));if(v%=20)for(v%5&&printf("%3s\n","...."+4-v%5),v/=5;v--;)puts("----");else puts("<  >");}

146 ไบต์
Jonathan Frech

1

PHP, 202 192 ไบต์

function m($n){return(($c=($n-($r=$n%20))/20)?m($c)."\n":"").
($r?(($q=$r%5)?substr(" .   .. ... ....",$q*4-4,4)."\n":"").
str_repeat("----\n",($r-$q)/5):"<  >\n");}
echo rtrim(m($argv[1]),"\n");

มันรับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรก

รหัสที่สมบูรณ์มีความคิดเห็นและการทดสอบสามารถใช้ได้บนGitHub


\nเป็นอักขระสองตัว - แต่บรรทัดใหม่ที่อยู่ตรงกลางของสตริงเป็นเพียงหนึ่งตัวเท่านั้น
fisharebest

1

Python 2, 114 ไบต์

คำตอบนี้ขึ้นอยู่กับคำตอบ Pyth ของ Jakube และคำตอบ Python 2 ของ Locoluis

def f(n):d,m=divmod(n%20,5);h=[" "*(2-m/2)+"."*m+"\n----"*d,"<  >"][n%20<1];n/=20;return(f(n)+"\n\n"if n else"")+h

0

เยลลี่ , 50 49 47 ไบต์

b5µṪ”.x⁶;$L<3Ɗ¡ṭ⁾--;UW¤ẋ$Ẏ$L¡Ṛø“<  >”WµẸ?
b20Ç€

ลองออนไลน์!

... ได้รับการจัดแนวให้ตรงกับจุดของผู้ใช้ 201027

เมื่อคุณหลอกตัวเองให้คิด< >เป็นสิ่งที่ต้องทำ ...


ทำไมคุณจัดชิดขวา......
user202729

@ user202729 สำหรับ.และ..จะต้องมีช่องว่างดังนั้นฉันใส่ไว้...ด้วย มีวิธีที่สั้นกว่านี้ไหม?
dylnan

ฉันคิดว่าเป็นไปตามสเป็คความท้าทาย...ไม่ควรจัดชิดขวา แค่เปลี่ยน<4เป็น<3?
user202729

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