ムーンフェイズを描く


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四半期の場合:

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

ギブスワックス用:

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

満月の場合:

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

衰退した三日月は、衰退したギブスとワックスがけのギブス、および最初と最後のクォーターと同様に、各行が反転したちょうどワックスがかかった三日月です。

ルール

  • 標準的な抜け穴が適用されます
  • 必要に応じて、反対方向にワックス/ワーニングを出力することもできますが、違いはないはずです(この質問に示されているグラフィックは、北半球のものです)
  • 出力は指定されたとおりでなければなりません。改行は適切な行区切り文字にすることができ、必要に応じて末尾の改行を使用できます。


「違いはないはずだ」-私は1バイト節約した(私はそれが正しかったことを願っている):)
ジョナサンアラン

1
ASCIIアートである必要がありますか?MoonPhase["Icon"]Mathematicaでは17バイトです…
ツリーではありません

@JonathanAllanいいね。それでは違いが生じるかもしれません:P
HyperNeutrino

@ lanlock4あなたは、私がASCIIアートにした理由の1つを述べました。また、はい、ASCIIアートである必要があります。
ハイパーニュートリノ

回答:


7

ゼリー 43 32 バイト

ビットマスクから比較マスクに移動する-7バイト-
暗黙のプログラミングの改善を伴う2 バイト-
南半球に移動する
-1バイト-1バイト- まったく新しいɓチェーンセパレーターを使用します。

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

およびの文字0を使用します。.1#

Try it onlineのテストスイートのすべてのケース

どうやって?

最初の4つのフェーズをキャプチャするマスクを作成します。フェーズdiv-4がゼロ以外の場合、行を逆にするのではなく、モジュロ4フェーズの結果の値を補完します。

私はもともとビットマスクを建てたが、マスク値であった0812、と14- 、000010001100および1110-これらが持っているphase主要なものを-比較マスクの代わりに使用することができるよう。

“>,##‘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 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]:''

デモ


ああ、私はこれを昼食時に刺したかった。しかし、私はあなたをbeatったと思います。
シャギー

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

リストモナド(do行のブロックと列のリスト内包表記)を使用して行と列をループし、入力の式(i)、行のオフセット値(a)、列インデックスを使用して各セルの文字を決定します(x)。

真のオフセットの部分式を単純化することにより、8バイトを節約しました。


3

パイソン2144の 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

オンラインでお試しください!

間違いなくさらにゴルフすることができます、ヒントは大歓迎です:)

地下モノレールのおかげで1バイトのゴルフができました!

私はcodegolfに4つのスペースを使用しないことを忘れている愚か者だから、oviとMegoのおかげで多くのバイトをオフにゴルフしました:)


if i>2:y=16-yy=[16-y,y][i>2]より長いに変更することもできますが、セミコロンを自由に使用すると、ループをワンライナーにして数バイトを節約できます。
メゴ


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

1andの0代わりに.andを#それぞれ使用してグリッドを返します。

1つの円形マスクと1つのハーフシェーディングマスクの2つのマスクを使用し、それらを論理的に組み合わせて適切な形状を取得します。

2つのマスクは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ます。

28バイトのボーナス(非ASCII)ソリューション: IconData["MoonPhase",#/4-1]&

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.