รถคิตตี้ศิลปะ ASCII


20

Knight Riderซีรีย์ทีวีในยุค 80 โดดเด่นด้วยรถยนต์อัจฉริยะที่มีความใส่ใจในตัวเองเรียกว่า KITT ลักษณะที่โดดเด่นอย่างหนึ่งของรถคือแถบสแกนเนอร์ที่ติดตั้งด้านหน้าซึ่งอนุญาตให้ KITT "เห็น" (และนั่นดูคุ้นเคยกับแฟน ๆ ของทีวีซีรีส์ก่อนหน้านี้อย่างน่าสงสัย )

สแกนเนอร์มีแปดไฟตามที่เห็นในภาพนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ไฟ "ย้าย" ตามที่แสดงในภาพเคลื่อนไหวนี้

งานของคุณดังที่คุณได้คาดไว้ในตอนนี้มันจะสร้างแถบเครื่องสแกนขึ้นใหม่ด้วยไฟเคลื่อนที่ในรูปแบบ ASCII

ความท้าทาย

ให้เป็นจำนวนเต็มtเอาท์พุทสถานะของแถบสแกนเนอร์ในทันทีนั้นกำหนดดังนี้:

  • เครื่องสแกนประกอบด้วยไฟแปดดวง
  • ที่หนึ่งทันทีใด ๆ ของไฟคือการใช้งาน#และมีการแสดงให้เห็นว่า ไฟที่ทำงานตลอดเวลาt-1และt-2ตอนนี้หรี่แสงและแสดง+ดังนี้ เว้นแต่พวกเขาจะตรงกับที่ใช้งานอยู่ในปัจจุบัน ไฟที่เหลือปิดอยู่-และจะแสดงเป็น
  • แสงที่ใช้งานจะเลื่อนจากซ้ายไปขวาจากนั้นเลื่อนไปทางซ้าย

ผลลัพธ์ที่แน่นอนสำหรับแต่ละรายการtมีรายละเอียดด้านล่าง

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

สำหรับค่าลบของtรอบจะถูกขยายเพียง:

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

กฎเพิ่มเติม

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น

เอาต์พุตสามารถมีช่องว่างต่อท้ายและขึ้นบรรทัดใหม่

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


คำตอบ:


4

เยลลี่ , 28 22 ไบต์

-6 ไบต์ขอบคุณด้วยความช่วยเหลือของ @Dennis! (ขึ้นก่อนแล้วต่อกัน)

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

TryItOnline
หรือแสดงออสซิลเลชันสี่ครั้งด้วยไข่อีสเตอร์โบนัส!!

อย่างไร?

”-ẋ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 ไบต์

แก้ไข - แก้ไขค่าลบ ขณะนี้สนับสนุนN >= -8,000,000,000ซึ่งควรจะให้เวลาการทำงานที่นานขึ้นในโหมด 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));
}

เวอร์ชันภาพเคลื่อนไหว


คุณสามารถบันทึก 1 ไบต์ด้วยn>=7แทนที่จะเป็นn/7&1
Hedi

@Hedi - มันจะใช้งานได้ถ้าnอยู่ใน[0 ... 13]นั้น
Arnauld

4

JavaScript (ES6), 90 87 ไบต์

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

"- + ##" ถูกทำดัชนีโดย bitmask โดยที่บิต 1 หมายถึงแสงที่ใช้งานและบิต 0 หมายถึงแสงสลัว แอคทีฟ / ความมัวถูกคำนวณโดยการเพิ่มและลบตำแหน่งปัจจุบันออกจากตำแหน่งที่ต้องการและดูว่าผลลัพธ์ใดหารด้วย 14


4

Python ขนาด 53 ไบต์

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

สร้างสตริง-----++#------ใช้หน้าต่างความยาว -8 ขึ้นอยู่กับอินพุตโมดูโล 7 ป้อนกลับสำหรับอินพุตโมดูโล 14 ที่อยู่ระหว่าง 1 ถึง 7


3

> <> , 51 + 3 = 54 ไบต์

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

คาดว่าอินพุตจะอยู่ในสแต็กเมื่อเริ่มต้นโปรแกรมดังนั้นจึงมีค่า 3 ไบต์สำหรับ-vแฟล็ก

ลองออนไลน์!


3

MATL, 34 30 27 ไบต์

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

บันทึกได้ 7 ไบต์ด้วย @Luis

ลองออนไลน์!

อีกตัวอย่างหนึ่งที่มี 25 ขั้นตอนแรก

คำอธิบาย

'++#-'      % 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 ขอบคุณ!
Suever


2

จาวาสคริปต์, 204 ไบต์

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

ทดสอบ

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)

น้อย golfed

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

ทดสอบ

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 ไบต์

รวม +1 สำหรับ -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//

ไม่ค่อยมีการแข่งขัน แต่สมควรได้รับโพสต์สำหรับวิธีแปลก


1

Perl, 56 55 ไบต์

รวมถึง +3 สำหรับ -p

รันด้วยหมายเลขบน 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;-+#

ใส่สิ่งนี้ลงในไฟล์โดยไม่ต้องขึ้นบรรทัดใหม่ (เพิ่มส่วนสุดท้าย;ลงในโปรแกรมหากคุณไม่ต้องการรบกวนสิ่งนั้น) น่าเสียดายที่การใช้ตัวอักษร^Fไม่ได้ผล

โปรแกรมนี้มี 2 ตัวอักษรความคิดเห็น (ไม่สนใจ#!บรรทัด) หนึ่งในนั้นคือความคิดเห็นและได้รับจริงไบต์ ....

ใช้อัลกอริทึม afterglow ที่เกิดขึ้นจริง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.