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


42

Programmation Puzzles & Code Golf est sur le point d'avoir un nouveau modérateur , Dennis ! Ce défi est un hommage à lui et à nos autres modérateurs actifs (ou récemment actifs): Doorknob , Martin Büttner et Chris Jester-Young . Le titre du défi est destiné à être lu sur l'air de la chanson de Pepto Bismol .

En gros, nous allons les traiter à la pizza à la Dix - neuvième Bite Pizzeria , mais nous devons nous assurer qu'ils partagent assez parce que certains des les mods sont connus pour être accros à pizza!

Les pizzas vendues par la pizzeria sont toutes des blocs de texte rectangulaires. La largeur et la longueur d'une pizza peuvent être des nombres entiers non négatifs dans la mesure où leur produit est divisible par quatre. Chaque espace de grille dans le bloc de pizza texte représente une tranche; il est donc toujours possible de scinder les tranches en quatre groupes égaux.

Les mods commanderont collectivement une seule pizza, en fournissant ses paramètres de largeur et de longueur à leur serveur dans un format raisonnable, tel que [width],[length]. Juste avant que la pizza n'arrive à leur table, vous devez étiqueter chaque tranche avec l'initiale du mod qui arrive à la manger pour s'assurer qu'elles partagent toutes de manière juste. Tout le monde devrait avoir le même nombre de tranches.

  • E est pour Dennis
  • D est pour Doorknob
  • M est pour Martin
  • C est pour Chris

Les mods sont un peu perspicaces, cependant, et exigent que leurs ensembles respectifs de tranches soient reliés par un chemin , c’est-à-dire que toutes leurs tranches puissent être atteintes les unes des autres en montant, en bas, à gauche et à droite, sans croiser celui des autres. tranches (et ne se déplaçant pas en diagonale). Peu importe comment vous faites cela tant que c'est fait.

Une fois que vous avez étiqueté chaque tranche avec précision, livrez la pizza aux mods avec une fin de ligne optionnelle.

Votre étiqueteuse peut être un programme ou une fonction et peut imprimer ou retourner la pizza étiquetée. L'étiqueteuse la plus courte des piqûres gagne.

Exemples

Exemple 1

Ordre: 4,1

Quelques pizzas étiquetées possibles:

EDMC
MEDC
CDEM

Exemple 2

Ordre: 4,4

Quelques pizzas étiquetées possibles:

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

Exemple 3

Ordre: 8,3

Quelques pizzas étiquetées possibles:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Exemple 4

Ordre: 20,5

Une pizza étiquetée possible:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

(Ils Dne sont pas simplement connectés mais ça va.)


12
@BetaDecay Il s'agit principalement d'un dispositif de rimes pour la diarrhée.
Les passe-temps de Calvin

28
Ils exigent que leurs ensembles de tranches respectifs soient connectés par chemin . C'est un peu effrayant que vous sachiez cela à propos de moi ...
Dennis

22
D'accord, qu'est-ce qui se passe avec cette étrange tranche de pizza en forme de contour rectangulaire que vous m'avez offerte? Je veux un remboursement!
Poignée de porte

12
@flawr Pas pour les goûts de vous, non-mod.
Hobbies de Calvin le

14
« Shortest étiqueteuse dans les morsures gagne » - Je vois ce que vous avez fait là.
DankMemes

Réponses:


21

CJam, 20 octets

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

Je pense que ça devrait marcher :)

Essayez-le en ligne

Explication:

Cela permet d’abord d’établir une pizza libellée CC… EE… JJ… MM… de gauche à droite et de haut en bas, puis de trier chaque rangée par ordre alphabétique. Les seules déconnexions peuvent se produire entre la frontière CE et la frontière ED, ou entre la frontière ED et la frontière DM (si elles se trouvent sur des lignes adjacentes). Mais le tri garantit que les E vont sur le côté droit et les D vont sur le côté gauche, comme C <E> D <M, de sorte que les E et les D restent connectés.

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
Inverser sélectivement les lignes partagées par Doorknob et moi. C'est une utilisation intelligente de $!
Dennis


7

K, 61 octets

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

Exemples:

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$ 

Je détesterais être la personne qui doit trancher ces choses ...


On dirait que ça zigzague d'avant en arrière, de haut en bas. Est-ce exact? (Cela fonctionnera-t-il 1,8?)
Calvin's Hobbies

@ Calvin'sHobbies Cela semble fonctionner pour cette entrée.
Kirbyfan64sos

1
J'allais utiliser la même approche et je suis sûr que cela fonctionne. C'est la C hristian bien.
Dennis

@ Dennis Oups. Fixé.
Kirbyfan64sos

7

Pyth, 20 octets

VceQs*L/*FQ4"CEDM"SN

Utilise l'astuce de tri de @ aditsu.

Manifestation.

J'ai imaginé un grand nombre de programmes alternatifs de même durée en essayant de jouer au golf:

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

Coincé , 42 33

Ça revient! Et sous une forme terriblement longue. :( - J'ai volé l'idée de tri de Aditsu pour économiser 9 octets :)

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

Explication:

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.

Exemple d'entrée:

20|5

Exemple de sortie:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Etes-vous sûr qu'il sera simplement connecté pour 8|3?
Yo '31

@yo 'Oui. Il sort CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Kade

/ me_stupid, désolé pour ça.
Yo '31

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

Pour une sauvegarde sur 1 octet, cette version inverse (uniquement) la rangée médiane des tranches pour un nombre impair de rangées.

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

Beaucoup de réponses ici zigzaguent, mais dans la plupart des cas, il suffit de sortir les lettres dans l’ordre (de gauche à droite, de haut en bas):

Pas besoin de zigzaguer pour les hauteurs 1,2 ou 4

Pas besoin de zigzaguer pour des hauteurs supérieures à 4 (la ration de pizza de chaque mod va envelopper.)

Par conséquent, nous n’avons réellement besoin que de zigzaguer lorsque la hauteur est de 3, puis d’inverser la rangée du milieu.

Il se trouve que Dennis et Doorknob sont les seuls mods de cette ligne. Et ils peuvent être interchangés en XORing leurs codes ASCII avec 1.

C'est pratique étant donné qu'il n'y a pas de moyen facile d'inverser une chaîne en C.

Programme non testé

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

Grande explication.
Trichoplax

1

JavaScript (ES6) 107

Solution en zigzag. À l'aide de la chaîne de modèle, la nouvelle ligne est significative et comptée.

Testez l'exécution de l'extrait avec 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 octets

Les fonctionnalités utilisées dans cette réponse sont plus récentes que ce défi (pas que ça compte ...). Le nombre d'octets suppose un codage ISO 8859-1.

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

Essayez-le en ligne!

Cela met en œuvre la solution aditsu qui est maintenant quelque peu réalisable grâce aux nouvelles étapes de tri.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.