KITT汽车ASCII艺术


20

80年代的电视连续剧《骑士骑士》采用了一种名为KITT的智能自我意识汽车。车上的一个独特的方面是安装在前部,允许KITT“看见”(这看上去扫描条形迹可疑熟悉的另一扇,早期的电视连续剧)。

如图所示,扫描仪有八盏灯:

在此处输入图片说明

灯光“移动”,如该动画图像所示。

正如您现在所猜到的,您的任务是使用ASCII艺术作品中的移动灯重新创建扫描仪栏。

挑战

给定一个整数t,输出该时刻扫描器栏的状态,定义如下:

  • 扫描仪由八个灯组成。
  • 在任何时刻,其中一个灯都处于活动状态,并显示为#。那名有时活性灯t-1t-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

附加规则

您可以编写程序或函数。

输出可以包含尾随空格和前导换行符。

以字节为单位的最短代码获胜。


Answers:


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

“-+ ##”由位掩码索引,其中位1表示活动光,位0表示暗光。现在,通过从所需位置加上当前位置并减去当前位置,然后查看任一结果是否可被14整除,来计算活动/变暗度。


4

Python,53个字节

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

创建字符串-----++#------,根据输入模数7取一个长度为8的窗口,反之为介于1和7之间的输入模数14。


3

> <>,51 + 3 = 54字节

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

程序启动时应在堆栈上输入,因此该-v标志为+3个字节。

在线尝试!


3

MATL,34 30 27字节

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

@Luis节省了7个字节

在线尝试!

前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,2016年

2

Pyth,33 28字节

通过以相同方式计算所有灯光节省了5个字节。

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

从所有指示灯熄灭开始,然后一次打开一个。

在线试用!


2

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

少打高尔夫球

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个注释字符(忽略该#!行)。其中之一的确是评论,并实际上获得了一个字节。

实现实际的余辉算法


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.