Код Гольфу: Лист-Цепція


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

Приклади:

вхід: a 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

вихід: що коли-небудь: це не має значення


Додаткові правила:

  • Вхідні параметри можна розділити на будь-який символ, який ви хочете.
  • Кожна літера повинна використовувати капітал себе як символ асції, щоб намалювати його.
  • Дозволені пробіли, нові лінії тощо
  • Замість програми ви можете написати функцію, яка бере аргумент цифри. Вихід повинен друкуватися нормально.
  • 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

(х,у)нго

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

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

нш=5н , яка є шириною кінцевого виводу.

0х<ш0у<ш(х,у)год

(х5кмод5,у5кмод5)

к[0н-1] .

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


Це працює дуже добре, вітаю! Ви можете спробувати трохи пояснити код?
Ніколя Брауер

Чому шаблон, який зберігається, відображається як в горизонтальному, так і вертикальному напрямку? чи знадобиться більше байтів, щоб не відобразити його взагалі для зберігання? І тивм для пояснення *. *
Ніколя Брауер

1
уш-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,,"")}

Спробуйте в Інтернеті!

Використовує кодування, майже ідентичне Уросу ; однак, це не змінює біти, замість цього вибирає їх безпосередньо використовувати.

Потім він створює 5x5 матрицю бітів і будує матрицю Kronecker Power для створення необхідного шаблону, записуючи результати в stdout.


Це чудове використання Kronecker!
digEmAll


@digEmВсі основою цієї проблеми є метод стиснення (все-таки з точки зору коду-гольфу). Чому б ви не опублікували це як відповідь, щоб і ви могли пояснити це?
Джузеппе

Гаразд, добре дякую!
digEmAll

5

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

Значно коротше з новим форматом IO.

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,,"")}

Спробуйте в Інтернеті!

Відмова від відповідальності:
це рішення було отримано шляхом отримання відповіді @ Джузеппе та заміни матричного стиснення іншим підходом, дуже схожим на той, який використовується у відповіді @ Арнольда , тому, перш за все, перейдіть на зміну їм :)

Ідея така:

Враховуючи цю 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, як пояснено у відповіді @ Джузеппе .


ви можете також використовувати недруковані вироби для гоління -48шматка, а використовувати !замість цього U: спробуйте в Інтернеті
Джузеппе

@Giuseppe: чудово! Я відповів на вікі спільноти, оскільки це результат співпраці :) Не соромтесь редагувати свою погану англійську мову: D
digEmAll
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.