Де приземлиться куля?


17

Давши рядок, де перший рядок містить пробіли та один період ( ., "кулька"), а потім рядки, що містять пробіли, косою косою рискою ( /) та косою косою рисою ( \), визначте, у який стовпчик потрапить куля після падіння із початкового положення . Кожен /переміщує його вліво на 1 стовпчик і кожен \переміщує його вправо на 1 стовпець.

Зразок введення

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

Вибірка зразка

Куля починається у колонці 5, потрапляє /на лінію 3, потім три \на лінії 5 - 7 для остаточного положення:

7

Зауважте, що стовпці мають 1-індексацію, переважно для узгодження з текстовими редакторами.

Корпусні кромки

Якщо куля потрапляє на a /в першому стовпчику, він назавжди застряг у неіснуючій колонці 0. Ваша програма повинна правильно впоратися з цим шляхом друку 0.

Якщо куля потрапляє в обидві сторони \/візерунка, результат не визначений. Вашій програмі дозволено закінчуватись без виводу, нескінченно циклічно чи друкувати повідомлення про помилку (друкується моє рішення -1), але вона не повинна друкувати нічого, що може сприйматись як дійсний вихід.

Якщо м'яч \\вдарив по лівій косою рисою за малюнком, він повинен закінчитися прямо під правою косою рисою, а не праворуч від неї. Рішення, яке я спочатку передбачав, було схильне сприймати це неправильно, тому не йдіть цим шляхом!

Після .або останнього, /або \у кожному рядку можуть бути пробіли . Ваша програма не повинна покладатися на доступність таких прокладок. На подібній ноті, за першим рядком можуть бути або не бути жодних рядків.

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

Деталі реалізації

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

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

Тестові справи

Вхід:

.

Вихід:

1

Зауважте, що тут вхід рівно один байт. Це найменший випадок, з яким ви повинні мати справу.

 

Вхід:

 .
 \
  \
   \
    \

Вихід:

 6

Зауважте, що після цих прорізів немає пробілів.

 

Вхід:

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

Вихід:

0

 

Вхід:

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

Вихід:

1

 

Вхід:

   .


 \
       /
/

      \

Вихід:

4

 

Вхід:

 .
 \

\/\/\/

Вихід:

(anything but a nonnegative number)

Заключними зауваженнями

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

У мене в Python є рішення з 169 символами. Я впевнений, що талановиті гольфісти можуть зірвати цей запис на шматки. : ^)

Це , тому найкоротша відповідь символами буде прийнята в кінці місяця!


Він також дуже схожий на A Mere Bagatelle з дещо іншим форматом імпорту та лише одним кидком. Ви можете запозичити та змінити мої тестові сценарії, якщо хочете.
Гарет

Ну, стріляйте, назва цього питання не була достатньо підозрілою для мене, щоб перевірити його. Вибач за це.
Fraxtil

Це добре, це питання було два з половиною роки тому.
Гарет

Я пропоную, щоб в останньому прикладі на виході повинен бути «Куля застряг».
Мукул Кумар

Чи вважається це ще кінцем місяця>. <
alexander-brett

Відповіді:


5

Пітона, 143Б

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

Використання трюку відступу пробілу / вкладки. Я тут не робив нічого особливо розумного. F- поточний індекс, l- поточний рядок; zне визначено, тому він кидає виняток, який, безумовно, не є додатним цілим числом, керуючи \/ситуацією.


2

05AB1E , 37 байт

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

Введіть як багаторядковий рядок. Виходи, \/якщо куля застрягла.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

¶¡                       # 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)

1

CJam, 61 байт

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

Якщо правило щодо \/цього скасовано (і ми не зобов’язані його виконувати), це може бути скорочено до 41 байта:

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

1

Java 10, 213 208 190 байт

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

Кидає ділення на нульову помилку, коли ми застрягли всередині a \/.

-5 байт завдяки @EdgyNerd .

Пояснення:

Спробуйте тут.

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

2
Я взагалі не знаю Java, але не спричинив би помилку коротше, ніж повернення -1?
EdgyNerd

@EdgyNerd Спасибі, що дійсно економить 5 байт. :)
Kevin Cruijssen

1

Пітон 3 , 124 байти

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)

Спробуйте в Інтернеті!

Також працює в Python 2.

Пояснення

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

0

J , 95 байт

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

Спробуйте в Інтернеті!

Повертає нескінченність, _коли куля застрягає. Втратили багато байт, обробляючи цей особливий випадок. Інакше це більш-менш просте скорочення рядків. Можливо, можна було б пограти в гольф далі.

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