Gerhana Matahari Melalui Kamera Lubang Jarum

28

Tantangan ini adalah tantangan seni ASCII sederhana yang diilhami oleh gerhana matahari yang terjadi pada 21 Agustus 2017. Diberikan input 0 <= n <= 4, hasilkan tahapan yang sesuai dari gerhana yang dijelaskan di bawah ini:

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

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

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

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

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

Aturan

  • Anda dapat 0 atau 1 indeks, sebutkan apa yang Anda pilih.
  • Karakter yang digunakan adalah ruang dan *, Anda dapat menggunakan karakter apa pun yang dapat dicetak untuk *(selain ruang).
  • Ruang tambahan adalah opsional (Anda mungkin atau mungkin tidak memilikinya).
  • Ini adalah , byte-count terendah adalah pemenangnya.
Guci Gurita Ajaib
sumber
3
@ Mr.Xcoder Saya menentang penandaan tantangan untuk mendapatkan input sebagai kolmogorov-kompleksitas , meskipun itu tergantung pada kebijaksanaan OP.
Erik the Outgolfer
15
Sayangnya, itu bukan top-to-bottom yang simetris.
AdmBorkBork
Juga, gerhana sudah mulai ...
Erik the Outgolfer
@ AdmBorkBork Ya saya bisa menyelamatkan beberapa byte ...
Erik the Outgolfer
7
"Anda dapat menggunakan karakter apa saja untuk *" ... termasuk spasi? ;)
Hagen von Eitzen

Jawaban:

13

Python 2 , 161 149 142 135 byte

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

Cobalah online!

-7 Terima kasih kepada Tn . Xcoder .

Erik the Outgolfer
sumber
9
Pelecehan yang tidak patut pada yang tidak patut.
Zacharý
Tidak sepenuhnya menghargai jawaban ini sampai saya menyalin-paste ke Emacs. Cemerlang!
Silvio Mayolo
@ SilvioMayolo Umm, apa yang Anda lakukan dengan Emacs?
Erik the Outgolfer
Saya hanya melihat jawaban di halaman ini dan tidak mengerti bagaimana cara kerjanya. Emacs menunjukkan semua karakter tersembunyi sebagai ^ A, ^ B, ^ C, dll.
Silvio Mayolo
@ SilvioMayolo Oh, itu karena unsintables memiliki representasi yang terlihat seperti karakter Unicode.
Erik the Outgolfer
9

Arang , 82 81 55 43 byte

-38 byte terima kasih kepada Neil!

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

Cobalah online! Tautan adalah untuk versi verbose.

Saya lakukan untuk sih itu. : P Saya mungkin akan keluar-golf dengan 40 byte. 26 38 byte ... Cukup dekat?

benar-benar manusiawi
sumber
1
Saya membuat beberapa penyederhanaan untuk algoritma dasar Anda: Cobalah online!
Neil
2
Saya keluar-golf dalam logika saya bukannya ketidakmampuan saya untuk menggunakan Arang. > _> Terima kasih!
totallyhuman
1
Sepertinya mencetak "lingkaran" luar bekerja paling singkat. Saya juga kreatif dengan poligon untuk input aneh: Cobalah online!
Neil
1) Sialan, saya pikir saya pintar dengan PolygonHollow. : P 2) Ohh, bagus. Terima kasih!
totallyhuman
5

Cinnamon Gum , 70 byte

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

Cobalah online!

Saya telah menunggu sangat lama untuk mengetahui bagaimana menggunakan bahasa ini. : P

Jadi, Cinnamon Gum adalah Bubblegum, tetapi lebih merupakan bahasa "nyata" daripada Bubblegum.

Byte pertama ( l) mengatur mode ke mode kamus. Sisa dari byte adalah string berikut yang dikompresi.

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

Ini pada dasarnya membuat tabel pencarian dengan masing-masing teks ditugaskan ke nomor. Program kemudian mengambil input dan output teks masing-masing.

benar-benar manusiawi
sumber
Bisakah argument%4atau argument&3menyimpan byte?
Titus
5

JavaScript (ES6), 103 102 byte

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>

Sunting: Disimpan 1 byte berkat @darrylyeo.

Neil
sumber
1
-2 byte dengan menyimpan *666777333*\ndalam variabel.
darrylyeo
@dryrylyeo Saya pasti melakukan sesuatu yang salah karena saya hanya bisa menghemat 1 byte ...
Neil
Buruk saya, itu memang menghemat hanya 1 byte.
darrylyeo
4

SOGL V0.12 , 40 39 byte

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

Coba Di Sini!

dzaima
sumber
Jika itu membantu, Ruang Trailing adalah opsional (Anda mungkin atau mungkin tidak memilikinya). - Tidak tahu SOGL, tetapi bisa menghemat byte
Tn. Xcoder
@ Mr.Xcoder Ini akan melakukan yang sebaliknya, karena SOGL menambahkan spasi tambahan ketika berhadapan dengan seni ASCII di mana saja: p
dzaima
4

