Очне яблуко


9

Очне яблуко бінарних значень, надрукованих у вигляді овалів і паличок, не так просто ... Щоб допомогти у цьому, ви повинні написати функцію (або програму), яка друкує числа у власному бінарному поданні.
Тому я хочу взяти число, скажімо, 3 ( 00000011) і вивести біти у визначеному користувачем форматі, наприклад, з розділеними пробілами парами:

00 00 00 11

або, скажімо, у зворотному порядку та з деякими декораторами, наприклад:

11_00_00_00

Крім того, повинна бути можливість відобразити "0" і "1" як власні символи, щоб їх краще розрізнити, наприклад:

XX oo oo oo

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

Специфікація

Функція приймає такий вхід: f (A, маска, нулі, ті)

Параметри:

А - вхідний номер - будь-яке (непідписане) ціле число в діапазоні 0-255.
маска - параметр рядка, який визначає побудову виводу.
нулі - рядок однакової довжини, визначає "нульові" гліфи для кожного вихідного слота.
ті - рядок однакової довжини, визначає "один" гліфів для кожного вихідного слота.

Правила побудови вихідних даних:

Подивіться на це зображення з прикладом уважно, щоб зрозуміти, як генерується результат:

введіть тут опис зображення

Отже, лише однозначні цифри в масці аналізуються та замінюються відповідними бітами A, інші символи залишаються як є . Далі, якщо значення взятого біта дорівнює 1, воно відображається на кінцевому виході як "X", а якщо воно дорівнює 0, воно відображається як "o". У наведеному вище прикладі всі чотири взятих біта є "1", тому ми бачимо "X" у всіх слотах.

Якщо вхідне число було 128, то, логічно, вихід був би X foo bar ooo. Символи в параметрах "нулі" та "одиниці": будь-які символи для друку ASCII, припустимо, вони завжди узгоджуються з маскою.

Примітки :

  • Біти 0-індексовані: 0-й біт - це MSB.
  • Припустимо, що цифри 8,9 не допускаються в рядку маски.
  • Рядки введення містять будь-які символи ASCII для друку.
  • "Нулі" та "ті" узгоджуються з маскою.
  • Для спеціальних символів / модифікаторів у вашій мові: можна припустити, що вони не відображатимуться у рядку введення.

Для наочності див. Більше прикладів.

Введення -> Приклади виводу

Виведіть усі 8 біт у загальному порядку з роздільником пробілу, у загальних позначеннях овальної та паличної форми:

mask  =  "0123 4567"  
zeros =  "0000 0000"  
ones  =  "1111 1111"  

A=1 ->    0000 0001


Виведіть у зворотному порядку в тире-гліфних позначеннях:

mask =    "| 7654 3210 |"
zeros=    "  ---- ----  "
ones =    "  ssss ssss  "

A=1  ->    | s--- ---- |
A=3   ->   | ss-- ---- |
A=128->    | ---- ---s |


Різні позначення на одному виході, наприклад, для упакованих даних:

mask =       "0 | 123 4567"
zeros=       "    --- ----"
ones =       "X   kkk ssss"

A= 15  ->       | --- ssss
A= 16  ->       | --k ----
A= 32  ->       | -k- ----
A= 128 ->     X | --- ----
A= 255 ->     X | kkk ssss


Повторювані шаблони:

mask =    "| 7 66 555 4444 |"
zeros=    "  . .. ... ....  "
ones =    "  0 00 000 0000  "

A= 0 ->    | . .. ... .... |
A= 1 ->    | 0 .. ... .... |
A= 2 ->    | . 00 ... .... |
A= 3 ->    | 0 00 ... .... |
A= 4 ->    | . .. 000 .... |

Оновлення

Правила були дещо спрощені - програма повинна надрукувати лише одне число (а не масив / список номерів, як було запропоновано спочатку).


Чи можемо ми також подати програму, яка приймає чотири входи? Деякі мови не дуже добре виконують функції.
Стівен

@StephenS Я думаю, що так, але я не впевнений, що я зрозумію це: /
Михайло V

2
Останні два аргументи здаються абсолютно нерелевантними для більшості мов, чому б просто не вимагати 1 і 0? Перший аргумент, який є списком, не здається великим, окрім того, що звичайні мови додають простий цикл / рекурсію, роблячи набагато складніше конкуренцію більш езотеричним мовам.
FryAmTheEggman

