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.


"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

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


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.


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 :)


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.