每天的ASCII艺术#4-黄道十二宫


12

我们都喜欢星座,不是吗?但是我在智能手机上安装的此星座应用程序中存在一个严重问题,即它仅显示每天星座运势的十二生肖图标。现在,我确实记得我的星座运势,但是很难记住我感兴趣的其他人的星座运势。

挑战

因此,这是您对“ ASCII每日艺术”系列的又一个补充的挑战。输入日期和月份后,以ASCII格式输出相应的星座,如下所示。每个十二生肖后面都有十二生肖的名称和日期范围(DD MM格式)。

Aries - 21 03 - 20 04
 .-.   .-.
(_  \ /  _)
     |
     |
Taurus - 21 04 - 20 05
 .     .
 '.___.'
 .'   '.
:       :
:       :
 '.___.'
Gemini - 21 05 - 20 06
._____.
  | |
  | |
 _|_|_
'     '
Cancer - 21 06 - 20 07
   .--.
  /   _'.
 (_) ( )
'.    /
  '--'
Leo - 21 07 - 20 08
  .--.
 (    )
(_)  /
    (_.
Virgo - 21 08 - 20 09
 _
' ':--.--.
   |  |  |_
   |  |  | )
   |  |  |/
        (J
Libra - 21 09 - 20 10
     __
___.'  '.___
____________
Scorpio - 21 10 - 20 11
 _
' ':--.--.
   |  |  |
   |  |  |
   |  |  |  ...
         '---':
Sagittarius - 21 11 - 20 12
      ...
      .':
    .'
'..'
.''.
Capricorn - 21 12 - 20 01
        _
\      /_)
 \    /'.
  \  /   :
   \/ __.'
Aquarius - 21 01 - 20 02
.-"-._.-"-._.-
.-"-._.-"-._.-
Pisces - 21 02 - 20 03
'-.    .-'
   :  :
 --:--:--
   :  :
.-'    '-.

输入值

  • 系统会为您提供两个整数,分别对应于生日的月份和年份的日期(按此顺序)。
  • 日期和月份将1像普通日历一样被索引。
  • 您可以采用STDIN / ARGV / function参数或最接近的等效形式的输入形式

输出量

  • 根据输入日期所属的日期范围,将相应的十二生肖输出到STDOUT。
  • 每行中最多可以有4个尾随空格,但没有不属于输出一部分的前导空格。
  • 您可以编写完整程序或命名函数。

这是因此以字节为单位的最短代码胜出!


排行榜

该系列的第一篇文章将产生一个排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头每个答案:

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,可以将旧分数保留在标题中,方法是将它们打掉。例如:

# Ruby, <s>104</s> <s>101</s> 96 bytes


我知道@@ NinjaBearMonkey,但是其中一个更详细和着重于日期解析
Optimizer

我知道,我绝对不会认为它是重复的,但我只是想提一提。
NinjaBearMonkey

金牛座和双鱼座最后一行的尾随空格是故意的吗?
Siguza 2015年

@Siguza,您最多可以有4个尾随空格。所以没关系:)
Optimizer

Answers:


7

CJam,296个 284 272 265 264字节

"03½åÙªWË#å¥ÜZ2ò'ýðDc}¦Ð£RÞ5ä<Üå§ÖÞYÏuäOe¤¶è2²|ZëßB«ô¬cm"257b2bSf*Qa/"®=&ðS¢Òpût£Ð`ç«^º,[öÄ©3¸YÝæ[%$>\D£(´õÓÆeUØRHáÄ¡ããîùK½ÊÆÇ:UBÍm¥·fèäBÓEwWOkQq×tÌVfè£g8·¨    q©ñäp-ÁgUÚ´Éõ'>r    Ê#"256bDb"
.\"'()-/:\_|J"f=.+sSN+/l~\K>+=

CJam解释器中在线尝试。

理念

我们首先使用字符串<SP><LF>作为分隔符来连接所有十二个符号。我们选择十二生肖不包含尾随空格,因此可以轻松分隔它们。

连接的字符串长542个字节。这些字节中的236个是空格,几乎是它们的一半。我们构建一个数组,其中每个空间包含一个1,每个非空间包含一个0。这样,对空间进行编码将仅花费1位。

从连接的字符串中删除所有空格,剩下的是字符<LF>."'()-/:J\_|。给它们每个分配一个介于0和12之间的值(例如,此字符串中的索引)

最后,我们将上述以2为基数和以13为基数的数组解码为字节数组。

在最终程序中,对于给定的输入DD MM,我们计算(int(MM) + (int(DD) > 20)) % 12,反转上述过程,以获得所有生肖的数组并选择适当的生肖。

