丹尼斯(Dennis),门把手(Donknob),马丁·布特纳(MartinBüttner),克里斯·杰斯特·杨(Chris Jester-Young)-披萨店!


42

编程难题和代码高尔夫即将获得一个新的主持人丹尼斯!这个挑战是向他致敬和我们的其他活动(或最近活动)主持人:门把手马丁布特内尔克里斯小丑,年轻。挑战冠军的标题应该被读作Pepto Bismol的歌曲

基本上,我们要在他们都把披萨第十九咬比萨店,但我们需要确保他们共享这还算是因为一些器官功能障碍综合征被称为是比萨瘾君子!

比萨店出售的披萨都是矩形文字。披萨的宽度和长度可以是任何非负整数,只要它们的乘积可被四整除即可。文本披萨块中的每个网格空间都代表一个切片,因此始终可以将切片分成四个相等的组。

国防部将集体订购一个比萨饼,并以任何合理格式(例如)将其宽度和长度参数提供给服务器[width],[length]。在比萨饼到达餐桌之前,您需要在每个切片上贴上可以食用的mod的开头,以确保它们都能公平共享。每个人都应获得相同数量的切片。

  • E 是给丹尼斯的
  • D 用于门把手
  • M 是给马丁的
  • C 是给克里斯的

但是,这些mod有点顽强,要求它们各自的切片组是路径连接的,也就是说,它们的所有切片都可以通过上下左右移动而不能互相交叉,切片(并且不移动对角线)。不在乎怎么你做到这一点,只要它完成。

正确标记每个切片后,使用可选的尾随换行符将披萨传送到模块。

您的贴标机可以是程序或函数,可以打印或退还贴有标签的披萨。咬短的贴标机获胜。

例子

例子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主要是腹泻押韵器。
加尔文的爱好2015年

28
他们要求将它们各自的切片集进行路径连接。您可能会对我一无所知……
Dennis

22
好吧,什么是你给我这个奇怪的矩形轮廓形状的比萨饼?我要退款!
门把手

12
@flawr不适合您,非mod。
加尔文的爱好

14
咬伤最短的贴标机胜出”-我明白你在那做的事情。
DankMemes

Answers:


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
选择性地反转Doorknob和我共享的行。那是对$
丹尼斯


7

K,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
卡尔文的爱好2015年

@ Calvin'sHobbies它似乎适用于该输入。
kirbyfan64sos

1
我本打算使用相同的方法,但是我敢肯定它会起作用。不过是C hris。
丹尼斯

@丹尼斯·胡普斯。固定。
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

它回来了!而且格式非常长。:(-我偷走了aittsu的排序想法以节省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吗?
2015年

@yo'是的。它输出CCCCCCEE\nDDDDEEEE\nDDMMMMMM
卡德,2015年

/ me_stupid,对此感到抱歉。
2015年

4

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

对于1字节的节省,此版本(仅)反转片的中间行以获得任何奇数行。

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

之字形的答案很多,但在大多数情况下,仅按顺序输出字母(从左到右,从上到下)即可正常工作:

无需曲折调整高度1,2或4

无需曲折弯曲高度大于4的高度(每个mod的比萨定量都可以环绕。)

因此,实际上我们只需要在高度为3时曲折,然后只需要反转中间行即可。

事实证明,Dennis和Doorknob是该行中仅有的mod。通过将ASCII码与1异或可以互换它们。

鉴于没有简单的方法可以在C中反转字符串,因此这很方便。

取消测试程序

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

很好的解释。
trichoplax

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的解决方案,由于采用了新的排序阶段,该解决方案现在在某种程度上是可行的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.