Robot di tangga

30

Latar Belakang

Saya memiliki tangga yang bersandar di dinding, dan robot yang dikendalikan dari jarak jauh yang dapat memanjatnya. Saya dapat mengirim tiga perintah berbeda ke robot:

  • UP: robot mengambil satu langkah ke atas. Jika itu pada langkah tertinggi, itu tersandung, jatuh dan meledak.
  • DOWN: robot mengambil satu langkah ke bawah. Jika itu pada langkah terendah, tidak ada yang terjadi.
  • RESET: robot kembali ke langkah terendah.

Saya juga dapat mengirim serangkaian perintah, dan robot akan menjalankannya satu per satu. Tugas Anda adalah memprediksi pergerakannya.

Memasukkan

Input Anda adalah bilangan bulat positif N, mewakili jumlah langkah di tangga, dan string non-kosong Clebih UDR, yang mewakili perintah saya telah dikirim ke robot. Anda bisa berasumsi itu N < 1000. Robot diinisialisasi pada langkah terendah tangga.

Keluaran

Dijamin bahwa pada suatu titik, robot akan memanjat langkah tertinggi dan meledak. Output Anda adalah jumlah perintah yang dieksekusi sebelum ini terjadi.

Contoh

Pertimbangkan input N = 4dan C = "UDDUURUUUUUUUDDDD" Robot, dilambangkan dengan @, bergerak di sepanjang tangga 4 langkah sebagai berikut:

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

Perintah yang tersisa tidak dieksekusi, karena robot telah meledak. Ledakan terjadi setelah 10 perintah, jadi output yang benar adalah 10.

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

  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
Zgarb
sumber
1
Terkait
Peter Taylor
8
Saya kecewa tugasnya bukan untuk menghasilkan seni ASCII itu.
user253751
6
@immibis Anda tahu apa yang harus dilakukan ...
Martin Ender
Alih-alih string, dapatkah kita mengambil daftar kode karakter?
Cyoce
@Cyoce Hanya jika bahasa Anda tidak memiliki cara lain untuk mewakili string.
Zgarb

Jawaban:

10

CJam, 26 25 22 byte

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

Format input adalah instruksi pada baris pertama dan tinggi tangga pada baris kedua.

Uji di sini.

Penjelasan

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.
Martin Ender
sumber
Ide bagus untuk memproses semua perintah bahkan setelah ledakan. Saya akan meminjam itu untuk menghemat beberapa byte
Luis Mendo
7

C, 83 71 + 4 = 75 byte

Terima kasih @Josh karena telah menunjukkan gaya K&S kepada saya , yang memungkinkan 8 byte !!

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

Menjelaskan:

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

Contoh panggilan:

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

Tes langsung pada ideone

dihapus
sumber
1
Jawaban yang bagus, tetapi mungkin perlu dicatat bahwa fungsi hanya dapat digunakan sekali sejak global zdan atidak diatur ulang.
Josh
@ Astaga. Saya telah memperbarui. :)
dihapus
1
Luar biasa! Anda juga dapat menyimpan beberapa karakter dengan bermain-main dengan deklarasi ketik dalam fungsi Anda: codegolf.stackexchange.com/a/40266/13877
Josh
@ Astaga. Wow, ini luar biasa! terima kasih
dihapus
6

JavaScript (ES6), 54 53 byte

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

Penjelasan

Menggunakan fungsi rekursif secara internal.

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>

pengguna81655
sumber
4

Perl, 47 + 2 = 49 byte

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

Membutuhkan -pbendera, -i$Nuntuk ketinggian yang terakhir dan daftar gerakan yang dipisahkan baris baru:

$ 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

Bagaimana itu bekerja:

                                                # '-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.

Dibatasi:

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

JavaScript (SpiderMonkey 30+), 65 64 byte

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

Bagaimana itu bekerja

