ルーカス対 ガレージドアリモート


15

免責事項

私はこの特定の関連する質問があることを知っていますが、私の質問はランダム化コンポーネントである2つのガレージドアを使用し、実際の生活上の出来事にも基づいています。先週のガレージ...創造力を発揮するために頭に衝撃を与えるようなものはありません!;)

背景

ルーカス(私の15ヶ月の息子)は、ガレージのリモコンで遊ぶのが好きです。このリモコンには2つのボタンがあります。1つは左のガレージドア用で、もう1つは右のガレージドア用です。両方のボタンは同じように機能します。一度押すとドアが開き始め、もう一度押すと停止し、もう一度押すと閉じるようになり、もう一度押すと再び停止します。

ルーカスはこのリモコンが大好きで、ボタンのいずれか、または両方をランダムに押すか、まったく押しません。両方が押された場合、信号は送信されませんが、1つのボタンを押すと信号が送信されます。

そのため、コードゴルフの課題は2つの部分に分かれています。

パート1

ルーカスのボタンが1分以上押されたことを表す60文字の文字列を生成します。この場合の「ランダム」とは、「各ティックで各入力が均等に発生する」ことを意味します。文字は次のとおりです。

  • 0:ルーカスはボタンを押さなかったか、両方のボタンを押しました。いずれにしても、信号は送信されていません。
  • 1:左のガレージのドアのボタンがルーカスによって押されました
  • 2:右のガレージのドアのボタンがルーカスによって押されました

二部

パート1で生成された文字列を使用して、これらのドアを開閉するためのトリガーとして番号を使用して、2台の車のガレージの開閉をシミュレートします。

私のガレージのドアは非常に高速です(理由については上記の免責事項を参照してください)。ボタンを押すと、完全に開いたり閉じたりするのに4秒かかります。

したがって、閉じている場合:

  • 0秒:0%オープン(クローズ); ボタンを押すと、ドアが開き始めます
  • 1秒:25%オープン
  • 2秒:50%オープン
  • 3秒:75%オープン
  • 4秒:100%開いて、ドアが止まる

したがって、開いている場合:

  • 0秒:100%オープン; ボタンを押すと、ドアが閉じ始めます
  • 1秒:75%オープン
  • 2秒:50%オープン
  • 3秒:25%オープン
  • 4秒:0%開いた(閉じた)、ドアストップ

特定のドアが動いている場合、その同じドアへの信号はそれを停止します。同じドアに送信された次の信号は、反対方向に移動して送信されます。以前に動いていたときにドアが停止し、「停止」信号を受信したときに完全に開いたり完全に閉じたりすると、ドアは完全に開いた状態または完全に閉じた状態で「停止」として登録され、新しい信号を受信すると、反対方向に移動します。

このシミュレーションでは、両方のガレージドアが最初に閉じた位置にあります。それでは、コマンドの10秒のリストを見て、Lucasがリモートでコマンドを実行した場合にどうなるかを見てみましょう。

2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)

出力

出力の最初の部分では、パート1から生成されたランダムな「0」、「1」、「2」文字の60文字の文字列を表示する必要があります。例えば。 212022112021202211202120221120212022112021202211202120221120

この文字列の下に、ガレージのドアがそれぞれのキャラクターでどのように振る舞うかについての上記の規則に従ったこれらの「信号」の処理があります(1秒ごとに)。結果として、最初の表示文字列の下に60行が表示されます。

これらの処理された各行は、次の形式になります N: (L:X% XXXXXXX, R:Y% YYYYYYY)

  • Nは、それぞれのランダム文字列のn番目の文字で、0、1、または2の形式になります。
  • X%は、左のドアが開いている割合です(ゼロパディングはありません)
  • XXXXXXXは左ドアのステータスです。ドアが動いていない(つまり、開閉していない)場合、ステータス「停止」が強制されます。つまり、動いている(25%、50%、または75%でのみ)停止または完全に開いた(100% )または完全に閉じています(0%)。それ以外の場合、ドアは「開く」または「閉じる」のいずれかになります。
  • Y%は、右側のドアが開いている割合です(ゼロパディングはありません)
  • YYYYYYYは右側のドアのステータスです。ドアが動いていない(つまり、開閉していない)場合、ステータス「停止」が強制されます。つまり、動いている(25%、50%、または75%でのみ)停止または完全に開いた(100% )または完全に閉じています(0%)。それ以外の場合、ドアは「開く」または「閉じる」のいずれかになります。

