Bir merdiven üzerinde robot


30

Arka fon

Duvara yaslanmış bir merdivenim ve onu tırmanabilen uzaktan kumandalı bir robotum var. Robota üç farklı komut gönderebilirim:

  • UP: robot bir adım yukarı atıyor. En yüksek basamağında olsaydı gezer, yere düşer ve patlar.
  • DOWN: robot aşağı doğru bir adım atıyor. En düşük adımdaysa, hiçbir şey olmuyor.
  • RESET: robot en düşük basamağa geri döner.

Ayrıca bir dizi komut gönderebilirim ve robot bunları birer birer uygular. Senin görevin hareketlerini tahmin etmektir.

Giriş

Sizin girişler pozitif bir tam sayı olduğu Nmerdivenin basamakları sayısını temsil ve boş olmayan bir dize Cüzerinde UDRben robot gönderilen adres komutları temsil eden. Bunu varsayabilirsin N < 1000. Robot, merdivenin en alt basamağında başlatıldı.

Çıktı

Bir noktada robotun en yüksek basamağa tırmanacağı ve patlayacağı garanti edilir. Çıktınız, bu olmadan önce yürüttüğü komut sayısıdır.

Örnek

Girdileri göz önünde bulundurun N = 4ve C = "UDDUURUUUUUUUDDDD" ile gösterilen robot, @4 adımlı merdiven boyunca aşağıdaki gibi hareket eder:

|-|   |-|   |-|   |-|   |-|   |-|   |-|   |-|   |-|   |@|   |-||
|-|   |-|   |-|   |-|   |-|   |@|   |-|   |-|   |@|   |-|   |-||
|-|   |@|   |-|   |-|   |@|   |-|   |-|   |@|   |-|   |-|   |-|v
|@| U |-| D |@| D |@| U |-| U |-| R |@| U |-| U |-| U |-| U |-|# Boom!

Robot patladığından, kalan komutlar yerine getirilmedi. Patlama 10 komuttan sonra gerçekleşti, bu yüzden doğru çıktı 10.

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez.

Test durumları

  1 U -> 1
  1 DDRUDUU -> 4
  4 UDDUUUUURUUUUDDDD -> 7
  4 UDDUURUUUUUUUDDDD -> 10
  6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR -> 20
 10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU -> 34
  6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU -> 8
  6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU -> 32
 20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU -> 56
354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU -> 872


8
Görevin bu ASCII sanatını yaratmamasından hayal kırıklığına uğradım.
user253751


Bir dize yerine, karakter kodlarının bir listesini alabilir miyiz?
Cyoce

@Cyoce Yalnızca dilinizin bir dizeyi temsil edecek başka yolu yoksa.
Zgarb

Yanıtlar:


10

CJam, 26 25 22 bayt

0l{i"()~ "=~0e>_}%ri#)

Giriş formatı ilk satırdaki talimat ve ikinci basamaktaki merdiven yüksekliğidir.

Burada test et.

açıklama

0         e# Push a 0 - the initial position of the robot.
l         e# Read the instructions.
{         e# Map this block over the instruction...
  i       e#   Convert to character code. D -> 68, U -> 85, R -> 82.
  "()~ "= e#   We use these as cyclic indices into this array. Note that the values
          e#   modulo 4 are 0, 1 and 2, respectively. So U -> ) (increment),
          e#   D -> ( (decrement), R -> ~ (bitwise NOT, i.e negated and decrement).
  ~       e#   Evaluate the character as code.
  0e>     e#   Clamp to non-negative numbers. So D can't go below 0, and since R is
          e#   guaranteed to yield something negative, this resets it to zero.
  _       e#   Duplicate, so we keep one copy of the current position on the stack.
}%        e# Since this was a map, the result will be wrapped in an array.
ri        e# Read the ladder height and convert it to an integer.
#         e# Find its first occurrence in the list of positions.
)         e# The result is off by one, so we increment it.

