Код Гольф: Письмо-Цепсион


15

Соревнование:

Для ввода одной буквы X (верхнего или нижнего регистра от A до Z) и одной цифры N (0-9) выведите соответствующую букву X из N * X.

Письмо должно быть из этого списка:

 AAA      BBBB       CCCC     DDDD      EEEEE     FFFFF      GGG      H   H
A   A     B   B     C         D   D     E         F         G         H   H
AAAAA     BBBB      C         D   D     EEEE      FFFF      G  GG     HHHHH
A   A     B   B     C         D   D     E         F         G   G     H   H
A   A     BBBB       CCCC     DDDD      EEEEE     F          GGG      H   H


IIIII         J     K   K     L         M   M     N   N      OOO 
  I           J     K  K      L         MM MM     NN  N     O   O
  I           J     KKK       L         M M M     N N N     O   O
  I       J   J     K  K      L         M   M     N  NN     O   O
IIIII      JJJ      K   K     LLLLL     M   M     N   N      OOO 


PPPP       QQQ      RRRR       SSSS     TTTTT     U   U     V   V     W   W
P   P     Q   Q     R   R     S           T       U   U     V   V     W   W
PPPP      Q   Q     RRRR       SSS        T       U   U     V   V     W   W
P         Q  QQ     R  R          S       T       U   U      V V      W W W
P          QQQQ     R   R     SSSS        T        UUU        V        W W 


X   X     Y   Y     ZZZZZ
 X X       Y Y         Z 
  X         Y         Z  
 X X        Y        Z   
X   X       Y       ZZZZZ

Примеры:

вход: 1

выход:

 AAA
A   A
AAAAA
A   A
A   A

вход: A 0

выход: A


вход: A 2

выход:

      AAA  AAA  AAA
     A   AA   AA   A
     AAAAAAAAAAAAAAA
     A   AA   AA   A
     A   AA   AA   A
 AAA                 AAA
A   A               A   A
AAAAA               AAAAA
A   A               A   A
A   A               A   A
 AAA  AAA  AAA  AAA  AAA
A   AA   AA   AA   AA   A
AAAAAAAAAAAAAAAAAAAAAAAAA
A   AA   AA   AA   AA   A
A   AA   AA   AA   AA   A
 AAA                 AAA
A   A               A   A
AAAAA               AAAAA
A   A               A   A
A   A               A   A
 AAA                 AAA
A   A               A   A
AAAAA               AAAAA
A   A               A   A
A   A               A   A

вход: А -1

выход: что когда-либо: это не имеет значения


Дополнительные правила:

  • Входные параметры могут быть разделены тем символом, который вы хотите.
  • Каждая буква должна использовать заглавную букву как символ ascii, чтобы нарисовать ее.
  • Разрешены пробелы, новые строки и т. Д.
  • Вместо программы вы можете написать функцию, которая принимает цифровую строку в качестве аргумента. Вывод должен быть напечатан нормально.
  • Stdout / Stderr не имеет значения, просто выберите один. Если материал напечатан на другом, тоже не имеет значения.
  • Возможные форматы вывода могут быть распечатаны в STDOUT, возвращены в виде списка строк, возвращены в виде символьной матрицы и т. Д., Если результат можно просто распечатать, используя метод печати по умолчанию для языков. *

*: подобно функции f (a, 1) возвращает строку, и можно просто сказать, что print (f (a, 1)) не делает вызов print () частью ответа. (На это указывали Кевин Круйссен и Арно).

Выигрыш:

Это код-гольф, побеждает наименьшее количество байтов. Веселиться!


Edit : этот вопрос кажется очень идентичен с этим , однако я бы сказал , что это не так , как она должна работать не только для H , но для каждой буквы из алфавита .. Думаю , вы решите , а или не является дубликатом.



3
@ElPedro Спасибо! Я еще не знал о песочнице, большое спасибо, я поближе на нее посмотрю!
Николас Брауэр

2
Хороший первый вызов! Тем не менее, ваш вопрос в настоящее время предполагает, что мы можем только напечатать результат. Правило по умолчанию состоит в том, что функциям разрешено просто возвращать его. Вообще говоря, форматы ввода / вывода очень гибкие. Возможно, вы захотите взглянуть на этот пост в мета, который объясняет, почему.
Арно

