추수 감사절 터키


10

(아직도 추수 감사절입니다)

추수 감사절 저녁 식사를 위해 칠면조를 얻었지만 고르게 분포시키는 방법을 모릅니다. 문제는 어떤 사람들은 다른 사람들보다 더 많이 먹기 때문에 해결책을 찾아야한다는 것입니다

입력

두 개의 입력이 있습니다. 첫 번째는 다양한 사람들의 예술입니다.

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

아스키 아트 사양

각 사람은 너비가 3 열입니다. 각 사람은 한 칸의 공백으로 구분됩니다. 각 사람의 맨 위는 o입니다. 아래 o, 오프셋 1-1는 x에 있습니다 \/각각. o입력에서의 두 번째 행부터 마지막 ​​행 까지는 |1 인당 금액이 "높이"입니다. 각 사람으로부터 추출해야 할 유일한 데이터는 "높이"입니다.


항상 최소한 한 사람이있을 것입니다. 각 사람은 항상 최소 높이가 2입니다. 프로그램이 처리해야하는 최대 높이에있다 적어도 64의 높이.

공백으로 채워진 입력을 사각형으로 만들려면 답을 지정하십시오.


두 번째 입력은 칠면조입니다. 칠면조는 실제로 칠면조가 아니며 칠면조의 NxM크기 보다 더 큽니다. 두 번째 입력 값이 3x2인 경우 칠면조의 크기는 3 * 2이며 총 면적은 6입니다.

산출

출력은 목록 또는 언어의 가장 가까운 대안 (예 : 배열) 일 수 있습니다. 값을 공백으로 구분하여 문자열을 출력 할 수도 있습니다.

각 사람의 값은 입력 된 순서대로 출력되어야합니다.

도전

당신의 목표는 사람들 사이에서 칠면조 지역을 나누는 것입니다.

시나리오 예 :

그들은의 높이로 두 사람이 있다고 가정 3하고 6각각. 의 칠면조가있는 경우 5x3. 분배해야 할 칠면조의 총 면적은입니다 15.

이제 모든 사람에게 어떻게 배포 하시겠습니까? 방법은 다음과 같습니다.

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

즉, 키가 첫 번째 인 사람 33/9*15칠면조를 받거나 5두 번째 사람은 키를 66/9*15거나 10칠면조 를 얻습니다 .

산출

.보너스를 선택하지 않는 한 출력은 숫자로만 이루어져야합니다 . 이 경우 숫자, 공백 ( ) 및 슬래시 ( /) 로만 구성 될 수 있습니다 .

전체 예

입력:

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

산출:

11.25 18.75

보너스

-20 % 보너스 : 분수를 출력합니다 (단순화해야 함) . 혼합 된 분수인지 부적절한 분수인지는 중요 하지 않습니다 .

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다!


뭔가 빠졌을 수 있지만 어떻게 각 사람의 결과를 다른 사람과 분리해야합니까? 즉, 출력의 정확한 형식은 무엇입니까?
ETHproductions

@ETHproductions 목록으로 출력하거나 공백으로 구분하여 지정할 수 없습니다.
Downgoat

칠면조 크기에는 상한이 있습니까? 즉, 각 차원이 항상 한 자리입니까, 아니면 11x10 이상일 수 있습니까?
톰 카펜터

@TomCarpenter 여러 자릿수 일 수 있습니다. 상한값은 언어가 지원하는 모든 것
Downgoat

답변:


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 바이트

나는 메타 포스트에서 제안 한 것을 계산하여 수정되지 않았지만 여기에 간다.

여기에 이미지 설명을 입력하십시오

공백으로 채워진 입력이 예상됩니다.

나는 머리를 세고 머리가있는 줄에서 사람들의 크기를 얻습니다.


3

apt , 49 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하여 각 사람의 크기를 포함하는 1D 배열 인 배열을 만듭니다.

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

다음으로 입력 문자열에서 칠면조의 크기를 추출합니다 %dx%d. 즉, 하나의 숫자 다음에 'x'다음에 다른 숫자입니다. 칠면조 지역을 얻기 위해 두 숫자의 결과 배열이 곱해집니다.

여기에는 각 사람의 키가 곱해지고 각 사람의 칠면조 부분이 10 진수로 표시되도록 모든 사람의 총 키로 나뉩니다.

rats(...)

보너스를 부여하는 마지막 단계-이 비트는 코드를 6 자로 길게 만들지 만 보너스는 ~ 22만큼 가치가 떨어집니다. rats()십진수를 단순화 된 부적절한 분수 (정확한 13dp)로 변환하는 멋진 기능입니다. 10 진수 배열 (즉, 각 사람의 양)을 먹이면 각 사람의 분수가 포함 된 단일 문자열이 공백으로 구분되어 반환됩니다.

rats()두 개 이상의 공백 을 더한 결과를 얻었 지 만 문제는 그렇게 할 수 없다고 말하는 것은 아닙니다. 문자열에는 숫자 ''및 '/'만 포함해야합니다.

이것은 예제의 출력입니다 (실제 출력이 아닌 공백이 제거되지 않도록 따옴표가 추가되었습니다).

'     45/4          75/4     '

사용법 예 :

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

산출:

'     45/4          75/4     '

온라인 옥타브 인터프리터 에서도 작동하지만 경고와 함께 작동합니다 . 여기서 시도해 볼 수 있습니다 . 링크는 f이미 파일에 정의 된 기능 이있는 작업 공간에 대한 것입니다. 프롬프트에서 위의 예제 사용법 만 입력하면됩니다.



2

하스켈 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

자바 스크립트 (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

파이썬 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']

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.