L'éclipse solaire à travers une caméra sténopé

28

Ce défi est un simple défi de l'art ASCII inspiré de l' éclipse solaire survenue le 21 août 2017. Étant donné une entrée 0 <= n <= 4, sortez l'étape correspondante de l'éclipse décrite ci-dessous:

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

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

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

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

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

Règles

  • Vous pouvez 0 ou 1 index, indiquez ce que vous avez choisi.
  • Les caractères utilisés sont l'espace et *vous pouvez utiliser n'importe quel caractère imprimable pour *(autre que l'espace).
  • Les espaces de fin sont facultatifs (vous pouvez ou non les avoir).
  • C'est le , le nombre d'octets le plus bas est le gagnant.
Urne de poulpe magique
la source
3
@ Mr.Xcoder Je suis contre les difficultés de balisage pour obtenir une entrée en tant que complexité kolmogorov , bien que cela soit à la discrétion d'OP.
Erik the Outgolfer
15
Dommage que ce ne soit pas symétrique de haut en bas.
AdmBorkBork
De plus, l'éclipse a déjà commencé ...
Erik the Outgolfer
@AdmBorkBork Oui, j'aurais pu économiser quelques octets ...
Erik the Outgolfer
7
"Vous pouvez utiliser n'importe quel caractère pour *" ... y compris l'espace? ;)
Hagen von Eitzen

Réponses:

13

Python 2 , 161 149 142 142 135 octets

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

Essayez-le en ligne!

-7 merci à M. Xcoder .

Erik le Outgolfer
la source
9
Bon abus d'imprimables.
Zacharý
Je n'ai pas vraiment apprécié cette réponse avant d'avoir copié-collé dans Emacs. Brillant!
Silvio Mayolo
@SilvioMayolo Umm, qu'avez-vous fait avec Emacs?
Erik the Outgolfer
Je regardais juste la réponse sur cette page et je ne comprenais pas comment cela fonctionnait. Emacs montre tous les personnages cachés comme ^ A, ^ B, ^ C, etc.
Silvio Mayolo
@SilvioMayolo Oh, c'est parce que les caractères non imprimables ont une représentation qui ressemble un peu aux caractères Unicode.
Erik the Outgolfer
9

Fusain , 82 81 55 43 octets

-38 octets grâce à Neil!

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

Essayez-le en ligne! Le lien est vers la version détaillée.

Je l'ai fait pour le plaisir. : P Je vais probablement me faire distancer de 40 octets. 26 38 octets ... Assez proche?

totalement humain
la source
1
J'ai apporté quelques simplifications à votre algorithme de base: essayez-le en ligne!
Neil
2
Je me suis mis à jouer dans ma logique au lieu de mon incapacité à utiliser le charbon de bois. > _> Merci!
totalement humain
1
On dirait que l'impression du "cercle" extérieur est la plus courte. J'ai également été créatif avec le polygone pour les entrées impaires: essayez-le en ligne!
Neil
1) Bon sang, je pensais être intelligent avec PolygonHollow. : P 2) Ohh, bien. Merci!
2017 totalement humain
5

Gomme de cannelle , 70 octets

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

Essayez-le en ligne!

J'attends depuis si longtemps pour savoir comment utiliser cette langue. : P

Donc, Cinnamon Gum est Bubblegum, mais c'est plus une "vraie" langue que Bubblegum.

Le premier octet ( l) définit le mode en mode dictionnaire. Le reste des octets est la chaîne suivante compressée.

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

Cela fait essentiellement une table de recherche avec chaque texte affecté à un numéro. Le programme prend ensuite en entrée et sort le texte respectif.

totalement humain
la source
Peut argument%4ou argument&3enregistrer des octets?
Titus
5

JavaScript (ES6), 103 102 octets

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>

Edit: 1 octet enregistré grâce à @darrylyeo.

Neil
la source
1
-2 octets en stockant *666777333*\ndans une variable.
darrylyeo
@darrylyeo Je dois faire quelque chose de mal parce que je ne peux enregistrer que 1 octet ...
Neil
Mon mauvais, il ne fait en effet économiser que 1 octet.
darrylyeo
4

SOGL V0.12 , 40 39 octets

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

Essayez-le ici!

dzaima
la source
Si cela vous aide, les espaces de fin sont facultatifs (vous pouvez ou non les avoir). - Je ne sais pas SOGL, mais pourrait économiser des octets
M. Xcoder
@ Mr.Xcoder Cela ferait le contraire, car la SOGL ajoute des espaces de fin lorsqu'elle traite de l'art ASCII n'importe où: p
dzaima
4

