Bir İğne Deliği Kamerasıyla Güneş Tutulması


28

Bu zorluk esinlenerek basit bir ASCII-sanat mücadeledir güneş tutulması bir giriş Verilen 21 Ağustos 2017 tarihinde meydana 0 <= n <= 4çıkış tutulmanın tekabül aşaması aşağıda tarif:

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

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

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

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

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

kurallar

  • 0 veya 1 indeksi seçebilir, istediğinizi belirtebilirsiniz.
  • Kullanılan karakterler boşluktur ve *yazdırılabilir karakterleri *(boşluk dışındaki) kullanabilirsiniz.
  • Sondaki boşluklar isteğe bağlıdır (bunlara sahip olabilirsiniz veya olmayabilir).
  • Bu , en düşük bayt sayımı kazanır.

3
@ Mr.Xcoder OP'nin takdirine bağlı olmasına rağmen, kolmogorov-karmaşıklığı olarak girilen zorlukları etiketlemeye karşıyım .
Outgolfer Erik

15
Simetrik yukarıdan aşağıya olmadığını söyleyin.
AdmBorkBork

Ayrıca, güneş tutulması çoktan başladı ...
Outgolfer Erik

@AdmBorkBork Evet, bazı baytları kurtarmış olabilirim ...
Outgolfer Erik,

7
*Boşluk dahil " Herhangi bir karakteri kullanabilirsin " ... ;)
Hagen von Eitzen

Yanıtlar:


13

Python 2 , 161 149 142 135 bayt

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

Çevrimiçi deneyin!

-7 Bay Xcoder'a teşekkürler .


9
Yazdırılamayanların kötü kullanımı.
Zacharý

Emacs'a kopyalanana kadar bu cevabı tam olarak anlamadım. Parlak!
Silvio Mayolo

@SilvioMayolo Umm, Emacs ile neler yaptınız?
Outgolfer Erik

Bu sayfadaki cevaba bakıyordum ve nasıl çalıştığını anlamadım. Emacs, tüm gizli karakterleri ^ A, ^ B, ^ C, vb. Olarak gösterir.
Silvio Mayolo

@ SilvioMayolo Ah, çünkü basılamazlar Unicode karakterlerine benzeyen bir temsilidir.
Outgolfer Erik

9

Kömür , 82 81 55 43 bayt

Neil sayesinde -38 bayt!

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

Çevrimiçi deneyin! Bağlantı ayrıntılı versiyonudur.

Bunun için yaptım. : P Muhtemelen 40 byte golf oynayacağım. 26 38 bayt ... Yeterince yakın mı?


1
Temel algoritmada bazı basitleştirmeler yaptım: Çevrimiçi deneyin!
Neil

2
Kömür kullanamadığım yerine mantığımda golf oynadım. > _> Teşekkürler!
23'te

1
Dış "daireyi" en kısa sürede basıyor gibi görünüyor. Ayrıca tek girişler için çokgen ile yaratıcıydım: Çevrimiçi deneyin!
Neil

1) Kahretsin, zeki olduğumu sanıyordum PolygonHollow. : P 2) Ohh, güzel. Teşekkürler!
tamamen insan

5