Patlamadan sonra bile tüm komutları işlemek için iyi bir fikir. Birkaç byte kurtarmak için ödünç alacağım
Luis Mendo

7

C, 83 71 + 4 = 75 bayt

Bana 8 byte izin verilen K & S stilini göstermek için teşekkürler @Josh !!

f(i,s,z,a)char*s;{z-=*s<82?z>0:*s>82?-1:z;return z-i?f(i,s+1,z,a+1):a;}

İzahı:

f(i,s,z,a)char*s;{ // function needs one integer and one "string"
  z-=              // z is the bot's height
    *s<82?         // if 'Down'
      z>0          // then subtract 1 when z>0 or nothing otherwise
    :*s>82?        // else if 'Up'
      -1           // increase height z-=-1
    :z;            // else reset z=z-z
  return z-i?      // if z is not the max height
    f(i,s+1,z,a+1) // try next step
  :a;              // else print how many calls/steps were made
}                  // end of function

Örnek çağrı:

f(1,"U",0,1);    // I've added 4 bytes in the score because of ",0,1"

İdeone canlı test


1
Güzel cevap, ancak işlevin yalnızca bir kez kullanılabildiğinden zve asıfırlanmadığından etkin bir şekilde kullanılabileceğini belirtmekte fayda var .
Josh,

@Josh. Güncelledim :)
kaldırıldı

1
Müthiş! Ayrıca, işlevinizdeki tür bildirimleriyle oynayarak da birkaç karakter kaydedebilirsiniz: codegolf.stackexchange.com/a/40266/13877
Josh

@Josh. Vay bu harika! thanks
kaldırıldı

6

JavaScript (ES6), 54 53 bayt

n=>c=>(f=p=>n-p?f({D:p&&p-1,U:p+1}[c[i++]]|0):i)(i=0)

açıklama

Dahili olarak özyinelemeli bir işlev kullanır.

var solution =

n=>c=>(
  f=p=>             // f = recursive function, p = position of robot on ladder
    n-p?            // if p != n
      f({           // execute the next command
          D:p&&p-1, // D -> p = max of p - 1 and 0
          U:p+1     // U -> p = p + 1
        }[c[i++]]   // get current command then increment i (current command index)
        |0          // R -> p = 0
      )
    :i              // else return the current command index
)(i=0)              // initialise p and i to 0 for the first recurse
N = <input type="number" id="N" value="354" /><br />
C = <input type="text" id="C" value="UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU" /><br />
<button onclick="result.textContent=solution(+N.value)(C.value)">Go</button>
<pre id="result"></pre>


4

Perl, 47 + 2 = 49 bayt

