Lucas vs. Pilot do drzwi garażowych

15

Zrzeczenie się

Chociaż wiem, że istnieje to szczególne powiązane pytanie , moje pytanie wykorzystuje dwie bramy garażowe, element losowy, a także opieram je na prawdziwych wydarzeniach z życia, widząc, jak mój syn przypadkowo opuścił jedną z tych bram garażowych, gdy wychodziłem z garaż w zeszłym tygodniu ... Nie ma to jak cios w głowę, aby płynęły kreatywne soki! ;)

Tło

Lucas (mój 15-miesięczny syn) lubi bawić się pilotem do garażu. Na tym pilocie znajdują się dwa przyciski, jeden dla lewej bramy garażowej i jeden dla prawej bramy garażowej. Oba przyciski działają w ten sam sposób; naciśnij jeden raz, aby drzwi zaczęły się otwierać, naciśnij ponownie, aby zatrzymać, naciśnij ponownie, aby rozpocząć zamykanie, naciśnij ponownie, aby zatrzymać ponownie itd.

Lucas uwielbia tego pilota, losowo naciska jeden z przycisków, oba lub wcale. Jeśli oba zostaną naciśnięte, żaden sygnał nie zostanie wysłany, ale naciśnięcie jednego przycisku wyśle ​​sygnał.

Tak więc wyzwanie związane z golfem jest podzielone na dwie części:

Część pierwsza

Wygeneruj ciąg znaków o długości 60 znaków reprezentujący losowe naciśnięcia przycisków Lucasa w ciągu minuty. „Losowy” w tym przypadku oznacza „z jednakową szansą na każdy wkład przy każdym tiku”. Znaki są następujące:

  • 0: Lucas albo nie nacisnął żadnego przycisku, albo nacisnął oba przyciski. Tak czy inaczej, żaden sygnał nie został wysłany.
  • 1: Lucas nacisnął przycisk lewej bramy garażowej
  • 2: Lucas nacisnął przycisk prawej bramy garażowej

Część druga

Korzystając z ciągu wygenerowanego w części pierwszej, symuluj otwieranie i zamykanie garażu na dwa samochody, używając liczb jako wyzwalaczy do otwierania, zatrzymywania i zamykania tych drzwi.

Moje bramy garażowe są dość szybkie (zobacz Zastrzeżenie powyżej, dlaczego). Po naciśnięciu przycisku pełne otwarcie lub zamknięcie zajmuje cztery sekundy.

Jeśli więc zamknięte:

  • 0 sekund: 0% otwarte (zamknięte); po naciśnięciu przycisku drzwi zaczynają się otwierać
  • 1 s: 25% otwarty
  • 2 sekundy: 50% otwarcia
  • 3 s: 75% otwarty
  • 4 sek .: 100% otwarte, drzwi zatrzymują się

A zatem, jeśli jest otwarty:

  • 0 sekund: 100% otwarty; po naciśnięciu przycisku drzwi zaczynają się zamykać
  • 1 s: 75% otwarty
  • 2 sekundy: 50% otwarcia
  • 3 sekundy: 25% otwarcia
  • 4 s: 0% otwarte (zamknięte), drzwi zatrzymują się

Jeśli określone drzwi są w ruchu, sygnał do tych samych drzwi zatrzyma je. Następny sygnał wysłany do tych samych drzwi po tym wyśle ​​je w przeciwnym kierunku. Jeśli drzwi zostaną zatrzymane, gdy były wcześniej w ruchu i będą teraz całkowicie otwarte lub całkowicie zamknięte, gdy otrzymany zostanie sygnał „stop”, drzwi zarejestrują się jako „zatrzymane” w stanie całkowicie otwartym lub całkowicie zamkniętym, gotowe do przesuń się w przeciwnym kierunku, gdy otrzyma nowy sygnał.

Dzięki tej symulacji obie bramy garażowe będą początkowo w pozycji zamkniętej. Spójrzmy więc na 10-sekundową listę poleceń i zobaczmy, co się stanie, jeśli Lucas wykona je na pilocie:

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)

Wynik

Pierwsza część wyniku wymaga wyświetlenia ciągu o długości 60 znaków losowych znaków „0”, „1” i „2” wygenerowanych z części pierwszej. na przykład. 212022112021202211202120221120212022112021202211202120221120

Poniżej tego ciągu znajduje się przetwarzanie tych „sygnałów” zgodnie z regułami wspomnianymi powyżej, jak bramy garażowe będą się zachowywać z każdą postacią (sekunda po drugiej). Wynik powinien wynosić 60 linii poniżej początkowego ciągu wyświetlania.

Każda z tych przetworzonych linii będzie miała postać: N: (L:X% XXXXXXX, R:Y% YYYYYYY)gdzie:

  • N jest n-tym znakiem z odpowiedniego ciągu losowego, który będzie miał postać 0, 1 lub 2.
  • X% to procent otwarcia lewych drzwi (nie ma wypełnienia zerowego)
  • XXXXXXX to status lewych drzwi. Jeżeli drzwi nie są w ruchu (tj. Nie otwierają się ani nie zamykają), status „zatrzymany” jest wymuszony, co oznacza, że ​​został zatrzymany w ruchu (możliwy tylko przy 25%, 50% lub 75%) lub zatrzymany przy pełnym otwarciu (100% ) lub całkowicie zamknięte (0%). W przeciwnym razie drzwi będą „otwierać się” lub „zamykać”.
  • Y% to procent otwarcia prawych drzwi (nie ma wypełnienia zerowego)
  • RRRRRRR to stan odpowiednich drzwi. Jeżeli drzwi nie są w ruchu (tj. Nie otwierają się ani nie zamykają), status „zatrzymany” jest wymuszony, co oznacza, że ​​został zatrzymany w ruchu (możliwy tylko przy 25%, 50% lub 75%) lub zatrzymany przy pełnym otwarciu (100% ) lub całkowicie zamknięte (0%). W przeciwnym razie drzwi będą „otwierać się” lub „zamykać”.

