球将降落在哪里?


17

给定一个字符串,其中第一行包含空格和一个句点(.,即“球”),然后是包含空格,正斜杠(/)和反斜杠(\)的行,请确定从起始位置掉落后球将落入的列。每个/将其向左移动一列,然后\将其向右移动一列。

样品输入

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

样品输出

球从第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非常相似,只是导入格式略有不同,只有一个抛出。您可以根据需要借用和修改我的测试脚本。
Gareth 2014年

好吧,射击,这个问题的标题并不足以让我检查它。对于那个很抱歉。
Fraxtil 2014年

没关系,这个问题是两年半以前的。
Gareth 2014年

我建议在最后一个示例中,输出应为“球被卡住”。
Mukul Kumar 2014年

它是否算作月底>。<
亚历山大·布雷特

Answers:


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是未定义的,因此会引发异常(绝对不是正整数)来处理这种\/情况。


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

当我们卡在时会抛出除以零的错误\/

-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

0

J,95字节

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

在线尝试!

_当球卡住时返回无穷大。丢失许多字节来处理这种特殊情况。否则,它或多或少是行的简单减少。当然可以打得更远。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.