$z-=-/U/||$z&&/D/;$z*=!/R/;$^I<=$z&&last}{$_=$.

Gerektirir -pbayrağı, -i$Nikinci yükseklik ve hamle satır ayrılmış listesi:

$ perl -pi10 ladderbot.pl <<<< $'U\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU'
34

Nasıl çalışır:

                                                # '-p' wraps the code in (simplified):
                                                # while($_=<>) {...print $_}
$z-=-/U/||$z&&/D/;                              # Subtract -1 if UP. subtract 1 if DOWN
                  $z*=!/R/;                     # If R then times by zero
                           $^I<=$z&&last        # Break while loop if N is reached
                                        }{      # Eskimo operator:
                                                # while($_=<>){...}{print$_}
                                          $_=$. # `$.` contains number of lines read from input.

Deparsed:

LINE: while (defined($_ = <ARGV>)) {
    $z -= -/U/ || $z && /D/;
    $z *= !/R/;
    last if $^I <= $z;
}
{
    $_ = $.;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

4

JavaScript (SpiderMonkey 30+), 65 64 bayt

(n,s,i=0)=>[for(c of s)if(i<n)c<'E'?i&&i--:c>'T'?i++:i=0].length

Nasıl çalışır

İlk önce değişkeni i0 olarak ayarladık. Bu robotun kaç adım attığını izleyecektir. Sonra cgiriş dizesindeki her karakter için aşağıdaki mantığı çalıştırırız:

  1. Eğer idaha büyük ya da eşit n, bir şey yapmayın.
  2. Eğer cbir "D":
    • Eğer i0, bu gibidir bırakın.
    • Aksi takdirde, 1 oranında azaltın.
  3. Eğer cbir "U"artış, i1 ile.
  4. Aksi takdirde, i0 olarak ayarlayın .

Keserek i>=n, robotun tepesine ulaştıktan sonra diziye daha fazla öğe eklemekten kaçınırız. Böylece, sonuçta elde edilen dizinin uzunluğunu döndürebiliriz.


3

Haskell, 65 bayt

x%'U'=x+1
x%'D'=max(x-1)0
x%_=0
f n=length.fst.span(<n).scanl(%)0

Kullanım örneği: f 4 "UDDUURUUUUUUUDDDD"-> 10.

%Geçerli pozisyonu merdiven üzerinde ayarlar, scanltüm pozisyonların bir listesini yapar fst.span(<n), patlamadan önce yer alır ve lengthadımları sayar.


Adlandırılmış argümanların ve kompozisyonun /
körenin


3

MATL , 37 34 bayt

Oj"t@4\1=?Q}6M?x0}qt0>*]]]N$h=f1)q

Çevrimiçi deneyin!

açıklama

Konum 0 tabanlıdır. Her yeni pozisyon, eski pozisyonları koruyarak istifin üzerine itilir. Yani yığın boyutu şimdiye kadarki hareket sayısını, artı 1'i temsil eder.

Her komutu işlemek için bir döngü kullanılır. Pozisyon merdiven yüksekliğine ulaştığında döngü , patlamadan sonra bile tüm komutları işler ( Martin'in cevabından alınan fikir ) çıkar. Nihai sonuç, merdiven yüksekliğine eşit olan ilk pozisyonun endeksi tarafından verilir.

O             % push a 0: initial position (0-based)
j             % take first input (commands) as a string
"             % for each command
  t           %   duplicate current position
  @           %   push command
  4\          %   modulo 4. This gives 1, 2, 0 for 'U','R', 'D'
  1=?         %   if result equals 1 (command 'U')
    Q         %     increase position by 1
  }           %   else
    6M?       %     if result was nonzero (command 'R')
      x0      %       delete current position and push 0
    }         %     else (command 'D')
      q       %       decrement by 1
      t0>*    %       turn negative values into 0
    ]         %     end if
  ]           %   end if
]             % end for each
N$h           % pack all numbers in the stack into an array
=             % implicitly read second input: ladder height
f1)q          % find first position equal to that, and subtract 1.
              % Implicitly display

3

Python 2, 63 62 bayt

f=lambda n,s,h=0:h^n and-~f(n,s[1:],-[2%~h,~h,0][ord(s[0])%4])

Örneğin, f(4, 'UDDUURUUUUUUUDDDD')bir 10.

xnor daha kısa bir ifade buldu: 2%~hgerçekten harika :)


Güzel bul %4. Yanılmıyorsam, yaparak bir karakteri kaydedebilirsiniz -[2%~h,~h,0][ord(s[0])%4].
xnor

3

PowerShell, 86 79 bayt

param($a,[char[]]$b)$b|%{$d++;if(($c-=((1,0)[!$c],-1,$c)[$_%4])-ge$a){$d;exit}}

Noel Baba'nın bodrum katında ne zaman hafif bir düzeltme yapması gerekiyor? Cevap.

Girdiyi alır $ave $baçıkça $bchar-array olarak yayınlar. Daha sonra |%{...}hepsinin üzerinden geçiyoruz $b. Her yineleme sayımızı arttırır $d.

Sonra, ifen üste çarpıp çarpmadığımızı kontrol etmek için bir ifade -ge$a. Eğer öyleyse, biz çıktı $dve exit. ifDeyim görevlendirilmesi tarafından oluşturulan bir sahte-üçlü inşa edilmiştir$c eksi eşit bir diziye çok dizinlerinin sonucu.

