Gambar Fase Bulan

20

Tantangan

Mengingat fase bulan, gambarkan menggunakan seni ASCII.

Program Anda harus menangani bulan baru, waxing sabit, kuartal pertama, waxing gibbous, bulan purnama, memudarnya gibbous, kuartal terakhir, dan memudarnya bulan sabit. Masukan Anda akan berupa bilangan bulat.

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

Seni ASCII semuanya ditempatkan pada kisi 16x8 (karena rasio dimensi karakter). Anda dapat mengganti .dengan karakter apa saja dan# dengan non-spasi putih lainnya.

Output untuk bulan baru harus:

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

Untuk waxing sabit:

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

Untuk kuartal pertama:

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

Untuk waxing siamang:

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

Dan untuk bulan purnama:

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

Bulan sabit memudar hanya bulan sabit waxing dengan setiap baris terbalik, seperti dengan siamang siam dan siamang siam, dan kuartal pertama dan terakhir.

Aturan

  • Celah Standar Berlaku
  • Anda dapat memilih untuk menghasilkan waxing / memudarnya ke arah yang berlawanan jika Anda mau, meskipun seharusnya tidak ada bedanya (grafik yang ditunjukkan dalam pertanyaan ini adalah untuk belahan bumi utara)
  • Output Anda harus persis seperti yang ditentukan. Baris baru Anda bisa berupa pemisah baris yang masuk akal, dan Anda mungkin memiliki baris tambahan tambahan jika Anda mau.
HyperNeutrino
sumber
5
Xkcd yang relevan.
Martin Ender
"meskipun seharusnya tidak ada bedanya" - menyelamatkan saya satu byte (saya harap saya sudah benar) :)
Jonathan Allan
1
Apakah itu harus seni ASCII? MoonPhase["Icon"]adalah 17 byte dalam Mathematica ...
Bukan pohon
@ Jonathan Allan Oh bagus. Kalau begitu itu mungkin membuat perbedaan: P
HyperNeutrino
@ lanlock4 Anda menyatakan salah satu alasan mengapa saya membuatnya menjadi ASCII art. Juga ya itu harus seni ASCII.
HyperNeutrino

Jawaban:

7

Jelly ,  43 32 byte

-7 byte bergerak dari bit-mask ke perbandingan-mask
-2 byte dengan beberapa perbaikan pemrograman diam-diam
-1 byte pindah ke belahan bumi selatan
-1 byte - gunakan ɓpemisah rantai yang semuanya baru ... digunakan pertama kali!

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

Menggunakan karakter 0untuk .dan 1untuk #.

Semua case dalam test suite di Coba online!

Bagaimana?

Buat masker yang menangkap empat fase pertama, dan alih-alih membalikkan garis melengkapi nilai yang dihasilkan dari hasil fase modulo-4 ketika fase div-4 bukan nol.

Saya awalnya dibangun masker sedikit, tetapi nilai-nilai topeng adalah 0, 8, 12, dan 14- 0000, 1000, 1100, dan 1110- ini memiliki phaseorang-orang terkemuka - sehingga perbandingan-mask dapat digunakan sebagai gantinya.

“>,##‘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
sumber
3
itu bukan bahasa, itu kebisingan modem ...
Alnitak
@Alnitak Selamat datang di PPCG! Apakah Anda bergabung dengan PPCG.SE ini agar Anda dapat berkomentar? ;)
HyperNeutrino
8

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

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
sumber
Ah, aku ingin mencoba ini saat makan siang. Keraguan saya akan mengalahkan Anda, meskipun.
Shaggy
4

Haskell , 98 90 byte

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

Ini loop melalui baris dan kolom menggunakan daftar monad ( doblok untuk baris dan pemahaman daftar untuk kolom) dan menentukan karakter mana untuk setiap sel menggunakan ekspresi input ( i), nilai offset untuk baris ( a), dan indeks kolom ( x).

Disimpan 8 byte dengan menyederhanakan subekspresi untuk offset yang sebenarnya.

faubi
sumber
3

Python 2 , 144 142 127 byte

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

Cobalah online!

Pasti bisa bermain golf lebih lanjut, tips sangat dihargai :)

Golf 1 byte berkat kereta bawah tanahmon!

Golf off banyak byte berkat ovi dan Mego karena saya bodoh yang lupa untuk tidak menggunakan 4 spasi untuk codegolf :)

musicman523
sumber
if i>2:y=16-ydapat diubah menjadi y=[16-y,y][i>2], yang lebih panjang, tetapi dengan penggunaan titik koma secara bebas akan memungkinkan loop Anda menjadi satu-liner untuk menyimpan beberapa byte.
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])."
";

Cobalah online!

Jörg Hülsermann
sumber
1
mengapa tidak $a/4? Pengindeksan akan melakukan pemotongan. :)
Titus
@Itus saya belum tahu itu. Terima Kasih
Jörg Hülsermann
1

Mathematica, 125 byte

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

Mengembalikan kisi menggunakan 1dan 0bukannya .dan #masing - masing.

Ia bekerja menggunakan dua topeng, satu melingkar satu dan satu setengah teduh, dan secara logis menggabungkan mereka untuk mendapatkan bentuk yang sesuai.

Kedua topeng dibuat dengan 1-{3.4,5}~DiskMatrix~{8,16}untuk yang melingkar, dan Table[Boole[i>8],8,{i,16}]untuk yang setengah. Logikanya adalah sebagai berikut:

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 disimulasikan dengan 1s dan 0s dengan menggunakan perkalian untuk ANDdan x -> 1-xuntukNOT .

Solusi bonus (non-ASCII), untuk 28 byte: IconData["MoonPhase",#/4-1]&

Bukan pohon
sumber