Солнечное затмение через камеру-обскуру


28

Эта задача представляет собой простую задачу ASCII-искусства, вдохновленную солнечным затмением, которое произошло 21 августа 2017 года. С учетом входных данных 0 <= n <= 4выведите соответствующую стадию затмения, описанную ниже:

n=0:
   *****
 **     **
*         *
*         *
**       **
  *******

n=1:
   *****
 **  *****
*   *******
*   *******
**   ******
  *******

n=2:
   *****
 *********
***********
***********
***********
  *******

n=3:
   *****
 *****  **
*******   *
*******   *
******   **
  *******

n=4:
   *****
 **     **
*         *
*         *
**       **
  *******

правила

  • Вы можете 0 или 1 индекс, указать, что вы выбрали.
  • Используемые символы являются пробелами, и *вы можете использовать любой печатный символ для *(кроме пробела).
  • Конечные пробелы не являются обязательными (вы можете иметь или не иметь их).
  • Это , самый низкий счетчик байтов является победителем.

3
@ Mr.Xcoder Я против того, чтобы помечать проблемы, получая входные данные в виде колмогоровской сложности , хотя это на усмотрение ОП.
Эрик Outgolfer

15
Облом, что это не симметрично сверху вниз.
AdmBorkBork

Кроме того, затмение уже началось ...
Эрик Outgolfer

@AdmBorkBork Да, я мог бы сэкономить несколько байтов ...
Эрик Outgolfer

7
«Вы можете использовать любой символ для *» ... включая пробел? ;)
Хаген фон

Ответы:


13

Python 2 , 161, 149, 142, 135 байтов.

lambda n,u=u' *':u'''   *****
 ****
**
**
****
  *******'''.translate({1:u[0<n<3],2:u[0<n<4],3:u[1<n<4]})

Попробуйте онлайн!

-7 спасибо мистеру Xcoder .


9
Хорошее злоупотребление непечатными.
Захари

Не полностью оценил этот ответ, пока я не скопировал его в Emacs. Brilliant!
Сильвио Майоло

@ SilvioMayolo Умм, что ты делал с Emacs?
Эрик Outgolfer

Я просто смотрел на ответ на этой странице и не понимал, как это работает. Emacs показывает все скрытые символы как ^ A, ^ B, ^ C и т. Д.
Сильвио Майоло,

@SilvioMayolo О, это потому, что непечатные шрифты имеют представление, похожее на символы Юникода.
Эрик Outgolfer

9

Древесный уголь , 82 81 55 43 байта

-38 байт благодаря Нейлу!

Nν”{“⟲FEd⧴_³⟲”‖O¿﹪ν⁴«F﹪ν²G↗³↑²↖²↙³*↑¤*¿⁼ν¹‖

Попробуйте онлайн! Ссылка на подробную версию.

Я сделал это, черт возьми. : P Я, вероятно, выйду из игры в гольф на 40 байтов. 26 38 байт ... Достаточно близко?


1
Я сделал несколько упрощений для вашего основного алгоритма: попробуйте онлайн!
Нил

2
Я стал играть в свою логику вместо неспособности использовать древесный уголь. > _> Спасибо!
полностью человек

1
Похоже, печать внешнего "круга" работает в кратчайшие сроки. Я также был креативен с полигоном для нечетных входов: попробуйте онлайн!
Нил

1) Черт возьми, я думал, что я был умным с PolygonHollow. : P 2) О, приятно. Благодарность!
полностью человек

5

Корица , 70 байт

HexDump:

0000000: 6c33 5053 5050 d002 012e 20a5 0002 4026  l3PSPP.... ...@&
0000010: 9001 0568 6c20 07a6 0648 4080 b521 8a19  ...hl ...H@..!..
0000020: 30a6 1644 1093 0de3 a098 6184 6206 422d  0..D......a.b.B-
0000030: 6136 c20c 6374 3380 3cb8 5aa0 1436 36ba  a6..ct3.<.Z..66.
0000040: 5f4c 280f 0f00                           _L(...

Попробуйте онлайн!

Я так долго ждал, чтобы узнать, как использовать этот язык. :П

Итак, Cinnamon Gum - это Bubblegum, но это более «настоящий» язык, чем Bubblegum.

Первый byte ( l) устанавливает режим в режим словаря. Остальная часть байтов является следующей сжатой строкой.

0&   *****
 **     **
*         *
*         *
**       **
  *******;1&   *****
 **  *****
*   *******
*   *******
**   ******
  *******;2&   *****
 *********
***********
***********
***********
  *******;3&   *****
 *****  **
*******   *
*******   *
******   **
  *******;4&   *****
 **     **
*         *
*         *
**       **
  *******

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


Можно argument%4или argument&3сохранить байты?
Тит

5

JavaScript (ES6), 103 102 байта

f=
n=>`   *****
 **66733**${s=`
*666777333*`}${s}
**6667333**
  *******`.replace(/\d/g,c=>" *"[c*2>>n&1])
<input type=number min=0 max=4 oninput=o.textContent=f(this.value)><pre id=o>

Редактировать: 1 байт сохранен благодаря @darrylyeo.


1
-2 байта путем сохранения *666777333*\nв переменной.
darrylyeo

@ darrylyeo Должно быть, я что-то делаю не так, потому что могу только сэкономить 1 байт ...
Нил

Мое плохое, это действительно экономит только 1 байт.
Даррильо

4

SOGL V0.12 , 40 39 байт

"⁽Ρūa╔Ƨ ‘╥▓.4%?52"¹ο1¹‘╬¡╬5.H?:±}.2=?╬8

