Die Sonnenfinsternis durch eine Lochkamera


28

Diese Herausforderung ist eine einfache ASCII-Kunst-Herausforderung, die von der Sonnenfinsternis am 21. August 2017 inspiriert wurde. Bei einer Eingabe 0 <= n <= 4geben Sie die entsprechende Stufe der unten beschriebenen Sonnenfinsternis aus:

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

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

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

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

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

Regeln

  • Sie können 0 oder 1 Index angeben, was Sie gewählt haben.
  • Die verwendeten Zeichen sind Leerzeichen und *Sie können jedes druckbare Zeichen für *(außer Leerzeichen) verwenden.
  • Nachgestellte Leerzeichen sind optional (Sie können sie haben oder nicht haben).
  • Dies ist , die niedrigste Byteanzahl ist der Gewinner.

3
@ Mr.Xcoder Ich bin gegen das Kennzeichnen von Herausforderungen, die als kolmogorov-Komplexität eingegeben werden , obwohl dies im Ermessen von OP liegt.
Erik der Outgolfer

15
Schade, dass es nicht symmetrisch von oben nach unten ist.
AdmBorkBork

Auch die Sonnenfinsternis hat bereits begonnen ...
Erik der Outgolfer

@AdmBorkBork Ja, ich hätte ein paar Bytes sparen können ...
Erik der Outgolfer

7
"Sie können ein beliebiges Zeichen verwenden für *" ... einschließlich Leerzeichen? ;)
Hagen von Eitzen

Antworten:


13

Python 2 , 161 149 142 135 Bytes

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

Probieren Sie es online!

-7 danke an Mr. Xcoder .


9
Netter Missbrauch von Unprintables.
Zacharý

Ich wusste diese Antwort erst zu schätzen, als ich sie in Emacs kopiert habe. Brillant!
Silvio Mayolo

@SilvioMayolo Umm, was hast du mit Emacs gemacht?
Erik der Outgolfer

Ich habe mir nur die Antwort auf dieser Seite angesehen und nicht verstanden, wie es funktioniert. Emacs zeigt alle versteckten Zeichen wie ^ A, ^ B, ^ C, etc.
Silvio Mayolo

@SilvioMayolo Oh, das liegt daran, dass Unprintables eine Darstellung haben, die Unicode-Zeichen ähnelt.
Erik der Outgolfer

9

Charcoal , 82 81 55 43 Bytes

-38 Bytes dank Neil!

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

Probieren Sie es online! Link ist zur ausführlichen Version.

Ich habe es zum Teufel gemacht. : P Ich werde wahrscheinlich um 40 Bytes herausgolfen. 26 38 Bytes ... Nah genug?


1
Ich habe einige Vereinfachungen an Ihrem grundlegenden Algorithmus vorgenommen: Probieren Sie es online aus!
Neil

2
Ich habe mich in meiner Logik vom Golf verabschiedet, anstatt dass ich nicht in der Lage war, Holzkohle zu verwenden. > _> Danke!
Totalhuman

1
Sieht so aus, als würde das Drucken des äußeren "Kreises" am kürzesten dauern. Ich war auch kreativ mit dem Polygon für die ungeraden Eingaben: Probieren Sie es online!
Neil

1) Verdammt, ich dachte, ich wäre schlau PolygonHollow. : P 2) Oh, schön. Vielen Dank!
Totalhuman

5

Zimtgummi , 70 Bytes

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

Probieren Sie es online!

Ich habe so lange gewartet , um herauszufinden, wie man diese Sprache benutzt. : P

Also, Zimtgummi ist Bubblegum, aber es ist eher eine "echte" Sprache als Bubblegum.

Das erste Byte ( l) setzt den Modus in den Wörterbuchmodus. Der Rest der Bytes ist die folgende komprimierte Zeichenfolge.

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

Dies macht im Wesentlichen eine Nachschlagetabelle mit jedem einer Nummer zugewiesenen Text. Das Programm übernimmt dann die Eingabe und gibt den jeweiligen Text aus.


Kann argument%4oder argument&3Bytes speichern?
Titus

5

JavaScript (ES6), 103 bis 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>

Bearbeiten: 1 Byte dank @darrylyeo gespeichert.


1
-2 Bytes durch Speichern *666777333*\nin einer Variablen.
Darrylyeo

@ Darrylyeo Ich muss etwas falsch machen, weil ich nur 1 Byte zu retten scheinen kann ...
Neil

Mein schlimmes, es spart ja nur 1 Byte.
Darrylyeo

4

SOGL V0.12 , 40 39 Bytes

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

Probieren Sie es hier aus!


Wenn das hilft, sind nachgestellte Leerzeichen optional (Sie können sie haben oder nicht haben). - Kenne SOGL nicht, könnte aber Bytes speichern
Mr. Xcoder

