День подяки Туреччині


10

(Сподіваємось, це все-таки подяка для вас)

Ви отримали індичку за вечерю подяки, але не знаєте, як її рівномірно розподілити. Проблема в тому, що деякі люди їдять більше, ніж інші, тому потрібно знайти рішення

Вхідні дані

Буде два входи. Першим стане мистецтво ассі різних людей.

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

технічні характеристики ascii-art

Кожна людина займає ширину 3 колони. Кожна людина відокремлена однією колоною пробілів. Сама верхня частина кожної людини - це o. Внизу o, зсув на х 1і -1в х, є \і /, відповідно. Від oдругого до останнього рядка вхідних |значень кількість їх на людину - це їх "зріст". Єдині дані, які вам знадобиться витягти у кожної людини, - це їх «зріст».


Завжди знайдеться хоча б одна людина. У кожної людини завжди принаймні 2-х зріст. Максимальна висота, з якою повинна працювати ваша програма, принаймні - 64.

Якщо ви хочете, щоб на вкладеному вкладені пробілами утворився прямокутник, вкажіть це у своїй відповіді.


Другий вхід - індик. Індичка насправді не індичка, більше NxMрозмірів індика. Якщо другий вхід є 3x2, то індичка має розміри 3 * 2, загальною площею 6.

Вихідні дані

Вихідним може бути список або найближча альтернатива вашої мови (наприклад, масив). Ви також можете вивести рядок із значеннями, розділеними пробілами.

Значення для кожної людини слід виводити в тому порядку, в якому вони були введені.

Виклик

Ваша мета - розділити площу індички серед людей.

Приклад сценарію:

Припустимо, це двоє людей з висотою 3і 6, відповідно. Якщо є індичка 5x3. Загальна площа індички, яку потрібно буде розподілити, - це 15.

Тепер, як би ви розподілили його серед усіх? Ось як:

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

Це означає, що для першої особи з ростом 3вони отримають 3/9*15індичку, або 5, другу людину з ростом 6вони отримають 6/9*15або 10індичку.

Вихідні дані

Результат повинен складатися виключно з цифр і ., якщо ви не вирішите скористатися бонусом. У цьому випадку він може складатися лише з цифр, пробілів ( ) та косою рисою ( /).

Повний приклад

Вхід:

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

Вихід:

11.25 18.75

Бонуси

-20% Бонус: Ви виводите дріб (повинен бути спрощений), не має значення, чи це змішана чи неправильна частка.

Оцінка балів

Це тому найкоротший код у байтах виграє!


Можливо, мені чогось не вистачає, але як нам відокремити результати для кожної людини від інших? Тобто в якому точному форматі має бути вихід?
ETHproductions

@ETHproductions Ви можете виводити у списку або розділяти пробілами, я не можу повірити, що забув це вказати.
Пуховик

Чи є верхня межа розмірів індички? тобто кожен вимір завжди є однією цифрою, або він може бути як 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

Japt , 49 46 байт

Japt - скорочена версія Ja 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', а потім інше число. Отриманий масив з двох чисел множимо разом, щоб отримати площу індички.

Це множиться на висоту кожного з людей, а також ділиться на загальний зріст усіх людей, щоб отримати порцію індика для кожної людини у вигляді десяткового числа.

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']

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.