Gdzie wyląduje piłka?

17

Biorąc pod uwagę ciąg, w którym pierwsza linia zawiera spacje i jeden kropka ( .„kulka”), a następnie linie zawierające spacje, ukośniki do przodu ( /) i ukośniki odwrotne ( \), określ, w której kolumnie wyląduje kula po upadku z pozycji początkowej . Każdy /przesuwa go w lewo o 1 kolumnę i każdy \przesuwa w prawo o 1 kolumnę.

Przykładowe dane wejściowe

    .
  /   \  \
    /   /
 \   \/  \
   \   /\
    \ /\  \
     \    /

Próbka wyjściowa

Piłka zaczyna się w kolumnie 5, uderza /w linię 3, następnie trzy \w liniach od 5 do 7, osiągając ostateczną pozycję:

7

Zauważ, że kolumny są indeksowane 1, głównie w celu zachowania spójności z konwencjami edytora tekstu.

Skrzynie na brzeg

Jeśli piłka uderzy /w pierwszą kolumnę, wiecznie utknie w nieistniejącej kolumnie 0. Twój program powinien sobie z tym poradzić poprawnie, drukując 0.

Jeśli piłka uderzy w dowolną stronę \/wzoru, wynik jest niezdefiniowany. Twój program może zakończyć działanie bez wyjścia, zapętlić się w nieskończoność lub wydrukować komunikat o błędzie (moje rozwiązanie drukuje -1), ale nie może drukować niczego, co mogłoby być postrzegane jako prawidłowe wyjście.

Jeśli piłka uderzy we lewy ukośnik \\wzorem, powinna skończyć się bezpośrednio pod prawym ukośnikiem, a nie na prawo od niego. Rozwiązanie, które pierwotnie przewidywałem, było skłonne do popełnienia tego błędu, więc nie idź tą drogą!

Mogą występować spacje po .ostatnim, ostatnim /lub \w każdej linii. Twój program nie powinien polegać na dostępności takiego wypełnienia. Na podobnej nuty mogą, ale nie muszą być żadne wiersze po pierwszym wierszu.

Możesz założyć, że pierwszy wiersz będzie miał zero lub więcej spacji i dokładnie jedną .. Kolejne wiersze, jeśli występują, będą miały zero lub więcej spacji i zero lub więcej ukośników.

Szczegóły dotyczące wdrożenia

Twój program może czytać z pliku (określonego jako argument wiersza poleceń) lub czytać ze standardowego wejścia, dla twojej wygody.

Twój program musi wypisać jedną liczbę na standardowe wyjście. (Tak, końcowy znak nowej linii jest w porządku. Tak, liczba może zawierać więcej niż jedną cyfrę.)

Przypadki testowe

Wejście:

.

Wynik:

1

Zauważ, że dane wejściowe mają dokładnie jeden bajt. Jest to najmniejszy przypadek, z którym powinieneś sobie poradzić.

 

Wejście:

 .
 \
  \
   \
    \

Wynik:

 6

Zauważ, że po tych ukośnikach nie ma spacji.

 

Wejście:

  .
  /
 /\\  /  \
//\ \/// //
\\/ \/\ /\/

Wynik:

0

 

Wejście:

  .
/ / /
 \\\
  /\\
 /   \

Wynik:

1

 

Wejście:

   .


 \
       /
/

      \

Wynik:

4

 

Wejście:

 .
 \

\/\/\/

Wynik:

(anything but a nonnegative number)

Uwagi końcowe

To pytanie jest podobne do Symuluj (oparty na grawitacji) komputer typu kule bilardowe , ale znacznie prostsze, więc mam nadzieję, że zyska większe zainteresowanie.

Mam 169-znakowe rozwiązanie w Pythonie. Jestem pewien, że utalentowani golfiści mogą rozerwać ten rekord na kawałki. : ^)

To jest , więc najkrótsza odpowiedź w postaci zostanie zaakceptowana pod koniec miesiąca!

Fraxtil
źródło
Jest również bardzo podobny do A Mere Bagatelle z nieco innym formatem importu i tylko jednym rzutem. Możesz pożyczyć i zmodyfikować moje skrypty testowe, jeśli chcesz.
Gareth,
Cóż, strzel, tytuł tego pytania nie był wystarczająco podejrzany, żebym to sprawdził. Przepraszam za to.
Fraxtil,
W porządku, to pytanie było dwa i pół roku temu.
Gareth,
Sugeruję, że w ostatnim przykładzie wyjście powinno brzmieć „Piłka utknęła”.
Mukul Kumar
Czy liczy się to jeszcze jako koniec miesiąca>. <
Alexander-brett

Odpowiedzi:

5

Python, 143B

import sys
for l in sys.stdin:
 a=l.find('.')
 if a>-1:F=a
 elif F>-1: 
    if'\\/'in l[F-1:F+2]:z
    F+={'\\':1,'/':-1}.get((l+' '*F)[F],0)
print F+1

Używanie sztuczki wcięcia spacji / tabulacji. Nie zrobiłem tu nic szczególnie sprytnego. Fjest bieżącym indeksem, ljest bieżącą linią; zjest niezdefiniowany, więc generuje wyjątek, który zdecydowanie nie jest dodatnią liczbą całkowitą, obsługującą \/sytuację.

Alexander-Brett
źródło
2

05AB1E , 37 bajtów

