Ay Evresini Çiz


20

Meydan okuma

Ayın evresi göz önüne alındığında, ASCII sanatı kullanarak çizin.

Programınız yeni ay, ağda hilal, ilk çeyrek, ağda gibibus, dolunay, karamsar, son çeyrek ve azalan hilal işlemelidir. Girişiniz bir tamsayı olacaktır.

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 sanatının tamamı 16x8 ızgaraya yerleştirilir (çünkü karakter boyut oranları). Sen yerini alabilecek .herhangi bir karakter ve #diğer herhangi bir boşluk olmayan karakteri ile.

Yeni ayın çıktısı şöyle olmalıdır:

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

Ağda hilal için:

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

İlk çeyrek için:

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

Ağdalı ağda için:

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

Ve dolunay için:

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

Azalan hilal, azalan gibbous ve ağda gibbous ve ilk ve son çeyrekte olduğu gibi, her bir hat ters çevrilmiş olan ağda hilalidir.

kurallar

  • Standart Loopholes Uygula
  • Herhangi bir fark yaratmamasına rağmen, ağda / balmumu istediğiniz yönde çıktı vermeyi seçebilirsiniz (bu soruda gösterilen grafikler kuzey yarımküre içindir)
  • Çıktınız tam olarak belirtildiği gibi olmalıdır. Yeni satırlarınız makul bir satır ayırıcı olabilir ve isterseniz sondaki bir satırsonunuz olabilir.


"hiçbir fark olmamasına rağmen" - beni bir bayt kurtardı (Umarım doğru anladım) :)
Jonathan Allan

1
ASCII sanatı mı olmalı? MoonPhase["Icon"]Mathematica'da 17 bayttır ...
ağaç değil

@JonathanAllan Oh güzel. O zaman bir fark yaratabilir: P
HyperNeutrino

@ lanlock4 Bunu ASCII sanatı yapmamın nedenlerinden birini söylediniz. Ayrıca evet, ASCII sanatı olmak zorunda.
HyperNeutrino

Yanıtlar:


7

Jöle ,  43 32 bayt

Biraz maskeleme
programlama geliştirmeleriyle bit maskesinden karşılaştırma maskesine -2 bayt -7 bayt-
güney yarımküreye
-1 bayt hareket ediyor - yepyeni ɓzincir ayırıcıyı kullanın ... ilk kullanımı!

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

Karakterleri kullanır 0için .ve 1için #.

Bir test paketindeki tüm vakalar Çevrimiçi deneyin!

Nasıl?

İlk dört fazı yakalayan bir maske oluşturur ve div-4 fazı sıfır olmadığında hatları tersine çevirmek yerine modulo-4 faz sonucunun sonuç değerlerini tamamlar.

Başlangıçta biraz maskesi inşa edilmiş, ancak maske değerleri 0, 8, 12, ve 14- 0000, 1000, 1100, ve 1110- bunlar var phaselider olanları - Bir karşılaştırma maskesi yerine kullanılabilir böylece.

“>,##‘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
bu bir dil değil, modem gürültüsü ...
Alnitak

@Alnitak PPCG'ye Hoş Geldiniz! Bu yorumu yapabilmek için bu PPCG.SE'ye katıldınız mı? ;)
HiperNeutrino

8

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

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

gösteri


Ah, öğle vakti bunu bıçaklamak istedim. Şüphe olsa seni döverdim.
Shaggy

4

Haskell , 98 90 bayt

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

Liste monadını kullanarak satırlar ve sütunlar arasında dolaşır (a do satırlar için blok için bir liste anlama) ve input ( i) ifadesini , row ( a) ve sütun dizinini ifade eden her bir hücre için hangi karakteri belirler? ( x).

Gerçek ofset için alt ifadeyi basitleştirerek 8 bayt kaydedildi.


3

Python 2 , 144 142 127 bayt

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

Çevrimiçi deneyin!

Kesinlikle daha fazla golf olabilir, ipuçları takdir :)

Yeraltı monoray sayesinde 1 bayt kapalı golf!

Ovi ve Mego sayesinde birçok bayttan kurtuldum çünkü codegolf için 4 boşluk kullanmamayı unutan bir aptalım :)


if i>2:y=16-ydaha y=[16-y,y][i>2]uzun olabilir, ancak noktalı virgüllerin liberal kullanımı ile döngünüzün birkaç bayt tasarruf etmek için bir astar olmasına izin verir.
Mego


1

Mathematica, 125 bayt

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

Sırasıyla 1ve 0yerine .ve kullanarak bir ızgara döndürür #.

Biri bir dairesel ve bir yarısı gölgeli iki maske kullanarak çalışır ve uygun şekilleri elde etmek için bunları mantıklı bir şekilde birleştirir.

İki maske 1-{3.4,5}~DiskMatrix~{8,16}, dairesel Table[Boole[i>8],8,{i,16}]olan ve yarım olan için yapılır . Mantık aşağıdaki gibidir:

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

Mantık, ve için çarpma kullanılarak 1s ve 0s ile simüle edilir .ANDx -> 1-xNOT .

28 bayt için bonus (ASCII olmayan) bir çözüm: IconData["MoonPhase",#/4-1]&

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.