День благодарения Турции


10

(Надеюсь, это еще День благодарения для вас)

У тебя есть индейка на ужин в День благодарения, но ты не знаешь, как ее равномерно распределить. Проблема в том, что некоторые люди едят больше, чем другие, поэтому вам нужно найти решение

вход

Там будет два входа. Первым будет ascii art разных людей.

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

спецификации ascii-art

Каждый человек занимает 3 колонки шириной. Каждый человек отделен одним столбцом пробелов. Самая вершина каждого человека - это o. Ниже o, смещение на 1и -1в x, и \и /, соответственно. От oвторого до последнего ряда во входных данных |количество их на человека является их «ростом». Единственные данные, которые вам нужно будет извлечь из каждого человека, это их «рост».


Всегда будет хотя бы один человек. У каждого человека всегда есть как минимум 2 роста. Максимальная высота, которую должна обработать ваша программа, - это высота не менее 64.

Если вы хотите, чтобы ввод, дополненный пробелами, образовывал прямоугольник, укажите это в своем ответе.


Второй вход - индейка. Индейка на самом деле не индейка, больше NxMразмеров индейки. Если второй ввод 3x2, то индейка имеет размеры 3 * 2, с общей площадью 6.

Вывод

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

Значения для каждого человека должны быть выведены в том порядке, в котором они были введены.

Вызов

Ваша цель состоит в том, чтобы разделить область индейки среди людей.

Пример сценария:

Предположим, что они два человека, с высотой 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 Вы можете выводить в виде списка или через пробел, я не могу поверить, что я забыл это указать.
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

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который представляет собой одномерный массив, содержащий размер каждого человека.

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.