Падающие шары ASCII

16

вход

Вам дают 2D карту с шарами и землей в ней. Это выглядит так:

  1         5          2
                 3
     4


__________________________

Каждый номер - это шар, а _это уровень земли. Символ подчеркивания _не допускается ни в какой другой строке, кроме линии уровня земли. Есть только пробелы, новые строки и цифры0-9 разрешенные над уровнем земли. Вы не можете предполагать, что последняя линия - уровень земли - допускаются пустые линии ниже уровня земли. Вы также можете добавить пробелы, чтобы заполнить пустые строки, если это вам поможет.

Шары могут иметь номера от 0до 9, могут быть размещены друг над другом, но не под землей. Номера мяча будут уникальными.

Предположим, что каждый персонаж составляет один метр .

Получить карту из pastebin!
Тестовый пример 1 - должен выводить что-то вроде этого
Тестовый пример 2 - должен давать те же результаты, что и первая карта

Вызов

Ваша задача - прочитать такую ​​карту из файла или из stdin- вам разрешено использоватьcat balls.txt | ./yourexecutable - и вывести скорость каждого шарика, когда он падает на землю.

Вот формула для скорости:

введите описание изображения здесь

Предположим, что hэто разность номеров линий между номером линии земли и номером линии мяча, и она gравна 10m/s^2.

Выход

Вы должны вывести число и скорость каждого шарика m/sна уровне земли. Например N - Vm/s, где Nномер шара и Vего скорость. Вы также можете вывести массив, если хотите.

Удачного кодирования! :)

Jacajack
источник
Тестовые случаи без ожидаемого результата не являются тестовыми случаями
edc65
@ edc65 Я добавил ожидаемые результаты к вопросу
Jacajack
Это нормально, если я возьму каталог как ввод от пользователя как часть программы?
Даниэль
@Dopapp Что вы имеете в виду именно?
Jacajack
Смотри мой ответ .
Даниэль

Ответы:

8

MATL , 31 30 27 25 байтов

95\16\5B#fG&X>1)b- 20*X^h

Ввод - это двумерный массив символов с ;разделителем строк:

['  1         5          2  ';'                 3        ';'     4                    ';'                          ';'                          ';'__________________________']

Попробуйте онлайн! Или включите инициал tв код для отображения карты для большей наглядности.

Вот другие тестовые случаи: первый , второй .

объяснение

95\      % Take input implicitly. Modulo 95: convert to numbers and map '_' into 0
16\      % Modulo 16: map space into 0 and digit chars into corresponding numbers
5B#f     % Find row indices and values of nonzero entries
G        % Push input again
&X>      % Index of maximum of each column. This finds character '_'
1)       % Get first value (they are all equal)
b        % Bubble row indices of numbers up in the stack
-        % Subtract to get distance from each number to the ground
20*X^    % Multiply by 20, take sqrt. This gives the velocity values
h        % Horizontally concat numbers and velocities. Display implicitly
Луис Мендо
источник
7

C 125 122 121 байт

b[99]={};main(l,c){for(;(c=getchar())<95u;)b[c]=(l+=c==10);for(c=47;++c<58;)b[c]&&printf("%c,%f\n",c,sqrt((l-b[c])*20));}

Скомпилируйте и запустите gcc -w golf.c -lm && cat balls.txt | ./a.out.

orlp
источник
Это действительно здорово, сэр! Я не сказал этого в своем вопросе, но я хотел бы, чтобы вы знали, что ваш пример ничего не выводит, когда 0 ... 9в текстовом файле встречается символ, отличный от символа . В любом случае +1, потому что я не виноват в том, что не указал на это
Jacajack
@Jacajack Нет, любой символ хорош, если он не содержит символ с кодом ASCII больше, чем _. Однако это можно исправить с помощью одного дополнительного байта ( !=вместо <).
orlp
Ну, я использовал «х» для тестирования. Ничего. Ваш код великолепен :)
Jacajack
@Jacajack В новой версии это больше не исправление одного символа, но я сохранил еще 3 байта :)
orlp
Ницца! :) Я посмотрю, что я могу сделать со своим кодом, когда вернусь домой. Я знаю, что это может быть сокращено много, но я не хочу, чтобы это было вашей копией: p
Jacajack
6

