Dennis, Doorknob, Martin Büttner, Chris Jester-Young - Pizzeria!


42

Programowanie łamigłówek i Code Golf wkrótce zyska nowego moderatora , Dennisa ! To wyzwanie jest hołdem dla niego i naszych innych aktywnych (lub ostatnio aktywnych) moderatorów: Doorknob , Martin Büttner i Chris Jester-Young . Tytuł wyzwania ma być czytany w melodii piosenki Pepto Bismol .

Zasadniczo, będziemy traktować je wszystkie do pizzy w XIX Ugryź Pizzeria , ale musimy mieć pewność, że podziela ona dość ponieważ niektóre z tych modów wiadomo, że są uzależnieni od pizzy!

Wszystkie pizze sprzedawane przez pizzerię są prostokątnymi blokami tekstu. Szerokość i długość pizzy mogą być dowolnymi liczbami całkowitymi nieujemnymi, o ile ich produkt jest podzielny przez cztery. Każda przestrzeń siatki w bloku pizzy tekstowej reprezentuje plasterek, więc zawsze można podzielić plastry na cztery równe grupy.

Mody będą wspólnie zamawiać jedną pizzę, podając jej parametry szerokości i długości do serwera w dowolnym rozsądnym formacie, takim jak [width],[length]. Tuż przed pizzą przybywa do ich stolika, musisz oznaczyć każdy plasterek inicjałem modu, który je zjeść, aby upewnić się, że wszystkie dzielą się sprawiedliwie. Każdy powinien otrzymać tę samą liczbę plasterków.

  • E jest dla Dennisa
  • D jest do Klamki
  • M jest dla Martina
  • C jest dla Chrisa

Mody są jednak nieco persnickety i wymagają, aby ich odpowiednie zestawy plasterków były połączone ścieżką , to znaczy, aby wszystkie ich plasterki były dostępne od siebie, poruszając się w górę, w dół, w lewo i w prawo, nie przekraczając niczyich plastry (i nieruchome ukośne). Nie obchodzi cię, jak to robisz, o ile jest to zrobione.

Po dokładnym oznaczeniu każdego plasterka dostarcz pizzę do modów z opcjonalnym końcowym znakiem nowej linii.

Twoja etykieciarka może być programem lub funkcją i może drukować lub zwracać oznaczoną pizzę. Zwycięża najkrótsza etykieta w kęsach.

Przykłady

Przykład 1

Zamówienie: 4,1

Niektóre możliwe oznaczone pizze:

EDMC
MEDC
CDEM

Przykład 2

Zamówienie: 4,4

Niektóre możliwe oznaczone pizze:

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

Przykład 3

Zamówienie: 8,3

Niektóre możliwe oznaczone pizze:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Przykład 4

Zamówienie: 20,5

Możliwa pizza z etykietą:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

( DTutaj nie są po prostu połączone, ale to jest ok.)


12
@BetaDecay Jest to głównie urządzenie do rymowania biegunka.
Calvin's Hobbies

28
Oni wymagają, aby ich odpowiednie zestawy plastrów być ścieżka połączone . To trochę przerażające, że wiesz o mnie ...
Dennis

22
Okej, co jest z tym dziwnym kawałkiem pizzy w kształcie prostokąta, który mi dałeś? Chce zwrot!
Klamka

12
@flawr Nie dla takich jak ty, non-mod.
Calvin's Hobbies

14
„Najkrótszy wygrywający w kęsy wygrywa” - widzę, co tam zrobiłeś.
DankMemes,

Odpowiedzi:


21

CJam, 20 bajtów

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

Myślę, że to powinno działać :)

Wypróbuj online

Wyjaśnienie:

Najpierw pizzy oznaczone CC… EE… DD… MM… od lewej do prawej i od góry do dołu, a następnie sortuje każdy wiersz w kolejności alfabetycznej. Jedyne rozłączenia mogą wystąpić między granicą CE a granicą ED lub granicą ED i granicą DM (jeśli spadną na sąsiednie rzędy). Ale sortowanie zapewnia, że ​​E idą na prawą stronę, a D idą na lewą stronę, jak C <E> D <M, więc E i D pozostają połączone.

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
Selektywnie odwracaj wiersze współdzielone przez Doorknob i mnie. To jedno sprytne zastosowanie $!
Dennis


7

K, 61 bajtów

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

Przykłady:

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$ 

Nie chciałbym być osobą, która musi pokroić te rzeczy ...


Wygląda na to, że zygzaki tam iz powrotem, od góry do dołu. Czy to jest poprawne? (Czy to zadziała 1,8?)
Hobby Calvina

@ Calvin'sHobbies Wygląda na to, że działa dla tego wejścia.
kirbyfan64sos

1
Chciałem zastosować to samo podejście i jestem pewien, że to zadziała. Ale to C hris.
Dennis

@Dennis Whoops. Naprawiony.
kirbyfan64sos

7

Pyth, 20 bajtów

VceQs*L/*FQ4"CEDM"SN

Wykorzystuje sztuczkę sortowania @ aditsu.

Demonstracja.

Podczas gry w golfa wymyśliłem wiele alternatywnych programów o tej samej długości:

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

Utknął , 42 33

Powraca! I w strasznie długiej formie. :( - Ukradłem pomysł sortowania aditsu, aby zaoszczędzić 9 bajtów :)

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

Wyjaśnienie:

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.

Przykładowe dane wejściowe:

20|5

Przykładowe dane wyjściowe:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Czy na pewno będzie to po prostu podłączone 8|3?
yo „

@yo 'Tak. Wyprowadza CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Kade

/ me_stupid, przepraszam za to.
yo „

4

Rev 1 C, 74

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

Aby zaoszczędzić 1 bajt, ta wersja odwraca (tylko) środkowy wiersz plasterków dla dowolnej nieparzystej liczby wierszy.

Rev 0 C, 75

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

Wiele odpowiedzi tutaj zygzak, ale w większości przypadków po prostu wypisywanie liter w kolejności (od lewej do prawej, od góry do dołu) działa dobrze:

Nie ma potrzeby zygzakiem dla wysokości 1,2 lub 4

Nie trzeba zygzakować na wysokościach większych niż 4 (racja pizzy każdego moda się zawinie.)

Dlatego faktycznie musimy zygzakować tylko wtedy, gdy wysokość wynosi 3, a następnie musimy tylko odwrócić środkowy rząd.

Jak się okazuje, Dennis i Doorknob są jedynymi modami w tym rzędzie. I można je zamieniać poprzez XOR ich kody ASCII za pomocą 1.

Jest to przydatne, ponieważ nie ma łatwego sposobu na odwrócenie łańcucha w C.

Niegolfowany w programie testowym

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);
} 

Świetne wyjaśnienie.
trichoplax

1

JavaScript (ES6) 107

Rozwiązanie zygzakowe. Używając ciągu szablonu, nowa linia jest znacząca i zliczana.

Przetestuj uruchomienie fragmentu za pomocą 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

Siatkówka , 83 bajty

Funkcje użyte w tej odpowiedzi są nowsze niż to wyzwanie (nie ma to znaczenia ...). Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online!

To implementuje rozwiązanie aditsu, które jest teraz w pewnym stopniu wykonalne dzięki nowym etapom sortowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.