Przykład pokazany poniżej z użyciem 10 „sygnałów” i 10 przetworzonych linii

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)

To jest kod-golf, więc najkrótszy kod będzie wyraźnym zwycięzcą. Ułatwiłem to trochę, używając wyrażeń takich jak „otwieranie”, „zatrzymywanie” i „zamykanie”, które są siedmioma literami ... więc możesz chcieć wprowadzić to w swoją strategię.

Powodzenia!

WallyWest
źródło
Powinieneś zdefiniować jaśniejszy format wyjściowy dla Części 2.
LegionMammal978 28.08.16
@ LegionMammal978 Czego brakuje w danych wyjściowych?
WallyWest,
1
W tej chwili tak nie jest, ale myślę, że to fajne pytanie - mogę sobie z tym poradzić.
DLosc
1
Dlaczego 1w twoim przykładzie ostatnie polecenie nie zatrzymuje lewych drzwi na poziomie 75%?
Arnauld
1
Czy wszystkie 0,1 i 2 powinny pojawiać się jednakowo w pierwszej części, czy też nie należy naciskać, podwójnie naciskać, naciskać w lewo i naciskać w prawo? (co oznacza, że ​​0 jest bardziej prawdopodobne, ponieważ reprezentuje dwa scenariusze, które powodują to samo i powodują ...)
Socratic Phoenix

Odpowiedzi:

2

Pyth, 156 149 145 bajtów

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

Bezpośrednie tłumaczenie mojej odpowiedzi w języku Python .

Wypróbuj online!

Wyjaśnienie:

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))                        "
Miedź
źródło
Łał! Dzięki za tę odpowiedź, a także wyjaśnienie kodu ... Właściwie to zrozumiałem, zanim dotarłem do końca ...
WallyWest
5

JavaScript (ES6), 277 275 263 253 250 247 234 bajtów

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

Nie golfił i komentował

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

Próbny

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
źródło
Wow, jestem pod wrażeniem jednej linijki i wrzucam ją do console.log! Dobra robota!
WallyWest,
1
Co ciekawe, nie działa w Firefoksie, tylko 4 linie wyjściowe, jak to 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](nowe wiersze po przecinku i nawiasach)
edc65
@ edc65 - Właściwie to mój zły. Źle odczytałem instrukcje dotyczące formatu wyjściowego. Zostało to naprawione.
Arnauld
@Arnauld Możesz również usunąć nawiasy z, v^=(c-i-1?0:v&8||24)aby zaoszczędzić dwa bajty.
WallyWest
PS @ Arnauld, dziękuję za udział!
WallyWest,
4

Python 2, 377 370 361 357 345 335 326 316 312 306 304 bajtów

Drugi poziom wcięcia to surowa tab ( \t), która gra naprawdę źle z Markdown, więc została zastąpiona dwoma spacjami.

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

Jestem prawie pewien, że można dalej grać w golfa.

Niegolfowany, z komentarzami:

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

Zapisano 4 14 15 bajtów dzięki @TheBikingViking!

Zaoszczędź 6 bajtów dzięki @ValueInk!

Miedź
źródło
1
Możesz zmienić range(60)na [0]*60.
TheBikingViking
1
@TheBikingViking Dzięki! Teraz to edytuję.
Copper
2
Możesz zrobić 'p'[1::3](zastąp apostrofy backticks) zamiast ''.join(map(str,p)).
TheBikingViking
2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking
2
@ValueInk Ta linia nadużywa błędu w zrozumieniu listy Pythona 2, aby ustawić nten ciąg. njest stosowany w końcowej linii, aby wyodrębnić closing, stopped, openingz tego łańcucha.
Copper
2

Rubinowy, 263 261 260 254 bajtów

W jaki sposób odpowiedź JavaScript stała się tak krótka? Wyprzedziło moje, gdy mnie nie było i wciąż wygrywam ...

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]}"}}
Wartość tuszu
źródło
2

C, 420 433 424 374 bajtów

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

Nie uruchamia generatora losowego, ale używa losowego dla lepszej dystrybucji. Musi istnieć lepszy sposób na zagranie w tę logikę ...

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)

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

Starsza wersja 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
źródło
2
Czy potrafisz przekonwertować to na kod?
haykam
2

PHP, 254 247 246 245 235 230 226 bajtów

pokonując ponownie 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;

grał w golfa z tych 311 (pierwsza kompletna wersja, już trochę golfa):

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

awaria

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)
Tytus
źródło
@Arnauld: mam cię! :)
Tytus
1

Java 8 lambda, 500 znaków

Dałem z siebie wszystko, oto co wymyśliłem:

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

Nie zaliczono do pełnej klasy:

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

Całkiem prosto. Zmienne stepLeft / stepRight krążą od 0-3. Wykonywanie prostych operacji matematycznych changeLeft / changeRight przechowuje odpowiednie zmiany względne na krok, które zostaną dodane do leftDoor / rightDoor. Wiele instrukcji if do łapania, gdy drzwi same muszą się zatrzymać.

Pomóż mi to skrócić, myślę, że jest wiele do zrobienia.

Frozn
źródło
1

Haskell (lambdabot) - 409 bajtów

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
Gajówka
źródło
Dodaj wszystkie niezbędne dane imports, np. randomsDo swojego kodu (i liczby bajtów). Jeśli domyślnie importowany jest tłumacz, sprawdź go w nazwie języka.
nimi