10個の「信号」と10個の処理された行を使用した以下の例

2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)

これはコードゴルフなので、最短のコードが明確な勝者になります。「開始」、「停止」、「終了」などの7文字すべてのフレーズを使用して、これを少し簡単にしました。

幸運を祈ります!


パート2には、より明確な出力形式を定義する必要があります
。– LegionMammal978

@ LegionMammal978出力には何が欠けていると思いますか?
WallyWest

1
私は現時点ではありませんが、それはきちんとした質問だと思います-私はそれに取り組むかもしれません。
DLosc

1
1あなたの例では、最後のコマンドが左ドアを75%で停止しないのはなぜですか?
アーナルド

1
0、1、および2はすべて最初の部分に等しく表示されるべきですか、それとも非押し、二重押し、左押し、および右押しはすべて等しく表示されるべきですか?(つまり、0は、同じ結果を引き起こす2つのシナリオを表しているため、より可能性が高くなります...)
ソクラティックフェニックス

回答:


2

Pyth、156 149 145バイト

jkJmO3U60K=G*]Z3=b*3]_1VJFHS2I&=T@KHq*2hT@XHGTH XbHT XKH0)) XKN*_@XbN|@KN@bNN!@KN%+N": (L:%s, R:%s)"m++*@Gd25"% "%3>"csoltpooespnipinengdg"h@KdS2

私のPythonの答えの直接翻訳。

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

説明:

jk                              " print ''.join(map(str,                   "
JmO3U60                         "  J = [randint(0,2) for _ in range(60)])) "
K=G*]Z3                         " K = copy(G = [0] * 3)                    "
=b*3]_1                         " b = [-1] * 3                             "
VJ                              " for N in J:                              "
FHS2                            "  for H in range(1, 3):                   "
I&=T@KH                         "   if ((T = K[H]) and                     "
q*2hT@XHGTH                     "       (2 * (T + 1) == (G[H] += T)[H]):   "
 XbHT                           "    b[H] = T                              "
 XKH0))                         "    K[H] = 0                              "
 XKN*_@XbN|@KN@bNN              "  K[N] = (-(b[N] = K[N] or B[N])[N] *     "
!@KN                            "   (not K[N]))                            "
%+N": (L:%s, R:%s)"             "  print(str(N) + ': (L:%s, R:%s)' %       "
m++                             "   map(lambda d:                          "
*@Gd25                          "    G[d] * 25 +                           "
"% "                            "    '% ' +                                "
%3>"csoltpooespnipinengdg"h@Kd  "    'csoltpooespnipinengdg'[K[d]+1::3]]   "
S2                              "   ), range(1, 3))                        "

うわー!この回答とコードの説明に感謝します...実際に私はそれの終わりに到達するまでにそれを
理解していました...-WallyWest

5

ジャバスクリプト(ES6)、277 275 263 253の 250 247 234バイト

_=>(d=[0,0],l=s='',[...Array(60)].map(_=>(s+=`
${c=Math.random()*3|0}:(`,l+=c,d=d.map((v,i)=>(v=v&8?v&16?v-27?v+1:20:v-9?v-1:0:v,v^=c+~i?0:v&8||24,s+='LR'[i]+`:${(v&7)*25}% `+(v&8?v&16?'opening':'closing':'stopped')+',)'[i],v)))),l+s)

非ゴルフとコメント