¶¡ð«ć'.ksvU…/ \yXD>‚èJD„\/Qiõqëнk<X+]>

Wprowadź jako ciąg wielu wierszy. Wydaje, \/jeśli piłka utknęła.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

¶¡                       # Split the (implicit) input-string on newlines
                         # (work-around instead of `|`, because it will stop at empty lines)
  ð«                     # Add a trailing space to each line (work-around because indexing
                         # -1 in 05AB1E will wrap around to the other side)
    ć                    # Extract head; pop and push the remainder-lines and first line
                         # separated to the stack
     '.k                '# Get the 0-based index of "." in this first line
s                        # Swap to get the remainder-list of lines
v                        # Loop over each line `y`:
 U                       #  Pop and store the top value (the index) in variable `X`
       X                 #  Push the current index `X`
        D>               #  Duplicate it, and increase the copy by 1
                        #  Pair to [X, X+1]
      y    è             #  Index both of those into the current line `y`
            JD           #  Join the two characters together, and duplicate it
              \/Qi      #  If it's equal to "\/":
                   q     #   Stop the program
                         #   (after which the string is output implicitly as result)
                  ë      #  Else:
                   н     #   Only leave the first character (at index `X`)
  …/ \              k    #   Get its 0-based index in string "/ \"
                     <   #   Decrease it by 1
                      X+ #   And add it to `X`
]                        # After the loop:
 >                       # Increase the top of the stack (`X`) by 1
                         # (after which it's output implicitly as result)
Kevin Cruijssen
źródło
1

CJam, 61 bajtów

qN/('.#)\_:,0+:e>f{' e]" /"f#0\+}{1$1$=\@2$-_@=@[\]$[W1]#/z}/

Jeśli reguła dotycząca \/zostanie zniesiona (i nie jesteśmy zobowiązani do jej obsługi), można ją skrócić do 41 bajtów:

qN/('.#)\_:,:e>f{' e]" /"f#0\+0+}{1$=-}/
Esolanging Fruit
źródło
1

Java 10, 213 208 190 bajtów

s->{int r=s.indexOf('.'),c;for(var x:s.split("\n")){for(;r>x.length()-2;x+=" ");c=x.charAt(r);if(c==46)continue;r/=c>47&x.charAt(r+1)==47?0:1;r+=c<33?0:c<48?-1:1;if(r<0)return 0;}return-~r;}

Zgłasza błąd dzielony przez zero, gdy utkniemy w środku \/.

-5 bajtów dzięki @EdgyNerd .

Wyjaśnienie:

Wypróbuj tutaj.

s->{                             // Method with String parameter and integer return-type
  int r=s.indexOf('.'),          //  Get the index of the dot on the first line
      c;                         //  Temp integer
  for(var x:s.split("\n")){      //  Split the input by newlines, and loop over the lines:
    for(;r>x.length()-2;x+=" "); //   Append trailing spaces if necessary
    c=x.charAt(r);               //   Get the character at the current index of this line
    if(c==46)                    //   If this is the first line (the char is the dot)
      continue;                  //    Continue to the next iteration of the loop
    r/=c>47&x.charAt(r+1)==47?   //   If we're stuck in a `\/`
        0                        //    Divide by 0 to exit the function with an error
       :1;                       //   Else: divide by 1 as no-op
    r+=c<33?                     //   If the current character is a space:
        0                        //    `r` remains at the same index
       :c<48?                    //   Else if it's a `/`:
        -1                       //    Index `r` is decreased by 1
       :                         //   Else (if it's a `\`):
        1;                       //    Index `r` is increased by 1
    if(r<0)                      //   If `r` is now -1:
      return 0;}                 //    Return 0
  return-~r;}                    //  After the loop: return the index `r` + 1
Kevin Cruijssen
źródło
2
W ogóle nie znam Java, ale czy błąd nie byłby krótszy niż zwracanie -1?
EdgyNerd,
@EdgyNerd Dzięki, to rzeczywiście oszczędza 5 bajtów. :)
Kevin Cruijssen
1

Python 3 , 124 bajty

import sys
for l in sys.stdin:i=('.'in l)*l.find('.')or(i<0)*i-2*('\\/'in l[i-1:i+2])or' \\'.find((l+i*' ')[i])+i
print(i+1)

Wypróbuj online!

Działa również w Python 2.

Wyjaśnienie

for l in sys.stdin:i=          # Change value i for each line in the input
('.'in l)*l.find('.')          # Set i to (0-indexed) dot position if present
or(i<0)*i                      # Keep i fixed if it is below zero
-2*('\\/'in l[i-1:i+2])        # Set i to -2 if \/ trap is encountered
or' \\'.find((l+i*' ')[i])+i   # Else: move position based on character
print(i+1)                     # Print final 1-indexed position
Jitse
źródło
0

J , 95 bajtów

[:>[:(<"1@|.@}.([:(1&{+_*0>[:*/2-/\])(]+{~ ::])^:(<3))&.>/@,2<@i.~{.)[:(0,'/ \'<:@i.]);._1 LF,]

Wypróbuj online!

Zwraca nieskończoność, _gdy piłka utknie. Utracono wiele bajtów obsługujących ten specjalny przypadek. W przeciwnym razie jest to mniej więcej prosta redukcja rzędów. Z pewnością można by dalej grać w golfa.

Jonasz
źródło