Xe KITT nghệ thuật ASCII


20

Bộ phim truyền hình Knight Rider của thập niên 80 có một chiếc xe thông minh, tự nhận thức được gọi là KITT. Một khía cạnh đặc biệt của chiếc xe là một thanh máy quét gắn phía trước cho phép KITT "nhìn thấy" (và trông có vẻ quen thuộc đáng ngờ đối với người hâm mộ của một bộ phim truyền hình khác trước đó ).

Máy quét có tám đèn như trong hình này:

nhập mô tả hình ảnh ở đây

Đèn "di chuyển" như thể hiện trong hình ảnh hoạt hình này .

Nhiệm vụ của bạn, như bạn đã đoán bây giờ, nó là tái tạo thanh máy quét bằng đèn di chuyển trong nghệ thuật ASCII.

Các thách thức

Cho một số nguyên t, xuất trạng thái của thanh máy quét ngay lúc đó, được xác định như sau:

  • Máy quét bao gồm tám đèn.
  • Tại bất kỳ thời điểm nào, một trong các đèn đang hoạt động và được hiển thị dưới dạng #. Các đèn được kích hoạt tại các thời điểm t-1t-2bây giờ bị mờ đi , và được hiển thị như +; trừ khi chúng trùng với hoạt động hiện tại. Phần còn lại của đèn tắt , và được hiển thị như -.
  • Ánh sáng hoạt động di chuyển từ trái sang phải, sau đó phải sang trái.

Đầu ra chính xác cho từng tđược chi tiết dưới đây.

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

Đối với các giá trị âm của tchu kỳ được mở rộng đơn giản:

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

Quy tắc bổ sung

Bạn có thể viết một chương trình hoặc chức năng.

Đầu ra có thể chứa khoảng trắng theo sau và một dòng mới hàng đầu.

Mã ngắn nhất trong byte thắng.


Câu trả lời:


4

Thạch , 28 22 byte

-6 byte nhờ sự giúp đỡ của @Dennis! (nâng cấp trước, sau đó nối)

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

TryItOnline
Hoặc thực hiện bốn dao động với một quả trứng Phục sinh thưởng !!

Làm sao?

”-ẋ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 byte

EDIT - Đã sửa cho các giá trị âm. Hiện đang hỗ trợ N >= -8,000,000,000, sẽ cung cấp thời gian hoạt động khá tốt trong chế độ 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));
}

Phiên bản hoạt hình


Bạn có thể lưu 1 byte n>=7thay vìn/7&1
Hedi

@Hedi - Điều đó sẽ làm việc nếu n[0 ... 13], nhưng không phải.
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)])

"- + ##" được lập chỉ mục bởi bitmask, trong đó bit 1 biểu thị ánh sáng hoạt động và bit 0 biểu thị ánh sáng mờ. Hoạt động / độ mờ hiện được tính bằng cách cộng và trừ vị trí hiện tại khỏi vị trí mong muốn và xem liệu kết quả có chia hết cho 14 không.


4

Python, 53 byte

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

Tạo chuỗi -----++#------, lấy một cửa sổ có độ dài 8 tùy thuộc vào modulo đầu vào 7, đảo ngược cho modulo đầu vào 14 nằm giữa 1 và 7.


3

> <> , 51 + 3 = 54 byte

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

Đầu vào được dự kiến ​​trên ngăn xếp khi bắt đầu chương trình, vì vậy +3 byte cho -v cờ.

Hãy thử trực tuyến!


3

MATL, 34 30 27 byte

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

7 byte được lưu nhờ @Luis

Hãy thử trực tuyến!

Một ví dụ khác với 25 bước đầu tiên

Giải trình

'++#-'      % 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 Cảm ơn!
Suever

2

Bình thường, 33 28 byte

Đã lưu 5 byte bằng cách tính toán tất cả các đèn theo cùng một cách.

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

Bắt đầu với tất cả các đèn tắt và bật chúng cùng một lúc.

Dùng thử trực tuyến!


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

Kiểm tra

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)

Ít chơi gôn

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

Kiểm tra

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 byte

Bao gồm +1 cho -n

Chạy với số trên 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//

Không cạnh tranh lắm nhưng xứng đáng một bài cho phương pháp lạ


1

Perl, 56 55 byte

Bao gồm +3 cho -p

Chạy với số trên 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;-+#

Đặt tệp này trong một tệp không có dòng mới cuối cùng (thêm phần cuối ;vào chương trình nếu bạn không muốn làm phiền với điều đó). Thật không may, sử dụng một nghĩa đen ^Fkhông hoạt động

Chương trình này chứa 2 ký tự nhận xét (bỏ qua #!dòng). Một trong số đó thực sự là một bình luận và thực sự đạt được một byte ....

Thực hiện thuật toán phát sáng thực tế


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.