หุ่นยนต์บนบันได


30

พื้นหลัง

ฉันมีบันไดพิงกำแพงและหุ่นยนต์ควบคุมจากระยะไกลที่สามารถปีนขึ้นไปได้ ฉันสามารถส่งคำสั่งต่าง ๆ ไปยังหุ่นยนต์ได้สามคำ:

  • UP: หุ่นยนต์ก้าวขึ้นไปหนึ่งขั้น ถ้ามันอยู่ในขั้นตอนที่สูงที่สุดมันจะเดินทางไปตกหล่นและระเบิด
  • DOWN: หุ่นยนต์ลงหนึ่งขั้น ถ้ามันเป็นขั้นตอนที่ต่ำที่สุดจะไม่มีอะไรเกิดขึ้น
  • RESET: หุ่นยนต์กลับไปที่ขั้นต่ำสุด

ฉันยังสามารถส่งชุดคำสั่งและหุ่นยนต์จะดำเนินการพวกเขาทีละคน งานของคุณคือทำนายการเคลื่อนไหว

อินพุต

ปัจจัยการผลิตของคุณเป็นจำนวนเต็มบวกNคิดเป็นจำนวนขั้นตอนในบันไดและสตริงไม่ว่างเปล่าCกว่าUDRคิดเป็นคำสั่งที่ผมได้ส่งไปยังหุ่นยนต์ N < 1000คุณสามารถสรุปได้ว่า หุ่นยนต์จะเริ่มต้นในขั้นตอนต่ำสุดของบันได

เอาท์พุต

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

ตัวอย่าง

พิจารณาอินพุตN = 4และC = "UDDUURUUUUUUUDDDD" หุ่นยนต์ที่แสดงโดย@เคลื่อนที่ไปตามบันได 4 ขั้นตอนดังนี้:

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

คำสั่งที่เหลือจะไม่ถูกดำเนินการเนื่องจากหุ่นยนต์ระเบิด การระเบิดเกิดขึ้นหลังจาก 10 10คำสั่งเพื่อการส่งออกที่ถูกต้องคือ

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและไม่อนุญาตช่องโหว่มาตรฐาน

กรณีทดสอบ

  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
ฉันผิดหวังที่งานไม่ได้สร้างงาน ASCII นั้นขึ้นมา
user253751


แทนที่จะเป็นสตริงเราสามารถใช้รายการรหัสอักขระได้หรือไม่
Cyoce

@Cyoce เฉพาะในกรณีที่ภาษาของคุณไม่มีวิธีอื่นในการแสดงสตริง
Zgarb

คำตอบ:


10

CJam, 26 25 22 ไบต์

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

รูปแบบอินพุตเป็นคำแนะนำในบรรทัดแรกและความสูงของบันไดในวินาที

ทดสอบที่นี่

คำอธิบาย

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.

ความคิดที่ดีในการประมวลผลคำสั่งทั้งหมดแม้หลังจากการระเบิด ฉันจะยืมมาเพื่อช่วยประหยัดไม่กี่ไบต์
Luis Mendo

7

C, 83 71 + 4 = 75 ไบต์

ขอบคุณ@Josh ที่แสดงให้ฉันเห็นสไตล์ K&Sซึ่งอนุญาตให้ 8 ไบต์ปิด !!

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

อธิบายว่า:

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

ตัวอย่างการโทร:

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

ทดสอบสดกับideone


1
คำตอบที่ดี แต่มันอาจคุ้มค่าที่จะสังเกตว่าฟังก์ชั่นสามารถใช้ได้อย่างมีประสิทธิภาพเพียงครั้งเดียวตั้งแต่ globals zและaไม่ได้รีเซ็ต
Josh

@ Josh ฉันได้อัพเดทแล้ว :)
นำออกเมื่อ

1
! น่ากลัว นอกจากนี้คุณยังสามารถบันทึกอักขระสองสามตัวได้โดยเล่นกับการประกาศประเภทในฟังก์ชันของคุณ: codegolf.stackexchange.com/a/40266/13877
Josh

@ Josh ว้าวนี่มันยอดเยี่ยมมาก! ขอบคุณ
ลบ

6

JavaScript (ES6), 54 53 ไบต์

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

คำอธิบาย

ใช้ฟังก์ชั่นวนซ้ำภายใน

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 ไบต์

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

ต้องการ-pแฟล็ก-i$Nสำหรับความสูงหลังและรายการการย้ายบรรทัดใหม่คั่น:

$ 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

มันทำงานอย่างไร:

                                                # '-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 ไบต์

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

มันทำงานอย่างไร