"03½åÙªWË#å¥ÜZ2ò'ýðDc}¦Ð£RÞ5ä<Üå§ÖÞYÏuäOe¤¶è2²|ZëßB«ô¬cm"

        e# Push the encoded space positions.

257b2b  e# Convert from base 257 to base 2.
Sf*     e# Replace 1's with spaces and 0's with empty strings.
Qa/     e# Split at empty strings.

"®=&ðS¢Òpût£Ð`ç«^º,[öÄ©3¸YÝæ[%$>\D£(´õÓÆeUØRHáÄ¡ããîùK½ÊÆÇ:UBÍm¥·fèäBÓEwWOkQq×tÌVfè£g8·¨ q©ñäp-ÁgUÚ´Éõ'>r    Ê#"

        e# Push the encoded non-space characters.

256bDb  e# Convert from base 256 to base 13.

"
.\"'()-/:\_|J"f=

        e# Replace each digit in base 13 by the corresponding character.

.+s     e# Interleave both arrays to create a string.
SN+/    e# Split at trailing spaces.
l~      e# Evaluate the input from STDIN.
\K>+    e# Add 1 to the month if the day is larger than 20.
=       e# Retrieve the corresponding element from the array.

УRÞ?DERP。。。
2015年

我见过的最长的高尔夫郎解决方案。
帕维尔

3

CJam,324字节

