KITT art ASCII mobil

20

Serial TV 80-an Knight Rider menampilkan mobil yang cerdas dan sadar diri yang disebut KITT. Salah satu aspek khas dari mobil ini adalah bar pemindai yang dipasang di depan yang memungkinkan KITT untuk "melihat" (dan yang mencurigakan akrab bagi penggemar serial TV lain sebelumnya ).

Pemindai memiliki delapan lampu seperti yang terlihat dalam gambar ini:

masukkan deskripsi gambar di sini

Lampu "bergerak" seperti yang ditunjukkan dalam gambar animasi ini .

Tugas Anda, seperti yang sudah Anda tebak sekarang, itu untuk membuat ulang bar pemindai dengan lampu bergerak dalam seni ASCII.

Tantangan

Diberikan bilangan bulat t, mengeluarkan status bilah pemindai saat itu juga, yang didefinisikan sebagai berikut:

  • Pemindai terdiri dari delapan lampu.
  • Setiap saat salah satu lampu aktif , dan ditampilkan sebagai #. Lampu yang aktif pada waktu t-1dan t-2sekarang redup , dan ditampilkan sebagai +; kecuali mereka bertepatan dengan yang aktif saat ini. Sisa lampu mati , dan ditampilkan sebagai -.
  • Lampu aktif bergerak dari kiri ke kanan, lalu ke kanan ke kiri.

Output yang tepat untuk masing-masing tdirinci di bawah ini.

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

Untuk nilai negatif dari tsiklus diperpanjang:

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

Aturan tambahan

Anda dapat menulis suatu program atau fungsi.

Output dapat berisi spasi spasi tambahan dan baris baru terkemuka.

Kode terpendek dalam byte menang.

Luis Mendo
sumber
Relevan.
SuperJedi224

Jawaban:

4

Jelly , 28 22 byte

-6 byte berkat bantuan @Dennis! (terbalik dulu, lalu gabungkan)

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

TryItOnline
Atau lakukan empat osilasi dengan bonus easter egg !!

Bagaimana?

”-ẋ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)    "-#++-----"])
Jonathan Allan
sumber
6

JavaScript (ES6), 65 67 byte

EDIT - Tetap untuk nilai negatif. Sekarang mendukung N >= -8,000,000,000, yang seharusnya memberikan perpanjangan waktu operasi yang cukup baik dalam mode AUTO CRUISE. :-)

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

Versi animasi

Arnauld
sumber
Anda dapat menyimpan 1 byte dengan n>=7bukannyan/7&1
Hedi
@Hedi - Itu akan berhasil jika nada di [0 ... 13], tetapi tidak.
Arnauld
4

JavaScript (ES6), 90 87 byte

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

"- + ##" diindeks oleh bitmask, di mana bit 1 menandakan cahaya aktif dan bit 0 menandakan cahaya redup. Aktif / meredup sekarang dihitung dengan menambah dan mengurangi posisi saat ini dari posisi yang diinginkan dan melihat apakah salah satu hasilnya dapat dibagi 14.

Neil
sumber
4

Python, 53 byte

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

Membuat string -----++#------, membutuhkan jendela panjang-8 tergantung pada modulo input 7, membalikkan untuk input modulo 14 yang terletak antara 1 dan 7.

Tidak
sumber
3

> <> , 51 + 3 = 54 byte

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

Input diharapkan pada stack saat program mulai, jadi +3 byte untuk -vflag.

Cobalah online!

Sok
sumber
3

MATL, 34 30 27 byte

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

7 byte disimpan berkat @Luis

Cobalah secara Online!

Contoh lain dengan 25 langkah pertama

Penjelasan

'++#-'      % 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
Suever
sumber
@LuisMendo Terima kasih!
Suever
2

Pyth, 33 28 byte

Disimpan 5 byte dengan menghitung semua lampu dengan cara yang sama.

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

Mulai dengan lampu mati semua dan menyalakannya satu per satu.

Cobalah online!

Steven H.
sumber
2

JavaScript, 204 byte

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

Uji

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

Attilio
sumber
2

JavaScript (ES6), 72

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

Kurang golf

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

Uji

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>

edc65
sumber
1

Perl, 65 byte

Termasuk +1 untuk -n

Jalankan dengan nomor di STDIN:

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

Tidak terlalu kompetitif tetapi pantas mendapat posting karena metode yang aneh

Ton Hospel
sumber
1

Perl, 56 55 byte

Termasuk +3 untuk -p

Jalankan dengan nomor di STDIN:

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;-+#

Masukkan ini ke dalam file tanpa baris terakhir (tambahkan final ;ke program jika Anda tidak ingin repot dengan itu). Sayangnya menggunakan literal ^Ftidak berhasil

Program ini berisi 2 karakter komentar (abaikan #!baris). Salah satunya adalah komentar dan sebenarnya mendapatkan satu byte ....

Menerapkan algoritma sisa cahaya aktual

Ton Hospel
sumber
1

Kanvas , 23 byte

±7%╵-8×#++1╋8m⁸╷³╵%7<?↔

Coba di sini!

dzaima
sumber