ลูกบอลจะลงจอดที่ไหน?


17

รับสตริงที่บรรทัดแรกมีช่องว่างและหนึ่งจุด ( ., "ลูกบอล") ตามด้วยบรรทัดที่มีช่องว่าง, เครื่องหมายทับ/ซ้าย ( \) และเครื่องหมายแบ็กสแลช ( ) กำหนดคอลัมน์ที่ลูกบอลจะตกลงหลังจากตกจากตำแหน่งเริ่มต้น . แต่ละ/ย้ายไปทางซ้าย 1 คอลัมน์และ\ย้ายไปทางขวา 1 คอลัมน์

ตัวอย่างอินพุต

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

ตัวอย่างผลลัพธ์

ลูกบอลเริ่มต้นในคอลัมน์ 5 ไป/ที่บรรทัดที่ 3 จากนั้นลูกบอลทั้งสาม\ในบรรทัดที่ 5 ถึง 7 สำหรับตำแหน่งสุดท้ายของ:

7

โปรดทราบว่าคอลัมน์นั้นมีการจัดทำดัชนี 1 ส่วนใหญ่เพื่อความสอดคล้องกับข้อกำหนดของโปรแกรมแก้ไขข้อความ

กรณีขอบ

ถ้าลูกฮิต/ในคอลัมน์แรกมันเป็นนิรันดร์ที่ติดอยู่ในคอลัมน์ดำรง 0. 0โปรแกรมของคุณควรจะจัดการกับเรื่องนี้อย่างถูกต้องโดยการพิมพ์

หากลูกบอลกระทบด้านใดด้านหนึ่งของ\/ลวดลายผลลัพธ์จะไม่ถูกกำหนด โปรแกรมของคุณได้รับอนุญาตให้ยกเลิกโดยไม่มีเอาต์พุตวนซ้ำไม่สิ้นสุดหรือพิมพ์ข้อความแสดงข้อผิดพลาด (โซลูชันของฉันพิมพ์ออกมา-1) แต่ต้องไม่พิมพ์สิ่งใด ๆ ที่สามารถรับรู้ว่าเป็นเอาต์พุตที่ถูกต้อง

หากลูกบอลกระทบกับสแลชซ้ายใน\\รูปแบบมันควรจะจบลงตรงใต้สแลชขวาไม่ใช่ไปทางขวาของมัน วิธีแก้ปัญหาที่ฉันคิดว่าแรกเริ่มมีแนวโน้มที่จะผิดพลาดดังนั้นอย่าไปตามทางนั้น!

อาจมีหรือไม่มีช่องว่างหลังจาก.หรือสุดท้าย/หรือ\ในแต่ละบรรทัด โปรแกรมของคุณไม่ควรใช้ช่องว่างภายในดังกล่าว ในบันทึกที่คล้ายกันอาจมีหรือไม่มีบรรทัดใด ๆ ที่ตามหลังบรรทัดแรก

.คุณอาจจะคิดว่าบรรทัดแรกจะมีศูนย์หรือมากกว่าช่องว่างและตรงหนึ่ง บรรทัดที่ตามมาหากมีจะมีช่องว่างเป็นศูนย์หรือมากกว่าและมีเครื่องหมายทับเป็นศูนย์

รายละเอียดการใช้งาน

โปรแกรมของคุณอาจอ่านจากไฟล์ (ระบุเป็นอาร์กิวเมนต์บรรทัดคำสั่ง) หรืออ่านจากอินพุตมาตรฐานตามความสะดวกของคุณ

โปรแกรมของคุณต้องส่งออกหมายเลขเดียวไปยังเอาต์พุตมาตรฐาน (ใช่บรรทัดใหม่ที่ต่อท้ายนั้นใช้ได้ แต่ตัวเลขอาจมีมากกว่าหนึ่งหลัก)

กรณีทดสอบ

การป้อนข้อมูล:

.

เอาท์พุท:

1

โปรดทราบว่าอินพุตที่นี่คือหนึ่งไบต์ นี่เป็นกรณีที่เล็กที่สุดที่คุณควรจัดการ

 

การป้อนข้อมูล:

 .
 \
  \
   \
    \

เอาท์พุท:

 6

โปรดทราบว่าไม่มีช่องว่างหลังจากเครื่องหมายทับเหล่านี้

 

การป้อนข้อมูล:

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

เอาท์พุท:

0

 

การป้อนข้อมูล:

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

เอาท์พุท:

1

 

การป้อนข้อมูล:

   .


 \
       /
/

      \

เอาท์พุท:

4

 

การป้อนข้อมูล:

 .
 \

\/\/\/

เอาท์พุท:

(anything but a nonnegative number)

พูดปิด

คำถามนี้คล้ายกับจำลองคอมพิวเตอร์ประเภทบิลเลียดที่ใช้แรงโน้มถ่วงแต่ง่ายกว่ามากดังนั้นหวังว่าจะได้รับความสนใจมากขึ้น

ฉันมีโซลูชัน 169 ตัวอักษรใน Python ฉันแน่ใจว่านักกอล์ฟที่มีความสามารถที่นี่สามารถฉีกบันทึกเป็นชิ้น ๆ ได้ : ^)

นี่คือดังนั้นคำตอบที่สั้นที่สุดในตัวละครจะได้รับการยอมรับในตอนท้ายของเดือน!


นอกจากนี้ยังคล้ายกับA Mere Bagatelle ที่มีรูปแบบการนำเข้าแตกต่างกันเล็กน้อยและมีเพียงการโยนเพียงครั้งเดียว คุณสามารถยืมและแก้ไขสคริปต์ทดสอบของฉันได้ถ้าต้องการ
Gareth

ยิงคำถามของคำถามนั้นไม่น่าสงสัยพอที่ฉันจะตรวจสอบ ขอโทษสำหรับเรื่องนั้น.
Fraxtil

ไม่เป็นไรคำถามนั้นคือเมื่อสองปีครึ่งที่แล้ว
Gareth

ฉันขอแนะนำว่าในตัวอย่างสุดท้ายผลลัพธ์ควรเป็น "ลูกบอลค้างอยู่"
Mukul Kumar

นับเป็นสิ้นเดือนหรือยัง>. <
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ไม่ได้ถูกกำหนดดังนั้นมันจะส่งข้อยกเว้นซึ่งไม่ใช่จำนวนเต็มบวกแน่นอนว่าจัดการ\/สถานการณ์


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 ไบต์แน่นอน :)
Kevin Cruijssen

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.