Biz ASCII değerleri bir hile var D, Rve Ueşleşecek şekilde 0, 2ve 1modulo-4 alındığında, bu yüzden $_%4bizim ilk endeks olarak hizmet vermektedir. Eğer öyleyse R, bu $ceşitleme yapar $c-$c, sıfırlama yapıyor. Eğer bu U, yukarı çıkmamız gerektiği anlamına geliyorsa , $c-(-1)sonuç. Aksi halde bu birdir D, bu yüzden zaten en altta olup olmadığımızı kontrol etmemiz gerekir (bu !$c, PowerShell'deki - "sıfır değil" "doğru" veya 1) ve sırasıyla $ceşit $c-0veya eşit olarak ayarlanır $c-1.

Düzenleme - Doğrudan atama yerine eksi eşit atama kullanılarak 7 bayt kaydedildi


3

Perl 5, 61 bayt

İçin iki bayt içerir -F -i. ( -M5.01ücretsizdir.)

Tamsayının girişi (örneğin 10) perl -M5.01 -F -i10 robot.pl; ladder komutlarının girişi STDIN gibidir.

for(@F){($i+=/U/)-=/R/?$i:$i&&/D/;$j++;last if$^I<=$i}say$j

perl 5.12.5 kullanarak, benim -anFiçin bir şey basmadan önce açıkça autosplit modunu etkinleştirmem gerekiyordu . ancak yalnızca -F5.20.3'te örtük olarak etkinleştirilmiş gibi görünüyor . bunu doğrulayabilir misin?
saat

@ardnew, -Fbenim için yeterli oldu (5.20 veya 5.22 ya da öylesine). Iirc, mevcut perldoc perlrun'un ima ettiğini -ave -aima ettiğini söylüyor -n.
msh210

Ne kadarını sayarız -i? 1 olarak saydığını görebiliyorum ama sanırım 3 olarak sayılmalı mıydı? :-)
andlrc

@ dev-null, neden üç? PPCG.SE konvansiyonunun bayraktaki harfleri kısa çizgi eksi karakterleriyle saymayacağını düşünüyorum, ancak hatalıysam lütfen beni düzeltin. (Bu soruya kendi cevabınız için de aynı sayım kuralını kullanıyormuşsunuz gibi görünüyor. (Bu arada, güzel cevap.))
msh210

@ msh210 Ben sadece vs 3 karakter kullanmadan -ive kullanmadan önce farkı sayıyordum ve sonra giriş numarasını - sanırım saymamalıyız . Ama bu sabah olsa da yanılıyor olabilirim :-)perl -i10 -pe';'perl -pe';'
andlrc

3

Vitsy, 44 bayt

Muhtemelen bazı indirimler olabilir - eğer yapabilirsem daha fazla şeyler bulacağım.

0vVWl:X[4M1+mDvV-);]lvXv?v-N
vD([1-]
v1+
vX0

Açıklama (devam ediyor):

0vVWl:X[4M1+mDvV-);]lvXv?v-N
0v             Save 0 as our temp var to edit.
  V            Save the input as a global var.
   W           Grab a line of STDIN.
    l          Push the length of the stack.
     :         Clone the stack. This is for later use.
      X        Remove the top item of the stack (we don't need the length right now.
[            ] Do the stuff in the brackets infinitely.
 4M            Modulo 4.
   1+          Add one.
     m         Go to the line index as specified by the top item of the stack.
      Dv       Duplicate the top item, save it in the temp var.
        V-);   If the top value is equal to the input number, exit the loop.
l              Push the length of the stack.
 vXv           Dump the temp var, then save the top item.
    ?          Rotate back to the original stack.
     v-        Subtract the top item (the original length) by the temp var (new length)
       N       Output the top item of the stack of the number.

