Narysuj fazę księżyca

20

Wyzwanie

Biorąc pod uwagę fazę księżyca, narysuj ją przy użyciu sztuki ASCII.

Twój program musi obsługiwać nowiu, woskowanie półksiężyca, pierwszy kwartał, woskowanie gibbous, pełnia księżyca, zanikający gibbous, ostatni kwartał i zanikający półksiężyc. Twój wkład będzie liczbą całkowitą.

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

Grafika ASCII jest umieszczana na siatce 16 x 8 (ponieważ proporcje wymiarów znaków). Możesz zastąpić .dowolną postacią i #dowolną inną spacją.

Dane wyjściowe dla nowiu powinny wynosić:

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

Do woskowania półksiężyca:

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

Za pierwszy kwartał:

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

Do woskowania garbnika:

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

I dla pełni księżyca:

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

Ubywający półksiężyc jest tylko woskującym półksiężycem z każdą odwróconą linią, podobnie jak ubywający garb i woskujący garb oraz pierwszy i ostatni kwadrans.

Zasady

  • Obowiązują standardowe luki
  • Możesz wybrać woskowanie / zanikanie w przeciwnym kierunku, jeśli chcesz, ale nie powinno to mieć znaczenia (grafika pokazana w tym pytaniu dotyczy półkuli północnej)
  • Twój wynik musi być dokładnie taki, jak określono. Twoje znaki nowej linii mogą być dowolnym rozsądnym separatorem linii, a jeśli chcesz, możesz mieć końcowy znak nowej linii.
HyperNeutrino
źródło
5
Odpowiedni xkcd.
Martin Ender
„choć to nie powinno mieć znaczenia” - uratował mi bajt (mam nadzieję, że udało mi się to dobrze) :)
Jonathan Allan
1
Czy to musi być sztuka ASCII? MoonPhase["Icon"]ma 17 bajtów w Mathematica…
To nie drzewo
@JonathanAllan Oh nice. To może mieć znaczenie: P
HyperNeutrino
@ lanlock4 Podałeś jeden z powodów, dla których zrobiłem z niego sztukę ASCII. Także tak, to musi być sztuka ASCII.
HyperNeutrino

Odpowiedzi:

7

Galaretka ,  43 32 bajty

-7 bajtów przechodzących z maski bitowej do maski porównawczej
-2 bajty z pewnymi ulepszeniami programowania ukrytego
-1 bajt przenoszony na półkulę południową
-1 bajt - użyj całkowicie nowego ɓseparatora łańcuchowego ... jego pierwsze użycie!

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

Używa znaków 0dla .i 1dla #.

Wszystkie przypadki w pakiecie testowym w Wypróbuj online!

W jaki sposób?

Tworzy maskę przechwytującą pierwsze cztery fazy i zamiast odwracania linii uzupełnia uzyskane wyniki wyniku fazy modulo-4, gdy faza div-4 jest niezerowa.

I pierwotnie zbudowany maskę bitową, ale wartości były maski 0, 8, 12, i 14- 0000, 1000, 1100oraz 1110- mają one phasete wiodące - więc porównanie maska może być stosowany zamiast.

“>,##‘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
źródło
3
to nie język, to szum modemu ...
Alnitak
@Alnitak Witamy w PPCG! Czy dołączyłeś do PPCG.SE tylko po to, żebyś mógł skomentować? ;)
HyperNeutrino
8

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

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

Próbny

Arnauld
źródło
Och, chciałem dać temu cios w porze lunchu. Wątpię, że bym cię pobiła.
Shaggy
4

Haskell , 98 90 bajtów

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

Pętle przechodzą przez wiersze i kolumny za pomocą monady listy ( doblok dla wierszy i rozumienie listy dla kolumn) i określa, który znak dla każdej komórki za pomocą wyrażenia input ( i), wartości przesunięcia dla row ( a) i indeksu kolumny ( x).

Zaoszczędzono 8 bajtów, upraszczając podwyrażenie dla prawdziwego przesunięcia.

faubi
źródło
3

Python 2 , 144 142 127 bajtów

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

Wypróbuj online!

Zdecydowanie można dalej grać w golfa, napiwki są mile widziane :)

Grał w golfa o 1 bajt dzięki podziemnej kolejce!

Grałem w golfa wiele bajtów dzięki Ovi i Mego, ponieważ jestem głupcem, który zapomina nie używać 4 spacji dla codegolfa :)

musicman523
źródło
if i>2:y=16-ymoże zostać zmieniony na y=[16-y,y][i>2], co jest dłuższe, ale przy swobodnym użyciu średników pozwoliłby, aby twoja pętla była jednowierszowa, aby zaoszczędzić kilka bajtów.
Mego
2

PHP, 105 bajtów

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])."
";

Wypróbuj online!

Jörg Hülsermann
źródło
1
dlaczego nie $a/4? Indeksowanie wykona cięcie. :)
Tytus
@Titus, nie wiem. Dziękuję
Jörg Hülsermann
1

Mathematica, 125 bajtów

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

Zwraca siatkę za pomocą 1i 0zamiast .i #odpowiednio.

Działa przy użyciu dwóch masek, jednej okrągłej jednej i jednej półcieniowanej, i logicznie łącząc je, aby uzyskać odpowiednie kształty.

Dwie maski wykonane są 1-{3.4,5}~DiskMatrix~{8,16}dla okrągłej i Table[Boole[i>8],8,{i,16}]dla połowy. Logika jest następująca:

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

Logika jest symulowana za pomocą 1si 0si za pomocą mnożenia dla ANDi x -> 1-xdlaNOT .

Rozwiązanie premiowe (inne niż ASCII) dla 28 bajtów: IconData["MoonPhase",#/4-1]&

Nie drzewo
źródło