Spadające kule ASCII


16

Wejście

Otrzymasz mapę 2D z kulkami i podłożem. To wygląda tak:

  1         5          2
                 3
     4


__________________________

Każda liczba jest piłką, a _poziom gruntu. Znak podkreślenia _nie jest dozwolony w żadnej innej linii niż linia na poziomie gruntu. Nad 0-9poziomem gruntu dozwolone są tylko spacje, znaki nowej linii i cyfry . Nie można zakładać, że ostatnia linia to poziom gruntu - dozwolone są puste linie poniżej poziomu gruntu. Możesz także dodać spacje, aby wypełnić puste linie, jeśli to ci pomoże.

Piłki mogą mieć numery od 0do 9, mogą być umieszczone nad sobą, ale nie pod ziemią. Numery piłki będą niepowtarzalne.

Załóż, że każda postać ma metr .

Pobierz mapę z pastebin!
Przypadek testowy 1 - wyjście powinno coś jak ten
przypadek testowy 2 - powinny produkować takie same wyniki jak pierwszy mapie

Wyzwanie

Twoim zadaniem jest odczytanie takiej mapy z pliku lub z stdin- możesz użyć cat balls.txt | ./yourexecutable- i prędkości wyjściowej każdej kuli, gdy uderzy ona o ziemię.

Oto wzór na prędkość:

wprowadź opis zdjęcia tutaj

Załóżmy, że hjest to różnica numeru linii między numerem linii ziemi a numerem linii piłki i gjest równa 10m/s^2.

Wynik

Należy podać liczbę i prędkość każdej kulki m/sna poziomie gruntu. Na przykład N - Vm/s, gdzie Njest liczba kuli i Vjej prędkość. Możesz również wypisać tablicę, jeśli chcesz.

Miłego kodowania! :)


Przypadki testowe bez oczekiwanego wyniku nie są przypadkami testowymi
edc65

@ edc65 Do pytania dodałem oczekiwane wyniki
Jacajack,

Czy jest w porządku, jeśli wezmę katalog jako dane wejściowe od użytkownika jako część programu?
Daniel

@Dopapp Co dokładnie masz na myśli?
Jacajack

Zobacz moją odpowiedź .
Daniel

Odpowiedzi:


8

MATL , 31 30 27 25 bajtów

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

Dane wejściowe to tablica ;znaków 2D z separatorem wierszy:

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

Wypróbuj online! Lub dołącz inicjał tdo kodu, aby wyświetlić mapę dla większej przejrzystości.

Oto inne przypadki testowe: pierwszy , drugi .

Wyjaśnienie

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 bajtów

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));}

Kompiluj i uruchamiaj z gcc -w golf.c -lm && cat balls.txt | ./a.out.


To jest naprawdę świetne! Nie powiedziałem tego w moim pytaniu, ale chciałbym, abyś wiedział, że twój przykład niczego nie wyświetla, gdy znak inny niż 0 ... 9występuje w pliku tekstowym. W każdym razie +1, ponieważ nie wskazanie tego jest moją winą
Jacajack

@Jajajack Nie, dowolny znak jest w porządku, o ile nie zawiera znaku o kodzie ASCII większym niż _. Można to jednak naprawić za pomocą jednego dodatkowego bajtu ( !=zamiast <).
orlp

Cóż, użyłem „x” do testowania. Nieważne. Twój kod jest świetny :)
Jacajack,

@Jajajack W nowej wersji nie jest to poprawka
jednoznakowa

Ładny! :) Zobaczę, co mogę zrobić z moim kodem, kiedy wrócę do domu. Wiem, że można go znacznie skrócić, ale nie chcę, żeby to była twoja kopia: p
Jacajack,

6

C - 194 (-5) 150 137 bajtów

Mając trochę więcej czasu i myślenia, grałem w golfa 44 bajki.
Dziękujemy orlp za pomoc w oszczędzeniu 13 bajtów.

Zacznę od mojego kodu 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));}

I wersja czytelna dla człowieka:

//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    
}

Skompiluj i uruchom w ten sposób: gcc -o balls ballsgolf.c -lm && cat 1.txt | ./balls

Wynik

1 10.000000
2 10.000000
3 8.944272
4 7.745967
5 10.000000

Zapisz 4 bajty: ~(c=getchar())zamiast (c=getchar())!=EOF.
marinus

@marinus Właśnie to miałem.
orlp

