Сонячне затемнення через камеру Pinhole


28

Цей виклик - це простий виклик мистецтва ASCII, натхненний сонячним затемненням, що сталося 21 серпня 2017 р. З огляду на вхід 0 <= n <= 4, виведіть відповідний етап затемнення, описаний нижче:

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

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

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

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

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

Правила

  • Ви можете 0 або 1 індексувати, зазначте, що обрали.
  • Застосовувані символи - це пробіл, і *ви можете використовувати будь-які символи для друку *(крім пробілу).
  • Пробіли для відстеження необов’язкові (їх у вас може бути або не бути).
  • Це , найнижчий байт - переможець.

3
@ Mr.Xcoder Я проти позначати проблеми, отримуючи вклад як складність кольмогорів , хоча це залежить від розсуду ОП.
Erik the Outgolfer

15
Баммер, що це не симетрично зверху вниз.
AdmBorkBork

Крім того, затемнення вже почалося ...
Ерік Вигнавець

@AdmBorkBork Так, я міг би врятувати декілька байтів ...
Erik the 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
Приємне зловживання недрукованими видами.
Zacharý

Не повністю оцінив цю відповідь, поки я не скопіював її в Emacs. Блискуче!
Сільвіо Майоло

@SilvioMayolo Umm, що ти робив з Emacs?
Erik the Outgolfer

Я просто переглядав відповідь на цій сторінці і не розумів, як це працює. Emacs показує всі приховані символи як ^ A, ^ B, ^ C тощо.
Сільвіо Майоло

@SilvioMayolo О, це тому, що у друкованих видань є представлення, яке схоже на символи Unicode.
Ерік Аутгольфер

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(...

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

Я так довго чекав, щоб дізнатися, як користуватися цією мовою. : P

Так, Кориця Гам - це Bubblegum, але це більше "справжня" мова, ніж Bubblegum.

Перший байт ( 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 байт.
darrylyeo

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.