@MikhailV, якщо ви хочете зрозуміти всі матеріали, які стосуються ваших проблем, удачі: / більшість із них мають посилання TryItOnline, щоб ви могли бачити, як вони працюють, але більшість мов для гольфу виглядають як дурниця, поки ви не знаєте, що вони роблять
Стівен,

@FryAmTheEggman Я також не розумію, що Aробить, оскільки це те саме у всіх тестових випадках
Стівен

Відповіді:


2

JavaScript (ES6), 57 байт

(A,M,O,I)=>M.replace(/[\d]/g,(d,i)=>(A>>7-d)%2?I[i]:O[i])


2

Рубін , 48 байт

->a,f,*b{f.gsub(/\d/){b[a[55-$&.ord]][$`.size]}}

Параметри нулів і одиниць розглядаються як масив ( *b), а параметр нулі зберігається в, b[0]а параметр - зберігається в b[1].

Параметр маски fмає кожну цифру ( /\d/), заміщену символом з відповідного масиву. Спеціальна змінна $`, яка містить текст, що веде до поточного збігу, тут (ab) використовується для відстеження положення.

Рубійна індексація Рубі називає 0 найменш значущим бітом, але виклик називає 0 найбільш значущим бітом. Віднімання ASCII від 55 (символ 7) дає корисний бітовий індекс Ruby.

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



1

Пітон, 97 байт

lambda A,M,Z,O:"".join([[Z,O][1&(A>>7-int(d))][i] if d.isdigit() else d for i,d in enumerate(M)])

1

Математика, 131 байт

""<>Table[(f/@{##2})[[x[[i]],i]],{i,Length[x=(f=Characters)@#2/.Table[ToString@i->2+Floor[#/2^(7-i)]~Mod~2,{i,0,7}]/._String->1]}]&

Length[x]може бути Length@xі {#2,#3,#4}може бути {##2}.
CalculatorFeline

Також, StringJoin@@може бути StringJoin@і #1є просто#
CalculatorFeline

Я трохи спростив правила, дивіться оновлення.
Михайло V

1

q / kdb +, 86 64 байт

Рішення:

f:{[A;M;Z;O]@[M;m;:;((-8#0b vs A)"I"$'M m)(Z;O)'m:(&)M in .Q.n]}

Приклади:

q)f[1;"0123 4567";"0000 0000";"1111 1111"]
"0000 0001"
q)f[1;"| 7654 3210 |";"  ---- ----  ";"  ssss ssss  "]
"| s--- ---- |"
q)f[15;"0 | 123 4567";"    --- ----";"X   kkk ssss"]
"  | --- ssss"
q)f [0;"| 7 66 555 4444 |";"  . .. ... ....  ";"  0 00 000 0000  "]
"| . .. ... .... |"

Пояснення:

Витягніть індекси, де вхідна маска Mє цифрою, назвіть це mсаме там, де ми будемо змінювати маску введення. Вийміть цифри з рядка, киньте на цілі числа, а потім індексуйте в наш 8-бітний масив, щоб отримати правильне впорядкування. Використовуйте цей 8-бітний масив, щоб індексувати або O(якщо встановлено 1), або Z(якщо встановлено 0), а потім індексуйте в ці списки за індексами, заданими m. Нарешті застосуйте ( :) цей новий список до оригінальної маски за індексами m.

{[A;M;Z;O]                                                   } / lambda function with 4 parameters
          @[ ; ; ;                                          ]  / apply, applies 3rd parameter to 1st parameter at indexes from parameter 2 with parameter 4 :)
                   (-8#0b vs A)                                / convert input number to binary (64 bit), take the last 8 items
                                              m:(&)M in .Q.n   / returns indices where mask is in "0123..789", stores in variable m
                               "I"$'M m                        / index into mask at indices m, then cast these numbers to an integer array
                  (                    )                       / we then index into our 8 bits a these offsets to get the output order
                                        (Z;O)                  / 2-item list of the zeroes and ones mask
                                             '                 / take each item on the left and right and apply them to (Z;O) (ie index in at 0 / 1 and then 123..67)
            M m :                                              / apply *this* list to M at each index given by m

Примітки:

Не могли б витрусити ще 14 байт, якби нам дали аргументи у формі:

[A;M;(Z;O)]

а д дозволяє до 3 -х аргументів слід приділити функції без явного імені (вони x, yі zвідповідно):

f:{@[y;m;:;((-8#0b vs x)"I"$'y m)z'm:(&)y in .Q.n]}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.