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


42

Das Programmieren von Rätseln und Code Golf ist im Begriff, einen neuen Moderator zu finden , Dennis ! Diese Herausforderung ist eine Hommage an ihn und unsere anderen aktiven (oder kürzlich aktiven) Moderatoren: Doorknob , Martin Büttner und Chris Jester-Young . Der Challenge-Titel soll zum Lied Pepto Bismol vorgelesen werden .

Grundsätzlich werden wir sie alle zu Pizza behandeln bei der neunzehnten Biss Pizzeria , aber wir müssen sicherstellen , dass sie teilen es ziemlich weil einige von den Mods sind dafür bekannt , Pizza Süchtigen sein!

Die von der Pizzeria verkauften Pizzen sind allesamt rechteckige Textblöcke. Die Breite und Länge einer Pizza können beliebige nicht negative ganze Zahlen sein, solange ihr Produkt durch vier teilbar ist. Jedes Rasterfeld im Text-Pizza-Block stellt ein Stück dar, sodass es immer möglich ist, die Stücke in vier gleiche Gruppen aufzuteilen.

Die Mods werden gemeinsam eine einzelne Pizza bestellen und ihren Servern ihre Breiten- und Längenparameter in jedem vernünftigen Format wie z [width],[length]. Kurz bevor die Pizza an ihrem Tisch ankommt, musst du jedes Stück mit der Initiale des Mods kennzeichnen, der sie essen darf, um sicherzustellen, dass sie alle fair teilen. Jeder sollte die gleiche Anzahl Scheiben bekommen.

  • E ist für Dennis
  • D ist für Türklinke
  • M ist für Martin
  • C ist für Chris

Die Mods sind jedoch ein wenig ausdauernd und erfordern, dass ihre jeweiligen Slice-Sets mit dem Pfad verbunden sind , dh, dass alle Slices voneinander erreicht werden können, indem man sich nach oben, unten, links und rechts bewegt und keine anderen kreuzt Scheiben (und sich nicht diagonal bewegen). Es ist dir egal, wie du das machst, solange es gemacht wird.

Sobald Sie jedes Stück genau beschriftet haben, bringen Sie die Pizza mit einem optionalen nachgestellten Zeilenumbruch zu den Mods.

Ihr Etikettierer kann ein Programm oder eine Funktion sein und die etikettierte Pizza drucken oder zurückgeben. Der kürzeste Etikettierer in Bissen gewinnt.

Beispiele

Beispiel 1

Bestellung: 4,1

Einige mögliche etikettierte Pizzas:

EDMC
MEDC
CDEM

Beispiel 2

Bestellung: 4,4

Einige mögliche etikettierte Pizzas:

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

Beispiel 3

Bestellung: 8,3

Einige mögliche etikettierte Pizzas:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Beispiel 4

Bestellung: 20,5

Eine mögliche etikettierte Pizza:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

(Die Dhier sind nicht einfach verbunden, aber das ist in Ordnung.)


12
@BetaDecay Es ist hauptsächlich ein Diarrhoe-Reimgerät.
Calvins Hobbys

28
Sie erfordern, dass ihre jeweiligen Gruppen von Slices mit dem Pfad verbunden sind . Es ist ein bisschen beängstigend, dass du das über mich weißt ...
Dennis

22
Okay, was ist mit diesem seltsamen rechteckigen Pizzastück, das du mir gegeben hast? Ich will eine Rückerstattung!
Türklinke

12
@flawr Nicht für Leute wie dich, nicht mod.
Calvins Hobbys

14
"Kürzester Etikettierer bei Bissen gewinnt" - ich verstehe, was Sie dort gemacht haben.
DankMemes

Antworten:


21

CJam, 20 Bytes

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

Ich denke das sollte funktionieren :)

Probieren Sie es online aus

Erläuterung:

Dies macht zuerst eine Pizza mit der Bezeichnung CC… EE… DD… MM… von links nach rechts und von oben nach unten und sortiert dann jede Zeile in alphabetischer Reihenfolge. Die einzigen Unterbrechungen können zwischen der CE-Grenze und der ED-Grenze oder der ED-Grenze und der DM-Grenze auftreten (wenn sie auf benachbarte Reihen fallen). Aber die Sortierung stellt sicher, dass die E's zur rechten Seite und die D's zur linken Seite gehen, als C <E> D <M, so dass die E's und die D's verbunden bleiben.

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
Selektives Umkehren von Zeilen, die Doorknob und ich gemeinsam nutzen. Das ist eine clevere Verwendung von $!
Dennis


7

K, 61 Bytes

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

Beispiele:

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$ 

Ich würde es hassen, die Person zu sein, die diese Dinge in Scheiben schneiden muss ...


Sieht aus wie es im Zick-Zack hin und her geht, von oben nach unten. Ist das korrekt? (Wird es funktionieren 1,8?)
Calvins Hobbys

@ Calvin'sHobbies Es scheint für diesen Eingang zu funktionieren.
kirbyfan64sos

1
Ich wollte den gleichen Ansatz verwenden und ich bin mir ziemlich sicher, dass es funktioniert. Es ist jedoch C hris.
Dennis

@ Tennis Whoops. Fest.
kirbyfan64sos

7

Pyth, 20 Bytes

VceQs*L/*FQ4"CEDM"SN

Verwendet @ aditsus Sortiertrick.

Demonstration.

Ich habe mir beim Golfspielen eine große Anzahl alternativer Programme gleicher Länge ausgedacht:

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

Feststecken , 42 33

Es kehrt zurück! Und in furchtbar langer Form. :( - Ich habe Aditsus Sortieridee gestohlen, um 9 Bytes zu sparen :)

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

Erläuterung:

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.

Beispiel Eingabe:

20|5

Beispielausgabe:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Sind Sie sicher, dass es einfach für verbunden wird 8|3?
Du

@yo 'Ja. Es gibt aus CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Kade

/ me_stupid, sorry dafür.
Du

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

Für eine 1-Byte-Speicherung kehrt diese Version (nur) die mittlere Reihe von Slices für eine ungerade Anzahl von Reihen um.

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

Viele Antworten hier im Zickzack, aber in den meisten Fällen funktioniert die Ausgabe der Buchstaben in der richtigen Reihenfolge (von links nach rechts, von oben nach unten):

Kein Zickzack für die Höhen 1,2 oder 4

Bei Höhen über 4 muss nicht im Zick-Zack gearbeitet werden (die Pizzaration jedes Mods wird gewickelt).

Daher müssen wir eigentlich nur bei einer Höhe von 3 im Zickzack verfahren und dann nur die mittlere Reihe umkehren.

Wie sich herausstellt, sind Dennis und Doorknob die einzigen Mods in dieser Reihe. Und sie können durch XOR-Verknüpfung ihrer ASCII-Codes mit 1 ausgetauscht werden.

Dies ist praktisch, da es in C keine einfache Möglichkeit gibt, eine Zeichenfolge umzukehren.

Ungolfed im Testprogramm

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

Tolle Erklärung.
Trichoplax

1

JavaScript (ES6) 107

Zick-Zack-Lösung. Mit Hilfe der Vorlagenzeichenfolge wird der Zeilenumbruch signifikant und gezählt.

Testen Sie das Ausführen des Snippets mit 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

Retina , 83 Bytes

Die in dieser Antwort verwendeten Funktionen sind neuer als diese Herausforderung (nicht, dass es darauf ankommt ...). Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

Probieren Sie es online!

Damit ist die Lösung von aditsu implementiert, die dank der neuen Sortierstufen nun einigermaßen realisierbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.