通过针孔照相机的日食


28

此挑战是受2017年8月21 日日食启发的简单ASCII艺术挑战。给定input 0 <= n <= 4,输出下面描述的日食的相应阶段:

n=0:
   *****
 **     **
*         *
*         *
**       **
  *******

n=1:
   *****
 **  *****
*   *******
*   *******
**   ******
  *******

n=2:
   *****
 *********
***********
***********
***********
  *******

n=3:
   *****
 *****  **
*******   *
*******   *
******   **
  *******

n=4:
   *****
 **     **
*         *
*         *
**       **
  *******

规则

  • 您可以0或1索引,说明选择的内容。
  • 使用的字符是空格*,您可以使用任何可打印的字符*(空格除外)。
  • 尾随空格是可选的(您可能有也可能没有)。
  • 这是,最低字节数是获胜者。

3
@ Mr.Xcoder我反对标签挑战,即以kolmogorov-complexity作为输入,尽管这取决于OP的判断。
暴民埃里克(Erik the Outgolfer)'17年

15
认为这不是上下对称。
AdmBorkBork

此外,日食已经开始...
暴民埃里克(Erik the Outgolfer)'17

@AdmBorkBork是的,我本可以节省一些字节...
Egg the Outgolfer '17

7
“您可以使用任何字符作为*... ...,包括空格?;)
哈根·冯·埃岑

Answers:


13

Python 2中161个 149 142 135字节

lambda n,u=u' *':u'''   *****
 ****
**
**
****
  *******'''.translate({1:u[0<n<3],2:u[0<n<4],3:u[1<n<4]})

在线尝试!

-7感谢Xcoder先生


9
很好地滥用无法打印的内容。
扎卡里

在我复制粘贴到Emacs之前,我并没有完全理解此答案。辉煌!
Silvio Mayolo

@SilvioMayolo乌姆,您对Emacs做了什么?
暴民埃里克(Erik the Outgolfer)'17

我只是在看此页面上的答案,不知道它是如何工作的。emacs的显示所有的隐藏字符为^ A,^ B,^ C等
的Silvio Mayolo

@SilvioMayolo哦,那是因为不可打印的内容看起来有点像Unicode字符。
暴民埃里克(Erik the Outgolfer)'17年

9

木炭82 81 55 43字节

-38字节感谢尼尔!

Nν”{“⟲FEd⧴_³⟲”‖O¿﹪ν⁴«F﹪ν²G↗³↑²↖²↙³*↑¤*¿⁼ν¹‖

在线尝试!链接是详细版本。

我做到了。:P 我可能会超出40个字节。 26 38个字节...足够接近吗?


1
我对您的基本算法做了一些简化:在线尝试!
尼尔

2
我从逻辑上感到生气,而不是无法使用木炭。> _>谢谢!
完全人类

1
看起来打印外部“圆”最短。对于奇数输入的多边形,我也很有创造力:在线尝试!
尼尔

1)该死,我以为我很聪明PolygonHollow。:P 2)哦,很好。谢谢!
完全人类

5

肉桂胶,70字节

十六进制转储:

0000000: 6c33 5053 5050 d002 012e 20a5 0002 4026  l3PSPP.... ...@&
0000010: 9001 0568 6c20 07a6 0648 4080 b521 8a19  ...hl ...H@..!..
0000020: 30a6 1644 1093 0de3 a098 6184 6206 422d  0..D......a.b.B-
0000030: 6136 c20c 6374 3380 3cb8 5aa0 1436 36ba  a6..ct3.<.Z..66.
0000040: 5f4c 280f 0f00                           _L(...

在线尝试!

我一直在等待很长时间,以了解如何使用这种语言。:P

因此,肉桂糖是Bubblegum,但比Bubblegum更像是一种“真实”语言。

第一个字节(l)将模式设置为字典模式。其余字节是以下压缩的字符串。

0&   *****
 **     **
*         *
*         *
**       **
  *******;1&   *****
 **  *****
*   *******
*   *******
**   ******
  *******;2&   *****
 *********
***********
***********
***********
  *******;3&   *****
 *****  **
*******   *
*******   *
******   **
  *******;4&   *****
 **     **
*         *
*         *
**       **
  *******

这实际上是一个查找表,其中每个文本都分配了一个数字。然后,程序接受输入并输出相应的文本。


可以argument%4还是argument&3节省字节?
泰特斯

5

的JavaScript(ES6),103个 102字节

f=
n=>`   *****
 **66733**${s=`
*666777333*`}${s}
**6667333**
  *******`.replace(/\d/g,c=>" *"[c*2>>n&1])
<input type=number min=0 max=4 oninput=o.textContent=f(this.value)><pre id=o>

编辑:由于@darrylyeo,节省了1个字节。


1
通过存储*666777333*\n在一个变量中-2个字节。
darrylyeo

@darrylyeo我一定做错了,因为我似乎只能保存1个字节……
Neil

我的错,确实确实只节省了1个字节。
darrylyeo

4

SOGL V0.1240 39 个字节

"⁽Ρūa╔Ƨ ‘╥▓.4%?52"¹ο1¹‘╬¡╬5.H?:±}.2=?╬8

