Lucas Vs. Remote Pintu Garasi

15

Penolakan

Meskipun saya tahu ada pertanyaan terkait khusus ini , saya menggunakan dua pintu garasi, komponen acak, dan saya juga mendasarkan ini pada peristiwa kehidupan nyata, melihat anak saya secara tidak sengaja menurunkan salah satu pintu garasi tersebut sementara saya berjalan keluar dari garasi minggu lalu ... Tidak ada yang seperti pukulan di kepala untuk membuat jus kreatif mengalir! ;)

Latar belakang

Lucas (putra saya yang berumur 15 bulan) suka bermain dengan remote garasi. Ada dua tombol pada remote ini, satu untuk pintu garasi kiri, dan satu untuk pintu garasi kanan. Kedua tombol bekerja dengan cara yang sama; tekan sekali untuk mendapatkan pintu untuk mulai membuka, tekan lagi untuk berhenti, tekan lagi untuk mulai menutup, tekan lagi untuk berhenti lagi, dan seterusnya.

Lucas menyukai remote ini, dia akan secara acak menekan salah satu tombol, atau keduanya, atau tidak sama sekali. Jika keduanya ditekan, tidak ada sinyal yang dikirim, tetapi menekan satu tombol akan mengirimkan sinyal.

Jadi, tantangan kode-golf dibagi menjadi dua bagian:

Bagian satu

Hasilkan string 60 karakter panjang yang mewakili tombol Lucas acak ditekan lebih dari satu menit. "Acak" dalam hal ini berarti "dengan peluang yang sama untuk setiap input pada setiap centang". Karakternya adalah sebagai berikut:

  • 0: Lucas menekan tombol no, atau menekan kedua tombol. Bagaimanapun, tidak ada sinyal yang dikirim.
  • 1: Tombol untuk pintu garasi kiri telah ditekan oleh Lucas
  • 2: Tombol untuk pintu garasi kanan telah ditekan oleh Lucas

Bagian kedua

Menggunakan string yang dihasilkan di Bagian Satu, mensimulasikan pembukaan dan penutupan garasi dua mobil menggunakan angka sebagai pemicu untuk membuka, menghentikan dan menutup pintu-pintu ini.

Pintu garasi saya cukup cepat (lihat Penafian di atas tentang alasannya). Setelah Anda menekan tombol, dibutuhkan empat detik untuk sepenuhnya terbuka atau tertutup.

Jadi, jika ditutup:

  • 0 dtk: 0% terbuka (tertutup); ketika tombol ditekan, pintu mulai terbuka
  • 1 dtk: 25% terbuka
  • 2 detik: 50% terbuka
  • 3 detik: 75% terbuka
  • 4 detik: 100% terbuka, pintu berhenti

Dan karena itu, jika terbuka:

  • 0 dtk: 100% terbuka; ketika tombol ditekan, pintu mulai menutup
  • 1 dtk: 75% terbuka
  • 2 detik: 50% terbuka
  • 3 detik: 25% terbuka
  • 4 detik: 0% terbuka (tertutup), pintu berhenti

Jika pintu tertentu sedang bergerak, sinyal ke pintu yang sama akan menghentikannya. Sinyal selanjutnya dikirim ke pintu yang sama setelah itu akan mengirimnya bergerak ke arah yang berlawanan. Jika pintu berhenti ketika sebelumnya telah bergerak dan sekarang terbuka penuh atau tertutup sepenuhnya ketika sinyal "berhenti" diterima, pintu akan mendaftar sebagai "berhenti" dalam keadaan terbuka atau tertutup sepenuhnya, siap untuk bergerak ke arah yang berlawanan ketika menerima sinyal baru.

Dengan simulasi ini, kedua pintu garasi pada awalnya akan berada dalam posisi tertutup. Jadi, mari kita lihat daftar perintah 10 detik dan lihat apa yang terjadi jika Lucas melakukannya di remote:

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)

Keluaran

Bagian pertama dari output membutuhkan tampilan string panjang 60 karakter acak "0", "1" dan "2" karakter yang dihasilkan dari Bagian Satu. misalnya. 212022112021202211202120221120212022112021202211202120221120

Di bawah string ini, adalah pemrosesan "sinyal" ini sesuai dengan aturan yang disebutkan di atas tentang bagaimana pintu garasi akan berperilaku dengan masing-masing karakter masing-masing (berdasarkan detik ke detik). Anda harus berakhir dengan 60 baris sebagai hasilnya di bawah string tampilan awal.

Masing-masing jalur yang diproses ini akan dalam bentuk: di N: (L:X% XXXXXXX, R:Y% YYYYYYY)mana:

  • N adalah karakter ke-n dari string acak masing-masing, yang akan dalam bentuk 0, 1, atau 2.
  • X% adalah persentase keterbukaan pintu kiri (tidak ada bantalan nol)
  • XXXXXXX adalah status pintu kiri. Jika pintu tidak bergerak (yaitu tidak membuka atau menutup) status "berhenti" diberlakukan, artinya telah berhenti bergerak (hanya mungkin pada 25%, 50% atau 75%) atau dihentikan ketika terbuka penuh (100% ) atau tertutup sepenuhnya (0%). Kalau tidak, pintu akan menjadi "membuka" atau "menutup".
  • Y% adalah persentase keterbukaan pintu kanan (tidak ada bantalan nol)
  • YYYYYYY adalah status pintu kanan. Jika pintu tidak bergerak (yaitu tidak membuka atau menutup) status "berhenti" diberlakukan, artinya telah berhenti bergerak (hanya mungkin pada 25%, 50% atau 75%) atau dihentikan ketika terbuka penuh (100% ) atau tertutup sepenuhnya (0%). Kalau tidak, pintu akan menjadi "membuka" atau "menutup".