Tarçınlı Sakız , 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(...

Çevrimiçi deneyin!

Bu dili nasıl kullanacağımı öğrenmek için çok uzun zamandır bekliyorum . : P

Öyleyse, Tarçın Sakızı Bubblegum'dur, fakat Bubblegum'dan daha "gerçek" bir dildir.

İlk byte ( l) modu sözlük moduna ayarlar. Baytların geri kalanı sıkıştırılmış aşağıdaki dizedir.

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

Bu, esas olarak, her bir metin bir numaraya atanmış bir arama tablosu yapar. Ardından program girdi alır ve ilgili metni çıkarır.


Can argument%4veya argument&3bayt kaydetmek?
Titus,

5

JavaScript (ES6), 103 102 bayt

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>

Düzenleme: @darrylyeo sayesinde 1 bayt kaydedildi.


1
*666777333*\nBir değişkende saklayarak -2 bayt .
darrylyeo

@darrylyeo Yanlış bir şey yapmalıyım çünkü sadece 1 byte tasarruf edebiliyor gibiyim ...
Neil

Benim hatam, gerçekten sadece 1 byte tasarruf sağlıyor.
darrylyeo

4

SOGL V0.12 , 40 39 bayt

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

Burada dene!


Bu herhangi bir yardımcı olursa, Firar boşlukları isteğe bağlıdır (bunlara sahip olabilir veya olmayabilir). - SOGL'u tanımıyorum, ancak baytları kurtarabilir
Bay

@ Mr.Xcoder SOGL her yerde ASCII sanatıyla uğraşırken iz bıraktığı boşlukları eklediği için tam tersini yapar: p
dzaima

4

VI, 108 bayt

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>olduğu Enterfelç, <C-?>karşılık gelir Control + ?ve <Esc>karşı Escapebelli. Bunların her biri 1 bayt için sayılır (bkz. Meta ). Çözeltideki satır sonları okunabilirlik içindir. Sadece <CR>gerçek Entervuruşları temsil eder .

Giriş

Giriş dosyası temsil eden sadece 1 karakter içermelidir n.

Başlatmak

VI şöyle başlatılmalıdır:

vi -u NONE input

açıklamalar

Çözümde 3 bölüm var. Açıklamak en kolay olduğu için ilk önce 2. bölümü (2. satır) anlatacağım.

Güneş çizim

Güneşi çekme emri:

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

Güneş ile çizilmelidir , *, 0, 1ve 3bu gibi:

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

Bir simetri, bu bölümün bayt boyutunu azaltmaya yardımcı olabilirdi, ama o kadar önemli değil. Tam satır açıklar, ancak model *****kolayca son hattı üretmek için kullanılır, ve desen **1110333**içeren 3 diğer çizgilerini oluşturmak için bir referans olarak alınmıştır 0, 1ve 3.

Kullanımı önemlidir 0, 1ve 3doldurulabilir güneş parçaları (sonraki açıklamalara bakın) için. Bu güneşin çekilmesi 55 byte alır ve muhtemelen bazı numaralarla oynanabilir.

Güneşe göre doldurma n

Güneşi doğru şekilde doldurmak için izlenmesi gereken talimatlar:

  • eğer n = 0öyleyse 0, 1ve 3(tüm basamaklar) ile değiştirilmeli
  • Eğer n = 1, daha sonra 1değiştirilmelidir diğer basamağı ile,*
  • eğer n = 2öyleyse 0, 1ve 3(tüm basamaklar) ile değiştirilmeli*
  • Eğer n = 3, daha sonra 3değiştirilmelidir diğer basamağı ile,*
  • eğer n = 4öyleyse 0, 1ve 3(tüm basamaklar) ile değiştirilmelidir (gibi n = 0)

Bundan, gerekli ikamelerin:

  • bazı basamakları değiştir ( ilk seçenek )
  • diğer tüm basamakları yerine koy *( ikinci ikame )

"Bazı rakamların" "rakam yok" anlamına gelebileceğini unutmayın ( n = 2örneğin). Ve "tüm diğer basamaklar", tüm basamaklar zaten ilk ikame ile değiştirilmişse ( n = 0örneğin) "basamaksız" olarak da gösterilebilir .

İkinci ikame kolaylıkla yazılabilir 11 bayt :

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

İlk ikame bağlıdır nbu yüzden ilk biz basamak değiştirilmesi için neler olduğunu hesaplamak zorunda. Değiştirilen karakterler kayıt defterinde saklanırsa a, ikame komutu 11 baytta da yazılır :

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

<C-r>aaKomut yazıldığında kayıt içeriği ile değiştirilir .

Değerini hesaplamak için aönceki talimatları izleyerek algoritma şu şekildedir (sözde kodda):

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

"X"dize kullanılır, çünkü ne zaman n = 2hiçbir basamak boşluk bırakmaz. İlk ikame hiç bir şey yapmazsa, güneş olmayan herhangi bir ip burada kullanılabilir.

Bu 31 bayt ile yazılabilir :

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

Çözüm

Tüm bu parçaları doğru sıraya koyun ve çözüme kavuşun:

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 bayt

İçin +1 bayt -R. Değişen ipucu için teşekkürler @ Neil.

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

*0 dizinli için alt çizgi kullanır . Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

PHP 5.5 veya daha yenisini gerektirir:
daha eski PHP değişmez dizge indekslemesini anlamıyor (ayrıştırma hatası);
PHP 7.1 (yerine sayısal olmayan değerler hakkında şikayet +$cile$c>0 düzeltmek için ).


1
Bence " _"[$c*2>>$argn&1]de gerekirse kaçınır olumsuz kaydırma parametrelerini.
Neil


2

Python 2,181 bayt

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]

Çevrimiçi deneyin!

Çok naif bir yaklaşım, golfin üzerinde çalışıyorum nvm.


2

Java 8, 225 213 211 bayt

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

Burada dene.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.