ボールはどこに着地しますか?


17

最初の行にスペースと1つのピリオド(.、「ボール」)が含まれ、その後にスペース、スラッシュ(/)、およびバックスラッシュ()が含まれる行が続く文字\列を指定すると、ボールが開始位置から落ちた後に着地する列を決定します。それぞれ/が左に1列ずつ\移動し、それぞれが右に1列ずつ移動します。

サンプル入力

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

サンプル出力

ボールは5列目から始まり、/3行目でヒットし、次に\5行目から7行目までの3つがヒットし、最終的な位置は

7

主にテキストエディタの規則との一貫性のために、列は1からインデックス付けされていることに注意してください。

エッジケース

ボール/が最初の列でa に当たった場合、ボールは存在しない列0に永久に留まります0

ボールが\/パターンのいずれかの側に当たった場合、結果は不定です。プログラムは出力なしで終了するか、無限ループするか、エラーメッセージを印刷することができます(私のソリューションは印刷します-1)が、有効な出力と認識できるものを印刷することはできません。

ボールが\\パターン内の左スラッシュに当たった場合、ボールは右スラッシュではなく、右スラッシュの直下に到達するはずです。私が当初考えていた解決策は、この間違いを起こしやすいため、その道をたどらないでください!

.最後/または\各行の後にスペースがある場合とない場合があります。あなたのプログラムは、そのようなパディングが利用可能であることに依存すべきではありません。同様に、最初の行に続く行がある場合とない場合があります。

最初の行には0個以上のスペースと正確に1個のスペースがあると想定できます.。後続の行がある場合は、ゼロ個以上のスペースとゼロ個以上のスラッシュが含まれます。

実装の詳細

プログラムは、ファイル(コマンドライン引数として指定)から読み取るか、標準入力から読み取ることができます。

プログラムは、単一の数値を標準出力に出力する必要があります。(はい、末尾の改行は問題ありません。はい、数字に複数の数字がある場合があります。)

テストケース

入力:

.

出力:

1

ここでの入力は正確に1バイトであることに注意してください。これは、処理できる最小のケースです。

 

入力:

 .
 \
  \
   \
    \

出力:

 6

これらのスラッシュの後にスペースがないことに注意してください。

 

入力:

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

出力:

0

 

入力:

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

出力:

1

 

入力:

   .


 \
       /
/

      \

出力:

4

 

入力:

 .
 \

\/\/\/

出力:

(anything but a nonnegative number)

閉会の辞

この質問は、(重力ベースの)ビリヤードボールタイプのコンピューターシミュレートするのと似ていますが、非常に単純なので、より多くの関心が得られることを願っています。

Pythonで169文字のソリューションがあります。しかし、ここの才能のあるゴルファーは、その記録をバラバラにすることができると確信しています。:^)

これはなので、文字の最短回答は月末に受け入れられます!


A Mere Bagatelleと非常によく似ており、インポート形式がわずかに異なり、スローは1つだけです。必要に応じて、テストスクリプトを借用して変更できます。
ガレス14

撮影、その質問のタイトルは、私がそれを確認するのに十分なほど疑わしくありませんでした。ごめんなさい
Fraxtil

大丈夫です、その質問は2年半前でした。
ガレス14

最後の例では、出力は「ボールが詰まっている」ことをお勧めします。
ムクルクマール14

それは>まだ月末として数えるん<。
アレクサンダー・ブレット

回答:


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

内にスタックしているときにゼロ除算エラーをスローします\/

@EdgyNerdのおかげで-5バイト。

説明:

ここで試してみてください。

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,]

オンラインでお試しください!

_ボールがスタックしたときに無限大を返します。その特殊なケースを処理する多くのバイトを失いました。それ以外の場合は、多かれ少なかれ、行の単純な削減です。確かにさらにゴルフができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.