Lucas Vs. Garaj Kapısı Uzaktan Kumandası


15

feragat

Bildiğim halde bu özel ilgili soru , sorum iki garaj kapıları, bir randomizing bileşenini kullanır ve Ben de dışarı yürüyordu iken oğlum yanlışlıkla bahsedilen garaj kapıları birini düşürdü görerek, gerçek yaşam olayları bu kurdum geçen hafta garaj ... Yaratıcı meyve sularının akması için kafaya bir darbe gibi bir şey yok! ;)

Arkaplan

Lucas (15 aylık oğlum) garaj uzaktan kumanda ile oynamayı seviyor. Bu uzaktan kumandada biri sol garaj kapısı, diğeri sağ garaj kapısı için olmak üzere iki düğme vardır. Her iki düğme de aynı şekilde çalışır; kapıyı açmaya başlamak için bir kez basın, durdurmak için tekrar basın, kapatmaya başlamak için tekrar basın, tekrar durdurmak için tekrar basın, vb.

Lucas bu uzaktan kumandayı seviyor, düğmelerden birine ya da her ikisine rastgele basacak ya da hiç basmayacak. Her ikisine de basılırsa, sinyal gönderilmez, ancak bir düğmeye basıldığında bir sinyal gönderilir.

Yani, kod golf zorluğu iki bölüme ayrılmıştır:

Bölüm Bir

Bir dakika içinde Lucas rastgele düğmesine basmayı temsil eden 60 karakter uzunluğunda bir dize oluşturun. Bu durumda "Rastgele", "her bir işarette her girişin eşit şansı ile" anlamına gelir. Karakterler aşağıdaki gibidir:

  • 0: Lucas ya hiçbir düğmeye basmadı ya da her iki düğmeye de bastı. Her iki durumda da sinyal gönderilmedi.
  • 1: Sol garaj kapısı düğmesine Lucas tarafından basıldı
  • 2: Sağ garaj kapısı düğmesine Lucas tarafından basıldı

Bölüm iki

Birinci Bölümde üretilen ipi kullanarak, bu kapıların açılması, durdurulması ve kapatılması için tetikleyici olarak sayıları kullanarak iki araçlık garajın açılıp kapanmasını simüle edin.

Garaj kapılarım oldukça hızlı (neden hakkında yukarıdaki Feragatnameye bakın). Düğmeye bastıktan sonra, tamamen açık veya kapalı olması dört saniye sürer.

Yani, kapalıysa:

  • 0 sn:% 0 açık (kapalı); düğmeye basıldığında, kapı açılmaya başlar
  • 1 sn:% 25 açık
  • 2 sn:% 50 açık
  • 3 sn:% 75 açık
  • 4 sn:% 100 açık, kapı duruşları

Bu nedenle, açıksa:

  • 0 sn:% 100 açık; düğmeye basıldığında, kapı kapanmaya başlar
  • 1 sn:% 75 açık
  • 2 sn:% 50 açık
  • 3 sn:% 25 açık
  • 4 sn:% 0 açık (kapalı), kapı duruşları

Belirli bir kapı hareket ediyorsa, aynı kapıya giden bir sinyal kapıyı durduracaktır. Bundan sonra aynı kapıya gönderilen bir sonraki sinyal, onu ters yönde hareket ettirecektir. Bir kapı daha önce hareket halindeyken durdurulursa ve "durdurma" sinyali alındığında şimdi tamamen açık veya tamamen kapalı ise, kapı tamamen açık veya tamamen kapalı durumda "durdurulmuş" olarak kaydedilecektir. yeni bir sinyal aldığında ters yönde hareket edin.

Bu simülasyonla, her iki garaj kapısı başlangıçta kapalı konumda olacaktır. Öyleyse, 10 saniyelik bir komut listesine bakalım ve Lucas bunları uzaktan kumandada gerçekleştirirse ne olacağını görelim:

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)

Çıktı

Çıktının ilk kısmı, Birinci Bölümden oluşturulan 60 karakter uzunluğunda rastgele "0", "1" ve "2" karakterlerinin dizgesinin görüntülenmesini gerektirir. Örneğin. 212022112021202211202120221120212022112021202211202120221120

Bu dizginin altında, bu "sinyallerin", garaj kapılarının her bir ilgili karakterle nasıl davranacağına ilişkin olarak (ikinci bir saniye bazında) yukarıda belirtilen kurallara göre işlenmesidir. İlk ekran dizesinin altında 60 satırla sonuçlanmalısınız.