vD([1-]
v              Push the temp variable to the stack.
 D([  ]        If this value is not zero...
    1-         Subtract one from it.

v1+            Push the temp variable to the stack, then add one to it.

vX0            Dump the temp var and replace it with zero.

Çevrimiçi Deneyin! (büyük sınav çantası)


2

PHP, 88 bayt

Bu, bazı (3 + 2n, n'nin çalıştırıldığı komut sayısıdır) bildirimlerini oluşturur, ancak golf oynamak için önemli değildir, değil mi?

<?php for(;$x++<$argv[1];)switch($argv[2][$i++]){case R;$x=2;case D;--$x?--$x:0;}echo$i;

ungolfed:

<?php                    # actually 1 byte shorter not as a function
for(;$x++<$argv[1];)     # not initialising the $x causes a notice but still works
                         # post increment $x by 1 regardless of the command (saves us writing a U case)
  switch($argv[2][$i++]) # get next command, increment number of commands
    {case R;             # R gets treated as a constant with value 'R'. and a notice
      $x=2;              # falling through to D which will double decrement so set to 2
    case D;              # same trick as R
      --$x?--$x:0;}      # decrement once then again if >0
echo$i;                  # output

Kod hala çalıştırılabildiği sürece bildirimler iyi durumdadır.
Zgarb

2

Python, 121 bayt

def f(a,n):
 i=c=0
 while i<n:i={'U':lambda x:x+1,'D':lambda x:0 if x==0 else x-1,'R':lambda x:0}[a[c]](i);c+=1
 return c

1
PPCG'ye Hoşgeldiniz! Burada varsayılan olarak cevapların ya STDIN'den girdi alan ve STDOUT'a baskı yapan tam programlar ya da girdileri argüman olarak alan ve çıktı değerini döndüren işlevler olmasını gerektirir. Çözümünüz, girişe izin verilmeyen girişleri kodlar.
Zgarb

İşlev oluşturarak düzeltildi, yazarken tercüman kullanıyordum.
Alex Burge

Teşekkür ederim! ## Python, <N> bytesBaşkalarına puanınızı göstermek için formun bir başlığını da eklemelisiniz .
Zgarb

Adsız bir işlev olabileceğini sanmıyorum.
user48538

Sen değiştirerek bayt kaydedebilirsiniz 0 if x==0 else x-1ilex and x-1
Cyoce

2

JavaScript, 131 106 Bayt-

Bunun bir Code Golf yarışması kazanmayacağını biliyorum, ancak bu eğlenceli ve aptal bir çözümdü:

l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})re‌​turn c`,D:"--"}[x]};`))()

Dinamik olarak oluşturulmuş bir zorunluluk çözümü yaparak "işlevsel" bir rotanın karşısına çıktım, bir talimatın herhangi bir örneği bir artırma ya da azaltma ile değiştirildi ve bir karşı artırma ile değiştirildi.

Beni 29 bayt kurtardığın için Cycoce'ye teşekkürler!


Burada, 29 bayt l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
golf oynadım

2

Python 3, 90

DSM sayesinde 6 bayt kaydedildi.

Şu anda oldukça basit.

def f(c,n):
 f=t=0
 for x in c:
  f+=1|-(x<'E');f*=(x!='R')&(f>=0);t+=1
  if f>=n:return t

Test durumları:

assert f('U', 1) == 1
assert f('DDRUDUU', 1) == 4
assert f('UDDUUUUURUUUUDDDD', 4) == 7
assert f('UDDUURUUUUUUUDDDD', 4) == 10
assert f('UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU', 354) == 872

1

PHP, 129 bayt

function r($h,$s){$i=0;$c=1;while($x=$s[$i++]){if($x=='U'){$c++;}elseif($x=='D'){--$c<1?$c=1:0;}else{$c=1;}if($c>$h){return$i;}}}

Kazanmak değil, yaratmak eğlencelidir. PHP, üçlü operatördeki boş kısımları sevmiyormuş gibi görünüyor (bir Sözdizimi Hatası veriyor), bu yüzden 0oraya koymak zorunda kaldım .

Ungolfed versiyonu:

