Top nereye inecek?


17

İlk satırın boşluklar ve bir nokta ( ."top") ve ardından boşluklar, eğik çizgiler ( /) ve ters eğik çizgiler ( ) içeren satırlar \verildiğinde, başlangıç ​​konumundan düştükten sonra topun hangi sütuna ineceğini belirleyin . Her biri /1 sütun sola \taşır ve her biri 1 sütun sağa taşır.

Örnek giriş

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

Örnek çıktı

Top, 5. sütunda başlar, /3. hatta vurur , ardından üçün \5 ila 7 numaralı satırlarda son konumu için:

7

Sütunların, çoğunlukla metin düzenleyici kurallarına uyum için 1 dizinli olduğunu unutmayın.

Edge kutuları

Top /ilk sütunda bir a vurursa, sonsuz olarak 0 sütunu 0'a yapışır. Programınız bunu yazdırarak doğru şekilde işlemelidir 0.

Top bir \/desenin her iki tarafına çarparsa , sonuç tanımsız olur. Programınızın çıktı olmadan sonlandırılmasına, sonsuz döngüye girmesine veya bir hata mesajı yazdırmasına (çözümüm yazdırılır -1) izin verilir, ancak geçerli çıktı olarak algılanabilecek hiçbir şeyi yazdırmamalıdır.

Top sol eğik çizgiyi bir \\desende vurursa, sağ eğik çizginin hemen altına, sağına değil. Başlangıçta düşündüğüm çözüm, bunu yanlış anlamaya meyilliydi, bu yüzden bu yolda gitmeyin!

Her satırda veya .sondan sonra /veya \her satırda boşluk olabilir veya olmayabilir . Programınız bu tür dolguların mevcut olmasına güvenmemelidir. Benzer bir notta, ilk satırı takip eden satırlar olabilir veya olmayabilir.

İlk satırın sıfır veya daha fazla boşluğa ve tam olarak bir boşluğa sahip olacağını varsayabilirsiniz .. Sonraki satırlarda varsa sıfır veya daha fazla boşluk ve sıfır veya daha fazla eğik çizgi olacaktır.

Uygulama ayrıntıları

Programınız uygun olan bir dosyadan (komut satırı bağımsız değişkeni olarak belirtilir) veya standart girdiden okuyabilir.

Programınızın standart çıktıya tek bir sayı vermesi gerekir. (Evet, sondaki yeni satır iyi. Evet, sayının birden fazla rakamı olabilir.)

Test senaryoları

Giriş:

.

Çıktı:

1

Buradaki girişin tam olarak bir bayt olduğunu unutmayın. Bu, halletmeniz gereken en küçük durum.

 

Giriş:

 .
 \
  \
   \
    \

Çıktı:

 6

Bu eğik çizgilerden sonra boşluk olmadığını unutmayın.

 

Giriş:

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

Çıktı:

0

 

Giriş:

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

Çıktı:

1

 

Giriş:

   .


 \
       /
/

      \

Çıktı:

4

 

Giriş:

 .
 \

\/\/\/

Çıktı:

(anything but a nonnegative number)

Kapanış konuşması

Bu soru (yerçekimi tabanlı) bilardo topu tipi bir bilgisayarı simüle etmeye benzer , ancak çok daha basittir, umarım daha fazla ilgi kazanacaktır.

Python'da 169 karakterlik bir çözümüm var. Eminim buradaki yetenekli golfçüler bu rekoru parçalara ayırabilirler. : ^)

Bu , bu yüzden ay sonunda karakterlerde en kısa cevap kabul edilecektir!


Aynı zamanda , biraz farklı bir içe aktarma formatı ve sadece bir atış ile A Sadece Bagatelle'ye çok benzer . İsterseniz test komut dosyalarımı ödünç alabilir ve değiştirebilirsiniz.
Gareth

Ateş et, bu sorunun başlığı onu kontrol etmem için yeterince şüpheli değildi. Bunun için üzgünüm.
Fraxtil

Sorun yok, bu soru iki buçuk yıl önceydi.
Gareth

Son örnekte, çıktının "Top sıkışmış" olması gerektiğini öneririm.
Mukul Kumar

Henüz ayın sonu olarak sayılıyor mu
?.

Yanıtlar:


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

Boşluk / sekme girinti hilesi kullanma. Burada özellikle zekice bir şey yapmadım. Fgeçerli dizin, lgeçerli çizgi; ztanımlanmamıştır, bu yüzden \/durumu olumlu yönde etkileyen bir tamsayı olmayan bir istisna atar .


2

05AB1E , 37 bayt

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

Çok satırlı dize olarak girin. Çıkışlar \/top sıkışıp kalması halinde.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

¶¡                       # 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 bayt

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

İlgili kural \/kaldırılırsa (ve bununla başa çıkmamız gerekmiyorsa), bu 41 bayta kısaltılabilir :

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

1

Java 10, 213 208 190 bayt

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

Bir içine sıkışıp kaldığımızda bir bölümü sıfır hata ile atar \/ .

@EdgyNerd sayesinde -5 bayt .

Açıklama:

Burada deneyin.

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'yı hiç bilmiyorum, ancak -1 döndürmekten daha kısa bir hataya neden olmaz mı?
EdgyNerd

@EdgyNerd Teşekkürler, bu gerçekten 5 bayt tasarruf sağlar. :)
Kevin Cruijssen

1

Python 3 , 124 bayt

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)

Çevrimiçi deneyin!

Ayrıca Python 2'de çalışır.

açıklama

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 bayt

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

Çevrimiçi deneyin!

_Top sıkıştığında sonsuzluğu döndürür . Bu özel durumla uğraşan birçok bayt kayboldu. Aksi takdirde, aşağı yukarı sıraların basit bir şekilde azaltılmasıdır. Kesinlikle daha fazla golf olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.