Chuyển đổi sang số Agrippa ASCII


8

Thử thách

Cho một số tự nhiên, xuất nó dưới dạng ASCII của hệ thống số của Agrippa.

Sự miêu tả

Tôi thích bảng chữ cái lẻ và hệ thống chữ số. Hệ thống chữ số yêu thích của tôi được đưa ra bởi Heinrich Cornelius Agrippa . Nó đưa ra một cách ngắn gọn để viết các số trong phạm vi [0,9999], trong đó các chữ số đơn được viết như sau:

Chữ số từ 1 đến 10

Các số lớn hơn ít hơn 10^4là sự kết hợp của các chữ số đơn, nhưng được xoay / nhân đôi theo chiều ngang trên một thanh trung tâm duy nhất như sau:

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

Đây là vài ví dụ:

Ví dụ các loại

Tương đương ASCII là:

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

Các số lớn hơn 9999được chia thành các phần gồm 4 chữ số (với các số 0 đứng đầu được thêm vào để có bội số của bốn) và mỗi số được chuyển đổi. Ví dụ:

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

Quy tắc

  • Câu trả lời của bạn có thể là một chức năng hoặc chương trình đầy đủ
  • Đầu vào là một số nguyên dương
  • Bài dự thi phải hỗ trợ đầu vào 10^8
  • Mỗi phần bốn chữ số có đúng sáu ký tự
  • Các phần của bốn được phân tách bằng một khoảng trắng
  • Trailing newline là tùy chọn
  • Cho phép tối đa hai dấu cách trên mỗi dòng
  • Tôi sẽ không chấp nhận câu trả lời của riêng tôi
  • Điểm được tính bằng byte, điểm số thấp nhất sẽ thắng!

Xin lỗi, nhưng tôi không hiểu bất kỳ ví dụ nào của bạn; chúng thậm chí không nhất quán với nhau, nói gì đến đồ họa.
Neil

@Neil Tôi thấy rằng 6 không nhất quán, nhưng tôi đã sửa chúng. Có gì khác? Ngoài ra, "đồ họa" nghĩa là gì? Nghệ thuật ASCII là sự giải thích của tôi về đồ họa, không phải là bản dịch trực tiếp dưới bất kỳ hình thức nào.
Michael Klein

1
Ý tôi là i.stack.imgur.com/2BUbM.gif cho thấy rõ rằng các đơn vị ở trên cùng bên phải và hàng trăm ở dưới cùng bên phải, nhưng các ví dụ của bạn có hàng trăm ở phía trên bên trái và các đơn vị ở dưới cùng bên phải.
Neil

@Neil Cảm ơn bạn đã nắm bắt điều này. Tôi đã bỏ lỡ bất cứ điều gì khác?
Michael Klein

1486 của bạn trông giống như 2486 với tôi, nhưng bây giờ tôi đồng ý với phần còn lại.
Neil

Câu trả lời:


3

Haskell, 310 byte

  • Xác định reverse(như tôi đã làm r:) ngắn hơn một byte so với nhập Data.Listvà sử dụng nó chỉ một lần
  • Xác định z=0:z(!)=(!!).(++z)là con đường ngắn nhất mà tôi đã tìm thấy để trở về 0ngoài giới hạn
  • Tôi đã kiểm tra và kiểm tra nhanh take4schức năng, nhưng tôi vẫn cảm thấy như là phép màu đối với tôi

Đây là mã:

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

Ít chơi gôn hơn:

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

Các thử nghiệm (ký tự thoát được loại bỏ):

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
Tôi tự hỏi làm thế nào bất cứ ai có thể trả lời một thách thức lâu như vậy trong vòng một phút sau khi đăng. Sau đó tôi thấy bạn là 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

Trường hợp \nđại diện cho một nhân vật dòng chữ mới.

Chỉnh sửa: Cập nhật cho chuyển đổi từ ,'sang |. Đã lưu 14 byte bằng cách sử dụng một đơn replaceđể thực hiện tất cả công việc. Đã lưu 3 byte bằng cách sử dụng &-4thay vì <<2>>2. Đã lưu 2 byte bằng cách lạm dụng chuyển nhượng hủy. Đã lưu 2 byte bằng cách lạm dụng các chuỗi mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.