Kami pertama-tama mengatur variabel ike 0. Ini akan melacak berapa banyak langkah yang telah didaki robot. Kemudian untuk setiap karakter cdalam string input, kami menjalankan logika berikut:

  1. Jika ilebih besar atau sama dengan n, jangan lakukan apa pun.
  2. Jika cadalah "D":
    • Jika i0, biarkan seperti apa adanya.
    • Kalau tidak, kurangi dengan 1.
  3. Jika cadalah "U", kenaikan isebesar 1.
  4. Jika tidak, atur ike 0.

Dengan memotong jika i>=n, kami menghindari menambahkan item lagi ke array setelah robot mencapai puncak. Jadi, kita bisa mengembalikan panjang array yang dihasilkan.

Produksi ETH
sumber
3

Haskell, 65 byte

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

Contoh penggunaan: f 4 "UDDUURUUUUUUUDDDD"-> 10.

%menyesuaikan posisi saat ini di tangga, scanlmembuat daftar semua posisi, fst.span(<n)mengambil bagian sebelum ledakan dan lengthmenghitung langkah-langkahnya.

nimi
sumber
Kerja
3

JavaScript (ES6), 65 byte

(n,s)=>[...s].map(_=>i=_<'E'?i&&i-1:_>'T'?i+1:0,i=0).indexOf(n)+1
Charlie Wynn
sumber
1
Mari kita lanjutkan diskusi ini dalam obrolan .
ETHproduksi
Saya pikir 0,i=0dapat diubah menjadii=0
Cyoce
@Cyoce hmm, gagal bagi saya di tab baru (berfungsi pada halaman ini b / ci sudah ditentukan)
Charlie Wynn
@CharlieWynn, maaf, presedensi saya campur aduk
Cyoce
3

MATL , 37 34 byte

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

Cobalah online!

Penjelasan

Posisi berbasis 0. Setiap posisi baru didorong ke tumpukan menjaga posisi yang lebih lama. Jadi ukuran tumpukan mewakili jumlah gerakan hingga sekarang, ditambah 1.

Loop digunakan untuk memproses setiap perintah. Lingkaran keluar ketika posisi mencapai ketinggian tangga memproses semua perintah, bahkan setelah ledakan (ide diambil dari jawaban Martin ). Hasil akhir diberikan oleh indeks posisi pertama yang sama dengan tinggi tangga.

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
Luis Mendo
sumber
3

Python 2, 63 62 byte

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

Sebagai contoh, f(4, 'UDDUURUUUUUUUDDDD')adalah 10.

xnor menemukan ekspresi yang lebih pendek: 2%~hsangat keren :)

Lynn
sumber
Nice ditemukan dengan %4. Jika saya tidak salah, Anda dapat menyimpan karakter dengan melakukan -[2%~h,~h,0][ord(s[0])%4].
xnor
3

PowerShell, 86 79 byte

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

Sedikit perataan ulang saya Kapan Santa memasuki ruang bawah tanah? menjawab.

Mengambil input $adan $b, secara eksplisit melakukan casting $bsebagai char-array. Kami kemudian mengulang |%{...}semua $b. Setiap iterasi, kami menambah penghitung kami $d.

Lalu, ifpernyataan untuk memeriksa apakah kita telah mencapai puncak -ge$a. Jika demikian, kami mengeluarkan $ddan exit. The ifpernyataan dibangun dari pseudo-ternary dibuat dengan menetapkan $cminus sama dengan hasil dari beberapa indeks ke dalam array.

Kami memiliki trik bahwa nilai-nilai ASCII dari D, R, dan Usesuai dengan 0, 2, dan 1ketika diambil modulo-4, sehingga $_%4berfungsi sebagai indeks pertama kami. Jika itu R, yang diset $csama dengan $c-$c, melakukan reset. Jika U, itu artinya kita harus naik, jadi $c-(-1)hasilnya. Kalau tidak, itu adalah D, jadi kita perlu memeriksa apakah kita sudah di bagian bawah (itu adalah !$c- di PowerShell, "tidak-nol" adalah "benar" atau 1) dan disetel $csama $c-0atau $c-1masing - masing.

Sunting - Disimpan 7 byte dengan menggunakan penetapan minus sama dengan bukan penetapan langsung