function r($h,$s) {          // $h - height of ladder; $s - instructions
  $i = 0;                    // Instruction index
  $c = 1;                    // Position on ladder
  while ($x = $s[$i++]){     // Set $x to current instruction and increment index
    if ($x == 'U'){          // If instruction is U...
      $c++;                  // Increment ladder position
    } elseif ($x == 'D') {   // If instruction is D...
      --$c < 1 ? $c = 1 : 0; // Decrement ladder position, if under 1 set to 1
    } else {                 // If instruction is anything else (in this case R)
      $c = 1;                // Reset ladder position
    }
    if ($c > $h) {           // If ladder position is larger than height...
      return $i;             // Return current instruction index
    }
  }
}

1

PHP, 113 bayt

Https://codegolf.stackexchange.com/a/74575/13216 adresinin küçük versiyonu

function r($h,$s){$i=0;$c=1;while($x=$s[$i++]){$c+=($x=='U'?1:($x=='D'?($c>1?-1:0):1-$c));if($c>$h){return $i;}}}

Ungolfed:

// $h - height of ladder; $s - instructions
function r($h,$s) {
    $i = 0;
    $c = 1;
    while ($x = $s[$i++]) {
        $c += (
            $x=='U'?
                1
            :
                (
                    $x=='D'? (
                        $c>1?
                            -1
                        :
                            0
                    ):
                        1-$c
                )
        );
        if ($c > $h) {
            return $i;
        }
    }
}

2
Harika ilk mesaj! Yazınızı daha iyi okunabilmesi için düzenledim. Mutlu golf!
GamrCorps

1

Pyth, 19 bayt

x.u@[tWNNhN00)CYz0Q

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

x.u@[tWNNhN00)CYz0Q   implicit: z = input string, Q = input number
 .u             z0    reduce z: for each char Y in z manipulate N = 0 with:
    [        )           create a list with
     tWNN                  * N-1 if N>0 else N
         hN                * N+1
           0               * 0
            0              * 0
   @          CY         replace N by the ord(Y)-th element (mod 4)
 .u                   .u give us a list with all intermediate values of N
x                 Q   print the index of Q in this list

1

Java, 250 bayt

int cmds(int n, String s) {
int steps=1;
int count=0;
for (int i=0;i< s.length();i++) {
count++;
char c=s.charAt(i);
switch(c){
case 'D':
steps=(steps==1)?1:--steps;
break;
case 'R':
steps=1;
break;
case 'U':
++steps;
break;
}
if(steps>n)
return count;
}
return 0;
}

2
Bir kod-golf sorusuna cevap verirken, cevabınızı ile başlamalısınız # <language_name>, XX bytes. Ayrıca değişken isimlerinizi birer karaktere indirgeyebilir ve fazladan boşlukları kaldırabilirsiniz, bu şekilde bayt sayınız azalacaktır (buradaki amaç budur) ... Ah, ve PPCG'ye hoş geldiniz!
kaldırıldı

Bazı ipuçları: Kodunuzu kod olarak girintilemek için satırın başına 4 boşluk ekleyin. Bazı boşlukları kaldırdınız, ancak yine de daha fazlasını kaldırabilirsiniz (örneğin: yerine int steps=1; int count=0;kullanabilirsiniz int s=1,c=0;- bak değişken adını değiştirdim - vb.) Hala gösterebilir ungolfed altında sürümünü golfed bu şekilde kimse yardım kolaydır (bir açıklama sürümü sen golf daha bayt).
kaldırıldı

1

C, 91 bayt

İle uyarı yok gcc -Wall. Özyineleme ve virgülle ayrılmış ifadeler.

r.c çıplak işlevi içerir:

int r(int N,int n,int s,char*C){return*C&&s<=N?s+=*C&2?-s:*C&1?1:-1,r(N,n+1,s?s:1,C+1):n;}

Yorumlananlar,

