KITT araba ASCII sanat


20

80'lerin TV dizisi Knight Rider , KITT adında akıllı, kendini tanıyan bir arabaya sahipti. Aracın ayırt edici özelliklerinden biri, KITT'in "görmesine" izin veren (ve başka bir önceki TV dizisinin hayranlarına şüpheyle tanıdık gelen) öne monte edilmiş bir tarayıcı çubuğuydu .

Tarayıcıda bu resimde görüldüğü gibi sekiz ışık vardı:

resim açıklamasını buraya girin

Işıklar bu animasyonlu resimde gösterildiği gibi "hareket etti" .

Göreviniz, şimdiye kadar tahmin ettiğiniz gibi, tarayıcı çubuğunu ASCII sanatında hareketli ışıklarla yeniden oluşturmak.

Meydan okuma

Bir tamsayı verildiğinde t, tarayıcı çubuğunun durumunu şu anda tanımlanan şu şekilde çıktılayın:

  • Tarayıcı sekiz ışıktan oluşur.
  • Herhangi bir anda ışıklardan biri aktiftir ve olarak gösterilir #. Bazen faaliyet ışıklar t-1ve t-2artık soluk ve olarak gösterilir +; mevcut aktif ile çakışmadıkça. Işıkların geri kalanı kapalı ve olarak gösterilir -.
  • Aktif ışık soldan sağa, sonra sağdan sola hareket eder.

Her tbiri için kesin çıktı aşağıda detaylandırılmıştır.

0  -->  #++-----   % The leftmost light is active, and it just came from the right.
                   % The two neighbouring lights are dimmed
1  -->  +#------   % The active light has bounced to the right, and it is covering
                   % one of the two lights that should be dimmed. So there is only
                   % one dimmed light
2  -->  ++#-----   % The active light has moved one more step to the right, and the
                   % two trailing dimmed lights are visible
3  -->  -++#----
7  -->  -----++#
8  -->  ------#+   % The active light has bounced to the left
9  -->  -----#++
10 -->  ----#++-
13 -->  -#++----
14 -->  #++-----   % Same as 0
15 -->  +#------   % Same as 1

tDöngünün negatif değerleri basitçe genişletilir için:

-1 -->  -#++----   % Same as 13
-2 -->  --#++---   % Same as 12

Ek kurallar

Bir program veya işlev yazabilirsiniz.

Çıktı, sondaki boşluk ve önde gelen yeni satır içerebilir.

Bayt cinsinden en kısa kod kazanır.


Yanıtlar:


4

Jöle , 28 22 bayt

@Dennis yardımı ile -6 bayt! (önce yukarı, sonra bitiştir)

”-ẋ6;“#++”ṙ7Ḷ’¤Ḋ€U;$⁸ị

TryItOnline
Veya bir bonus paskalya yumurtası ile dört salınım gerçekleştirin !!

Nasıl?

”-ẋ6;“#++”ṙ7Ḷ’¤Ḋ€U;$⁸ị - Main link: n
”-   “#++”             - strings "-" and "#++"
  ẋ6                   - repeat six times: "------"
    ;                  - concatenate: "------#++"
              ¤        - nilad followed by atoms as a nilad (ie make a constant)
           7Ḷ’         -     range(7) decremented: [-1,0,1,2,3,4,5]
          ṙ            - rotate left by (makes)-----------> ["+------#+",
               Ḋ€      - Dequeue each                        "------#++",
                   $   - last two atoms as a monad           "-----#++-",
                 U     -     reverse (vectorises)            "----#++--",
                  ;    -     concatenate                     "---#++---",
                    ⁸  - left argument (n)                   "--#++----",
                     ị - index into (1 based and modular)    "-#++-----"])

6

JavaScript (ES6), 65 67 bayt

EDIT - Negatif değerler için düzeltildi. Şimdi N >= -8,000,000,000, AUTO CRUISE modunda oldukça iyi bir uzatılmış çalışma süresi sağlamalıdır. :-)

let f =

n=>[..."------#++-----".substr((n+=8e9)%7,8)].sort(_=>n/7&1).join``

// testing 28 frames
for(var i = -14; i < 14; i++) {
  console.log(f(i));
}

Animasyonlu sürüm


Sen 1 byte kaydedebilirsiniz n>=7yerinen/7&1
Hedi

@Hedi - Bu eğer çalışacak noldu [0 ... 13], ama değil.
Arnauld

4

JavaScript (ES6), 90 87 bayt

n=>"01234567".replace(/./g,i=>"-+##"[g=n=>!((+i+n)%14&&(n-i)%14),g(n)*2|g(n-1)|g(n-2)])

"- + ##" bir bit maskesi ile endekslenir, burada bit 1 aktif bir ışığı ve bit 0 soluk bir ışığı belirtir. Aktif / solukluk şimdi mevcut pozisyonu istenen pozisyona ekleyip çıkararak ve her iki sonucun 14'e bölünebilir olup olmadığını görerek hesaplanır.


4

Python, 53 bayt

