Konversikan ke Nomor Agrippa ASCII

8

Tantangan

Dengan diberi nomor alami, tampilkan dalam bentuk ASCII dalam sistem angka Agrippa.

Deskripsi

Saya suka huruf aneh dan sistem angka. Sistem angka favorit saya adalah yang diberikan oleh Heinrich Cornelius Agrippa . Ini memberi cara ringkas untuk menulis angka dalam rentang [0,9999], di mana satu digit dituliskan sebagai berikut:

Angka dari 1 hingga 10

Angka yang lebih besar kurang dari 10^4kombinasi angka tunggal, tetapi diputar / dicerminkan secara horizontal pada bar pusat tunggal sebagai berikut:

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

Berikut ini beberapa contoh:

Berbagai macam contoh

Setara ASCII adalah:

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||    _|-
 _|~    _|~    _|\    -|\    \|\

Angka yang lebih besar dari 9999yang dipecah menjadi bagian-bagian dari 4 digit (dengan nol di depan ditambahkan untuk mendapatkan kelipatan empat) dan masing-masing dikonversi. Sebagai contoh:

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

Aturan

  • Jawaban Anda mungkin fungsi atau program lengkap
  • Inputnya adalah bilangan bulat positif
  • Entri harus mendukung input 10^8
  • Setiap bagian empat digit membutuhkan tepat enam karakter
  • Bagian empat dipisahkan oleh satu ruang
  • Mengejar baris baru adalah opsional
  • Hingga dua ruang trailing per baris diperbolehkan
  • Saya tidak akan menerima jawaban saya sendiri
  • Skor dalam byte, skor terendah menang!
Michael Klein
sumber
Maaf, tapi saya tidak mengerti contoh Anda; mereka bahkan tidak konsisten satu sama lain, apalagi grafisnya.
Neil
@Neil Saya menemukan bahwa 6 tidak konsisten, tapi saya sudah memperbaikinya. Apakah ada hal lain? Juga, apa yang Anda maksud dengan "grafik"? Seni ASCII adalah interpretasi saya terhadap grafik, bukan terjemahan langsung dalam bentuk apa pun.
Michael Klein
1
Maksud saya i.stack.imgur.com/2BUbM.gif jelas menunjukkan bahwa unit berada di kanan atas dan ratusan di kanan bawah, tetapi contoh Anda memiliki ratusan di kiri atas dan unit di kanan bawah.
Neil
@Neil Terima kasih telah menangkap ini. Apakah saya melewatkan sesuatu yang lain?
Michael Klein
1486 Anda terlihat seperti 2486 bagi saya, tetapi saya sekarang setuju dengan yang lainnya.
Neil

Jawaban:

3

Haskell, 310 byte

  • Mendefinisikan reverse(seperti yang saya lakukan r:) adalah satu byte lebih pendek daripada mengimpor Data.Listdan menggunakannya hanya sekali
  • Menentukan z=0:zdan (!)=(!!).(++z)merupakan cara terpendek yang saya temukan untuk kembali 0tanpa batas
  • Saya sudah memeriksa dan cepat memeriksa take4sfungsinya, tetapi masih terasa ajaib bagi saya

Berikut kodenya:

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

Kurang golf:

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

Tes (karakter pelepasan dihapus):

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|~ 
Michael Klein
sumber
1
Saya bertanya-tanya bagaimana orang bisa menjawab tantangan selama ini dalam satu menit setelah posting. Lalu aku melihat kamu OP.
lirtosiast
3

JavaScript (ES6), 180 159 byte

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

Dimana \nmewakili karakter baris baru literal.

Sunting: Diperbarui untuk beralih dari ,'ke |. Disimpan 14 byte dengan menggunakan satu replaceuntuk melakukan semua pekerjaan. Disimpan 3 byte dengan menggunakan &-4bukan <<2>>2. Disimpan 2 byte dengan menyalahgunakan penugasan perusakan. Disimpan 2 byte dengan menyalahgunakan string template.

Neil
sumber