ASCII Maya番号


21

入力として正の整数を指定すると、Maya数字でその整数の表現を出力するプログラムまたは関数を記述します。

マヤの数字

Mayaの数字は、3つのシンボルのみを使用した仮想システム(基数20)です。

  • < >以下のためにゼロ(正しい記号を容易ASCIIを使用して表すことができないシェルのいくつかの並べ替えです)。
  • .以下のための一つ
  • ----以下のためのファイブ

数値は20の累乗で垂直に書き込まれ、0〜19の数値は51のスタックとして書き込まれます。詳細については、Wikipediaの記事を参照してください。

例として、0から25までの数字をコンマで区切って示します。

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

入力

  • 入力は常に0〜2147483647(2 ^ 31-1)の間の正の整数です。
  • コマンドライン引数、関数パラメーター、または同様のものとして、STDINから入力を取得できます。

出力

  • 各行の長さは最大4文字です。< >そして----(4文字ずつ)、ここで与えられたとして、常に印刷されなければなりません。
  • Ones(.)は行の中央に配置する必要があります。1または3がある場合.、完全な水平方向の配置は不可能であるため、それらが左に1列か、右または中央に1列かは関係ありません。
  • 20の累乗のスタックの高さに関係なく、20の累乗の間に正確に1つの空行がなければなりません。たとえば、25と30の正しい出力は次のとおりです。

            .
     .
           ----
    ----   ----
    
  • 先頭または末尾の行は許可されません。

  • 出力は、指定された例のとおりに印刷する必要があります。

テストケース

  • 上記の例のように、0から25までの個々の数字

  • 入力: 42

出力:

 .. 

 .. 
  • 入力: 8000

出力:

 .  

<  >

<  >

<  >
  • 入力: 8080

出力:

 .  

<  >

....

<  >
  • 入力: 123456789

出力:

 .  

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

 .  
----
----

 .. 
----
----

 .  

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

....
----
  • 入力: 31415

出力:

... 

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

----
----

----
----
----
  • 入力: 2147483647

出力:

 .  

... 
----
----

 .  
----
----

 .  

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

....
----

 .. 

 .. 
----

得点

これはであるため、バイト単位の最短コードが優先されます。


15と20は同じように見えます。
isaacg

@isaacgありがたいことに、実際には適切な場所と19〜20の間に15が表示されていました。修正されました。
15

@Fatalize出力を印刷する必要がありますか(つまり、STDOUT)、または関数が出力を返すだけですか?
-rink.attendant.6

@ rink.attendant.6投稿とまったく同じように印刷する必要があります。
-18:

1が右に1列、3が左に1列であれば問題ありませんか?
-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

8バイトの節約にご協力いただいたDom Hastingsに感謝します。


1
ちょっとサムガック、redo,if(int($i/=20))あなたが使用することができるよりむしろ、さらに2バイトを節約する変更~~($i/=20)&&redo~~intに変換します- 0|最初(または|0最後)でも使用できます。また、substr(".... ... .. . ",20-$i%5*5,5)と置き換える(' .', ' ..','...','.'x4)[$i%5-1].$/ことはうまくいくようですが、私はすべてのテストケースをテストしていません...それらがうまくいくなら、あなたは114になります...共有する他の何かを考えているなら、お知らせします!
ドムヘイスティングス

1
考えてみると、整数のみを持ち、残りを無視したい場合は、$-常にintに切り捨てるマジック変数を使用できます...さらに節約できます!
ドムヘイスティングス

1
@DomHastingsに感謝します。int変換のトリックは数バイトを節約し、substrを取り除くことでさらに4バイトを節約します。
-samgak

1
本当にありがとうございます!それは、世界のジョークの終わりを取り除く必要があることを意味すると思います
-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

匿名関数を使用するというArcindeの提案のおかげで18バイトが節約され、

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]

output


確認中

10進数、31415、基数20で表されます。Mathematicaはこれに小文字を使用します。

BaseForm[31415, 20]

base 20


上記の基数20に対応する10進数。

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括弧は必要ですか?
ダウンゴート


@vihanそれは何も出力せず、単に戻ります。
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]ます。次に、with に変更[[""," "*(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%5s を移動し、同じ効果のために*(a>0)空の文字列atを返す条件を変更しますa==0
Sherlock9

最後に、入れahnそうのように、1行に: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プログラム。基本的には、CJamに対するPerlの回答の音訳です。

オンラインで試す

コメント付きの複数行:

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には、すべての機能が組み込まれています。

次のように、コマンドライン(STDIN)から1つの入力を取得します$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("<  >");}

再帰を使用して、最も重要な数値を最初に印刷します。次に、ゼロを印刷するか、1つの巧妙で すべてのドットと5つ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("<  >");}


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は2文字ですが、文字列の途中の改行は1文字のみです。
fisharebest

1

Python 2、114バイト

この回答は、JakubeのPythの回答とLocoluisのPython 2の回答に基づいています。

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Ç€

オンラインでお試しください!

... user202729のポイントのおかげで、現在は左揃えになっています。

自分をだまして考えさせる< >と回文です...


なぜ右揃えするの...
...-user202729

@についてはuser202729 ...私は1を置くように、スペースが必要である...、あまりにも。もっと短い方法はありますか?
ディルナン

チャレンジ仕様によると、...右揃えにするべきではないと思います。に変更<4するだけ<3ですか?
user202729

@ user202729そのとおりです。仕様を読み間違えたと思います。私はそれが...のために指定するとは思わないが、私はそれを<2に変更することができる
ダイナン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.