VI, 108 byte

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>adalah Enterstroke, <C-?>dapat disamakan dengan Control + ?, dan <Esc>untuk Escapejelas. Masing-masing dihitung untuk 1 byte (lihat meta ). Jeda baris dalam solusinya adalah agar mudah dibaca. Hanya <CR>mewakili Enterpukulan nyata .

Memasukkan

File input harus berisi hanya 1 karakter, mewakili n.

Meluncurkan

VI harus dimulai seperti:

vi -u NONE input

Penjelasan

Ada 3 bagian dalam solusi. Saya akan menjelaskan bagian ke-2 dulu (baris ke-2), karena ini adalah yang paling mudah untuk dijelaskan.

Menggambar matahari

Perintah untuk menggambar matahari adalah:

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

Matahari harus ditarik dengan , *, 0, 1dan 3, seperti ini:

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

Simetri akan membantu mengurangi ukuran byte bagian ini, tetapi itu tidak terlalu penting. Saya tidak akan menjelaskan baris lengkap, tetapi polanya *****digunakan untuk dengan mudah menghasilkan baris terakhir, dan polanya **1110333**telah diambil sebagai referensi untuk menghasilkan 3 baris lain yang berisi 0, 1dan 3.

Penting untuk digunakan 0, 1dan 3untuk bagian matahari yang bisa diisi (lihat penjelasan selanjutnya). Menggambar matahari ini membutuhkan 55 byte , dan mungkin bisa bermain golf dengan beberapa trik.

Mengisi matahari sesuai dengan n

Untuk mengisi matahari dengan benar, petunjuk yang harus diikuti adalah:

  • jika n = 0, lalu 0, 1dan 3(semua digit) harus diganti dengan
  • jika n = 1, maka 1harus diganti dengan , digit lainnya dengan*
  • jika n = 2, lalu 0, 1dan 3(semua digit) harus diganti dengan*
  • jika n = 3, maka 3harus diganti dengan , digit lainnya dengan*
  • jika n = 4, lalu 0, 1dan 3(semua digit) harus diganti dengan (seperti n = 0)

Dari itu, kita dapat menyimpulkan bahwa substitusi yang diperlukan adalah:

  • ganti beberapa digit dengan ( substitusi pertama )
  • ganti semua digit lainnya dengan *( substitusi kedua )

Perhatikan bahwa "beberapa digit" dapat berarti "tanpa digit" ( n = 2misalnya). Dan "semua digit lainnya" juga dapat mewakili "tanpa digit", jika semua digit telah diganti oleh substitusi pertama ( n = 0misalnya).

The substitusi kedua dapat dengan mudah ditulis dalam 11 bytes :

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

The substitusi pertama tergantung pada n, jadi pertama kita harus menghitung apa yang akan digit diganti. Jika karakter yang diganti disimpan dalam register a, perintah substitusi ditulis dalam juga 11 byte :

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

<C-r>adiganti dengan isi register aketika perintah diketik.

Untuk menghitung nilai a, mengikuti instruksi sebelumnya, algoritmanya adalah (dalam pseudo-code):

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

"X"string digunakan karena ketika n = 2, tidak ada digit yang diganti oleh spasi. String apa pun yang bukan matahari bisa digunakan di sini, selama pergantian pertama tidak menghasilkan apa-apa.

Ini dapat ditulis dalam 31 byte :

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

Larutan

Masukkan semua bagian ini dalam urutan yang benar, dan Anda memiliki solusinya:

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
sumber
3

PHP, 114 +1 byte

+1 byte untuk -R. Terima kasih @Neil untuk petunjuknya.

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

menggunakan garis bawah untuk *, 0-diindeks. Jalankan sebagai pipa dengan -nRatau coba online .

Membutuhkan PHP 5.5 atau yang lebih baru:
PHP yang lebih lama tidak memahami pengindeksan string literal (kesalahan parse);
PHP 7.1 mengeluh tentang nilai-nilai non-numerik (ganti +$cdengan $c>0untuk memperbaikinya).

Titus
sumber
1
Saya pikir " _"[$c*2>>$argn&1]menghindari parameter pergeseran negatif jika Anda membutuhkannya.
Neil
2

Python 2 , 170 169 byte

  • -1 byte terima kasih kepada @TheIOSCoder: penggunaan 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

Cobalah online!

officialaimm
sumber
2

Python 2 , 181 byte

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]

Cobalah online!

Pendekatan yang sangat naif, bekerja di golf di nvm.

benar-benar manusiawi
sumber
2

Java 8, 225 213 211 byte

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

Coba di sini.

Kevin Cruijssen
sumber