AdmBorkBork
sumber
3

Perl 5, 61 byte

Termasuk dua byte untuk -F -i. ( -M5.01gratis)

Input bilangan bulat (mis. 10) adalah sebagai perl -M5.01 -F -i10 robot.pl; input dari perintah ladder adalah sebagai STDIN.

for(@F){($i+=/U/)-=/R/?$i:$i&&/D/;$j++;last if$^I<=$i}say$j
msh210
sumber
menggunakan perl 5.12.5, saya juga harus secara eksplisit mengaktifkan mode autosplit -anFsebelum akan mencetak apa pun untuk saya. tetapi tampaknya diaktifkan secara implisit hanya dengan -F5.20.3. dapatkah Anda memverifikasi ini?
ardnew
@ardnew, -Fcukup untuk saya (5,20 atau 5,22 atau lebih). Iirc perlrun perldoc saat ini mengatakan itu menyiratkan -adan -amenyiratkan -n.
msh210
Berapa yang kita hitung -i? Saya dapat melihat Anda menghitungnya sebagai 1 tetapi saya kira itu seharusnya dihitung sebagai 3? :-)
andlrc
@ dev-null, mengapa tiga? Saya pikir konvensi pada PPCG.SE adalah untuk menghitung huruf dalam bendera tetapi bukan karakter tanda hubung minus, tapi tolong perbaiki saya jika saya salah. (Sepertinya Anda menggunakan konvensi penghitungan yang sama untuk jawaban Anda sendiri untuk pertanyaan ini juga. (Kebetulan, jawaban yang bagus.))
msh210
@ msh210 Saya hanya menghitung perbedaan ketika menggunakan -idan tanpa perl -i10 -pe';'vs perl -pe';'3 karakter lebih banyak dan kemudian jumlah input - yang saya kira kita tidak harus menghitung. Tapi saya mungkin salah hanya tentang hal ini pagi ini :-)
andlrc
3

Vitsy, 44 byte

Mungkin ada beberapa pengurangan - saya akan memikirkan beberapa hal lagi jika saya bisa.

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

Penjelasan (sedang berlangsung):

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.

Cobalah secara Online! (kasus uji besar)

Addison Crump
sumber
2

PHP, 88 byte

Ini menghasilkan beberapa (3 + 2n di mana n adalah jumlah perintah dijalankan) pemberitahuan tetapi itu tidak masalah untuk bermain golf, kan?

<?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
pengguna51805
sumber
Pemberitahuan baik-baik saja, selama kode masih dapat dijalankan.
Zgarb
2

Python, 121 byte

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
Alex Burge
sumber
1
Selamat datang di PPCG! Di sini kami mengharuskan secara default bahwa jawaban adalah program lengkap yang mengambil input dari STDIN dan mencetak ke STDOUT, atau fungsi yang mengambil input sebagai argumen dan mengembalikan nilai output. Solusi Anda menyulitkan input yang tidak diizinkan.
Zgarb
Diperbaiki dengan membentuk fungsi, saya menggunakan juru bahasa ketika saya menulisnya.
Alex Burge
Terima kasih! Anda juga harus menambahkan tajuk formulir ## Python, <N> bytesuntuk menunjukkan skor Anda kepada orang lain.
Zgarb
Saya tidak berpikir mungkin ada fungsi yang tidak disebutkan namanya.
user48538
Anda dapat menyimpan byte dengan menggantinya 0 if x==0 else x-1denganx and x-1
Cyoce
2

JavaScript, 131 106 Bytes-

Saya tahu ini tidak akan memenangkan kompetisi Code Golf, tetapi ini adalah solusi yang menyenangkan dan bodoh untuk diterapkan:

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

Saya agak bertolak belakang dengan rute "fungsional" dengan membuat solusi imperatif yang dihasilkan secara dinamis, setiap instance dari instruksi diganti dengan kenaikan atau penurunan, dan kenaikan tandingan.

Terima kasih kepada Cycoce karena telah menyelamatkan saya 29 byte!