Попробуй здесь!


Если это поможет, пробел через пробел не является обязательным (вы можете иметь или не иметь их). - Не знаю SOGL, но мог бы сэкономить байты
г-н Xcoder

@ Mr.Xcoder Это сделало бы обратное, поскольку SOGL добавляет пробелы при работе с ASCII-искусством где угодно: p
dzaima

4

VI, 108 байт

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>

<CR>является Enterинсульт, <C-?>соответствует Control + ?, и <Esc>к Escapeочевидно. Каждый из них считается за 1 байт (см. Мета ). Разрывы строк в решении предназначены для удобства чтения. Только <CR>представляет реальные Enterудары.

вход

Входной файл должен содержать только 1 символ, представляющий n.

запуск

VI должен быть запущен как:

vi -u NONE input

Пояснения

В решении 3 части. Сначала я опишу 2-ю часть (2-я строка), так как это проще всего объяснить.

Рисовать солнце

Команда рисовать солнце:

3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp

ВС должны быть нарисованы , *, 0, 1и 3, как это:

   *****
 **11033**
*111000333*
*111000333*
**1110333**
  *******

Симметрия помогла бы уменьшить размер в байтах этой части, но это не так важно. Я не буду объяснять всю линию, но шаблон *****используется легко генерировать последнюю строку, и образец **1110333**был взят в качестве эталона для создания 3 других строк , содержащих 0, 1и 3.

Важно , чтобы использовать 0, 1и 3для солнечных частей , которые могут быть заполнены (см следующих пояснений). Рисование этого солнца занимает 55 байт , и, возможно, с некоторыми хитростями можно играть в гольф.

Заполнение солнцем согласно n

Чтобы правильно заполнить солнце, следуйте инструкциям:

  • если n = 0, то 0, 1и 3(все цифры) должны быть заменены
  • если n = 1, то 1следует заменить на , другие цифры с*
  • если n = 2, то 0, 1и 3(все цифры) должны быть заменены*
  • если n = 3, то 3следует заменить на , другие цифры с*
  • если n = 4, то 0, 1и 3(все цифры) должны быть заменены (как n = 0)

Исходя из этого, мы можем сделать вывод, что необходимые замены:

  • заменить некоторые цифры на ( первая замена )
  • заменить все остальные цифры на *( вторая замена )

Обратите внимание, что «некоторые цифры» могут означать «без цифр» ( n = 2например). И «все остальные цифры» также могут представлять «без цифр», если все цифры уже были заменены первой заменой ( n = 0например).

Вторая замена может быть легко записана в 11 байт :

:%s/\d/*/g<CR>

Первая замена зависит n, поэтому сначала мы должны рассчитать , какие цифры будут заменены. Если замененные символы хранятся в регистре a, команда замещения записывается также в 11 байтах :

:%s/<C-r>a/ /g<CR>

<C-r>aзаменяется содержимым регистра aпри вводе команды.

Для вычисления значения a, следуя предыдущим инструкциям, алгоритм (в псевдокоде):

n := read()
if (n % 2 != 0)
then
    a := n
else
    if(n % 4 != 0)
    then
        a := "X"
    else
        a := "\d"

"X"Строка используется, потому что, когда n = 2, никакие цифры не заменяются пробелами. Любая строка, которая не является солнцем, могла бы использоваться здесь, пока первая замена ничего не делает.

Это может быть записано в 31 байте :

D                                   # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
 :let@a=                            # define register "a content
        @"%2                        # if (n % 2 != 0)
            ?                       # then
             @"                     #   n
               :                    # else
                @"%4                #   if (n % 4 != 0)
                    ?               #   then
                     "X"            #       "X"
                        :           #   else
                         "\\d"      #       "\\d"
                              <CR>  # calculate "a

Решение

Разместите все эти части в правильном порядке, и у вас есть решение:

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>                                              # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp     # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR>                                                              # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR>                                                                  # replace the remaining digits with stars

3

PHP, 114 + 1 байт

+1 байт за -R. Спасибо @Neil за подсказку.

for(;$c="   *****
 **66733**
*666777333*
*666777333*
**6667333**
  *******"[$i++];)echo+$c?" *"[$c*2>>$argn&1]:$c;

использует подчеркивание для *0, проиндексировано. Запустите как трубу с -nRили попробуйте онлайн .

Требуется PHP 5.5 или более поздняя
версия : более старый PHP не понимает индексацию буквенных строк (ошибка разбора);
PHP 7.1 жалуется нечисловых значений (заменить +$cс , $c>0чтобы исправить).


1
Я думаю, что " _"[$c*2>>$argn&1]позволяет избежать отрицательных параметров сдвига, если вам это нужно.
Нил




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.