感恩节火鸡


10

(希望它仍然是您的感恩节)

您在感恩节晚餐上得到了火鸡,但您不知道如何均匀分配。问题是,有些人比其他人吃得更多,所以您需要找到解决方案

输入值

将有两个输入。首先将是各种人的ASCII艺术。

     o
 o  \|/
\|/  |
 |   |
/ \ / \

技术规格

每个人占用3列的宽度。每个人都由一列空格分隔。每个人的最上层是一个o。在下方,分别o1和偏移-1x \/。从输入o到的第二行到最后一行,|每人这些的数量即为它们的“高度”。您需要从每个人中提取的唯一数据是他们的“身高”。


总会有至少一个人。每个人的身高至少为 2。程序应处理的最大高度至少为64。

如果您想用空格填充输入以形成矩形,请在答案中指定。


第二个输入是土耳其。火鸡并不是真正的火鸡,而是更大的NxM火鸡尺寸。如果第二个输入为3x2,则土耳其的尺寸为3 * 2,总面积为6。

输出量

输出可能是列表,或者是您语言最接近的替代项(例如Array)。您也可以输出一个字符串,其值之间用空格分隔。

每个人的值应按输入顺序输出。

挑战

您的目标是在人们之间划分火鸡的面积。

一个示例场景:

假设他们是两个人,身高分别为36。如果有火鸡5x3。土耳其需要分配的总面积为15

现在,您将如何在所有人之间分配它?就是这样:

                    the_persons_height
TurkeyForAPerson = -------------------- * turkey_area
                    sum_of_all_heights

这意味着,对于第一个身高为的人3,他们将得到3/9*15火鸡,或5,对于第二个身高为的人,6他们将获得6/9*1510火鸡。

输出量

输出必须仅由数字和组成.,除非您选择获得奖金。在这种情况下,它只能由数字,空格()和斜杠(/)组成。

完整的例子

输入:

6x5
     o 
     | 
 o  \|/
\|/  | 
 |   | 
 |   | 
/ \ / \

输出:

11.25 18.75

奖金

-20%奖励:您输出的一小部分(必须简化),但它确实管它是混合或不当分数。

计分

这是因此以字节为单位的最短代码胜出!


我可能会缺少一些东西,但是我们应该如何将每个人的输出与其他人分开呢?即输出应采用哪种确切格式?
ETHproductions 2015年

@ETHproductions您可能会在列表中输出,或将其用空格分隔,我不敢忘记指定该内容。
Downgoat

火鸡尺寸有上限吗?也就是说,每个尺寸都始终是一位数字,还是11x10或更高?
汤姆·卡彭特

@TomCarpenter可能是多个数字,上限是您的语言支持的上限
Downgoat 2015年

Answers:


3

Pyth,23个字节

mc*vXzG\*dsN=N-/R\|C.z0

这在在线版本中不起作用,因为它用于eval确定火鸡的大小。

说明:

mc*vXzG\*dsN=N-/R\|C.z0   implicit: z = first input line
                    .z    read all other lines
                   C      transpose them
               /R\|       count the "|"s in each column
              -       0   remove 0s in this list (columns with no "|"s)
            =N            assign the resulting list to N
m                         map each value d in N to:
    XzG\*                    replace every letter in z with a "*"
   v                         evaluate the result (does the multiplication)
  *      d                   multiply with d
 c        sN                 divide by sum(N)

4

LabVIEW,67字节

我数了数我在meta post中提出的内容,所以它没有固定,但是是的。

在此处输入图片说明

输入用空格填充。

我要数人头,并从人头所在的行中得出人员的大小。


3

Japt49个 46字节

JaptJa vaScri pt的缩写。口译员

W=UqR y f@Y%4¥1 £Xq'| l -1)£Vq'x r@X*Y,1 *X/Wx

输出为数组。(请注意,您需要将两个输入中的每一个都用引号引起来。)

怎么运行的

            // Implicit: U = stick-figures, V = turkey size
W=UqR y     // Assign variable W to: split U at newlines, transpose rows with columns,
f@Y%4==1    // take each stick-figure body,
m@Xq'| l -1 // and count the number of "|"s.
)m@Vq'x     // Now map each item X in W to: V split at "x",
r@X*Y,1     // reduced by multiplication, starting at 1,
*X/Wx       // multiplied by X and divided by the total of W.
            // Implicit: output last expression