C - 194 (-5) 150 137 байтов

Потратив немного больше времени на размышления, я проиграл 44 байта.
Спасибо orlp за помощь в экономии 13 байтов.

Я начну с моего кода C:

b[256]={},n,i=47;main(l,c){for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);for(;++i<58;)b[i]&&printf("%d %f\n",i-48,sqrt((n-b[i])*20));}

И человекочитаемая версия:

//Throws many warnings, but lack of libraries is tolerated

/*
    c - current character
    l - line number (starts at 1)
    n - ground level
    i - iterator
    b - balls array
*/

b[256] = {}, n, i = 47; //That actually works, as long as you are using ASCII

main( l, c )
{
    for ( ;~( c = getchar( ) ); n = c == 95 ? l : n ) //Read stdin and search for ground
        b[c] = ( l += c == 10 ); //Increment lines counter on newlines, and save line numbers

    for ( ; ++i < 58; ) //Iterate through balls
        b[i] && printf( "%d %f\n", i - 48, sqrt( ( n - b[i] ) * 20 ) ); //Print out data    
}

Скомпилируйте и запустите так: gcc -o balls ballsgolf.c -lm && cat 1.txt | ./balls

Выход

1 10.000000
2 10.000000
3 8.944272
4 7.745967
5 10.000000
Jacajack
источник
Сохранить 4 байта: ~(c=getchar())вместо (c=getchar())!=EOF.
Маринус
@marinus Вот что у меня было.
orlp
1
if (x != -1)такой же, как if (~x)(на двух дополняющих машинах), потому что ~-1есть (однозначно) 0. В С гольф никогда не используют while(cond), так как for(;cond;)он такой же длинный и предоставляет больше возможностей для игры в гольф. В вашем примере это может стать for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);.
orlp
@ или я понимаю, спасибо за совет :)
Jacajack
1
l=1можно обойти, сделав lпервый аргумент для main, так как среда выполнения C передает число аргументов в main в качестве первого аргумента ( argc), а когда вы вызываете программу без аргументов командной строки ( ./a.out), тогда argc = l = 1. n=0;не требуется, так как глобальные целые числа автоматически инициализируются в 0. Так что просто n;будет достаточно.
orlp
4

Пиф, 27 26 25 24 байта

smf-hT "_". e, b @ * 20-xd \ _k2dC 
smf @ hT`M; .e, b @ * 20-xd \ _k2dC
 smf @ T`M; .e, b @ * 20-xd \ _k2dC
см @ # `M; .e, б @ * 20-XD \ _k2dC

Попробуйте онлайн!

Пропитанная монахиня
источник
@orlp О, я думал, что уровень земли может быть только в последней строке.
Утренняя монахиня
@ orlp Нет, нет
Leaky Nun
1
@orlp Это было в правилах : «Вы можете добавить пробелы, чтобы заполнить пустые строки, если это вам поможет».
Дрянная Монахиня
3

Matlab, 100 96 89 90 байт

s=input('');X=find(s==95);for i=0:9
[x y]=find(s==48+i);if(x)[i sqrt(20*(X(1)-x))]
end
end

Многие байты сохранены благодаря Луису Мендо

Формат ввода:

['  1         9          2  ';'                 3        ';'     4                    ';'                          ';'                          ';'__________________________']

Объяснение:

X=find(s==95)         -- finds '_', we'll need X(1) to determine max height
for i=0:9             -- loops through balls' numbers
[x y]=find(s==48+i)   -- finds the ball
if(x)                 -- if it is present
[i sqrt(20*(X(1)-x))] -- output its number and velocity
pajonk
источник
3

Python 3, 84 байта

Версия 6, 84 байта: (Спасибо Leaky Nun!)

lambda a:[(c,(~-(len(a)-i)*20)**.5)for i,s in enumerate(a)for c in s if c.isdigit()]

Версия 5, 91 байт:

lambda a:[c+":"+str((~-(len(a)-i)*20)**.5)for i,s in enumerate(a)for c in s if c.isdigit()]

Версия 4, 92 байта:

lambda i:[c+":"+str((~-(len(i)-n)*20)**.5)for n in range(len(i))for c in i[n]if c.isdigit()]

Версия 3, 99 байт:

