Где приземлится мяч?

17

Если задана строка, в которой первая строка содержит пробелы и один период ( .«шар»), за которыми следуют строки, содержащие пробелы, косую /черту ( \) и обратную косую черту ( ), определите, в какой столбец попадет мяч после падения из своей исходной позиции. , Каждый /перемещает его влево на 1 столбец, а каждый \перемещает вправо на 1 столбец.

Пример ввода

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

Образец вывода

Мяч начинается в столбце 5, попадает в /строку 3, а затем в тройки \в строки 5-7 для конечной позиции:

7

Обратите внимание, что столбцы индексируются 1, в основном для соответствия соглашениям текстового редактора.

Краевые случаи

Если мяч попадает /в первый столбец, он навсегда застрял в несуществующем столбце 0. Ваша программа должна правильно обработать это, печатая 0.

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

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

Могут или не могут быть пробелы после .или последней /или \на каждой строке. Ваша программа не должна полагаться на доступность такого дополнения. На аналогичном примечании могут быть или не быть какие-либо строки после первой строки.

Вы можете предположить, что в первой строке будет ноль или более пробелов и ровно один .. Последующие строки, если таковые имеются, будут иметь ноль или более пробелов и ноль или более косых черт.

Детали реализации

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

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

Контрольные примеры

Входные данные:

.

Выход:

1

Обратите внимание, что здесь вводится ровно один байт. Это наименьший случай, с которым вы сможете справиться.

 

Входные данные:

 .
 \
  \
   \
    \

Выход:

 6

Обратите внимание, что после этих слешей нет пробелов.

 

Входные данные:

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

Выход:

0

 

Входные данные:

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

Выход:

1

 

Входные данные:

   .


 \
       /
/

      \

Выход:

4

 

Входные данные:

 .
 \

\/\/\/

Выход:

(anything but a nonnegative number)

Заключительные замечания

Этот вопрос аналогичен моделированию компьютера типа "бильярдный шар" (на основе гравитации) , но значительно проще, поэтому, надеюсь, он получит больший интерес.

У меня есть 169-символьное решение в Python. Я уверен, что талантливые игроки в гольф могут разорвать эту пластинку на части. : ^)

Это , поэтому самый короткий ответ в символах будет принят в конце месяца!

Fraxtil
источник
Это также очень похоже на A Mere Bagatelle с немного другим форматом импорта и только одним броском. Вы можете позаимствовать и изменить мои тестовые сценарии, если хотите.
Гарет
Ну, стреляйте, название этого вопроса не было достаточно подозрительным, чтобы я его проверил. Прости за это.
Fraxtil
Ничего страшного, этот вопрос был два с половиной года назад.
Гарет
Я полагаю, что в последнем примере вывод должен быть «Шар застрял».
Мукул Кумар
Считается ли это еще концом месяца>. <
alexander-brett

Ответы:

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

Используя трюк с отступом пробела / табуляции. Я не сделал ничего особенно умного здесь. Fтекущий индекс, lтекущая строка; zне определен, поэтому он генерирует исключение, которое определенно не является положительным целым числом, обрабатывая \/ситуацию.

александр-Brett
источник
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$=-}/
Esolanging Fruit
источник
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;}

Выдает ошибку деления на ноль, когда мы застряли внутри \/ .

-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 байтов. :)
Кевин Круйссен
1

Python 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
Jitse
источник
0

J , 95 байт

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

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

Возвращает бесконечность, _когда мяч застревает. Потерял много байтов при обработке этого особого случая. В противном случае это более или менее простое сокращение строк. Конечно, можно играть в гольф дальше.

Ион
источник