Zaćmienie Słońca przez kamerę otworkową

28

To wyzwanie jest prostym wyzwaniem w stylu ASCII zainspirowanym zaćmieniem Słońca, które miało miejsce 21 sierpnia 2017 r. Biorąc pod uwagę dane 0 <= n <= 4wyjściowe, wygeneruj odpowiedni etap zaćmienia opisany poniżej:

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

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

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

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

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

Zasady

  • Możesz 0 lub 1 indeks, określić, co wybrałeś.
  • Używane znaki to spacja i *możesz użyć dowolnego znaku do druku *(innego niż spacja).
  • Końcowe spacje są opcjonalne (możesz je mieć lub nie).
  • To jest , zwycięzcą jest najniższa liczba bajtów.
Urna Magicznej Ośmiornicy
źródło
3
@ Mr.Xcoder Jestem przeciwny oznaczaniu wyzwań związanych z uzyskiwaniem wkładu w złożoność kolmogorowa , chociaż to zależy od uznania OP.
Erik the Outgolfer
15
Bummer, że nie jest symetryczny od góry do dołu.
AdmBorkBork
Również zaćmienie już się rozpoczęło ...
Erik Outgolfer
@AdmBorkBork Tak, mogłem zaoszczędzić trochę bajtów ...
Erik the Outgolfer
7
„Możesz użyć dowolnej postaci do *” ... w tym spacji? ;)
Hagen von Eitzen

Odpowiedzi:

13

Python 2 , 161 149 142 135 bajtów

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

Wypróbuj online!

-7 dzięki Mr. Xcoder .

Erik the Outgolfer
źródło
9
Ładne nadużycie materiałów niedrukowalnych.
Zacharý
Nie doceniłem w pełni tej odpowiedzi, dopóki nie wkleiłem w Emacsa. Znakomity!
Silvio Mayolo,
@SilvioMayolo Umm, co zrobiłeś z Emacsem?
Erik the Outgolfer
Właśnie patrzyłem na odpowiedź na tej stronie i nie rozumiałem, jak to działa. Emacs pokazuje wszystkie ukryte znaki jako ^ A, ^ B, ^ C itp.
Silvio Mayolo
@SilvioMayolo Och, to dlatego, że elementy niedrukowalne mają reprezentację przypominającą znaki Unicode.
Erik the Outgolfer
9

Węgiel drzewny , 82 81 55 43 bajtów

-38 bajtów dzięki Neilowi!

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

Wypróbuj online! Link jest do pełnej wersji.

Zrobiłem dla cholery tego. : P Prawdopodobnie zostanę pokonany przez 40 bajtów. 26 38 bajtów ... Wystarczająco blisko?

całkowicie ludzki
źródło
1
Wprowadziłem kilka uproszczeń do twojego podstawowego algorytmu: Wypróbuj online!
Neil,
2
Grałem w golfa w logice zamiast niezdolności do używania węgla drzewnego. > _> Dzięki!
całkowicie ludzki,
1
Wygląda na to, że wydruk zewnętrznego „koła” działa najkrócej. Byłem także kreatywny z wielokątem dla nieparzystych danych wejściowych: Wypróbuj online!
Neil,
1) Cholera, myślałem, że jestem sprytny PolygonHollow. : P 2) Och, miło. Dzięki!
całkowicie ludzki,
5

Guma cynamonowa , 70 bajtów

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

Wypróbuj online!

Tak długo czekałem , aby dowiedzieć się, jak korzystać z tego języka. : P

Tak więc guma cynamonowa to guma do żucia, ale jest to bardziej „prawdziwy” język niż guma do żucia.

Pierwszy bajt ( l) ustawia tryb na tryb słownika. Reszta bajtów to skompresowany następujący ciąg.

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

Zasadniczo tworzy to tabelę odnośników z każdym tekstem przypisanym do liczby. Program pobiera następnie dane wejściowe i wyjściowe odpowiedniego tekstu.

całkowicie ludzki
źródło
Może argument%4albo argument&3zapisać bajtów?
Tytus
5

JavaScript (ES6), 103 102 bajtów

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>

Edycja: Zapisano 1 bajt dzięki @darrylyeo.

Neil
źródło
1
-2 bajty poprzez zapisanie *666777333*\nw zmiennej.
darrylyeo
@darrylyeo Muszę robić coś złego, bo wydaje mi się, że mogę zaoszczędzić tylko 1 bajt ...
Neil
Mój zły, to rzeczywiście oszczędza tylko 1 bajt.
darrylyeo
4

SOGL V0.12 , 40 39 bajtów

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

Wypróbuj tutaj!

dzaima
źródło
Jeśli to pomoże, końcowe spacje są opcjonalne (możesz je mieć lub nie). - Nie znam SOGL, ale może zaoszczędzić bajty
Mr. Xcoder
@ Mr.Xcoder Byłoby odwrotnie, ponieważ SOGL dodaje końcowe spacje, gdy zajmuje się sztuką ASCII w dowolnym miejscu: p
dzaima
4

VI, 108 bajtów

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>jest Enterudar mózgu, <C-?>odpowiada Control + ?, i <Esc>do Escapeoczywiście. Każdy z nich liczy się dla 1 bajtu (patrz meta ). Podziały linii w rozwiązaniu służą do czytelności. <CR>Reprezentuje tylko prawdziwe Enteruderzenia.

Wkład

