Di mana bola akan mendarat?

17

Diberikan string di mana baris pertama berisi spasi dan satu periode ( ., "bola"), diikuti oleh garis yang berisi spasi, garis miring ke depan ( /), dan garis miring terbalik ( \), tentukan kolom mana bola akan mendarat setelah jatuh dari posisi awalnya . Masing-masing /memindahkannya ke kiri sebanyak 1 kolom dan masing-masing \memindahkannya ke kanan sebanyak 1 kolom.

Masukan sampel

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

Output sampel

Bola dimulai pada kolom 5, hits /on line 3, maka tiga \'s pada garis 5 sampai 7 untuk posisi akhir:

7

Perhatikan bahwa kolom 1-diindeks, sebagian besar untuk konsistensi dengan konvensi editor teks.

Kasus tepi

Jika bola menyentuh a /di kolom pertama, bola itu selamanya macet di kolom tidak ada 0. Program Anda harus menangani ini dengan benar dengan mencetak 0.

Jika bola menyentuh kedua sisi \/pola, hasilnya tidak ditentukan. Program Anda diizinkan untuk mengakhiri tanpa output, loop tanpa batas, atau mencetak pesan kesalahan (solusi saya mencetak -1), tetapi tidak boleh mencetak apa pun yang dapat dianggap sebagai output yang valid.

Jika bola menyentuh tebasan kiri dalam suatu \\pola, bola seharusnya berakhir tepat di bawah tebasan kanan, bukan ke kanan. Solusi yang awalnya saya bayangkan adalah cenderung salah, jadi jangan pergi jalan itu!

Mungkin ada atau mungkin tidak ada spasi setelah .atau yang terakhir /atau \pada setiap baris. Program Anda seharusnya tidak mengandalkan padding yang tersedia. Pada catatan yang sama, mungkin ada atau tidak ada baris yang mengikuti baris pertama.

Anda dapat mengasumsikan bahwa baris pertama akan memiliki nol atau lebih banyak ruang dan tepat satu .. Baris berikutnya, jika ada, akan memiliki nol atau lebih banyak ruang dan nol atau lebih garis miring.

Detail implementasi

Program Anda dapat membaca dari file (ditentukan sebagai argumen baris perintah) atau membaca dari input standar, sesuai keinginan Anda.

Program Anda harus menampilkan satu nomor ke keluaran standar. (Ya, garis belakang baru baik-baik saja. Ya, jumlahnya mungkin memiliki lebih dari satu digit.)

Uji kasus

Memasukkan:

.

Keluaran:

1

Perhatikan bahwa input di sini persis satu byte. Ini adalah kasus terkecil yang harus Anda tangani.

 

Memasukkan:

 .
 \
  \
   \
    \

Keluaran:

 6

Perhatikan bahwa tidak ada spasi setelah garis miring ini.

 

Memasukkan:

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

Keluaran:

0

 

Memasukkan:

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

Keluaran:

1

 

Memasukkan:

   .


 \
       /
/

      \

Keluaran:

4

 

Memasukkan:

 .
 \

\/\/\/

Keluaran:

(anything but a nonnegative number)

Kata penutup

Pertanyaan ini mirip dengan Mensimulasikan komputer jenis bola biliar (berbasis gravitasi) , tetapi secara signifikan lebih sederhana, sehingga mudah-mudahan itu akan menarik minat lebih banyak.

Saya punya solusi 169 karakter dengan Python. Saya yakin pegolf berbakat di sini bisa merobek rekor itu berkeping-keping. : ^)

Ini , jadi jawaban terpendek dalam karakter akan diterima pada akhir bulan!

Fraxtil
sumber
Ini juga sangat mirip dengan A Mere Bagatelle dengan format impor yang sedikit berbeda dan hanya satu lemparan. Anda dapat meminjam dan memodifikasi skrip pengujian saya jika mau.
Gareth
Nah, tembak, judul pertanyaan itu tidak cukup mencurigakan bagi saya untuk memeriksanya. Maaf soal itu.
Fraxtil
Tidak apa-apa, pertanyaan itu dua setengah tahun yang lalu.
Gareth
Saya menyarankan bahwa dalam contoh terakhir, output harus "Bola macet".
Mukul Kumar
Apakah itu terhitung sebagai akhir bulan ini>. <
alexander-brett

Jawaban:

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

Menggunakan trik lekukan spasi / tab. Saya belum melakukan sesuatu yang sangat pintar di sini. Fadalah indeks saat ini, ladalah garis saat ini; ztidak terdefinisi sehingga melempar pengecualian, yang jelas bukan bilangan bulat positif, menangani \/situasi.

alexander-brett
sumber
2

05AB1E , 37 byte

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

Input sebagai string multi-line. Keluaran \/jika bola macet.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

¶¡                       # 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
sumber
1

CJam, 61 byte

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

Jika aturan tentang \/dicabut (dan kami tidak diharuskan menanganinya), ini bisa disingkat menjadi 41 byte:

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

Java 10, 213 208 190 byte

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

Melemparkan pembagian dengan kesalahan nol saat kita terjebak di dalam a \/ .

-5 byte berkat @EdgyNerd .

Penjelasan:

Coba di sini.

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
sumber
2
Saya tidak tahu Java sama sekali, tetapi tidak akan menyebabkan kesalahan lebih pendek daripada mengembalikan -1?
EdgyNerd
@ EdgyNerd Terima kasih, itu memang menghemat 5 byte. :)
Kevin Cruijssen
1

Python 3 , 124 byte

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)

Cobalah online!

Juga berfungsi di Python 2.

Penjelasan

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
sumber
0

J , 95 byte

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

Cobalah online!

Mengembalikan tak terhingga _ketika bola macet. Kehilangan banyak byte yang menangani case khusus itu. Kalau tidak, itu lebih merupakan pengurangan sederhana dari baris. Pasti bisa bermain golf lebih lanjut.

Jonah
sumber