Codegolf — Конвертировать В Числа Агриппы Ascii

  • Автор темы Александр Гладких
  • Обновлено
  • 21, Oct 2024
  • #1

Испытание

Учитывая натуральное число, выведите его в формате ASCII системы счисления Агриппы.

Описание

Мне нравятся странные алфавиты и системы счисления. Моя любимая система счисления – та, что дана Генрих Корнелий Агриппа. Это дает краткий способ записи чисел в диапазоне

 
 
 10^8 
, where single digits are written as follows:

codegolf — конвертировать в числа Агриппы ASCII

Большие числа меньше 314159: (0031 4159) /|- ~|] | /|_ are a combination of single digits, but rotated/horizontally-mirrored on a single central bar as follows:

9999

Вот несколько примеров:

codegolf — конвертировать в числа Агриппы ASCII

Эквивалентами 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|| _|- _|~ _|~ _|\ -|\ \|\

Числа больше, чем [0° mirrored, 10's ] | [0°, 1's ] [180°, 1000's] | [180° mirrored, 100's] are broken up into sections of 4 digits (with leading zeros added to get a multiple of four) and each is converted. For example:

10^4

Правила

  • Ваш ответ может быть функцией или полной программой
  • Входные данные — положительное целое число.
  • Записи должны поддерживать входные данные более чем [0,9999]
  • Каждый четырехзначный раздел занимает ровно шесть символов.
  • Секции из четырех разделяются одним пробелом.
  • Завершающая новая строка не является обязательной
  • Допускается до двух конечных пробелов в строке.
  • Я не приму свой ответ
  • Оценка указывается в байтах, побеждает наименьший результат!

#код-гольф #ascii-art #kolmogorov-complexity

Александр Гладких


Рег
28 Oct, 2020

Тем
95

Постов
213

Баллов
718
  • 26, Oct 2024
  • #2

Хаскелл, 310 байт

  • Определение
     
     
     
     <<2>>2 
    (as I did: &-4 ) на один байт короче, чем при импорте replace and using it just один раз
  • Определение | and ,' это самый короткий путь, который я нашел, чтобы вернуться \n for out of bounds
  • Я проверил и быстроПроверил 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 function, but it still feels like magic to me

Вот код:

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

Меньше гольфа:

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

Тесты (удалены escape-символы):

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 ||answer||

JavaScript (ES6), 180 159 байт

take4s

Где 0 represents a literal newline character.

Изменить: Обновлено для перехода с (!)=(!!).(++z) to z=0:z . Сэкономлено 14 байт за счет использования одного Data.List to do all the work. Saved 3 bytes by using r вместо reverse . Saved 2 bytes by abusing destructuring assignment. Saved 2 bytes by abusing template strings.

 

Jeniboyde


Рег
18 Feb, 2014

Тем
75

Постов
180

Баллов
565