int r(int N,   // number of steps on ladder
      int n,   // result, seed with 0
      int s,   // current step, seed with 1
      char *C  // command string
      )
{
    return *C&&s<=N ?  // still reading commands and still on ladder?
       s+=                // increment step value by...
        *C&2?             // bit test if 'R' but not 'U' or 'D'.
         -s               // negate to 0, will set to 1 in call if needed
         :*C&1?           // Not 'R', is it 'U'?
            1             // 'U', add 1
            :-1,          // Must be 'D', subtract 1
       r(N,n+1,s?s:1,C+1) // Recursive call, and fix case where s==0.
      :n;                 // end of string or fell off ladder
}

Referans için,

'U'.charCodeAt(0).toString(2)
"1010101"
'D'.charCodeAt(0).toString(2)
"1000100"
'R'.charCodeAt(0).toString(2)
"1010010"

roboladder.c sargı,

#include <stdio.h>
#include <stdlib.h>
#include "r.c"
int main(int argc, char * argv[])
{
  int N = atoi(argv[1]);
  int n = r(N,0,1,argv[2]);
  int check = atoi(argv[3]);
  printf("%d : %d\n", n, check);
  return 0;
}

Makefile test için,

run:
    @gcc -Wall robotladder.c -o robotladder 
    @./robotladder 1 U 1
    @./robotladder 1 DDRUDUU 4  
    @./robotladder 4 UDDUUUUURUUUUDDDD 7
    @./robotladder 4 UDDUURUUUUUUUDDDD 10
    @./robotladder 6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR 20
    @./robotladder 10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU 34
    @./robotladder 6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU 8
    @./robotladder 6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU 32
    @./robotladder 20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU 56
    @./robotladder 354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU 872
    @wc -c r.c

1

Mathematica, 114 120 bayt

(d=#~Max~1-1&;u=#+1&;r=1&;s=StringToStream@ToLowerCase@#;l=1;t=1;While[(l=ToExpression[s~Read~Character]@l)<=#2,t++];t)&

İki argümanı alan adsız fonksiyon (C, N). Kullanmakta olduğu akımı kapatmadığından dikkatli olun. Ayrıca tüm değişkenlerini global olarak atar.

d=#-1&Ile değiştirilir d=#~Max~1-1&, böylece pastacı kazmaya gitmez.


Bekle: Bunun geçerli olduğunu sanmıyorum. Robotun olumsuz basamaklardan aşağı inmesine izin verir. Whoops. Bu bana kapsamlı olmayan bir şekilde test etmeyi öğretecek ... Şans bulduğumda düzeltilmiş bir tane koyacağım.
hYPotenuser

1

Mathematica, 112 Bayt

i=0;First@Position[ToExpression["{"<>#~StringReplace~{"U"->"i++,","D"->"i=i~Max~1-1,","R"->"i=0,"}<>"0}"],#2-1]&

0

Clojure, 92 84 bayt

nSıfır saymak yerine sıfır nkullanabiliyoruz take-while pos?.

#(count(take-while pos?(reductions(fn[p o](if o(min(o p 1)%)%))%(map{\U -\D +}%2))))

Orijinal:

#(count(take-while(partial > %)(reductions(fn[p o](if o(max(o p 1)0)0))0(map{\U +\D -}%2))))

Haritalar 2 argüman Uiçin +, Diçin -ve diğerleri için nil. Azaltma fonksiyonu (operand position 1)boş olmayan operandve 0başka türlü çalışır . 1. girdi argümanından daha yüksek olana kadar değerleri alır ve kaç taneye sahip olduğumuzu sayar.


0

Mathematica, 67 bayt

(p=i=0;While[p<#,p=Switch[#2[[++i]],"U",p+1,"D",1~Max~p-1,_,0]];i)&

Olumlu bir tamsayı döndüren iki argümanın adlandırılmamış işlevleri, bir pozitif tamsayı ve bir karakter listesi. WhileDiğer Mathematica kayıtlarına göre daha rekabetçi bir sonuçla sonuçlanan daha basit bir uygulama.

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.