Нарисуй фазу Луны


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 все размещено в сетке 16x8 (потому что размеры символов). Вы можете заменить .любым символом и #любым другим непробельным символом.

Выход для новолуния должен быть:

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

Для вощения полумесяца:

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

За первый квартал:

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

Для вощения гиббуса:

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

И для полной луны:

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

Убывающий полумесяц - это просто растущий полумесяц с каждой перевернутой линией, как с убывающим гиббусом и растущим гиббусом, а также в первой и последней четверти.

правила

  • Стандартные лазейки применяются
  • При желании вы можете выводить растущие / убывающие значения в противоположном направлении, хотя это не должно иметь значения (графики, показанные в этом вопросе, относятся к северному полушарию).
  • Ваш вывод должен быть точно таким, как указано. Ваши новые строки могут быть любым разумным разделителем строк, и вы можете использовать завершающий перевод новой строки, если хотите.


«хотя это не должно иметь никакого значения» - спас мне байт (надеюсь, я понял это правильно) :)
Джонатан Аллан

1
Это должно быть искусство ASCII? MoonPhase["Icon"]в Mathematica 17 байтов ...
Не дерево

@JonathanAllan О, хорошо. Ну, тогда это может иметь значение: P
HyperNeutrino

@ lanlock4 Вы указали одну из причин, почему я сделал это ASCII art. Также да, это должно быть искусство 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"}

Он просматривает строки и столбцы, используя монаду списка ( doблок для строк и понимание списка для столбцов), и определяет, какой символ для каждой ячейки использует выражение input ( i), значение смещения для row ( 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 байта благодаря подземному монорельсу!

Выиграл много байтов благодаря ovi и Mego, потому что я дурак, который забывает не использовать 4 пробела для codegolf :)


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


1

Mathematica, 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.