Plik wejściowy powinien zawierać tylko 1 znak reprezentujący n.

Uruchomić

VI należy rozpocząć tak:

vi -u NONE input

Objaśnienia

Rozwiązanie zawiera 3 części. Opiszę pierwszą część 2. (2. wiersz), ponieważ jest najłatwiejsza do wyjaśnienia.

Rysowanie słońca

Polecenie narysowania słońca to:

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

Słońce musi być sporządzony z , *, 0, 1i 3, podobnie jak to:

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

Symetria pomogłaby zmniejszyć rozmiar tej części w bajtach, ale nie jest to takie ważne. Nie wyjaśnię pełnej linii, ale wzorzec *****służy do łatwego wygenerowania ostatniego wiersza, a wzorzec **1110333**został przyjęty jako odniesienie do wygenerowania 3 innych wierszy zawierających 0, 1i 3.

Ważne jest, aby używać 0, 1a 3dla części słonecznych, które mogą być wypełnione (patrz następny wyjaśnień). Narysowanie tego słońca zajmuje 55 bajtów i prawdopodobnie można go zagrać w golfa za pomocą niektórych sztuczek.

Wypełnianie słońca zgodnie z n

Aby prawidłowo wypełnić słońce, postępuj zgodnie z instrukcjami:

  • jeśli n = 0, to 0, 1i 3(wszystkie cyfry) powinny być zastąpione
  • jeśli n = 1, to 1należy zastąpić innymi cyframi*
  • jeśli n = 2, to 0, 1i 3(wszystkie cyfry) powinny być zastąpione*
  • jeśli n = 3, to 3należy zastąpić innymi cyframi*
  • jeśli n = 4, to 0, 1i 3(wszystkie cyfry) należy zastąpić (jak n = 0)

Z tego możemy wywnioskować, że wymagane podstawienia to:

  • zamień niektóre cyfry na ( pierwsza zamiana )
  • zamień wszystkie pozostałe cyfry na *( druga zamiana )

Zauważ, że „niektóre cyfry” mogą oznaczać „brak cyfr” ( n = 2na przykład). „Wszystkie pozostałe cyfry” mogą również oznaczać „brak cyfr”, jeśli wszystkie cyfry zostały już zastąpione pierwszym zastąpieniem ( n = 0na przykład).

Drugiej zmiany mogą być łatwo napisany w 11 bajtów :

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

Najpierw podstawienie zależy n, więc najpierw musimy obliczyć, jakie cyfry zostaną zastąpione. Jeśli zastąpione znaki są przechowywane w rejestrze a, polecenie podstawienia zapisywane jest również w 11 bajtach :

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

<C-r>ajest zastępowany treścią rejestru apo wpisaniu polecenia.

Aby obliczyć wartość a, postępując zgodnie z poprzednimi instrukcjami, algorytm jest (w pseudokodzie):

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

"X"ciąg jest używany, ponieważ kiedy n = 2żadne cyfry nie są zastępowane spacjami. Można tu użyć dowolnego łańcucha, który nie jest słońcem, pod warunkiem, że pierwsze podstawienie nic nie robi.

Można to zapisać w 31 bajtach :

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

Rozwiązanie

Umieść wszystkie te części we właściwej kolejności, a otrzymasz rozwiązanie:

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
norbjd
źródło
3

PHP, 114 + 1 bajtów

+1 bajt dla -R. Dzięki @Neil za zmianę wskazówki.

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

używa podkreślenia dla *, 0-indeksowane. Uruchom jako potok z -nRlub spróbuj online .

Wymaga PHP 5.5 lub nowszego:
starszy PHP nie rozumie dosłownego indeksowania ciągów (błąd analizy);
PHP 7,1 uskarża się wartości liczbowych (nie zastąpi +$csię $c>0na stały).

Tytus
źródło
1
Myślę, że " _"[$c*2>>$argn&1]unika ujemnych parametrów przesunięcia, jeśli ich potrzebujesz.
Neil
2

Python 2 , 170 169 bajtów

  • -1 bajt dzięki @TheIOSCoder: użycie exec
def f(x,k=0):exec'print"".join(ord(i)*" *"[j%2]for j,i in enumerate(["		","	","	!",""][x%4]))[11*k:][:11];k+=1;'*6

Wypróbuj online!

Officialaimm
źródło
2

Python 2 , 181 bajtów

lambda n,s=' ',a='*':"""   *****
 **%s**
*%s*
*%s*
**%s**
  *******"""%[(s*5,s*9,s*9,s*7),(s*2+a*3,s*3+a*6,s*3+a*6,s*3+a*4),(a*5,a*9,a*9,a*7),(a*3+s*2,a*6+s*3,a*6+s*3,a*4+s*3)][n%4]

Wypróbuj online!

Bardzo naiwne podejście, praca nad golfem w NVM .

całkowicie ludzki
źródło
2

Java 8, 225 213 211 bajtów

n->{String a=n<2|n>3?"   ":"***",b=n<1|n>2?"   ":"***",c=n%4<1?" ":"*",d=a+(n%4<1?"   ":"***")+b;return"   *****\n **"+(n<2|n>3?"  ":"**")+c+(n<1|n>2?"  ":"**")+"**\n*"+d+"*\n*"+d+"*\n**"+a+c+b+"**\n  *******";}

Wypróbuj tutaj.

Kevin Cruijssen
źródło