1
if (x != -1)jest taki sam jak if (~x)(na dwóch maszynach dopełniających), ponieważ ~-1jest (wyjątkowo) 0. W C golf nigdy nie używaj while(cond), ponieważ for(;cond;)jest tak samo długi i zapewnia więcej możliwości gry w golfa. W twoim przykładzie może to być for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);.
orlp

@orlp Rozumiem, dziękuję za radę :)
Jacajack,

1
l=1można obejść, wprowadzając lpierwszy argument dla main, ponieważ środowisko wykonawcze C przekazuje liczbę argumentów do main jako pierwszy argument ( argc), a gdy wywołujesz program bez żadnych argumentów wiersza poleceń ( ./a.out), to argc = l = 1. n=0;jest niepotrzebne, ponieważ globalne liczby całkowite są automatycznie inicjowane na 0. Wystarczy więc n;.
orlp

4

Pyth, 27 26 25 24 bajtów

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

Wypróbuj online!



@orlp Oh, myślałem, że poziom gruntu może znajdować się tylko w ostatniej linii.
Leaky Nun



1
@orlp Zgodnie z regułami „Możesz dodawać spacje, aby wypełnić puste linie, jeśli to ci pomoże”.
Leaky Nun

3

Matlab, 100 96 89 90 bajtów

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

Wiele bajtów zaoszczędzonych dzięki Luisowi Mendo

Format wejściowy:

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

Wyjaśnienie:

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

3

Python 3, 84 bajtów

Wersja 6, 84 bajtów: (Dzięki Leaky Nun!)

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

Wersja 5, 91 bajtów:

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

Wersja 4, 92 bajty:

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

Wersja 3, 99 bajtów:

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()])

Wersja 2, 102 bajty:

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

Powyższe wersje pobierają tablicę ciągów jako dane wejściowe.

Wersja 1, 140 bajtów:

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

To pobiera katalog pliku jako dane wejściowe od użytkownika.


1 for l in i->1for l in i
Leaky Nun

@LeakyNun, czy ta sztuczka działa ze wszystkimi słowami kluczowymi i liczbami?
Daniel

1
Tak mi się wydaje. Ponadto, (n-1)*20->~-n*20
Leaky Nun

1
Czekaj. Czy Python3 nie wymaga nawiasów z printwywołaniem?
Yytsi

1
@LeakyNun Nie, nie działa dla wszystkich słów kluczowych i liczb w Pythonie 2. W szczególności nie działa dla słów kluczowych rozpoczynających się od e, ponieważ wtedy tokenizer Pythona spróbuje go przeanalizować jako notację zmiennoprzecinkową (np 1e5.). Przykładem, który nie: f = lambda n:-1if n<0else 1. Przykładem, który zawodzi w obu wersjach Pythona, jest to 0or 1, że tokenizer myśli, że 0orozpoczyna liczbę ósemkową.
orlp

2

Python 3, 84 bajtów

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

Anonimowa funkcja, która akceptuje wprowadzanie argumentem jako ciąg wieloliniowy ze wszystkimi pustymi liniami wypełnionymi spacjami i zwraca tablicę, w której każdy element ma postać [liczba kulek, prędkość].

Jak to działa

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]

Wypróbuj na Ideone


Myślę, że w tym przypadku jest to fragment kodu, a nie pełny samodzielny skrypt w języku Python, prawda?
Jacajack

@Jajajack W rzeczywistości jest to funkcja, a nie fragment kodu, który jest domyślnie dozwolony . W Pythonie funkcje lambda są funkcjami bez nazwy, które można przypisać do zmiennej, a następnie wywołać w razie potrzeby; możesz napisać f = MyAnswer, a następnie zadzwonić za pomocą f(x). Panuje zgoda, że ​​nie ma potrzeby nazywać lambdas . Nawiasem mówiąc, niezłe wyzwanie!
TheBikingViking

Jasne, właśnie pomyślałem, że lambdas zostały tutaj uznane za fragmenty kodu ( lambdas meta.codegolf.stackexchange.com/a/1146/55729 ). Myślę więc, że wszystko jest w porządku. Dziękuję za opinię :)
Jacajack,

2

JavaScript (ES6) 93

Edytuj 2 bajty zapisane przez @Jajajack

Funkcja z ciągiem wielowierszowym jako parametrem wejściowym. Dane wyjściowe nie są sortowane (ponieważ nie są wymagane)

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

Test

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>


Nie sqrt(x)byłby krótszy niż pow(x,.5)?
Jacajack,

@Jacajack tak, dziękuję, nie wiem jak to wymknęło mi się z głowy
edc65
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.