_ => (
  // Initialize array:
  //   - d = door states as integers
  //     - bits 0 to 2: door opening state (from 0b000 = 0% to 0b100 = 100%)
  //     - bit #3: door in motion (0: no, 1: yes)
  //     - bit #4: door direction (0: closing, 1: opening)
  d = [0, 0],

  // Initialize strings:
  //   - l = list of commands
  //   - s = door states in plain text
  l = s = '',

  // Iterate on an array of 60 entries.
  [...Array(60)].map(_ => (
    // c = new random command (0, 1 or 2)
    // Append new line and new command to s.
    s += `\n${c = Math.random() * 3 | 0}:(`,

    // Append new command to l.
    l += c,

    // For each door ...
    d = d.map((v, i) => (
      // If the door is in motion, update its opening state.
      // Clear the 'in motion' bit if a bound is reached (either closed or fully open).
      v = v & 8 ? v & 16 ? v - 27 ? v + 1 : 20 : v - 9 ? v - 1 : 0 : v,

      // If the current command is intended for this door, update its direction and
      // 'in motion' bit. Direction is changed on the 'stopped => moving' transition.
      v ^= c + ~i ? 0 : v & 8 || 24,

      // Translate the door state in plain text and append it to s
      s +=
        'LR'[i] +
        `:${(v & 7) * 25}% ` +
        (v & 8 ? v & 16 ? 'opening' : 'closing' : 'stopped') +
        ',)'[i],

      // Value to be taken into account by map()
      v
    ))
  )),

  // Final result to be returned
  l + s
)

デモ

let f = 
_=>(d=[0,0],l=s='',[...Array(60)].map(_=>(s+=`
${c=Math.random()*3|0}:(`,l+=c,d=d.map((v,i)=>(v=v&8?v&16?v-27?v+1:20:v-9?v-1:0:v,v^=c+~i?0:v&8||24,s+='LR'[i]+`:${(v&7)*25}% `+(v&8?v&16?'opening':'closing':'stopped')+',)'[i],v)))),l+s)

console.log(f())


うわー、私は1つのライナーに感銘を受け、それでconsole.logにそれを投げます!よくやった!
WallyWest

1
不思議なことに、Firefoxで機能していません。出力は4行だけです112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](コンマと括弧の後の改行)
edc65

@ edc65-私の悪い、実は。出力形式に関する指示を読み間違えました。これは修正されました。
アーナルド

@Arnauldまた、括弧を削除してv^=(c-i-1?0:v&8||24)2バイト節約することもできます。
WallyWest

PS @Arnauld、参加してくれてありがとう!
WallyWest

4

Python 2、377 370 361 357 345 335 326 316 312 306 304バイト

2番目のインデントレベルは生のタブ(\t)であり、Markdownとの連携が非常に悪いため、2つのスペースに置き換えられています。

from random import*
p=[randint(0,2)for d in[[0]*3]*60]
print`p`[1::3]
v=[-1]*3
c=[0]*3
f=lambda y:str(c[y]*25)+'% '+'csoltpooespnipinengdg'[d[y]+1::3]
for x in p:
 for i in 1,2:
  q=d[i];c[i]+=q
  if(2*-~q==c[i])*q:v[i]=q;d[i]=0
 z=d[x]
 if z:v[x]=z
 d[x]=-v[x]*(z==0);print'%d: (L:%s, R:%s)'%(x,f(1),f(2))

これはさらにゴルフができると確信しています。

Ungolfed、コメント付き:

import random

# Generate the random string - represented as a list of ints
presses = [random.randint(0, 2) for _ in range(60)]
print ''.join(map(str, presses))

# Constants for door states used for easier reading
CLOSING = -1
STOPPED = 0
OPENING = 1

# Variables representing the state of the garage doors
# There's a third element in these so that x[0] resolves to a dummy slot
# (this way, we can avoid a conditional down the road)
prev_states = [CLOSING, CLOSING, 0]
door_states = [STOPPED, STOPPED, 0]
door_pcts = [0, 0, 0]  # delta 1 = 25%

for press in presses:
  # Close/open the door 1 more
  for i in 1, 2:
    if door_states[i] != STOPPED:
      delta_pct, stop_pct = (-1, 0) if door_states[i] == CLOSING else (1, 4)
      door_pcts[i] += delta_pct
      if door_pcts[i] == stop_pct:
        prev_states[i] = door_states[i]
        door_states[i] = STOPPED

  # Handle pressing a button
  # If the press is 0 (no press), the 0th element resolves to a dummy
  # door, thus saving us an expensive conditional

  if door_states[press] == STOPPED:
    door_states[press] = -prev_states[press]
  else:
    prev_states[press] = door_states[press]
    door_states[press] = STOPPED

  # Print the status update
  print '%d: (L:%d%% %s, R:%d%% %s)' % (
    press,
    door_pcts[0]*25,
    ['closing', 'stopped', 'opening'][door_states[0]+1],
    door_pcts[1]*25,
    ['closing', 'stopped', 'opening'][door_states[1]+1],
  )

