Zeichne die Mondphase

20

Herausforderung

Zeichnen Sie die Mondphase mit ASCII-Kunst.

Ihr Programm muss sich mit Neumond, zunehmendem Halbmond, erstem Quartal, zunehmendem Gibbous, Vollmond, abnehmendem Gibbous, letztem Quartal und abnehmendem Halbmond befassen. Ihre Eingabe wird eine ganze Zahl sein.

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

Die ASCII-Grafik wird alle in einem 16 x 8-Raster platziert (da das Verhältnis der Zeichenmaße stimmt). Sie können durch ein .beliebiges Zeichen und #durch ein beliebiges anderes Zeichen ohne Leerzeichen ersetzen .

Die Ausgabe für Neumond sollte sein:

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

Zum Wachsen von Halbmond:

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

Für das erste Quartal:

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

Zum Wachsen von Gummibändern:

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

Und für Vollmond:

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

Der abnehmende Halbmond ist nur der abnehmende Halbmond, wobei jede Linie umgekehrt ist, ebenso wie der abnehmende und der abnehmende Halbmond sowie das erste und das letzte Viertel.

Regeln

  • Es gelten Standardlücken
  • Sie können das Wachsen / Abnehmen in die entgegengesetzte Richtung ausgeben, wenn Sie möchten, es sollte jedoch keinen Unterschied machen (die in dieser Frage gezeigten Grafiken gelten für die nördliche Hemisphäre).
  • Ihre Ausgabe muss genau wie angegeben sein. Ihre Zeilenumbrüche können ein beliebiges sinnvolles Zeilentrennzeichen sein, und wenn Sie möchten, haben Sie möglicherweise einen nachgestellten Zeilenumbruch.
HyperNeutrino
quelle
5
Relevante xkcd.
Martin Ender
"obwohl es keinen Unterschied machen sollte" - sparte mir ein Byte (ich hoffe, ich habe es richtig gemacht) :)
Jonathan Allan
1
Muss es ASCII-Kunst sein? MoonPhase["Icon"]ist 17 Bytes in Mathematica ...
Kein Baum
@ JonathanAllan Oh, schön. Na dann könnte es einen Unterschied machen: P
HyperNeutrino
@ lanlock4 Du hast einen der Gründe angegeben, warum ich es zu ASCII-Art gemacht habe. Auch ja, es muss ASCII-Kunst sein.
HyperNeutrino

Antworten:

7

Jelly ,  43 32 Bytes

-7 Bytes beim Übergang von der Bitmaske zur Vergleichsmaske
-2 Bytes mit einigen stillschweigenden Programmierverbesserungen
-1 Bytes beim Übergang zur südlichen Hemisphäre
-1 Bytes - verwenden Sie den brandneuen ɓKettentrenner ... es ist der erste Einsatz!

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

Verwendet die Zeichen 0für .und 1für #.

Alle Fälle in einer Testsuite bei Try it online!

Wie?

Erstellt eine Maske, die die ersten vier Phasen erfasst, und statt die Linien umzukehren, werden die resultierenden Werte des Modulo-4-Phasenergebnisses ergänzt, wenn die Phase div-4 ungleich Null ist.

Ich ursprünglich eine Bitmaske gebaut, aber die Maskenwerte waren 0, 8, 12, und 14- 0000, 1000, 1100und 1110- diese haben phaseführende Einsen - so eine Vergleichsmaske stattdessen verwendet werden könnte.

“>,##‘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
Jonathan Allan
quelle
3
Das ist keine Sprache, es ist Modemrauschen ...
Alnitak
@Alnitak Willkommen bei PPCG! Haben Sie sich dieser PPCG.SE angeschlossen, um diesen Kommentar abzugeben? ;)
HyperNeutrino
8

JavaScript (ES6), 121 ... 103 92 Bytes

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

Demo

Arnauld
quelle
Oh, ich wollte dies zur Mittagszeit versuchen. Zweifel, ich hätte dich geschlagen.
Shaggy
4

Haskell , 98-90 Bytes

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

Es durchläuft die Zeilen und Spalten mit der Listenmonade (ein doBlock für Zeilen und ein Listenverständnis für Spalten) und bestimmt anhand eines Ausdrucks für input ( i), eines Versatzwerts für row ( a) und eines Spaltenindex , welches Zeichen für jede Zelle verwendet wird ( x).

8 Byte durch Vereinfachung des Unterausdrucks für den wahren Versatz eingespart.

faubi
quelle
3

Python 2 , 144 142 127 Bytes

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

Probieren Sie es online!

Kann definitiv weiter golfen werden, Tipps sind erwünscht :)

Ab 1 Byte dank U-Bahn-Monorail!

Ich habe dank Ovi und Mego viele Bytes verloren, weil ich ein Idiot bin, der vergisst, keine 4 Leerzeichen für Codegolf zu verwenden :)

musicman523
quelle
if i>2:y=16-ykönnte in geändert werden y=[16-y,y][i>2], was länger ist, aber mit der großzügigen Verwendung von Semikolons könnte Ihre Schleife ein Einzeiler sein, um mehrere Bytes zu sparen.
Mego
2

PHP, 105 Bytes

for(;$i++<8;)echo($p=str_pad)($p("",[16,16-$b=_64333346[$i],8,$b][3&$a=$argn],_M[$a/4]),16,M_[$a/4])."
";

Probieren Sie es online!

Jörg Hülsermann
quelle
1
warum nicht $a/4? Die Indexierung erledigt das Schneiden. :)
Titus
@Titus ich habe es nicht gewusst. Vielen Dank
Jörg Hülsermann
1

Mathematica, 125 Bytes

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

Gibt ein Raster mit 1und 0anstelle von .und #zurück.

Es werden zwei Masken verwendet, eine kreisförmige und eine halbschattierte, und diese werden logisch kombiniert, um die entsprechenden Formen zu erhalten.

Die beiden Masken sind mit 1-{3.4,5}~DiskMatrix~{8,16}für die runde und Table[Boole[i>8],8,{i,16}]für die halbe gemacht. Die Logik ist wie folgt:

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  ○  ◨

Die Logik wird mit 1s und 0s durch Multiplikation für ANDund x -> 1-xfür simuliert NOT.

Eine Bonuslösung (Nicht-ASCII) für 28 Bytes: IconData["MoonPhase",#/4-1]&

Kein Baum
quelle