@ Mr.Xcoder es das Gegenteil tun würde, als SOGL nachstehende Leerzeichen hinzufügt , wenn mit ASCII - Art zu tun überall: p
dzaima

4

VI, 108 Bytes

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>ist der EnterHub, <C-?>entspricht Control + ?, und <Esc>zu Escapeoffensichtlich. Diese zählen jeweils 1 Byte (siehe Meta ). Die Zeilenumbrüche in der Lösung dienen der Lesbarkeit. Nur <CR>stellt echte EnterSchlaganfällen.

Eingang

Die Eingabedatei sollte nur 1 Zeichen enthalten n.

Starten

VI sollte gestartet werden wie:

vi -u NONE input

Erklärungen

Die Lösung besteht aus 3 Teilen. Ich werde zuerst den 2. Teil (2. Zeile) beschreiben, da dies am einfachsten zu erklären ist.

Die Sonne zeichnen

Der Befehl zum Zeichnen der Sonne lautet:

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

Die Sonne muss mit gezogen werden , *, 0, 1und 3, wie folgt aus :

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

Eine Symmetrie hätte dazu beigetragen, die Bytegröße dieses Teils zu reduzieren, aber das ist nicht so wichtig. Ich werde die ganze Zeile nicht erklären, aber das Muster *****wird verwendet, um die letzte Zeile auf einfache Weise zu generieren, und das Muster **1110333**wurde als Referenz genommen, um die 3 anderen Zeilen zu generieren 0, die 1und enthalten 3.

Es ist wichtig 0, 1und 3für Sonne Teile zu verwenden, die gefüllt werden können (siehe nächste Erläuterungen). Das Zeichnen dieser Sonne dauert 55 Bytes und kann wahrscheinlich mit ein paar Tricks gespielt werden.

Füllen Sie die Sonne nach n

Um die Sonne richtig auszufüllen, müssen folgende Anweisungen befolgt werden:

  • wenn n = 0, dann 0, 1und 3(alle Ziffern) sollte ersetzt werden durch
  • Wenn n = 1, dann 1sollten die anderen Ziffern durch ersetzt werden*
  • wenn n = 2, dann 0, 1und 3(alle Ziffern) sollte ersetzt werden durch*
  • Wenn n = 3, dann 3sollten die anderen Ziffern durch ersetzt werden*
  • wenn n = 4, dann 0, 1und 3(alle Ziffern) sollte ersetzt werden (wie n = 0)

Daraus können wir schließen, dass folgende Substitutionen erforderlich sind:

  • ersetze einige Ziffern durch ( erste Ersetzung )
  • Ersetzen Sie alle anderen Ziffern durch *( zweite Ersetzung )

Beachten Sie, dass "einige Ziffern" beispielsweise "keine Ziffern" bedeuten können n = 2. Und "alle anderen Ziffern" können auch "keine Ziffern" darstellen, wenn ( n = 0zum Beispiel) bereits alle Ziffern durch die erste Ersetzung ersetzt wurden .

Die zweite Ersetzung kann leicht in 11 Bytes geschrieben werden :

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

Die erste Ersetzung hängt davon ab n, also müssen wir zuerst berechnen, welche Ziffern ersetzt werden sollen. Wenn ersetzte Zeichen im Register gespeichert sind a, wird der Ersetzungsbefehl auch in 11 Bytes geschrieben :

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

<C-r>awird durch den Inhalt des Registers ersetzt, awenn der Befehl eingegeben wird.

Zur Berechnung des Werts von alautet der Algorithmus gemäß den vorherigen Anweisungen (in Pseudocode):

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

"X"string wird verwendet, weil wenn n = 2keine Ziffern durch Leerzeichen ersetzt werden. Jede Zeichenfolge, die nicht die Sonne ist, kann hier verwendet werden, solange die erste Ersetzung nichts bewirkt.

Dies könnte in 31 Bytes geschrieben werden :

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

Lösung

Ordnen Sie all diese Teile in der richtigen Reihenfolge an und Sie haben die Lösung:

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 Bytes

+1 Byte für -R. Danke @Neil für den Hinweis.

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

Verwendet einen Unterstrich für *, 0-indiziert. Laufen Sie als Pipe mit -nRoder versuchen Sie es online .

Benötigt PHP 5.5 oder neuer:
älteres PHP versteht die Indexierung von Literalstrings nicht (Analysefehler);
PHP 7.1 beschwert sich über nicht-numerische Werte (ersetzen +$cdurch $c>0, um sie zu beheben).


1
Ich denke, dass " _"[$c*2>>$argn&1]negative Verschiebungsparameter vermieden werden, wenn Sie es brauchen.
Neil


2

Python 2 , 181 Bytes

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]

Probieren Sie es online!

Sehr naive Herangehensweise, Golf spielen.


2

Java 8, 225 213 211 Bytes

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

Probieren Sie es hier aus.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.