Намалюйте фазу Місяця


20

Виклик

З огляду на фазу Місяця, намалюйте її, використовуючи арт. ASCII.

Ваша програма повинна обробляти молодик, восковий півмісяць, першу чверть, воскову гібку, повний місяць, спадаючий хиб, останню чверть та зменшуючий півмісяць. Ваше введення буде цілим числом.

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 розміщується на сітці 16х8 (оскільки співвідношення розмірів символів). Ви можете замінити .будь-яким символом і #будь-яким іншим символом, який не є пробілом.

Вихід для молодика повинен бути:

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

Для воскового півмісяця:

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

За перший квартал:

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

Для депіляції воском:

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

А для повного місяця:

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

Знижуючий півмісяць - це лише восковий півмісяць із кожною лінією, яка перевернута, як і при зменшенні хибної та воскової хибної, і в першій, і в останній чверті.

Правила

  • Застосовуються стандартні лазівки
  • Якщо ви хочете, ви можете вивести воскові / зменшуються в протилежному напрямку, хоча це не має значення (графіки, показані в цьому питанні, стосуються північної півкулі)
  • Вихід повинен бути точно вказаний. Ваші нові рядки можуть бути будь-яким розумним роздільником рядків, і, можливо, у вас може бути зворотний новий рядок.


"хоч це не має значення" - врятував мене байт (сподіваюся, що я це зрозумів) :)
Джонатан Аллан

1
Чи повинно це бути мистецтво ASCII? MoonPhase["Icon"]це 17 байт у Mathematica…
Не дерево

@JonathanAllan О, приємно. Ну тоді це може змінити значення: P
HyperNeutrino

@ lanlock4 Ви вказали одну з причин, чому я зробив це мистецтвом ASCII. Також так, це має бути мистецтвом ASCII.
HyperNeutrino

Відповіді:


7

Желе ,  43 32 байт

-7 байт, що переходять від бітової маски до порівняльної маски
-2 байт з деякими поліпшеннями негласного програмування
-1 байт, переміщення до південної півкулі
-1 байт - використовуйте абсолютно новий ɓсепаратор ланцюга ... його перший в історії використання!

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

Використовує символи 0для .і 1для #.

Усі випадки в тестовому наборі на " Спробуйте в Інтернеті"!

Як?

Побудова маски, що фіксує перші чотири фази, і замість того, щоб реверсувати лінії, доповнює отримані значення результату фази модуля-4, коли фаза div-4 не дорівнює нулю.

Спочатку я побудував бітову маску, але значення маски були 0, 8, 12, і 14- 0000, 1000, 1100, і 1110- у них є phaseпровідні з них - так порівняння маска може використовуватися замість цього.

“>,##‘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
це не мова, це шум модему ...
Альнітак

@Alnitak Ласкаво просимо до PPCG! Ви приєдналися до цього PPCG.SE просто для того, щоб ви могли зробити цей коментар? ;)
HyperNeutrino

8

JavaScript (ES6), 121 ... 103 92 байт

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

Демо


Ах, я хотів дати це забити в обідній час. Сумніви, я б побив тебе.
Кудлатий

4

Haskell , 98 90 байт

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

Він проходить через рядки та стовпці, використовуючи список монади (a do блок для рядків та розуміння списку для стовпців) та визначає, який символ для кожної комірки, використовуючи вираз input ( i), значення зміщення для рядка ( a) та індексу стовпців ( x).

Збережено 8 байтів, спростивши підвираження для справжнього зміщення.


3

Python 2 , 144 142 127 байт

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

Спробуйте в Інтернеті!

Однозначно можна пограти в гольф далі, вдячні поради :)

Поле з байтом на 1 байт завдяки підземніймонорельсі!

Завзято багато байтів завдяки явам та Мего, тому що я дурень, який забуває не використовувати 4 місця для codegolf :)


if i>2:y=16-yможе бути змінено на y=[16-y,y][i>2], що довше, але при ліберальному використанні крапки з комою дозволить вашій петлі бути однолінійкою, щоб зберегти кілька байтів.
Мего


1

Математика, 125 байт

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

Повертає сітку, використовуючи 1і 0замість, .і #відповідно.

Це працює за допомогою двох масок, однієї круглої та однієї напівтіньової та логічно поєднуючи їх, щоб отримати відповідні форми.

Дві маски зроблені як 1-{3.4,5}~DiskMatrix~{8,16}для круглої, так і Table[Boole[i>8],8,{i,16}]для півтора. Логіка така:

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

Логіка моделюється за допомогою 1s і 0s, використовуючи множення для ANDі x -> 1-xдляNOT .

Бонусне (не для ASCII) рішення, на 28 байт: IconData["MoonPhase",#/4-1]&

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.