保存済み4 14 15は @TheBikingVikingのおかげでバイト!

@ValueInkのおかげで6バイト節約されました!


1
あなたは変更することができますrange(60)[0]*60
-TheBikingViking

1
@TheBikingVikingありがとう!現在編集中です。

2
'p'[1::3]代わりに(アポストロフィをバッククォートで置き換える)実行できます''.join(map(str,p))
TheBikingViking

2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking

2
@ValueInkこの行は、Python 2のリスト内包表記のバグを悪用して、nその文字列に設定します。n抽出する最後の行で使用されclosingstoppedopeningその文字列から。

2

ルビー、263 261 260 254バイト

JavaScriptの答えはどのように短くなりましたか?私が留守中に私を追い越し、現在も勝っている...

s=(1..60).map{rand 3}
puts s*''
D=1,2
d=[25]*3;a=[0]*3;m=[p]*3
s.map{|i|D.map{|j|m[j]&&a[j]+=d[j];(0..100)===a[j]+d[j]||i!=j&&(d[j]*=-1;m[j]=p)}
(m[i]^=1)||d[i]*=-1
puts"#{i}: (L%s, R%s)"%D.map{|j|":#{a[j]}% #{%w"stopped opening closing"[m[j]?d[j]:0]}"}}

2

C、420 433 424 374バイト

#define F(X,x) X=x==1?X+1:x==2?X-1:X;X=X<0?0:X>4?4:X;x=X==0?0:X==4?3:x
#define G(x) x=x==1?3:x==2?0:x==3?2:x+1
#define H(X,x) X*25,x==0||x==3?"stopped":x==1?"opening":"closing"
c,i,l,r,L,R,x[60];main(){while(i<60)printf("%d",x[i++]=random()%3);while(c<60){if(x[c]==1)G(l);else if(x[c]==2)G(r);printf("\n%d: (L:%d%% %s, R:%d%% %s)",x[c++],H(L,l),H(R,r));F(L,l);F(R,r);}}

ランダムジェネレータをシードしませんが、より良い分布のためにランダムを使用します。しかし、このロジックをゴルフするより良い方法がなければなりません...

110121100121212100112200222111200020111100022122202112202211002
1: (L:0% opening, R:0% stopped)
1: (L:25% stopped, R:0% stopped)
0: (L:25% stopped, R:0% stopped)
1: (L:25% closing, R:0% stopped)
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
1: (L:25% stopped, R:50% opening)
0: (L:25% stopped, R:75% opening)
0: (L:25% stopped, R:100% stopped)
1: (L:25% closing, R:100% stopped)
2: (L:0% stopped, R:100% closing)
1: (L:0% opening, R:75% closing)
2: (L:25% opening, R:50% stopped)
1: (L:50% stopped, R:50% stopped)
2: (L:50% stopped, R:50% opening)
1: (L:50% closing, R:75% opening)
0: (L:25% closing, R:100% stopped)
0: (L:0% stopped, R:100% stopped)
1: (L:0% opening, R:100% stopped)
1: (L:25% stopped, R:100% stopped)
2: (L:25% stopped, R:100% closing)
2: (L:25% stopped, R:75% stopped)
0: (L:25% stopped, R:75% stopped)
0: (L:25% stopped, R:75% stopped)
2: (L:25% stopped, R:75% opening)
2: (L:25% stopped, R:100% closing)
2: (L:25% stopped, R:75% stopped)
1: (L:25% closing, R:75% stopped)
1: (L:0% opening, R:75% stopped)
1: (L:25% stopped, R:75% stopped)
2: (L:25% stopped, R:75% opening)
0: (L:25% stopped, R:100% stopped)
0: (L:25% stopped, R:100% stopped)
0: (L:25% stopped, R:100% stopped)
2: (L:25% stopped, R:100% closing)
0: (L:25% stopped, R:75% closing)
1: (L:25% closing, R:50% closing)
1: (L:0% opening, R:25% closing)
1: (L:25% stopped, R:0% stopped)
1: (L:25% closing, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
2: (L:0% stopped, R:0% opening)
2: (L:0% stopped, R:25% stopped)
1: (L:0% opening, R:25% stopped)
2: (L:25% opening, R:25% closing)
2: (L:50% opening, R:0% opening)
2: (L:75% opening, R:25% stopped)
0: (L:100% stopped, R:25% stopped)
2: (L:100% stopped, R:25% closing)
1: (L:100% closing, R:0% stopped)
1: (L:75% stopped, R:0% stopped)
2: (L:75% stopped, R:0% opening)
2: (L:75% stopped, R:25% stopped)
0: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% closing)
2: (L:75% stopped, R:0% opening)
1: (L:75% opening, R:25% opening)
1: (L:100% closing, R:50% opening)