2
@Arnauld, как и об искусстве ASCII, я бы сказал, что вывод результата несколько важен для задачи, но я думаю, что если ваш код возвращает результат, а возвращаемую строку можно просто напечатать, используя метод печати по умолчанию для языков (например, ваша функция f (a, 1) возвращает строку, и я могу просто сказать, print (f (a, 1)) вызов print () не должен быть частью кода ответа. Если это несколько понятно, и вы согласны, я могу добавить это к описание задачи
Николя Брауэр

2
@KevinCruijssen Я немного обновил вопрос, пожалуйста, скажите мне, если это понятно, как я это написал :)
Николас Брауэр

Ответы:


6

JavaScript (ES8), 281 байт

Принимает вход как (letter)(N). Возвращает строку.

c=>n=>(g=y=>y--?''.padEnd(w).replace(/./g,(_,x)=>(h=d=>~~(d/=5)?(P=parseInt)('hhvhefhfhfu111ufhhhfv1f1v11f1vehp1ehhvhhv444vehgggh979hv1111hhlrhhpljhehhhe11fhfuphheh9fhffge1u4444vehhhh4ahhhalhhhha4ah444ahv248v'[y/d%5+5*P(c,36)-50|0],36)>>x/d%5&1?h(d):' ':c)(w))+`
`+g(y):'')(w=5**n)

Попробуйте онлайн!

Как?

Шрифтовая кодировка

5×5031

Сохраненный шаблон зеркально отражается как по горизонтали, так и по вертикали.

Пример для 'F':

#####     ....#     00001      1     '1'
#....     ....#     00001      1     '1'
####. --> .#### --> 01111 --> 15 --> 'f' --> '11f1v'
#....     ....#     00001      1     '1'
#....     #####     11111     31     'v'

26×5знак равно130

(Икс,Y)Nго

parseInt('hhvhefhfh...'[y + 5 * n], 36) >> x & 1

Основной алгоритм

Nвесзнак равно5N

0Икс<вес0Y<вес(Икс,Y)час

(Икс5Кмодификация5,Y5Кмодификация5)

К[0...N-1]

Функция возвращает пробел, как только на некоторой глубине обнаруживается пустой пиксель, или символ, соответствующий вводимой букве, если все итерации выполнены успешно.


Работает действительно хорошо, поздравляю! Можете ли вы попытаться объяснить код немного, пожалуйста?
Николас Брауэр

Почему сохраненный шаблон зеркально отражается как по горизонтали, так и по вертикали? потребовалось бы больше байтов, чтобы вообще не отражать его для хранения? И тывм за объяснение *. *
Николя Брауэр

1
Yвес-10

1
(Хотя я думаю, что мы могли бы бесплатно уронить вертикальное зеркало.)
Арно

6

R , 348 байт

function(K,N){if(N)for(i in 1:N)T=T%x%matrix(c(15269425,32045630,16269839,32032318,33061407,33061392,15224366,18415153,32641183,1082926,18444881,17318431,18732593,18667121,15255086,32045584,15255151,32045649,16267326,32641156,18400814,18400580,18400938,18157905,18157700,32575775)[utf8ToInt(K)-64]%/%2^(24:0)%%2,5,5)
write(c(" ",K)[T+1],1,5^N,,"")}

Попробуйте онлайн!

Использует кодировку, почти идентичную кодировке Ouros ; однако, он не инвертирует биты, а предпочитает использовать их напрямую.

Затем он создает матрицу битов 5x5 и строит матрицу мощности Кронекера для генерации необходимого шаблона, записывая результаты в стандартный вывод.


Это отличное использование Kronecker!
digEmAll


@digEmВ основе этой проблемы лежит метод сжатия (в любом случае, с точки зрения код-гольфа). Почему бы вам не опубликовать это как ответ, чтобы вы тоже могли это объяснить?
Джузеппе

Хорошо, хорошо, спасибо!
digEmAll

5

Чисто , 436 372 байта

Значительно короче с новым форматом ввода-вывода.