3

MATLAB 109 * 80%= 87.2字节

function o=f(t,p);p=char(strsplit(p,'\n'));a=sum(p(:,2:4:end)=='|');o=rats(prod(sscanf(t,'%dx%d'))*a/sum(a));

因此,这是一个MATLAB函数,需要两个输入,第一个是土耳其大小的字符串(例如'8x4',第二个是包含人员的字符串。它返回一个包含每个人不正确分数的字符串)。

这本来可以小很多,但是新行变得棘手。MATLAB可以轻松地将字符串转换;为每行的分隔符,但是事实证明,尝试使用换行很困难,花费25个字符:

p=char(strsplit(p,'\n')); % Converts the input person string to a 2D array

实际上,扩大人员规模非常容易:

a=sum(p(:,2:4:end)=='|');

这需要从第二列开始的第四列(这将是人的身体所在的所有列),然后将其转换为一个数组,该数组包含有1个人体位元和0个无人体位元。最后,它按列求和a,得到一个数组,该数组是一个包含每个人的大小的一维数组。

prod(sscanf(t,'%dx%d'))*a/sum(a)

接下来,我们从输入字符串中提取火鸡的大小,其形式为%dx%d,即一个数字然后是“ x”,然后是另一个数字。将两个数字组成的数组相乘在一起得到土耳其面积。

将其乘以每个人的身高,再除以所有人的总身高即可得出每个人的火鸡比例(以十进制数字表示)。

rats(...)

获得奖金的最后一步-此位使代码更长6个字符,但奖金降低了〜22,因此值得。rats()是一个很好的函数,它将十进制数转换为简化的不正确分数(精确到13 dp)。给它提供一个十进制数字数组(即每个人的数量)将返回一个字符串,其中包含每个人的分数,并依次用空格分隔。

授予的输出rats()增加了一个以上的空格,但问题并没有说明它不能-只是说字符串必须只包含数字''和'/'。

这是示例的输出(我添加的引号是为了防止空格被删除,而不是在实际输出中):

'     45/4          75/4     '

用法示例:

f('6x5',['     o ' 10 '     | ' 10 ' o  \|/' 10 '\|/  | ' 10 ' |   | ' 10 ' |   | ' 10 '/ \ / \'])

输出:

'     45/4          75/4     '

它也可以在联机Octave解释器上运行(尽管带有警告)。您可以在这里尝试。链接指向具有f已在文件中定义的功能的工作空间。因此,您应该能够在提示符处输入上面的示例用法。



2

Haskell 119字节

import Data.List
g x=sum[1|y<-x,y>'{']
s#p|(h,_:t)<-span(<'x')s=[g x*read h*read t/g p|x<-transpose$lines p,any(>'{')x]

用法示例:"6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"-> [11.25,18.75]


2

JavaScript(ES6),131个字节

(t,p)=>eval(`h=[];for(s=0;m=r.exec(p);s++)h[i=m.index%l/4|0]=~~h[i]+1;h.map(v=>v/s*${t.replace("x","*")})`,l=p.search`
`+1,r=/\|/g)

返回部分数组。

说明

(t,p)=>                      // t = turkey equation, p = ASCII art of people
  eval(`                     // use eval to enable for loop without {} or return
    h=[];                    // h = array of each person's height
    for(s=0;m=r.exec(p);s++) // for each match of "|", s = sum of all heights
      h[i=m.index%l/4|0]=    // i = person index of this match
        ~~h[i]+1;            // increment person's height (~~ casts undefined to 0)
    h.map(v=>v/s*            // divide each height by the sum and multiply by turkey area
      ${t.replace("x","*")}  // since this is inside an eval just convert t to an equation
    )`,                      // implicit: return array of each person's portion

    // These are executed BEFORE the eval (escaping characters would mean more bytes)
    l=p.search`
`+1,                         // l = line length
    r=/\|/g                  // r = regex to match height markers
  )

测试


1

Python 99字节

lambda a,b: [`(''.join(i)).count('|')*1.0/a.count('|')*eval(b)` for i in zip(*a.split('\n'))[1::4]]

输入:' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'

输出: ['11.25', '18.75']

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.