ก่อนอื่นเราตั้งค่าตัวแปรiเป็น 0 สิ่งนี้จะติดตามจำนวนขั้นตอนที่หุ่นยนต์ปีนขึ้น จากนั้นสำหรับอักขระแต่ละตัวcในสตริงอินพุตเราเรียกใช้ตรรกะต่อไปนี้:

  1. หากiมีขนาดใหญ่กว่าหรือเท่ากับnอย่าทำอะไร
  2. ถ้าcเป็น"D":
    • ถ้าiเป็น 0 ให้ปล่อยไว้เหมือนเดิม
    • มิฉะนั้นลดค่าลง 1
  3. ถ้าcเป็น"U"เช่นนั้นเพิ่มขึ้นi1
  4. มิฉะนั้นตั้งค่าiเป็น 0

โดยการตัดถ้าi>=nเราหลีกเลี่ยงการเพิ่มรายการใด ๆ ในอาร์เรย์หลังจากที่หุ่นยนต์ได้มาถึงด้านบน ดังนั้นเราสามารถคืนความยาวของอาเรย์ที่เกิดขึ้นได้


3

Haskell, 65 ไบต์

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

ตัวอย่างการใช้งาน: ->f 4 "UDDUURUUUUUUUDDDD"10

%ปรับตำแหน่งปัจจุบันบนบันไดscanlทำรายการของตำแหน่งทั้งหมดเข้ามาfst.span(<n)มีส่วนร่วมก่อนการระเบิดและlengthนับขั้นตอน


เป็นงานที่ดีด้วยการรวมกันของข้อโต้แย้งที่มีชื่อและองค์ประกอบ / การ
สาปแช่ง

3

JavaScript (ES6), 65 ไบต์

(n,s)=>[...s].map(_=>i=_<'E'?i&&i-1:_>'T'?i+1:0,i=0).indexOf(n)+1

1
ขอให้เรายังคงอภิปรายนี้ในการแชท
ETHproductions

ฉันคิดว่า0,i=0สามารถเปลี่ยนเป็นi=0
Cyoce

@Cyoce อืมล้มเหลวสำหรับฉันในแท็บใหม่ (ทำงานบนหน้านี้ b / CI ถูกกำหนดไว้แล้ว)
ชาร์ลีวิลเลียม

@CharlieWynn ขออภัยมีความสำคัญของฉันผสมขึ้น
Cyoce

3

MATL , 37 34 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ตำแหน่งเป็นแบบ 0 ตำแหน่งใหม่แต่ละตำแหน่งจะถูกผลักลงบนสแต็กเพื่อรักษาตำแหน่งเดิม ดังนั้นขนาดสแต็กหมายถึงจำนวนการเคลื่อนไหวจนถึงตอนนี้บวก 1

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

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 ไบต์

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

ยกตัวอย่างเช่นเป็นf(4, 'UDDUURUUUUUUUDDDD')10

xnor พบการแสดงออกที่สั้นลง: 2%~hเจ๋งจริงๆ :)


%4นีซพบกับ -[2%~h,~h,0][ord(s[0])%4]ถ้าฉันไม่ผิดคุณสามารถบันทึกตัวอักษรด้วยการทำ
xnor

3

PowerShell, 86 79 ไบต์

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

การตกแต่งของฉันอีกเล็กน้อยซานต้าจะเข้าห้องใต้ดินเมื่อไหร่? ตอบ.

รับค่าอินพุท$aและแคส$bต์$bเป็นอาเรย์อย่างชัดเจน จากนั้นเราจะห่วงกับไปทั่ว|%{...} แต่ละซ้ำเราเพิ่มเคาน์เตอร์ของเรา$b$d

จากนั้นมีคำสั่งให้ตรวจสอบว่าเราได้ตีด้านบนด้วยif -ge$aถ้าเป็นเช่นนั้นเราส่งออกและ$d คำสั่งถูกสร้างจากหลอก ternary สร้างขึ้นโดยการกำหนดลบเท่ากับผลมาจากหลายดัชนีเป็นอาร์เรย์exitif$c

เรามีเคล็ดลับว่าค่า ASCII ของD, RและUสอดคล้องกับ0, 2และ1เมื่อนำมาโมดูโล-4 เพื่อ$_%4ทำหน้าที่เป็นดัชนีแรกของเรา หากเป็นRเช่นนั้นนั่น$cเท่ากับ$c-$cว่าทำการรีเซ็ต ถ้าUนั่นหมายความว่าเราต้องขึ้นไปดังนั้น$c-(-1)ผลลัพธ์ มิฉะนั้นจะเป็น a Dดังนั้นเราต้องตรวจสอบว่าเราอยู่ด้านล่าง (นั่นคือ!$c- ใน PowerShell, "ไม่เป็นศูนย์" คือ "จริง" หรือ1) และตั้งค่า$cเท่ากับ$c-0หรือ$c-1ตามลำดับ