import StdEnv,StdLib
t=transpose
f=flatten
$0c=[[c]]
$n c=f[t(f[t($(n-1)if(isOdd({#18415150,16301615,31491134,16303663,32554047,1096767,15262766,18415153,32641183,15254032,18128177,32539681,18405233,18667121,15255086,1097263,32294446,18136623,16267326,4329631,15255089,4539953,11191857,18157905,4329809,32575775}.[toInt(max'A'c)-65]>>p))c' ')\\p<-[i..i+4]])\\i<-[0,5..20]]

Попробуйте онлайн!

Сжатие буквенных шаблонов в биты целочисленных литералов для сохранения ~ 700 байтов. Например, A:

  1. Свести [[' AAA '],['A A'],['AAAAA'],['A A'],['A A']]
  2. Задний ход [' AAA A AAAAAAA AA A']
  3. Превратить ['A AA AAAAAAA A AAA ']в бинарный ( 'A' = 1, ' ' = 0)
  4. Превратить 0b1000110001111111000101110в десятичную
  5. Получить 18415150

4

R , 259 байт

function(K,N,`!`=utf8ToInt){if(N)for(i in 1:N)T=T%x%(sapply(!"			




",intToBits)[1:5,5*(-64+!K)-4:0]>0)
write(c(" ",K)[T+1],1,5^N,,"")}

Попробуйте онлайн!

Отказ от ответственности:
это решение было получено, если взять ответ @ Giuseppe и заменить сжатие матрицы другим подходом, очень похожим на тот, который использовался в ответе @ Arnauld , поэтому прежде всего оцените их :)

Идея заключается в следующем:

Учитывая эту 5 x 26*5матрицу 0/1:

(1 replaced by '#', 0 replaced by '.' and '|' added for readability)

.####|#####|.###.|#####|#####|#####|.###.|#####|#...#|...#.|#####|#####|#####|
#.#..|#.#.#|#...#|#...#|#.#.#|#.#..|#...#|..#..|#...#|....#|..#..|....#|.#...|
#.#..|#.#.#|#...#|#...#|#.#.#|#.#..|#...#|..#..|#####|....#|..#..|....#|..#..|
#.#..|#.#.#|#...#|#...#|#.#.#|#.#..|#.#.#|..#..|#...#|....#|.#.#.|....#|.#...|
.####|.#.#.|#...#|.###.|#...#|#....|..##.|#####|#...#|####.|#...#|....#|#####| ...
  ^     ^     ^     ^     ^     ^     ^     ^     ^     ^     ^     ^     ^   
  |     |     |     |     |     |     |     |     |     |     |     |     |   
  A     B     C     D     E     F     G     H     I     J     K     L     M   

каждый столбец считается двоичным числом и преобразуется в целое число. Эти целые числа затем преобразуются в непечатаемые ASCII в диапазоне 1 ... 31:

Например, для столбцов "B"конечная строка будет "\017\021\017\021\017"(непечатаемые символы записаны в восьмеричном представлении):

#####                   ####.     11110          15            '\017'
#.#.#                   #...#     10001          17            '\021'
#.#.#      ------->     ####. --> 11110  ------> 15   ------>  '\017'
#.#.#                   #...#     10001          17            '\021'
.#.#.                   ####.     11110          15            '\017'

          (transposed                  bin to int   int to ASCII
         for reability)    

Следовательно, учитывая последнюю строку 5*26 = 130символов, мы конвертируем эту строку обратно в матрицу 0/1использования:

sapply(utf8ToInt(STRING),intToBits)

затем мы просто подразделяем матрицу, выбирая только первые 5 строк (intToBits возвращает 32 бита) и только столбцы, соответствующие букве, переданной в качестве ввода, и, наконец, применяем kronecker, как объяснено в ответе @ Giuseppe .


Вы также можете использовать непечатаемые, чтобы сбрить -48кусок, и использовать !вместо U: попробуйте онлайн
Giuseppe

@ Джузеппе: отлично! Я сделал ответ в вики сообщества, так как это результат совместной работы :) Не стесняйтесь редактировать мой плохой английский: D
digEmAll
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.