画月相


20

挑战

给定月亮的相位,请使用ASCII艺术画图。

您的程序必须处理新月,给新月打蜡,第一季度,给凸出的月球打蜡,满月,下降的凸出的月牙,最后一个季度和消散的月牙。您的输入将是一个整数。

0 -> new moon
1 -> waxing crescent
2 -> first quarter
3 -> waxing gibbous
4 -> full moon
5 -> waning gibbous
6 -> last quarter
7 -> waning crescent

ASCII图片全部放在16x8网格上(因为字符尺寸比例)。您可以.用任何字符和#任何其他非空白字符替换。

新月的输出应为:

................
................
................
................
................
................
................
................

对于新月打蜡:

..........######
............####
.............###
.............###
.............###
.............###
............####
..........######

对于第一季度:

........########
........########
........########
........########
........########
........########
........########
........########

对于隆起的打蜡:

......##########
....############
...#############
...#############
...#############
...#############
....############
......##########

对于满月:

################
################
################
################
################
################
################
################

渐弱的新月形只是上蜡的新月形,每条线都颠倒了,如渐弱的隆起和上蜡隆起,以及第一个和最后一个季度。

规则

  • 适用标准漏洞
  • 如果需要,您可以选择向相反的方向输出打蜡/减弱,尽管这没有什么区别(此问题中显示的图形适用于北半球)
  • 您的输出必须与指定的完全相同。您的换行符可以是任何合理的行分隔符,并且如果您愿意,可以在尾随换行符。


“尽管没有什么区别”-为我节省了一个字节(我希望我没错):)
乔纳森·艾伦

1
它一定是ASCII艺术吗?MoonPhase["Icon"]在Mathematica中是17个字节…
不是一棵树

@JonathanAllan哦,太好了。那么,这可能会有所作为:P
HyperNeutrino

@ lanlock4您陈述了我将其制成ASCII艺术的原因之一。同样是的,它确实必须是ASCII艺术。
HyperNeutrino

Answers:


7

果冻 43 32 字节

-7个字节从位掩码移动到比较掩码
-2个字节,并进行了一些默认的编程改进
-1个字节移至南半球
-1个字节- 使用全新的ɓ链分隔符 ...它首次使用!

“>,##‘m0Dm€0ż@€4Ḷ¤Œṙɓ%4>C¹⁸:4¤?Y

采用字符0.1#

在线试用的测试套件中的所有案例

怎么样?

建立一个捕获前四个相位的遮罩,并且当相位div-4不为零时,而不是反转线来补充modulo-4相位结果的结果值。

我最初建一个位掩码,但屏蔽值分别为0812,和14- ,,0000 和-这些具有领先的-这样的比较掩码可以用来代替。100011001110phase

“>,##‘m0Dm€0ż@€4Ḷ¤Œṙɓ%4>C¹⁸:4¤?Y - Main link 1: number phase
“>,##‘                           - code-page index literal [62,44,35,35]
      m0                         - reflect -> [62,44,35,35,35,35,44,62]
        D                        - decimalise -> [[6,2],[4,4],[3,5],[3,5],[3,5],[3,5],[4,4],[6,2]]
         m€0                     - reflect €ach -> [[6,2,2,6],[4,4,4,4],[3,5,5,3],[3,5,5,3],[3,5,5,3],[3,5,5,3],[4,4,4,4],[6,2,2,6]]
                 ¤               - nilad and link(s) as a nilad:
               4                 -   literal 4
                Ḷ                -   lowered range -> [0,1,2,3]
            ż@€                  - zip (reverse @rguments) for €ach -> [[[0,6],[1,2],[2,2],[3,6]],[[0,4],[1,4],[2,4],[3,4]],[[0,3],[1,5],[2,5],[3,3]],[[0,3],[1,5],[2,5],[3,3]],[[0,3],[1,5],[2,5],[3,3]],[[0,3],[1,5],[2,5],[3,3]],[[0,4],[1,4],[2,4],[3,4]],[[0,6],[1,2],[2,2],[3,6]]]
                  Œṙ             - run-length decode -> [[0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3],[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3],[0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3]]
                                    -   i.e.: 0000001122333333  -
                                              0000111122223333  - Marking out the separate
                                              0001111122222333  - regions as filled up by
                                              0001111122222333  - the phases of the moon in
                                              0001111122222333  - the southern hemisphere.
                                              0001111122222333  -
                                              0000111122223333  -
                                              0000001122333333  -
                    ɓ            - dyadic chain separation & swap arguments, call that m
                     %4          - phase mod 4
                       >         - greater than? (vectorises across m) 1 if so 0 if not
                              ?  - if:
                             ¤   -   nilad followed by link(s) as a nilad:
                          ⁸      -     link's left argument, phase
                           :4    -     integer divide by 4
                        C        - then: complement
                         ¹       - else: identity (do nothing)
                               Y - join with newlines
                                 - implicit print