lambda n:('-'*5+'++#'+'-'*6)[-n%7:][:8][::-n/7%2*2-1]

Dizeyi oluşturur, -----++#------giriş modulo 7'ye bağlı olarak bir uzunluk-8 penceresi alır, 1 ve 7 arasında bulunan modulo 14 girişleri için tersine çevirir.


3

> <> , 51 + 3 = 54 bayt

<v{"------#++"%7&(7%*27:-1
}>:?!\1-$
{~&?r\~
l?!;o>

Program başlangıcında yığınta giriş beklenir, bu nedenle -vbayrak için +3 bayt .

Çevrimiçi deneyin!


3

MATL, 34 30 27 bayt

'++#-'I:7XyY+4LZ)t2&P&viY))

@Luis sayesinde 7 byte tasarruf edildi

Çevrimiçi deneyin!

İlk 25 adımla ilgili başka bir örnek

açıklama

'++#-'      % Push the string literal to the stack
I:          % Create the array [1 2 3]
7Xy         % Create a 7 x 7 identity matrix
Y+          % Perform 2D convolution between the vector and this matrix
4LZ)        % Grab all but the first column. Yields the following matrix
            %
            %    2 3 0 0 0 0 0 0
            %    1 2 3 0 0 0 0 0
            %    0 1 2 3 0 0 0 0
            %    0 0 1 2 3 0 0 0
            %    0 0 0 1 2 3 0 0
            %    0 0 0 0 1 2 3 0
            %    0 0 0 0 0 1 2 3
            %
t2&P&v      % Copy this matrix, flip it horizontally and vertically concatenate
            % it with itself. 
i           % Explicitly grab the input (n)
Y)          % Get the n-th row of the above matrix (and use modular indexing)
)           % Index into the initial string literal to replace 2 with #, 1 and 3 with + 
            % and all 0's with -
            % Implicitly display the result

@LuisMendo Teşekkürler!
Suever

2

Pyth, 33 28 bayt

Tüm ışıkları aynı şekilde hesaplayarak 5 bayt tasarruf etti.

X:*8\-@LJ+U7_S7,-Q2tQ\+@JQ\#

Işıkların tümü kapalı olarak başlar ve her seferinde bir tane açar.

Çevrimiçi deneyin!


2

JavaScript, 204 bayt

function g(i){var a=(i%16+16)%16
if(!a)return g(2)
if(1==a%14)return(g(2)+'-').substr(1)
if((1<a)&&(a<8))return Array(a-1).join('-')+'++#'+Array(8-a).join('-')
return g(a-7).split("").reverse().join("")}

Ölçek

function g(i){var a=(i%16+16)%16
if(!a)return g(2)
if(1==a%14)return(g(2)+'-').substr(1)
if((1<a)&&(a<8))return Array(a-1).join('-')+'++#'+Array(8-a).join('-')
return g(a-7).split("").reverse().join("")}

for (var i = 0; i < 16; ++i) {
    console.log(i + '-->' + g(i));
}


2

JavaScript (ES6), 72

t=>`------${(t=(13+t%14)%14)>6?'#++':'++#'}------`.substr(t>6?t%7:7-t,8)

Daha az golf

t=>(
  pad = '------',
  t = (13+(t%14))%14,
  u = t % 7,
  t > 6 ? (pad + '#++' + pad).substr(u, 8)
        : (pad + '++#' + pad).substr(7 - u, 8)
)

Ölçek

f=
t=>`------${(t=(13+t%14)%14)>6?'#++':'++#'}------`.substr(t>6?t%7:7-t,8)

T=_=>(
  O.textContent=f(++N.textContent),
  setTimeout(T, 150)
)

T()
<input id=I type=number value=0 oninput='N.textContent=this.value'>
<pre id=N>-100</pre>
<pre id=O></pre>


1

Perl, 65 bayt

İçin +1 içerir -n

STDIN üzerindeki numara ile çalıştırın:

for i in 0 `seq 14`; do perl -M5.010 kitt.pl <<< $i; done

kitt.pl:

#!/usr/bin/perl -n
$_="311e".--$_%14+4e16|0;s/.(.{8})/$&|reverse/e;y/013/-+#/;say//

Çok rekabetçi değil ama garip yöntem için bir yazı hak ediyor


1

Perl, 56 55 bayt

İçin +3 içerir -p

STDIN üzerindeki numara ile çalıştırın:

for i in 0 `seq 14`; do kitt.pl <<< $i; echo; done

kitt.pl:

#!/usr/bin/perl -p
$_=eval'1x8
|1x(7-abs$_--%14-7).++$^F#'x3;y;1537;-+#

Bunu son satırsonu olmayan bir dosyaya koyun ( ;bununla uğraşmak istemiyorsanız programa bir final ekleyin ). Maalesef değişmez^F işe yaramıyor

Bu program 2 yorum karakteri içerir ( #!satırı yoksay ). Bunlardan biri gerçekten bir yorum ve aslında kazanıyor bir bayt ....

Gerçek görüntü tutma algoritmasını uygular


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.