แก้ไข - บันทึกแล้ว 7 ไบต์โดยใช้การมอบหมายที่มีค่าลบมากกว่าการกำหนดโดยตรง


3

Perl 5, 61 ไบต์

-F -iรวมถึงสองไบต์ ( -M5.01ฟรี)

อินพุตของจำนวนเต็ม (เช่น 10) เป็นperl -M5.01 -F -i10 robot.plดังนี้ อินพุตของคำสั่ง ladder เป็น STDIN

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

ใช้ Perl 5.12.5 ฉันยังต้องเปิดใช้งานโหมด autosplit อย่างชัดเจนด้วย-anFก่อนที่มันจะพิมพ์ทุกอย่างให้ฉัน แต่ดูเหมือนว่าจะเปิดใช้งานโดยนัยเฉพาะ-Fใน 5.20.3 เท่านั้น คุณสามารถตรวจสอบสิ่งนี้ได้หรือไม่
ardnew

@ มาใหม่-Fเพียงพอสำหรับฉัน (5.20 หรือ 5.22 หรือดังนั้น) iirc perlrun perldoc ปัจจุบันบอกว่ามันหมายถึง-aและหมายถึง-a -n
msh210

เรานับ-iเท่าไร ฉันสามารถเห็นคุณนับเป็น 1 แต่ฉันเดาว่าควรนับเป็น 3 จริงหรือ :-)
andlrc

@ dev-null ทำไมถึงสาม ฉันคิดว่าการประชุม PPCG.SE คือการนับตัวอักษรในธง แต่ไม่ใช่ตัวอักษรยัติภังค์ - ลบ แต่โปรดแก้ไขให้ฉันถ้าฉันผิด (ดูเหมือนว่าคุณกำลังใช้การนับแบบเดียวกันสำหรับคำตอบของโยรูเองสำหรับคำถามนี้ด้วย (บังเอิญคำตอบที่ดี))
msh210

@ msh210 ฉันแค่นับความแตกต่างเมื่อใช้-iและไม่มีตัวอักษรperl -i10 -pe';'vs perl -pe';'3 และมากกว่าจากนั้นก็ใส่หมายเลข - ซึ่งฉันเดาว่าเราไม่ควรนับ แต่ฉันอาจจะคิดผิดเกี่ยวกับเรื่องนี้เมื่อเช้านี้ :-)
andlrc

3

Vitsy, 44 ไบต์

อาจมีการลดบางอย่าง - ฉันจะหาสิ่งอื่นเพิ่มเติมถ้าทำได้

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

คำอธิบาย (กำลังดำเนินการ):

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.

ลองออนไลน์! (กรณีทดสอบขนาดใหญ่)


2

PHP, 88 ไบต์

มันสร้างบางอย่าง (3 + 2n โดยที่ n คือจำนวนคำสั่งที่รัน) แต่มันไม่สำคัญสำหรับการเล่นกอล์ฟใช่ไหม?

<?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

การแจ้งเตือนนั้นใช้ได้ตราบใดที่รหัสยังคงสามารถทำงานได้
Zgarb

2

Python ขนาด 121 ไบต์

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! ที่นี่เราต้องการโดยค่าเริ่มต้นว่าคำตอบคือโปรแกรมเต็มรูปแบบที่รับอินพุตจาก STDIN และพิมพ์ไปยัง STDOUT หรือฟังก์ชั่นที่รับอินพุตเป็นอาร์กิวเมนต์และส่งคืนค่าเอาต์พุต โซลูชันของคุณกำหนดรหัสอินพุตที่ไม่อนุญาต
Zgarb

แก้ไขโดยสร้างเป็นฟังก์ชั่นฉันใช้ล่ามเมื่อฉันเขียนมัน
Alex Burge

ขอขอบคุณ! คุณควรเพิ่มส่วนหัวของแบบฟอร์ม## Python, <N> bytesเพื่อแสดงคะแนนของคุณให้คนอื่น ๆ
Zgarb

ฉันไม่คิดว่าจะมีฟังก์ชั่นที่ไม่มีชื่อ
user48538

คุณสามารถบันทึกไบต์โดยแทนที่0 if x==0 else x-1ด้วยx and x-1
Cyoce

2

JavaScript, 131 106 Bytes-

ฉันรู้ว่าสิ่งนี้จะไม่ชนะการแข่งขันกอล์ฟ Code แต่นี่เป็นวิธีที่สนุกและงี่เง่าที่จะนำไปใช้:

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

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

ขอบคุณ Cycoce ที่ช่วยฉัน 29 ไบต์!