古いバージョン1:

c,i,l,r,L,R,x[60];main(){while(i<60)printf("%d",x[i++]=random()%3);while(c<60){if(x[c]==1)l=l==1?3:l==2?0:l==3?2:l+1;else if(x[c]==2)r=r==1?3:r==2?0:r==3?2:r+1;printf("\n%d: (L:%d%% %s, R:%d%% %s)",x[c++],L*25,l==0||l==3?"stopped":l==1?"opening":"closing",R*25,r==0||r==3?"stopped":r==1?"opening":"closing");L=l==1?L+1:l==2?L-1:L;R=r==1?R+1:r==2?R-1:R;L=L<0?0:L>4?4:L;R=R<0?0:R>4?4:R;l=L==0?0:L==4?3:l;r=R==0?0:R==4?3:r;}}

古いバージョン2:

c,i,l,r,L,R,x[60];g(){while(i<60)printf("%d",x[i++]=random()%3);}main(){g();while(c<60){if(x[c]==1)l=l==1?3:l==2?0:l==3?2:l+1;else if(x[c]==2)r=r==1?3:r==2?0:r==3?2:r+1;printf("%d: (L:%d%% %s, R:%d%% %s)\n",x[c++],L*25,l==0||l==3?"stopped":l==1?"opening":"closing",R*25,r==0||r==3?"stopped":r==1?"opening":"closing");L=l==1?L+1:l==2?L-1:L;R=r==1?R+1:r==2?R-1:R;L=L<0?0:L>4?4:L;R=R<0?0:R>4?4:R;l=L==0?0:L==4?3:l;r=R==0?0:R==4?3:r;}}

2
それをコードに変換できますか?
haykam

2

PHP、254 247 246 245 235 230 226バイト

再びESを破りました!

