はしご上のロボット


30

バックグラウンド

壁にはしごがあり、それを登ることができる遠隔操作ロボットがあります。ロボットに3つの異なるコマンドを送信できます。

  • UP:ロボットは1ステップ上に移動します。それが最高のステップにあった場合、それはつまずき、倒れ、爆発します。
  • DOWN:ロボットは下に1歩進みます。それが最下段にあった場合、何も起こりません。
  • RESET:ロボットは最下段に戻ります。

一連のコマンドを送信することもでき、ロボットはそれらを1つずつ実行します。あなたの仕事は、その動きを予測することです。

入力

あなたの入力は正の整数である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ご使用の言語に文字列を表す他の手段がない場合のみ。
ズガルブ

回答:


10

CJam、26 25 22バイト

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

入力形式は、1行目の指示と2行目のラダーの高さです。

ここでテストしてください。

説明

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.

爆発後もすべてのコマンドを処理することをお勧めします。数バイト節約するためにそれを借りる
ルイスメンドー

7

C、83 71 + 4 = 75バイト

@JoshK&Sスタイルを見せてくれてありがとう。

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"

イデオンでのライブテスト


1
いい答えですが、関数はグローバルzaリセットされないため、関数は1回しか効果的に使用できないことに注意してください。
ジョシュ

@ジョシュ。更新しました。:)
削除

1
驚くばかり!:また、あなたの関数内の型宣言で遊んでカップルの文字を保存することができcodegolf.stackexchange.com/a/40266/13877
ジョシュ

@ジョシュ。すごいこれはすごい!おかげで
削除

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.

分解済み:

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"
    • i0の場合、そのままにしておきます。
    • それ以外の場合は、1ずつ減らします。
  3. IFがcあり"U"、増分i1によります。
  4. それ以外の場合は、i0 に設定します。

ifを切断することにより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


0,i=0変更できると思うi=0
チョイス

@Cyoceうーん、新しいタブで失敗します(このページの作業は既に定義されています)
チャーリーウィン

@CharlieWynn申し​​訳ありませんが、私の優先順位がまちまちです
チョイス

3

MATL37 34バイト

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

オンラインでお試しください!

説明

位置は0から始まります。新しい位置はそれぞれ、古い位置を維持したままスタックにプッシュされます。したがって、スタックサイズは、現在までの移動数に1を加えたものを表します。

各コマンドの処理にはループが使用されます。爆発後であっても、位置がはしごの高さに達するとループが終了します(Martinの回答から得たアイデア)。最終結果は、はしごの高さに等しい最初の位置のインデックスによって与えられます。

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、明示的に$bchar-arrayとしてキャストします。次に|%{...}、すべてをループし$bます。繰り返しごとに、counterをインクリメントします$d

次に、でifトップに到達したかどうかを確認するステートメント-ge$a。もしそうなら、出力し$dexitます。ifステートメントは割り当てることによって作成された擬似三元から構成され$cた配列に複数のインデックスの結果にマイナスに等しいです。

我々は、のASCII値ことトリックを持っているDRUの対応02および1モジュロ4を取ったときに、そう$_%4私たちの最初の指標となります。の場合は、リセットを実行してに等しくR設定されます。の場合、それは上に行く必要があることを意味するので、結果。それ以外の場合は、だ(だ我々は一番下にすでにしているかどうかを確認する必要があるので、- PowerShellで「ないゼロ」は「true」または、)とのセットはに等しいか、それぞれ。$c$c-$cU$c-(-1)D!$c1$c$c-0$c-1

編集-直接割り当てではなく、マイナスの割り当てを使用して7バイトを保存しました


3

Perl 5、61バイト

の2バイトが含まれます-F -i。(-M5.01無料です。)

整数(10など)の入力は次のとおりperl -M5.01 -F -i10 robot.plです。ラダーコマンドの入力は標準入力です。

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

perl 5.12.5を使用して、-anF何かを印刷する前に、自動分割モードを明示的に有効にする必要がありました。しかし-F、5.20.3 でのみ暗黙的に有効にされるようです。これを確認できますか?
-ardnew

@ardnew、-F私にとっては十分です(5.20または5.22程度)。Iirc現在のperldoc perlrunは、それが暗示している-a-a暗示してい-nます。
msh210

どれくらいの価値-iがありますか?私はあなたが1として数えるのを見ることができますが、実際には3として数えられるべきだと思いますか?:-)
andlrc

@ dev-null、なぜ3つですか?PPCG.SEの慣習では、フラグ内の文字はカウントするがハイフンマイナス文字はカウントしないと思いますが、間違っている場合は修正してください。(この質問に対するあなた自身の答えにも同じカウント規則を使用しているようです。(偶然、いい答えです。))
msh210

@ msh210私はちょうど使用した場合の違いを数えた-iとなしperl -i10 -pe';'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;

なし:

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

コードを実行できる限り、通知は問題ありません。
ズガルブ

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に出力する完全なプログラム、または入力を引数として受け取って出力値を返す関数である必要があります。ソリューションは入力をハードコーディングしますが、これは許可されていません。
ズガルブ

関数に形成することで修正され、私はそれを書いたときにインタプリタを使用していました。
アレックスバージ

ありがとうございました!また、フォームのヘッダーを追加して、## Python, <N> bytes他の人にスコアを表示する必要があります。
ズガルブ

名前のない関数は存在しないと思います。
user48538

あなたは置き換えることにより、バイトを保存することができ0 if x==0 else x-1x and x-1
Cyoceを

2

JavaScript、131 106バイト-

これはCode Golfコンペティションには勝てないことは知っていますが、これは実装するための楽しくて愚かなソリューションでした。

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

動的に生成された命令型ソリューションを作成することで、「機能的な」ルートとは反対になりました。命令のインスタンスは、インクリメントまたはデクリメント、およびカウンターインクリメントに置き換えられます。

29バイト節約してくれたCycoceに感謝します!


ここでは、私が29のバイトをオフgolfed: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

DSMのおかげで6バイト節約されました。

とても簡単です。

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

ゴルフをしていない:

// $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
code-golf -challengeに答えるときは、から始めてください# <language_name>, XX bytes。また、変数名をそれぞれ1文字に減らして余分な空白を削除することもできます。これにより、バイト数が減ります(ここでの目的です)。ああ、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)&

2つの引数(C、N)を取る匿名関数。これを使用する際には注意してください。開いているストリームを閉じないためです。また、すべての変数をグローバルに割り当てます。

に置き換えd=#-1&て編集しd=#~Max~1-1&、ロビーが掘らないようにしました。


待ってください。これは有効ではないと思います。これにより、ロボットは負のラングを下ることができます。おっと。それは非包括的にテストすることを教えてくれます...機会があれば修正したものを置きます。
hYPotenuser

1

Mathematica、112バイト

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

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)null以外とoperandし、0それ以外の場合は。最初の入力引数よりも大きくなるまで値を取得し、取得した数をカウントします。


0

Mathematica、67バイト

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

正の整数と正の整数を返す文字のリストの2つの引数の名前のない関数。While他のMathematicaエントリよりも簡単な実装で、より競争力のある長さになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.