VI, 108 octets

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>est le Entercoup, <C-?>correspond à Control + ?, et <Esc>à Escapeévidemment. Chacun d'entre eux compte pour 1 octet (voir méta ). Les sauts de ligne dans la solution sont pour la lisibilité. Ne <CR>représente que de vrais Entercoups.

Contribution

Le fichier d'entrée ne doit contenir qu'un seul caractère, représentant n.

lancement

Le VI doit être démarré comme:

vi -u NONE input

Explications

Il y a 3 parties dans la solution. Je décrirai d'abord la 2e partie (2e ligne), car elle est la plus simple à expliquer.

Dessiner le soleil

La commande pour dessiner le soleil est:

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

Le soleil doit être établi avec , *, 0, 1et 3, comme celui - ci:

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

Une symétrie aurait aidé à réduire la taille en octets de cette partie, mais ce n'est pas si important. Je n'expliquerai pas la ligne complète, mais le motif *****est utilisé pour générer facilement la dernière ligne, et le motif **1110333**a été pris comme référence pour générer les 3 autres lignes contenant 0, 1et 3.

Il est important de l'utiliser 0, 1et 3pour les pièces solaires qui peuvent être remplies (voir explications suivantes). Dessiner ce soleil prend 55 octets et peut probablement être joué au golf avec quelques astuces.

Remplir le soleil selon n

Pour bien remplir le soleil, les instructions à suivre sont les suivantes:

  • si n = 0, alors 0, 1et 3(tous les chiffres) doivent être remplacés par
  • si n = 1, alors 1doit être remplacé par , les autres chiffres avec*
  • si n = 2, alors 0, 1et 3(tous les chiffres) doivent être remplacés par*
  • si n = 3, alors 3doit être remplacé par , les autres chiffres avec*
  • si n = 4, alors 0, 1et 3(tous les chiffres) doivent être remplacés par (comme n = 0)

On peut en déduire que les substitutions requises sont:

  • remplacer certains chiffres par ( première substitution )
  • remplacer tous les autres chiffres par *( deuxième substitution )

Notez que "certains chiffres" peuvent signifier "pas de chiffres" ( n = 2par exemple). Et "tous les autres chiffres" peuvent également représenter "pas de chiffres", si tous les chiffres ont déjà été remplacés par la première substitution ( n = 0par exemple).

La deuxième substitution peut être facilement écrite en 11 octets :

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

La première substitution dépend n, donc nous devons d'abord calculer quels chiffres vont être remplacés. Si les caractères remplacés sont stockés dans le registre a, la commande de substitution est également écrite en 11 octets :

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

<C-r>aest remplacé par le contenu du registre alorsque la commande est tapée.

Pour calculer la valeur de a, en suivant les instructions précédentes, l'algorithme est (en pseudo-code):

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

"X"chaîne est utilisée car quand n = 2, aucun chiffre n'est remplacé par des espaces. Toute chaîne qui n'est pas le soleil peut être utilisée ici, tant que la première substitution ne fait rien.

Cela pourrait être écrit en 31 octets :

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

Solution

Mettez toutes ces pièces dans le bon ordre, et vous avez la solution:

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
la source
3

PHP, 114 + 1 octets

+1 octet pour -R. Merci @Neil pour l'astuce changeante.

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

utilise le soulignement pour *, indexé 0. Exécuter en tant que pipe avec -nRou l' essayer en ligne .

Nécessite PHP 5.5 ou version ultérieure: l'
ancien PHP ne comprend pas l'indexation de chaînes littérales (erreur d'analyse);
PHP 7.1 se plaint des valeurs non numériques (remplacez +$cpar $c>0pour corriger).

Titus
la source
1
Je pense que cela " _"[$c*2>>$argn&1]évite les paramètres de décalage négatifs si vous en avez besoin.
Neil
2

Python 2 , 170 169 octets

  • -1 octet grâce à @TheIOSCoder: utilisation d'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

Essayez-le en ligne!

officialaimm
la source
2

Python 2 , 181 octets

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]

Essayez-le en ligne!

Approche très naïve, travaillant sur golfin ' nvm.

totalement humain
la source
2

Java 8, 225 213 211 octets

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

Essayez-le ici.

Kevin Cruijssen
la source