Денніс, Дорноб, Мартін Бюттнер, Кріс Єстер-Янг - Піцерія!


42

Програмування Головоломки та Код Гольф збирається придбати нового модератора , Денніс ! Цей виклик є даниною йому та іншим нашим активним (або останнім часом активним) модераторам: Дорнобб , Мартін Бюттнер та Кріс Єстер-Янг . Заголовок виклику призначений для прочитання під мелодію пісні Pepto Bismol .

В основному, ми будемо розглядати їх всі піци в Дев'ятнадцяте Укус піцерії , але ми повинні переконатися , що вони поділяють це досить , бо деякі з тих модов , як відомо, піца наркоманами!

Піцерії, продані піцерією, - це прямокутні блоки тексту. Ширина і довжина піци можуть бути будь-якими невід’ємними цілими числами, якщо їх продукт розділиться на чотири. Кожен простір сітки в блоці текстової піци являє собою фрагмент, тому завжди можна розділити скибочки на чотири рівні групи.

Моди колективно замовляють одну піцу, надаючи своїм серверам параметри ширини та довжини у будь-якому розумному форматі, наприклад [width],[length]. Незадовго до того, як піца приїде до їх столу, потрібно позначити кожен шматочок початковим модом, який отримує його з'їсти, щоб гарантувати, що всі вони справедливо поділяються. Кожен повинен отримати однакову кількість скибочок.

  • E для Денніса
  • D є для Doorknob
  • M є для Мартіна
  • C для Кріса

Проте, модники мають невелику ступінь, і вони вимагають, щоб їх відповідні набори зрізів були пов'язані шляхом , тобто щоб усі їх фрагменти можна було дістати один від одного, рухаючись вгору, вниз, вліво та вправо, не перетинаючи чужих скибочки (і не рухаються по діагоналі). Байдуже, як ви це робите, доки це робиться.

Після того, як ви точно позначили кожен шматочок, доставляйте піцу модникам за допомогою додаткового нового рядка.

Ваш етикетка може бути програмою або функцією і може друкувати або повертати мітку піци. Виграє найкоротший ярлик в укусах.

Приклади

Приклад 1

Замовлення: 4,1

Деякі можливі піци з написом:

EDMC
MEDC
CDEM

Приклад 2

Замовлення: 4,4

Деякі можливі піци з написом:

MMMM
CCCC
DDDD
EEEE
DEMC
DEMC
DEMC
DEMC
CCCC
DEEM
DEEM
DDMM

Приклад 3

Замовлення: 8,3

Деякі можливі піци з написом:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Приклад 4

Замовлення: 20,5

Можлива мітка піци:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

( DТут не просто пов'язано, але це нормально.)


12
@BetaDecay Це в основному пристрій для римування діареї.
Захоплення Кальвіна

28
Вони вимагають, щоб їхні відповідні набори зрізів були пов'язані шляхом . Трохи страшно, що ви про це знаєте ...
Денніс

22
Гаразд, що з цим дивним шматочком піци, який ви подарували мені прямокутної форми? Я хочу повернути гроші!
Дверна ручка

12
@flawr Не для подобається вам, не мод.
Захоплення Кальвіна

14
"Найкоротший етикетчик в укусах виграє" - я бачу, що ви там зробили.
DankMemes

Відповіді:


21

CJam, 20 байт

q~1$*4/"CEDM"e*/:$N*

Я думаю, що це має працювати :)

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

Пояснення:

Спершу робиться піца з написом CC… EE… DD… MM… зліва направо і зверху вниз, а потім сортує кожен ряд за алфавітом. Єдині відключення можуть статися між кордоном CE та кордоном ED, або кордоном ED та кордоном DM (якщо вони потрапляють на сусідні ряди). Але сортування гарантує, що E переходять у праву сторону, а D - у ліву, як C <E> D <M, так що E і D залишаються з'єднаними.

q~          read and evaluate the input
1$          copy the width
*4/         multiply with the height and divide by 4
"CEDM"e*    repeat each letter in "CEDM" that many times
/           split into rows of the given width
:$          sort each row
N*          join with newlines

1
Вибірково обертаються рядки, якими поділяються Дорноб і я. Це одне розумне використання $!
Денніс

8

Pyth, 30 25 байт

jb.eu_GkbceQs*R/*FQ4"EDMC

Демо-версія та всі тестові приклади .

Відріжте 5 байт завдяки @Jakube!

Такий же алгоритм, як і моя відповідь К ... але набагато коротший.

30-байтна версія:

jb.e?%k2_bbcjkm*/*FQ4d"EDMC"hQ

Демонстраційна демонстрація та всі тестові випадки для 50-байтної версії .


7

К, 61 байт

{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}

Приклади:

ryan@DevPC-LX:~/golf$ rlwrap k2
K 2.8 2000-10-10 Copyright (C) 1993-2000 Kx Systems
Evaluation. Not for commercial use. 
\ for help. \\ to exit.

  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[4;1]
EDMC
  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[4;4]
EEEE
DDDD
MMMM
CCCC
  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[8;3]
EEEEEEDD
MMMMDDDD
MMCCCCCC
  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[20;5]