3
那不是语言,是调制解调器的噪音……
Alnitak

@Alnitak欢迎来到PPCG!您是否加入了这个PPCG.SE只是为了发表评论?;)
HyperNeutrino

8

JavaScript(ES6),121 ... 103 92字节

f=(n,i=128)=>i--?f(n,i)+(i%16?'':`
`)+'.#.'[i%16+4*n-~-'31000013'[n&1?i>>4:1]*~-(n&2)>>4]:''

演示版


w,我想在午饭时a一下。不过我怀疑我会打败你。
毛茸茸的

4

Haskell98 90字节

f i=do{a<-[3,1,0,0,0,0,1,3];[".#."!!div(i*4+x+[0,a-1,0,1-a]!!mod i 4)16|x<-[0..15]]++"\n"}

它使用list monad(do行的块和列的列表推导)循环遍历行和列,并使用input的表达式,i行的偏移值a和列索引确定每个单元格的字符(x)。

通过简化真正偏移量的子表达式,节省了8个字节。


3

Python 2中144个 142 127字节

i=input()
a,b='#.'[::i/4*2-1]
i%=4
for x in range(8):y=(int(abs(x-3.5))or 1)+2;y=[y,16-y][i>2];y=[i*4,y][i%2];print(16-y)*a+b*y

在线尝试!

绝对可以打更多的球,技巧表示赞赏:)

多亏了undergroundmonorail,打了1个字节!

得益于ovi和Mego,我摆脱了很多字节,因为我是一个傻瓜,他忘了不为codegolf使用4个空格:)


if i>2:y=16-y可以更改为y=[16-y,y][i>2],这会更长一些,但是如果广泛使用分号,则可以使循环成为单行代码以节省多个字节。
Mego


1

Mathematica,125个字节

s=Switch;Grid@If[1<#<6,#&,1-#&][s[m=#~Mod~4,0,0,2,1,_,1-{3.4,5}~DiskMatrix~{8,16}]s[m,1,h=Table[Boole[i>8],8,{i,16}],_,1-h]]&

分别使用10而不是.和返回网格#

它使用两个遮罩工作,一个遮罩一个圆形,一个半遮罩一个半遮罩,然后将它们逻辑组合起来以获得适当的形状。

两个面罩分别用1-{3.4,5}~DiskMatrix~{8,16}圆形的和Table[Boole[i>8],8,{i,16}]半个的制成。逻辑如下:

output = f(a AND b)

where f, a and b are:

n | f    a  b
--+-----------
0 | NOT  F  ◨ 
1 | NOT  ○  ◧ 
2 | 1    T  ◨
3 | 1    ○  ◨
4 | 1    F  ◨ 
5 | 1    ○  ◧ 
6 | NOT  T  ◨ 
7 | NOT  ○  ◨

通过使用for 和for 乘法,使用1s和0s 模拟逻辑ANDx -> 1-xNOT

奖励(非ASCII)解决方案,为28个字节: IconData["MoonPhase",#/4-1]&

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.