ที่นี่ฉันลงเล่นกอล์ฟ 29 ไบต์:l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Cyoce

2

Python 3, 90

บันทึก 6 ไบต์ด้วย DSM

สวยง่ายตอนนี้

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

กรณีทดสอบ:

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 ไบต์

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

ไม่ชนะ แต่สนุกที่จะสร้าง PHP ดูเหมือนจะไม่ชอบส่วนที่ว่างเปล่าในผู้ประกอบการที่ประกอบไปด้วย (มันพ่นไวยากรณ์ผิดพลาด) ดังนั้นผมต้องใส่0มี

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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 ไบต์

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

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
โพสต์แรกสุดยอด! ฉันแก้ไขโพสต์ของคุณเพื่อให้อ่านง่ายขึ้น มีความสุขในการเล่นกอล์ฟ!
GamrCorps

1

Pyth, 19 ไบต์

x.u@[tWNNhN00)CYz0Q

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

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 ไบต์

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
เมื่อตอบรหัสกอล์ฟ -challenge # <language_name>, XX bytesคุณควรเริ่มต้นด้วยคำตอบของคุณ นอกจากนี้คุณยังสามารถลดชื่อตัวแปรของคุณเป็นหนึ่งตัวละครในแต่ละตัวและลบช่องว่างพิเศษได้ด้วยวิธีนี้การนับไบต์ของคุณจะลดลง (ซึ่งเป็นวัตถุประสงค์ที่นี่) ... อ่าและยินดีต้อนรับสู่ PPCG!
นำออก

เคล็ดลับ: ในการเยื้องรหัสของคุณเป็นรหัสเพิ่ม 4 ช่องว่างที่จุดเริ่มต้นของบรรทัด คุณลบช่องว่างบางส่วนออก แต่คุณยังสามารถลบเพิ่มเติมได้ (เช่น: แทนที่จะint steps=1; int count=0;ใช้int s=1,c=0;- ดูฉันเปลี่ยนชื่อตัวแปร - และอื่น ๆ ) คุณยังสามารถแสดงเวอร์ชันที่ไม่ได้ปรับปรุงของคุณได้ที่ด้านล่างเวอร์ชั่นกอล์ฟด้วยคำอธิบาย (วิธีนี้ง่ายสำหรับคนที่ช่วยคุณเล่นกอล์ฟจำนวนไบต์เพิ่ม)
นำออกเมื่อ

1

C, 91 ไบต์

gcc -Wallไม่มีคำเตือนด้วย การเรียกซ้ำและนิพจน์คั่นด้วยเครื่องหมายจุลภาค

r.c มีฟังก์ชั่นเปลือย:

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

แสดงความคิดเห็น

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
}

สำหรับการอ้างอิง

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

roboladder.c เสื้อคลุม

#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 สำหรับการทดสอบ

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 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อซึ่งใช้เวลาสองข้อโต้แย้ง (C, N) ใช้อย่างระมัดระวังเนื่องจากจะไม่ปิดสตรีมที่เปิด นอกจากนี้ยังกำหนดตัวแปรทั้งหมดทั่วโลก

แก้ไขเพื่อแทนที่d=#-1&ด้วยd=#~Max~1-1&ดังนั้น robie จะไม่ไปขุด


เดี๋ยวก่อน: ฉันไม่คิดว่ามันถูกต้อง จะช่วยให้หุ่นยนต์ลงไปในเชิงลบ อ๊ะ นั่นจะสอนให้ฉันทดสอบแบบไม่ครอบคลุม ... ฉันจะทำการแก้ไขเมื่อฉันได้รับโอกาส
hYPotenuser


0

Clojure, 92 84 ไบต์

นับnเป็นศูนย์แทนศูนย์ถึงnสามารถใช้ประโยชน์take-while pos?ได้

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

เดิม:

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

แผนที่อาร์กิวเมนต์ที่ 2 Uไป+, Dไปและคนอื่น-nilฟังก์ชั่นการลดการทำงาน(operand position 1)โดยไม่มีค่าว่างoperandและ0อื่น ๆ รับค่าจนกว่าเราจะสูงกว่าอาร์กิวเมนต์ที่ 1 และนับจำนวนที่เรามี


0

Mathematica, 67 ไบต์

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

ฟังก์ชันที่ไม่มีชื่อของอาร์กิวเมนต์สองตัวคือจำนวนเต็มบวกและรายการอักขระที่ส่งคืนเลขจำนวนเต็มบวก การWhileดำเนินการที่ตรงไปตรงมามากขึ้นกว่ารายการ Mathematica อื่น ๆ ที่จัดการเพื่อให้มีความยาว competetive

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.