DLeh
sumber
Di sini, saya l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
bermain golf
2

Python 3, 90

Disimpan 6 byte berkat DSM.

Cukup sederhana sekarang.

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

Kasus uji:

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
Morgan Thrapp
sumber
1

PHP, 129 byte

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

Bukan menang, tapi menyenangkan untuk dibuat. PHP tampaknya tidak menyukai bagian-bagian kosong di operator ternary (itu melempar Kesalahan Sintaks), jadi saya harus meletakkan di 0sana.

Versi tidak disatukan:

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
    }
  }
}
daavko
sumber
1

PHP, 113 byte

Versi lebih kecil dari https://codegolf.stackexchange.com/a/74575/13216

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

Tidak Disatukan:

// $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;
        }
    }
}
RibeiroBreno
sumber
2
Pos pertama yang bagus! Saya mengedit posting Anda agar lebih mudah dibaca. Selamat bermain golf!
GamrCorps
1

Pyth, 19 byte

x.u@[tWNNhN00)CYz0Q

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

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
Jakube
sumber
1

Java, 250 byte

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;
}
Surya Vattikuti
sumber
2
Saat menjawab tantangan kode- golf-, Anda harus memulai dengan # <language_name>, XX bytes. Anda juga dapat mengurangi masing-masing nama variabel menjadi satu karakter dan menghapus spasi putih tambahan, dengan cara ini jumlah byte Anda akan berkurang (yang merupakan tujuan di sini) ... Ah, dan selamat datang di PPCG!
dihapus
Beberapa tips: Untuk membuat indentasi kode Anda sebagai kode tambahkan 4 spasi di awal baris. Anda menghapus beberapa spasi, tetapi Anda masih dapat menghapus lebih banyak (mis: alih-alih int steps=1; int count=0;Anda dapat menggunakan int s=1,c=0;- lihat saya mengubah nama variabel - dan sebagainya). Anda masih bisa menunjukkan Anda ungolfed versi di bawah golfed versi dengan penjelasan (cara ini mudah bagi seseorang bantuan Anda bermain golf lebih byte).
dihapus
1

C, 91 byte

Tidak ada peringatan dengan gcc -Wall. Rekursi dan ekspresi yang dipisahkan koma.

r.c berisi fungsi kosong:

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

Berkomentar,

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
}

Sebagai referensi,

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

roboladder.c pembungkus,

#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 untuk pengujian,

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
jamieguinan
sumber
1

Mathematica, 114 120 byte

(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)&

Fungsi anonim, yang mengambil dua argumen (C, N). Hati-hati menggunakan ini, karena tidak menutup aliran yang terbuka. Juga memberikan semua variabelnya secara global.

Diedit untuk menggantikan d=#-1&dengan d=#~Max~1-1&, sehingga robie tidak menggali.

hYPotenuser
sumber
Tunggu: Saya rasa ini tidak valid. Ini memungkinkan robot untuk turun anak tangga negatif. Aduh. Itu akan mengajari saya untuk menguji non-komprehensif ... Saya akan memasang yang diperbaiki ketika saya mendapatkan kesempatan.
hYPotenuser
1

Mathematica, 112 Bytes

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

Clojure, 92 84 byte

Hitungan nke nol, bukan nol n, bisa memanfaatkan take-while pos?.

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

Asli:

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

Argumen Maps 2 Uke +, Dke , -dan lainnya ke nil. Fungsi reduksi berjalan (operand position 1)dengan non-null operanddan 0sebaliknya. Mengambil nilai sampai kita lebih tinggi dari argumen input pertama dan menghitung berapa banyak yang kita punya.

NikoNyrh
sumber
0

Mathematica, 67 byte

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

Fungsi dua argumen yang tidak disebutkan namanya, bilangan bulat positif dan daftar karakter, yang mengembalikan bilangan bulat positif. WhileImplementasi yang lebih mudah daripada entri Mathematica lainnya, yang berhasil menghasilkan panjang yang lebih kompetitif.

Greg Martin
sumber