for($t=60;$t--;)$s.=rand()%3;echo$s;for(;++$t<60;print"
$c: ($o[1], $o[2])")for($i=3;--$i;$o[$i]='.LR'[$i].':'.$d[$i]*25 .'% '.[opening,stopped,closing][abs($z-1)])if(((1&$z=&$r[$i])&&!(3&$d[$i]+=2-$z))|$i&$c=$s[$t])$z=++$z%4;

これらの311(最初の完全なバージョン、すでにいくつかのゴルフがありました)からゴルフダウン:

<?for($i=60;$i--;)$s.=rand(0,2);echo$s;$d=$r=[0,0];$n=[L,R];$p=[stopped,opening,stopped,closing];for($t=-1;++$t<60;print"
$c: (".join(', ',$x).")")for($m=$c=$s[$t],$i=-1;$i++<1;){if($r[$i]&1)if(!($d[$i]+=2-$r[$i])||4==$d[$i])$m|=$i+1;if($m&$i+1)$r[$i]=(1+$r[$i])%4;$x[$i]="$n[$i]:".($d[$i]*25)."% ".$p[$r[$i]];}

壊す

for($t=60;$t--;)$s.=rand()%3;   // part 1               also initializes $t to -1
echo$s;
for(
    ;
    ++$t<60;
    print"\n$c: ($o[1], $o[2])" // print output
)
    for($i=3;--$i;  // loop $i from 2 to 1 (door number)
        // generate output
        $o[$i]='.LR'[$i].':'.$d[$i]*25 .'% '
        .[opening,stopped,closing][abs($z-1)]           // map 0123 to 1012
    )
        if(((1&$z=&$r[$i])  // if door in motion        ... and reference the array item
            &&!(3&              // 2. if end position   "&&" needed for short circuit
            $d[$i]+=2-$z        // 1. move door         2-$z maps 1,3 to 1,-1 = delta
            )
        )|$i&$c=$s[$t])     // 3. or if button $i pressed   "|" needed for no short circuit
            $z=++$z%4;          // rotate direction     ++$z%4 maps 0,1,2,3 to 1,2,3,0
        // generate output (loop post condition)
    // print output (loop post condition)

@アーナウルド:わかった!:)
タイタス

1

Java 8ラムダ、500文字

私はベストを尽くしました、ここに私が思いついたものがあります:

()->{String r="";int i=0,l=0,m=0,n=1,o=1,p=0,q=0;for(;i++<60;)r+=(int)(Math.random()*3);for(char s:r.toCharArray()){l+=p;m+=q;if(l>99&p>0){l=100;p=25*(((n=++n%4)-1)%2);}if(l<1&p<0){l=0;p=25*(((n=++n%4)-1)%2);}if(m>99&q>0){m=100;q=25*(((o=++o%4)-1)%2);}if(m<1&q<0){m=0;q=25*(((o=++o%4)-1)%2);}if(s<49);else if(s>49)q=25*(((o=++o%4)-1)%2);else p=25*(((n=++n%4)-1)%2);r+="\n"+s+": (L:"+l+"% "+(p<0?"closing":p>0?"opening":"stopped")+", R:"+m+"% "+(q<0?"closing":q>0?"opening":"stopped")+")";}return r;}

完全なクラスにゴルフを解く:

public class Q91479 {

    public static String movedDoorsCombined() {
        String result = "";
        int i = 0, leftDoor = 0, rightDoor = 0, stepLeft = 1, stepRight = 1, changeLeft = 0, changeRight = 0;

        for (; i++ < 60;) {
            result += (int) (Math.random() * 3);
        }

        for (char step : result.toCharArray()) {
            // update stats
            leftDoor += changeLeft;
            rightDoor += changeRight;

            if (leftDoor > 99 & changeLeft > 0) {
                leftDoor = 100;
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            if (leftDoor < 1 & changeLeft < 0) {
                leftDoor = 0;
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            if (rightDoor > 99 & changeRight > 0) {
                rightDoor = 100;
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }
            if (rightDoor < 1 & changeRight < 0) {
                rightDoor = 0;
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }

            if (step < 49) {
                // 0
            }
            else if (step > 49) {
                // right
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }
            else {
                // left
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            result += "\n" + step + ": (L:" + leftDoor + "% "
                        + (changeLeft < 0 ? "closing" : changeLeft > 0 ? "opening" : "stopped")
                        + ", R:" + rightDoor + "% "
                        + (changeRight < 0 ? "closing" : changeRight > 0 ? "opening" : "stopped")
                        + ")";
        }
        return result;
    }
}

かなり簡単です。stepLeft / stepRight変数は、0〜3を囲みます。いくつかの簡単な数学を行うと、changeLeft / changeRightは、ステップごとにそれぞれの相対的な変更を保持します。これは、leftDoor / rightDoorに追加されます。ドアが自力で停止する必要がある場合にキャッチするためのifステートメントの多く。

これを短くするのを手伝ってください、私はやるべきことがたくさんあると思います。


1

Haskell(lambdabot)-409バイト

p=(cycle[0,1,0,-1],0)
t(d:q,s)=(if d/=0&&(s+d<1||3<s+d)then q else d:q,s+d)
k i(a,b)=[o i,": (L:",j a,", ","R:",j b,")"]>>=id
j(d:_,s)=o(round$(fromIntegral s/4)*100)++"% "++words"closing stopped opening"!!(d+1)
s=scanl$ \(a,b)i->i(t a,t b)
main=do b<-(fmap(round.(*(2::Float))).take 60<$>randoms)<$>getStdGen;putStrLn.unlines$(o=<<b):(zipWith k b.w.s(p,p)$([id,f$f w,second$f w]!!)<$>b)
o=show;f=first;w=tail

すべての必要な追加してくださいimportsために例えば、randomsあなたのコード(およびバイト数)へ。デフォルトでインポートするインタープリターがある場合は、言語名でそれを参照します。
-nimi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.