Contoh yang ditunjukkan di bawah ini menggunakan 10 "sinyal" dan 10 jalur yang diproses

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)

Ini adalah kode-golf, jadi kode terpendek akan menjadi pemenang yang jelas. Saya membuat ini sedikit mudah dengan menggunakan frasa seperti "pembukaan", "berhenti" dan "penutupan", yang semuanya adalah tujuh huruf ... jadi Anda mungkin ingin memasukkannya ke dalam strategi Anda.

Semoga berhasil!

WallyWest
sumber
Anda harus menentukan format output yang lebih jelas untuk Bagian 2.
LegionMammal978
@ LegionMammal978 Apa yang Anda rasa hilang dari output?
WallyWest
1
Saya tidak melakukannya saat ini, tetapi saya pikir itu adalah pertanyaan yang rapi - saya mungkin mengatasinya.
DLosc
1
Mengapa 1perintah terakhir tidak menghentikan pintu kiri 75% pada contoh Anda?
Arnauld
1
Haruskah 0,1, dan 2 semuanya tampil sama rata di bagian pertama, atau tidak boleh tekan, tekan dua kali, tekan kiri, dan tekan kanan semua sama? (artinya, 0 lebih mungkin karena mewakili dua skenario yang menyebabkan hal yang sama dan hasilnya ...)
Socratic Phoenix

Jawaban:

2

Pyth, 156 149 145 byte

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

Terjemahan langsung dari jawaban Python saya .

Cobalah online!

Penjelasan:

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))                        "
Tembaga
sumber
Wow! Terima kasih atas jawaban ini, dan juga penjelasan kodenya ... Saya benar-benar memahaminya pada saat saya mencapai akhir ...
WallyWest
5

Javascript (ES6), 277 275 263 253 250 247 234 byte

_=>(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)

Tidak diikat dan dikomentari

_ => (
  // 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
)

Demo

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

Arnauld
sumber
Wow, saya terkesan dengan liner satu dan melemparkannya ke console.log pada saat itu! Sudah selesai dilakukan dengan baik!
WallyWest
1
Anehnya tidak bekerja di Firefox, hanya 4 baris dalam output, seperti ini 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](baris baru setelah koma dan kurung)
edc65
@ edc65 - Sebenarnya saya buruk. Saya salah membaca instruksi tentang format output. Ini sudah diperbaiki.
Arnauld
@Arnauld Anda juga dapat menghapus tanda kurung v^=(c-i-1?0:v&8||24)untuk menghemat dua byte.
WallyWest
PS @Arnauld, terima kasih sudah ikut!
WallyWest
4

Python 2, 377 370 361 357 345 335 326 316 312 306 304 byte

Level indentasi kedua adalah tab mentah ( \t), yang bermain sangat buruk dengan Markdown, sehingga telah diganti oleh dua spasi.

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

Saya hampir yakin ini bisa golf lebih lanjut.

Tidak disatukan, dengan komentar:

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],
  )

Disimpan 4 14 15 byte berkat @TheBikingViking!

Disimpan 6 byte berkat @NilaiInk!

Tembaga
sumber
1
Anda bisa berubah range(60)menjadi [0]*60.
TheBikingViking
1
@TheBikingViking Terima kasih! Saya sedang mengedit itu sekarang.
Tembaga
2
Anda dapat melakukan 'p'[1::3](mengganti apostrof dengan backticks) sebagai gantinya ''.join(map(str,p)).
TheBikingViking
2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking
2
@NilaiInk Baris itu menyalahgunakan bug dalam daftar Python 2 untuk ditetapkan nke string itu. ndigunakan pada baris akhir untuk mengekstrak closing, stopped, openingdari string itu.
Tembaga
2

Ruby, 263 261 260 254 byte

Bagaimana jawaban JavaScript menjadi sangat singkat ??? Itu mengambil alih milikku saat aku pergi dan masih menang saat ini ...

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]}"}}
Nilai Tinta
sumber
2

C, 420 433 424 374 byte

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

Tidak menyemai generator acak tetapi menggunakan acak untuk distribusi yang lebih baik. Harus ada cara yang lebih baik untuk golf logika ini ...

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)

Versi yang lebih lama 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;}}

Versi lebih lama 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;}}
Cleblanc
sumber
2
Bisakah Anda mengubahnya menjadi kode?
haykam
2

PHP, 254 247 246 245 235 230 226 byte

mengalahkan ES lagi!

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;

bermain golf dari 311 ini (versi lengkap pertama, sudah bermain golf):

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

kerusakan

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)
Titus
sumber
@Arnauld: mengerti! :)
Titus
1

Java 8 lambda, 500 karakter

Saya melakukan yang terbaik, inilah yang saya hasilkan:

()->{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;}

Tidak tergabung dalam kelas lengkap:

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

Cukup lurus ke depan. Variabel stepLeft / stepRight lingkaran dari 0-3. Melakukan beberapa matematika sederhana changeLeft / changeRight tahan perubahan relatif masing-masing per langkah, yang akan ditambahkan ke leftDoor / rightDoor. Banyak jika pernyataan untuk menangkap ketika pintu harus berhenti sendiri.

Jangan ragu untuk membantu saya mempersingkat ini, saya pikir ada banyak yang harus dilakukan.

Frozn
sumber
1

Haskell (lambdabot) - 409 byte

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
BlackCap
sumber
Silakan tambahkan semua yang diperlukan imports, misalnya untuk randomskode Anda (dan jumlah byte). Jika ada penerjemah yang mengimpor secara default, rujuklah dalam nama bahasa.
nimi