"%[hÿìs5!zaÆT=ªñ=Û]ÌUMàûÓ»¦f¼³ëµ1þÈUÑyéC4¬u1T9KÍü!+Úøöà&J~âZ®uRtkRÿ+*ÐFeÜPý¤SÙËU7óÎ?LXÝ2D@0¶ÆÀ¡kÚça­çªñܧ#iµ3L®ó&Ë'iºyè½?JS÷SjS`ösÓò»zjRoaÃIYrµ&M>ÍKaaúcg®Ð\p¨²:LqÜݶo¯ÆkµúÒ4Ezú©æ¼xP»¸¯gd^ßg±>ï ÃºDÎŧ@3Bßt\<GÒcû)ËûwíUÑdØoiTv>¤&ý°mÊ13ÛUÿØjª¬Ì±(¦¿çÍX4tõãÜÑ*ÃmÜ9ãSÁ3IþÜìÙ,"{_'~>33*32+-}%191bEb428Et"
 \"'()-./:\_a|J"f='a/q~\K>+=

我的第一次尝试。在线尝试


2

Python 2中,961 698 692 687字节

绝对仍然要继续打高尔夫球,只是想把想法放下来。现在使用字典。

a,b=raw_input().split()
b=int(b)
c='.-"-._.-"-._.-'
print{0:c+'\n'+c,1:"'-.    .-'\n   :  :\n --:--:--\n   :  :\n.-'    '-.",2:" .-.   .-.\n(_  \ /  _)\n     |\n     |",3:" .     .\n '.___.'\n .'   '.\n:       :\n:       :\n '.___.'",4:"._____.\n  | |\n  | |\n _|_|_\n'     '",5:"   .--.\n  /   _'.\n (_) ( )\n'.    /\n  '--'",6:"  .--.\n (    )\n(_)  /\n    (_.",7:" _\n' ':--.--.\n   |  |  |_\n   |  |  | )\n   |  |  |/\n        (J",8:"     __\n___.'  '.___\n"+'_'*12,9:" _\n' ':--.--.\n   |  |  |\n   |  |  |\n   |  |  |  ...\n         '---':",10:"      ...\n      .':\n    .'\n'..'\n.''.",11:"        _\n\      /_)\n \    /'.\n  \  /   :\n   \/ __.'"}[[[b-2,11][b<2],b-1][int(a)>20]]

旧方法,使用交织。

d,m=raw_input().split()
m=int(m)
print'.\'  .       --.._  _ _  ".- _ .\n \n  - . _.-\' \'  .   _--     _   _-.\'_\'  .   ..\n:_:. -...\n\n -\n-. "--\n  (-_-._-\'.    ._.\n\n.\n\n\'|/ -_- \\_ (.   -.-  . __|  .\'.  -  _\n )\n \n  \n: _ _\n     . \\. \'( \'   -  \'|._ . . ":/\n \n)|_|\'/-\n  |   _ :_.  .\n(  _ \n)_-_\' _/|\n| \n.-) _)\n _   -:\n |   _  \\"-  _( |_|  -- \'|  __\n. .: ._) \n_ \' _- \n\n\n( _ \n .- :\'\'_ _ \'/-\n|  .. _|.\'  \n    |_ ..        _ \'\n        _|\n  :     |_ .     \'/    \'\\     \n   |\'  :|:   | \n.  \n \n       / . : \' )     -   - \n     \'   -   |       \'     :           \n       | |               \'           - :   | | \\ . \n       /               \'   | . _   .   / . _   _   \n . .   _     \n \'   _           .           \'                                                               (           J             \'           -           -           -           \'           :  '[[m-2,m-1][int(d)>21]::12].rstrip()

2

Python 2中,565个 568 553字节

def z(d,m):b="\n "+"  |"*3;c=" _\n' ':--.--.";a="  ...\n      ";print["\      /_)\n \    /'.\n  \  /   :\n   \/ __.'",'.-"-._.-"-._.-\n'*2,"'-.    .-'\n   :  :\n --:--:--\n   :  :\n.-'    '-.",' .-.   .-.\n(_  \ /  _)'+'\n     |'*2," .     .\n '.___.'\n .'   '.\n:       :\n:       :\n '.___.'","._____.\n  | |\n  | |\n _|_|_\n'     '","   .--.\n  /   _'.\n (_) ( )\n'.    /\n  '--'",'  .--.\n (    )\n(_)  /\n    (_.',c+b+"_"+b+" )"+b+"/\n        (J","     __\n___.'  '.___\n"+"_"*12,c+b*3+a+"   '---':","    "+a+".':\n    .'\n'..'\n.''."][m%12-(d<21)]

所以我有点懒,所以决定不打高尔夫。相反,我决定让python自己打高尔夫球。

上面的解决方案是使用以下代码创建的:

full_string = """
\      /_)
 \    /'.
  \  /   :
   \/ __.'
*
.-"-._.-"-._.-
.-"-._.-"-._.-
*
...               # The others in this list as well
*
      ...
      .':
    .'
'..'
.''.
"""

# Golf the input string
string_list = full_string.split('*')
# Remove begin and end \n
string_list = [s[1:-1] for s in string_list]
# Remove unnescessary repr characters
golf = repr(string_list).replace(r'\\ ', r'\ ').replace(r'\\/', r'\/').replace(', ', ',')
# Special case for the Aquarius as it's a full duplicate
middle = golf.find('\\n', 50)
end = golf.find(',', middle)
golf = golf[0:middle+2] + "'*2" + golf[end:]
# Special case for the 12 underscores
golf = golf.replace('____________"', '"+"_"*12')
# Replace the three bars and their whitespace
golf = golf.replace('\\n   |  |  |', '"+b+"')
# Replace the bar-cover
cover = '" _\\n\' \':--.--."'
golf = golf.replace(cover, 'c')
# Replaces aries' foot
golf = golf.replace("\\n     |\\n     |'", "'+'\\n     |'*2")
# Replace dots
golf = golf.replace('  ...\\n      ', '"+a+"')
# Remove empty strings and optimize b's
golf = golf.replace('""+', '').replace('b+b+b', 'b*3')

# Surround the lookup table with the function that that prints the correct zodiac sign for the day/month
golf = 'def z(d,m):a="  ...\\n      ";b="\\n "+"  |"*3;c=" _\\n\' \':--.--.";print' + golf + '[m%12-(d<21)]'

这根本不会产生正确的输出。所有这些都需要移动,如果超过20,12,则列表索引将超出范围。z(21,1)应该会产生水瓶座,但会产生Picses等。–
Kade

@ Vioz-哇,我太草率了。谢谢,它现在可以正常工作了。
马蒂(Matty)2015年

1

Perl,414岁

在这里没有太多要做,只是应用了字典压缩:

#!perl -p
/ /;$i=$'%12-($`<21);
$_="cc_
\\ct_s \\c/'ga\\thlh\\/ __ijkee
keej'-.ck'n q:q:qnk'c'-gA k.hkg(_a\\ /a_sm|
m|j .mg oi
 ih'g:chl:chl oij.d__grr _|_|_
'm'jhk-gth_'g (_) ( s'.c/
a'q'jak-g (cs(_)t
c(_.f_b )b/
cc(Jjm__
diao
ddddfbbpm'q-':jcpailci
'.i
i'g";
1while s![a-t]!(split z,"  z
a |a|a|zaaz___z\"-._.-z
A _
' ':--.--.bz.
za z.'z
Az.-z:
zc z
h:alz'.dza..gcz--za| |
z)
za/")[(ord$&)%97]!e;$_=(split A)[$i]

测试

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.