ASCIIアグリッパ番号に変換


8

チャレンジ

自然数を指定して、アグリッパの数体系のASCII形式で出力します。

説明

私は奇妙なアルファベットと数字のシステムが好きです。私のお気に入りの数字体系は、ハインリッヒ・コルネリウス・アグリッパによって与えられたものです。これは、範囲内の数値を簡潔に書き込む方法を提供します。1 [0,9999]桁の数字は次のように記述されます。

1から10までの数字

より小さい数値10^4は1桁の組み合わせですが、次のように1つの中央バーで回転/水平ミラーリングされます。

[0° mirrored, 10's  ] | [0°,            1's  ]
[180°,        1000's] | [180° mirrored, 100's]

以下にいくつかの例を示します。

各種例

同等のASCIIは次のとおりです。

Ones:
  0  1  2  3  4  5  6  7  8  9
  |  |- |_ |\ |/ |~ || |^ |v |]
  |  |  |  |  |  |  |  |  |  |

Tens:
  0  1  2  3  4  5  6  7  8  9
  | -| _| /| \| ~| || ^| v| [|
  |  |  |  |  |  |  |  |  |  |

Hundreds:
  0  1  2  3  4  5  6  7  8  9
  |  |  |  |  |  |  |  |  |  |
  |  |_ |- |/ |\ |~ || |v |^ |]

Thousands:
  0  1  2  3  4  5  6  7  8  9
  |  |  |  |  |  |  |  |  |  |
  | _| -| \| /| ~| || v| ^| [|

 1510:  1511:  1471:  1486:  3421:
 -|     -|-    ^|-    v||    _|-
 _|~    _|~    _|\    -|\    \|\

より大きい数値9999は4桁のセクションに分割され(4の倍数になるように先行ゼロが追加されます)、それぞれが変換されます。例えば:

314159: (0031 4159)
         /|-  ~|]
          |   /|_

ルール

  • あなたの答えは機能か完全なプログラムかもしれません
  • 入力は正の整数です
  • エントリは入力をサポートする必要があります 10^8
  • 各4桁のセクションは正確に6文字
  • 4つのセクションは1つのスペースで区切られています
  • 末尾の改行はオプションです
  • 行ごとに最大2つの末尾スペースを使用できます
  • 自分の答えは受け入れません
  • スコアはバイト単位で、最低スコアが勝ちます!

すみませんが、あなたの例はどれも理解できません。グラフィックスは言うまでもなく、それらは互いに一貫性さえありません。
ニール、

@ニール私は6が一貫していないことを発見しましたが、私はそれらを修正しました。他に何かありますか?また、「グラフィックス」とはどういう意味ですか?ASCIIアートはグラフィックスの私の解釈であり、いかなる種類の直接翻訳でもありません。
マイケルクライン

1
I平均i.stack.imgur.com/2BUbM.gifユニットは右下の右上と数百人であるが、あなたの例では、右下の左の一番上に何百と単位を持っていることを明確に示しています。
Neil

@ニールこれをキャッチしていただきありがとうございます。他に見逃したことはありますか?
マイケルクライン

あなたの1486は2486のように見えますが、私は残りに同意します。
Neil

回答:


3

Haskell、310バイト

  • reverse(私がしたようにr)定義することは、インポートData.Listしてそれを使用するよりも1バイト短いです一度
  • 定義z=0:z(!)=(!!).(++z)される最短の道をまだ私は返すように見つけたその0範囲外のため
  • 私はチェックしてクイックチェックしました take4s機能が、それでも私には魔法のように感じられます

これがコードです:

l=lines"    \n--__\n__--\n\\//\\\n/\\\\/\n~~~~\n||||\n^^vv\nvv^^\n][]["
d x|x<1=[]|1<2=mod x 10:d(div x 10)
(&)=(!!)
z=(0::Int):z
(!)=(&).(++z)
t a=[[a!q|q<-[p..p+3]]|p<-[0,4..length a-1]]
g[c,d,b,a]=[[l&b&1,'|',l&a&0,' '],[l&d&3,'|',l&c&2,' ']]
r[]=[]
r(x:y)=r y++[x]
f=unlines.foldl1(zipWith(++)).map g.r.t.d

より少ないゴルフ:

import Data.List (reverse)

dict = lines "    \n--__\n__--\n\\//\\\n/\\\\/\n~~~~\n||||\n^^vv\nvv^^\n][]["


-- Note that (digits x) returns the digits of x in little-endian order
digits x  | x < 1     = []
          | otherwise = mod x 10 : digits (div x 10)

-- Note: zeros needs the type signature, because otherwise it won't match [Int] (inferred from (!!))
zeros = (0::Int) : zeros

-- list ! position gives the element at the position, or 0 for out of bounds
(!) = (!!) . (++zeros)

-- This partitions the digits into groups of four, padded right
take4s a = [[a!q | q <-[p..p+3]] | p <- [0,4..length a - 1]]

convertOne[c,d,b,a] = [[dict !! b !! 1, '|', dict !! a !! 0, ' '], [dict !! d !! 3, '|', dict !! c !! 2, ' ']]

f = unlines . foldl1(zipWith (++)) . map convertOne . reverse . take4s . digits

テスト(エスケープ文字を削除):

mapM_ print $ lines $ f 1510
-|  
_|~ 

mapM_ print $ lines $ f 1511
-|- 
_|~ 

mapM_ print $ lines $ f 1471
^|- 
_|\ 

mapM_ print $ lines $ f 1486
v|| 
_|\ 

mapM_ print $ lines $ f 3421
_|- 
\|\ 

mapM_ print $ lines $ f 1234567891011121314
_|\ ||^ -|  -|_ -|/ 
 |_ /|~ ^|] _|_ _|/ 

mapM_ print $ lines $ f 1024628340621757567
 |_ _|v  || ^|~ ||^ 
 |_ /|| \|\ -|_ v|~ 

1
投稿から1分以内に、誰もがこれほど長くチャレンジに答えられるのかと思いました。それから私はあなたがOPであるのを見ました。
リルトシアスト2016

3

JavaScript(ES6)、180 159バイト

s=>`000${s}`.slice(-s.length&-4).replace(/..../g,([t,h,d,u])=>(r+=' _-\\/~|v^['[t]+`|${'_-/\\~|v^]'[h]} `,' -_/\\~|^v['[d]+`|${' -_\\/~|^v]'[u]} `),r='')+`\n`+r

どこ \nはリテラルの改行文字を表します。

編集:から,'への切り替え用に更新されました|。シングルreplaceを使用してすべての作業を行うことにより、14バイトを節約しました。の&-4代わりにを使用して3バイトを節約しました<<2>>2。破壊的な割り当てを悪用することで2バイトを節約しました。テンプレート文字列を悪用することで2バイトを節約しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.