在这里尝试!


如果有帮助,则尾随空格是可选的(您可能有也可能没有)。-不了解SOGL,但可能会节省字节
Xcoder先生17年

@ Mr.Xcoder相反,因为SOGL在任何地方处理ASCII艺术时都会添加尾随空格:p
dzaima

4

VI,108字节

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>

<CR>Enter中风,<C-?>对应Control + ?,并<Esc>Escape明显。这些每个都计为1个字节(请参见meta)。解决方案中的换行符是为了提高可读性。仅<CR>代表真实Enter笔画。

输入值

输入文件应仅包含1个字符,代表n

发射

VI应该像这样开始:

vi -u NONE input

说明

解决方案包括3个部分。我将首先描述第二部分(第二行),因为它最容易解释。

画太阳

绘制太阳的命令是:

3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp

太阳必须与绘制*013,就像这样:

   *****
 **11033**
*111000333*
*111000333*
**1110333**
  *******

对称性将有助于减小此部分的字节大小,但这并不重要。我不会解释实线,但图案*****被用来容易地产生的最后一行,并且图案**1110333**被作为基准来生成包含3条其它线路013

重要的是要使用01并且3对于可以填充的太阳零件(请参阅以下说明)。绘制此太阳需要55个字节,并且可能会有一些技巧。

根据 n

要正确填充太阳,请遵循以下说明:

  • 如果n = 0,那么013(所有的数字)应该被替换
  • 如果n = 11则应替换为,其他数字替换为*
  • 如果n = 2,那么013(所有的数字)应该被替换*
  • 如果n = 33则应替换为,其他数字替换为*
  • 假如n = 4,然后013(所有数字)应改为(像n = 0

由此,我们可以推断出所需的替换是:

  • 第一次替换)替换一些数字
  • 将所有其他数字替换为*第二个替换

请注意,“某些数字”可能表示“无数字”(n = 2例如)。如果所有数字均已被第一个替换字符替代(n = 0例如),则“所有其他数字”也可以表示“无数字” 。

所述第二取代可以容易地写入11字节

:%s/\d/*/g<CR>

一次替换取决于n,因此首先我们必须计算要替换的数字。如果替换的字符存储在寄存器中a,则替换命令也将写入11个字节

:%s/<C-r>a/ /g<CR>

<C-r>aa键入命令时,将被寄存器的内容替换。

a按照前面的说明,要计算的值,算法为(伪代码):

n := read()
if (n % 2 != 0)
then
    a := n
else
    if(n % 4 != 0)
    then
        a := "X"
    else
        a := "\d"

"X"使用string的原因是,当时n = 2,没有数字用空格替换。只要不是第一个替代项,任何可以使用非阳光字符串都可以在这里使用。

这可以写成31个字节

D                                   # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
 :let@a=                            # define register "a content
        @"%2                        # if (n % 2 != 0)
            ?                       # then
             @"                     #   n
               :                    # else
                @"%4                #   if (n % 4 != 0)
                    ?               #   then
                     "X"            #       "X"
                        :           #   else
                         "\\d"      #       "\\d"
                              <CR>  # calculate "a

将所有这些部分按正确的顺序放置,您将获得解决方案:

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>                                              # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp     # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR>                                                              # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR>                                                                  # replace the remaining digits with stars

3

PHP,114 + 1字节

的+1个字节-R。感谢@Neil提供的转移提示。

for(;$c="   *****
 **66733**
*666777333*
*666777333*
**6667333**
  *******"[$i++];)echo+$c?" *"[$c*2>>$argn&1]:$c;

*0索引使用下划线。与管道一起运行-nR在线尝试

需要PHP 5.5或更高版本:
较旧的PHP无法理解文字字符串索引(解析错误);
PHP 7.1抱怨非数值(替换+$c$c>0而定)。


1
我认为," _"[$c*2>>$argn&1]如果需要,请避免使用负移位参数。
尼尔


2

Python 2,181字节

lambda n,s=' ',a='*':"""   *****
 **%s**
*%s*
*%s*
**%s**
  *******"""%[(s*5,s*9,s*9,s*7),(s*2+a*3,s*3+a*6,s*3+a*6,s*3+a*4),(a*5,a*9,a*9,a*7),(a*3+s*2,a*6+s*3,a*6+s*3,a*4+s*3)][n%4]

在线尝试!

非常幼稚的方法,在nvm上工作。


2

Java的8,225个 213 211字节

n->{String a=n<2|n>3?"   ":"***",b=n<1|n>2?"   ":"***",c=n%4<1?" ":"*",d=a+(n%4<1?"   ":"***")+b;return"   *****\n **"+(n<2|n>3?"  ":"**")+c+(n<1|n>2?"  ":"**")+"**\n*"+d+"*\n*"+d+"*\n**"+a+c+b+"**\n  *******";}

在这里尝试。


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.