def r(i):x=len(i);print([c+":"+str((~-(x-n)*20)**.5)for n in range(x)for c in i[n] if c.isdigit()])

Версия 2, 102 байта:

def r(i):
 n=len(i)
 for l in i:
  for c in l:
   if c.isdigit():print(c+":"+str((~-n*20)**.5))
  n-=1

Вышеуказанные версии принимают массив строк в качестве входных данных.

Версия 1, 140 байт:

with open(input(),"r")as i:
 n=sum(1for l in i);i.seek(0)
 for l in i:
  for c in l:
   if c.isdigit():print(c+":"+str((~-n*20)**.5))
  n-=1

Это берет каталог файла как ввод от пользователя.

Даниил
источник
1 for l in i->1for l in i
Дрянная Монахиня
@ LeakyNun, этот трюк работает со всеми ключевыми словами и числами?
Даниэль
1
Я так считаю. Кроме того, (n-1)*20->~-n*20
Leaky Nun
1
Оставайтесь на линии. Разве Python3 не требует скобок с printвызовом?
Yytsi
1
@LeakyNun Нет, он не работает для всех ключевых слов и чисел в Python 2. Он, в частности, не работает для ключевых слов, начинающихся с e, потому что тогда токенизатор Python попытается проанализировать его как научную нотацию с плавающей запятой (например, 1e5). Пример , который терпит неудачу: f = lambda n:-1if n<0else 1. Пример, который терпит неудачу в обеих версиях Python 0or 1, так как токенизатор считает, что 0oначинается восьмеричное число.
orlp
2

Python 3, 84 байта

lambda x:[[i,(20*x[x.find(i):x.find('_')].count('\n'))**.5]for i in x if i.isdigit()]

Анонимная функция, которая принимает входные данные в качестве аргумента в виде многострочной строки со всеми пустыми строками, заполненными пробелами, и возвращает массив, где каждый элемент имеет форму [номер шара, скорость].

Как это устроено

lambda x                      Function with input x
...for i in x if i.isdigit()  Loop through all characters i in x for which i is a digit,
                              and hence one of the balls
x[x.find(i):x.find('_')]      Slice x to give the substring between the ball and the ground
....count('\n')               Count the number of newlines in the substring to give the
                              height of the ball
(20*...)**.5                  Calculate the speed of the ball as it hits the ground
[i,...]                       Package the ball number and speed into a list
:[...]                        Return all ball-speed pairs as a list with elements [ball
                              number, speed]

Попробуйте это на Ideone

TheBikingViking
источник
В этом случае, я думаю, это фрагмент кода, а не полностью автономный скрипт Python, не так ли?
Jacajack
@Jacajack На самом деле это функция, а не фрагмент, который разрешен по умолчанию . В Python лямбда-функции - это функции без имени, которые можно присвоить переменной и затем вызывать при необходимости; Вы можете написать f = MyAnswer, а затем позвонить, используя f(x). Существует консенсус, что нет необходимости называть лямбды . Кстати, хороший вызов!
TheBikingViking
Конечно, я просто думал, что лямбды здесь считаются фрагментами кода ( meta.codegolf.stackexchange.com/a/1146/55729 ). Я думаю, что все в порядке. Спасибо за ваше мнение :)
Jacajack
2

JavaScript (ES6) 93

Редактирование 2 байт сохраненного ТНХ @Jacajack

Функция с многострочной строкой в ​​качестве входного параметра. Вывод не сортируется (так как это не запрашивается)

a=>[...a].reverse().map(c=>c>'Z'?b=i:c<' '?++i:c>' '&&console.log(c,Math.sqrt((i-b)*20)),i=0)

Тестовое задание

F=
a=>[...a].reverse().map(c=>c>'Z'?b=i:c<' '?++i:c>' '&&console.log(c,Math.sqrt((i-b)*20)),i=0)

function test()
{
  F(I.value);
}

test()
#I { height: 12em; width: 30em}
<textarea id=I>
    
 
  1         5          2
                 3
     4


__________________________




</textarea>
<button onclick="test()"></button>

edc65
источник
Не sqrt(x)будет короче чем pow(x,.5)?
Jacajack
@Jacajack да, спасибо, я не знаю, как это
сошло