Bu işlenen satırların her biri şu şekilde olacaktır: N: (L:X% XXXXXXX, R:Y% YYYYYYY)burada:

  • N, 0, 1 veya 2 şeklinde olacak ilgili rastgele dizeden gelen n. Karakterdir.
  • % X, sol kapının açıklık yüzdesidir (sıfır dolgu yoktur)
  • XXXXXXX sol kapının durumudur. Kapı hareket halinde değilse (yani açılmıyor veya kapanmıyorsa) "durdu" durumu uygulanır, yani hareket halinde durdurulmuştur (sadece% 25,% 50 veya% 75'te mümkündür) veya tamamen açıldığında (% 100 ) veya tamamen kapalı (% 0). Aksi takdirde, kapı "açılır" veya "kapanır".
  • % Y, sağ kapının açıklık yüzdesidir (sıfır dolgu yoktur)
  • YYYYYYY, sağ kapının durumudur. Kapı hareket halinde değilse (yani açılmıyor veya kapanmıyorsa) "durdu" durumu uygulanır, yani hareket halinde durdurulmuştur (sadece% 25,% 50 veya% 75'te mümkündür) veya tamamen açıldığında (% 100 ) veya tamamen kapalı (% 0). Aksi takdirde, kapı "açılır" veya "kapanır".

Aşağıda 10 "sinyaller" ve 10 işlenmiş hat kullanılarak gösterilen örnek

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)

Bu kod golf, bu yüzden en kısa kod açık kazanan olacak. Yedi harften oluşan "açılış", "durdurulmuş" ve "kapanış" gibi ifadeler kullanarak bunu biraz kolaylaştırdım ... bu yüzden bunu stratejinize eklemek isteyebilirsiniz.

İyi şanslar!


Bölüm 2 için daha net bir çıktı biçimi tanımlamalısınız
LegionMammal978

@ LegionMammal978 Çıktınızda neyin eksik olduğunu düşünüyorsunuz?
WallyWest

1
Şu anda değilim, ama bunun düzgün bir soru olduğunu düşünüyorum - bununla başa çıkabilirim.
DLosc

1
Son 1komut neden örneğinizde sol kapıyı% 75'te durdurmuyor?
Arnauld

1
İlk kısımda 0,1 ve 2'nin tümü eşit mi görünmeli yoksa basma, çift basma, sol basma ve sağ basmanın hepsi eşit mi görünmeli? (yani, 0 daha olasıdır çünkü aynı ve sonuç veren iki senaryoyu temsil eder ...)
Socratic Phoenix

Yanıtlar:


2

Pyth, 156 149 145 bayt

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 cevabımın doğrudan çevirisi .

Çevrimiçi deneyin!

Açıklama:

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

Vaov! Bu cevabın yanı sıra kodun açıklaması için teşekkürler ... Aslında sonuna kadar geldiğini
anlamıştım

5

JavaScript (ES6), 277 275 263 253 250 247 234 bayt

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

Ungolfed ve yorumladı

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

gösteri

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


Vay canına, bir astardan etkilendim ve onu console.log'a atıyorum! Aferin!
WallyWest

1
Merakla Firefox'ta çalışmıyor, sadece 4 satır çıktı, bunun gibi 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](virgül ve parantez sonrası yeni satırlar)
edc65

@ edc65 - Benim kötüm aslında. Çıktı formatıyla ilgili talimatları yanlış okudum. Bu düzeltildi.
Arnauld

@Arnauld Ayrıca v^=(c-i-1?0:v&8||24)iki bayt kaydetmek için parantezleri de kaldırabilirsiniz .
WallyWest

PS @Arnauld, katıldığınız için teşekkürler!
WallyWest

4

Piton 2, 377 370 361 357 345 335 326 316 312 306 304 bayt

İkinci girinti seviyesi, gerçekten\t oynayan ham bir sekmedir ( ) Markdown ile kötü yüzden iki boşlukla değiştirildi.

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

Bunun daha fazla golf oynayabileceğinden neredeyse eminim.

Ungolfed, yorumlarla:

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

Kaydedilmiş 4 14 15 @TheBikingViking sayesinde bayt!

@ValueInk sayesinde 6 bayt kaydedildi!


1
Değişebilirsin range(60)için [0]*60.
TheBikingViking

1
@TheBikingViking Teşekkürler! Bunu şimdi düzenliyorum.
Bakır

2
Bunun 'p'[1::3]yerine (kesme işaretlerini ters tırnaklarla değiştirin) yerine yapabilirsiniz ''.join(map(str,p)).
TheBikingViking

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

2
@ValueInk Bu satır, Python 2'nin liste anlamalarındaki bir hatayı n bu dizeye için kullanır. nayıklamak için son satırda kullanılır closing, stopped, openingbu dizeden.
Bakır

2

Yakut, 263 261 260 254 bayt

JavaScript'in cevabı nasıl bu kadar kısaldı ??? Ben yokken benimkini devirdi ve hala kazanıyor ...

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 bayt

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

Rastgele jeneratörü tohumlamaz, ancak daha iyi bir dağıtım için rasgele kullanır. Bu mantığı golf oynamanın daha iyi bir yolu olmalı ...

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)

Eski sürüm 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;}}

Eski sürüm 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
Bunu koda çevirebilir misiniz?
haykam

2

PHP 254 247 246 245 235 230 226 bayt

ES'yi yenmek!

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;

Bu 311 (ilk tam sürüm, zaten bazı golf vardı) aşağı 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]];}

Yıkmak

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)

@Arnauld: anladım! :)
Titus

1

Java 8 lambda, 500 karakter

Elimden geleni yaptım, işte geldiklerim:

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

Tam bir sınıfa ayrıldı:

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

Oldukça düz ileri. StepLeft / stepRight değişkenleri 0-3 arasında değişir. Bazı basit matematik değişiklikleri yapmak changeLeft / changeRight, leftDoor / rightDoor'a eklenecek adım başına ilgili göreceli değişiklikleri tutar. Kapının kendi başına durması gerektiğinde birçok if ifadesi.

Bunu kısaltmama yardım etmekten çekinmeyin, bence yapacak çok şey var.


1

Haskell (lambdabot) - 409 bayt

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

Lütfen gerekli tüm kodları ekleyiniz ( importsörneğin randomskodunuza (ve bayt sayısına). Varsayılan olarak içe aktarılan bir tercüman varsa, bu dile dil adıyla bakın.
nimi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.