EEEEEEEEEEEEEEEEEEEE
DDDDDDDDDDDDDDDEEEEE
DDDDDDDDDDMMMMMMMMMM
CCCCCMMMMMMMMMMMMMMM
CCCCCCCCCCCCCCCCCCCC

ryan@DevPC-LX:~/golf$ 

Мені б не хотілося бути людиною, яка повинна нарізати ці речі ...


Схоже, це зигзаги вперед-назад, зверху вниз. Це правильно? (Буде це працювати 1,8?)
Захоплення Кальвіна

@ Calvin'sHobbies Схоже, працює для цього вводу.
kirbyfan64sos

1
Я збирався використовувати той самий підхід, і я впевнений, що він працює. Це хоч С Хріс.
Денніс

@Dennis Whoops. Виправлено.
kirbyfan64sos

7

Pyth, 20 байт

VceQs*L/*FQ4"CEDM"SN

Використовує фокус сортування @ aditsu.

Демонстрація.

Я придумав велику кількість альтернативних програм однакової довжини, намагаючись пограти в цей гольф:

VceQs*L/*FQ4"CEDM"SN
VceQsCm"CEDM"/*FQ4SN
VceQs*L*FQ"CEDM"%4SN
VceQ%4s*L*FQ"CEDM"SN
VcQs*L/*Qvz4"CEDM"SN    (Newline separated input)
jbSMceQs*L/*FQ4"CEDM
Vcs*L/*FQ4"CEDM"hQSN

6

Застряг , 42 33

Він повертається! І в жахливо довгій формі. :( - Я вкрав подібну ідею aditsu, щоб зберегти 9 байт :)

t;g*4/[4*"CEDM"z"];F*":j0GK'$:Nj

Пояснення:

t;g*4/                              # Take |-separated input,
                                    #   store the first value in var stack,
                                    #   multiply the two numbers and divide by 4.
      [4*"CEDM"z                    # Wrap that value in an array, make 3 copies
                                    #   to get a list of length 4, zip with "EDMC"
                "];F*":j0GK         # For each item, multiply letter by value to
                                    #   to get string, join the result, split into
                                    #   segments the size of the saved variable.
                            '$:Nj   # For each item, sort so the letters are in the correct
                                    #   order, join by newline, print.

Приклад введення:

20|5

Приклад виводу:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Ви впевнені, що це буде просто підключено 8|3?
йо

@yo 'Так. Він виводить CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Каде

/ me_stupid, вибачте за це.
yo

4

Вир. 1 С, 74

i;f(w,h){for(i=w*h;i--;i%w||puts(""))putchar(h-i/w*2==1^"CDEM"[i*4/w/h]);}

Для збереження в 1 байті ця версія повертає (лише) середній ряд фрагментів для будь-якої непарної кількості рядків.

Обр. 0 С, 75

i;f(w,h){for(i=w*h;i--;i%w||puts(""))putchar(h==3&i/w==1^"CDEM"[i*4/w/h]);}

Тут багато відповідей на зигзаг, але в більшості випадків просто виведення букв у порядку (зліва направо, зверху вниз) працює добре:

Не потрібно проводити зигзаг на висоту 1,2 або 4

Не потрібно проводити зигзаг на висоті, що перевищує 4 (раціон піци кожного мода обернеться навколо.)

Тому нам потрібно насправді зигзагувати лише тоді, коли висота дорівнює 3, і тоді нам потрібно лише перевернути середній ряд.

Як виявляється, Dennis та Doorknob - єдині модники в цьому ряду. І їх можна міняти, XORing їх ASCII коди з 1.

Це зручно, враховуючи, що не існує простого способу повернути рядок у C.

Ungolfed в тестовій програмі

i;
f(w,h){
  for(i=w*h;i--;i%w||puts(""))            //loop through all squares. puts inserts a newline at the END of each line.
  putchar(h==3&i/w==1^"CDEM"[i*4/w/h]);   //put the letter, XORing D and E for the middle row of height 3.
}

W,H;
main(){
  scanf("%d%d",&W,&H);
  f(W,H);
} 

Чудове пояснення.
трихоплакс

1

JavaScript (ES6) 107

Зигзагоподібний розчин. Використовуючи рядок шаблону, новий рядок є значущим і підраховується.

Перевірте запуск фрагмента з FireFox.

f=(w,h)=>{for(i=o=r='',z=l=1;--l?l:c='CDEM'[l=w*h/4,i++];r[w-1]&&(o+=r+`
`,r='',z=!z))r=z?r+c:c+r;return o}


//TEST

(test=_=>([w,h]=I.value.match(/\d+/g),O.innerHTML=f(w,h)))()
<input id=I value='8 3'><button onclick='test()'>-></button>
<pre id=O></pre>


0

Сітківка , 83 байти

Особливості, використані у цій відповіді, новіші, ніж ця проблема (не те, що це має значення ...). Кількість байтів передбачає кодування ISO 8859-1.

\d+
$*#
#(?=.*¶(.+))
$1
\G####
CDEM
S_`((.)+?(?=.*¶(?<-2>#)+$))|\D
O`.
T`DE`ED
O%`.

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

Це реалізує рішення aditsu, яке тепер є дещо здійсненним завдяки новим етапам сортування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.