Placez un planeur!

17

Cette:

entrez la description de l'image ici

est un planeur .

Dans Game of Life de Conway, le planeur est un motif célèbre qui traverse rapidement la planche. Pour le défi d'aujourd'hui, nous allons dessiner un tableau Game of Life art ASCII et placer un planeur dessus.

Le tableau avec lequel nous commençons est le suivant:

|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|

Cette planche est entièrement composée de tuyaux |et de traits de soulignement _, et est de 10x10. Vous devez écrire un programme ou une fonction qui accepte deux entiers, «x» et «y», et génère cette même carte avec un planeur à ces coordonnées. Par exemple, si vous aviez un planeur en position (1, 1)(indexé 0), vous devez sortir les éléments suivants:

|_|_|_|_|_|_|_|_|_|_|
|_|_|*|_|_|_|_|_|_|_|
|_|_|_|*|_|_|_|_|_|_|
|_|*|*|*|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|

Vous pouvez supposer que le planeur ne sera jamais placé hors des limites, donc x et y seront toujours dans la [0-7]plage. Vous pouvez également choisir de prendre les coordonnées indexées 1, mais vous devez le spécifier dans votre réponse. Dans ce cas, les entrées seront toujours dans la [1-8]plage. Voici quelques exemples (tous indexés 0):

0, 0:
|_|*|_|_|_|_|_|_|_|_|
|_|_|*|_|_|_|_|_|_|_|
|*|*|*|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|

7, 7:
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|*|_|
|_|_|_|_|_|_|_|_|_|*|
|_|_|_|_|_|_|_|*|*|*|

7, 4:
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|*|_|
|_|_|_|_|_|_|_|_|_|*|
|_|_|_|_|_|_|_|*|*|*|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|

5, 2:
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|*|_|_|_|
|_|_|_|_|_|_|_|*|_|_|
|_|_|_|_|_|*|*|*|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|

Comme d'habitude, vous pouvez prendre votre E / S dans n'importe quel format raisonnable. Cela inclut, mais sans s'y limiter, une chaîne avec des sauts de ligne, un tableau de chaînes, un tableau 2d de chaînes ou l'écriture dans un fichier / STDOUT. Vous pouvez également choisir dans quel ordre prendre x et y .

Puisqu'il s'agit de , les failles standard sont interdites, et faites le code le plus court possible!

DJMcMayhem
la source
Pouvons-nous changer quel coin identifie la position du planeur?
Stephen
@StephenS Non, les coordonnées doivent identifier où commence le coin supérieur gauche du planeur.
DJMcMayhem
2
the glider is a famous pattern that slowly traverses across the boar.. Lentement? Il s'agit de l'objet à déplacement diagonal le plus rapide du GoL. Il atteint 1/4 de la vitesse de la lumière.
Christoph
1
@Christoph, bon point, nous pouvons observer que sa longueur ne semble pas se contracter dans le sens de la marche, mais je ne connais aucun moyen de mesurer sa masse à des vitesses relativistes.
Wossname

Réponses:

7

MATL , 35 32 30 octets

20*+'|_'5E:21:I$)42b' 34'Q+(

Le code contient des caractères non imprimables. L'entrée est basée sur 0. Essayez-le en ligne!

Luis Mendo
la source
5

V , 31 , 30 octets

10O±°_|ÀGjjÀ|3r*kr*kh.Í*ü_/|&

Essayez-le en ligne!

Hexdump:

00000000: 3130 4fb1 b05f 7c1b c047 6a6a c07c 3372  10O.._|..Gjj.|3r
00000010: 2a6b 722a 6b68 2ecd 2afc 5f2f 7c26       *kr*kh..*._/|&

Cela prend l'entrée en tant qu'arguments de programme et indexée 1.

Explication:

10O                         " On the following 10 lines, insert:
   ±°_                      "   10 '_' characters
      |                     "   And a '|'
       <esc>                " Return to normal mode
            ÀG              " Go to the a'th line
              jj            " Move down two lines
                À|          " Go to the b'th column
                  3r*       " and replace the next 3 characters with asterisks
                     k      " Move up a line
                      r*    " And replace this char with an asterisk
                        kh  " Move up a line and to the left
                          . " And repeat the last change we performed (replace with asterisk)
                            "
Í                           " On every line, substitute:
 *                          "   An asterisk
  ü                         "   OR
   _                        "   An underscore
    /                       " With:
     |&                     "   A bar followed by the matched pattern
DJMcMayhem
la source
Deux questions: quoi? et comment?
Pureferret
1
@Pureferret deux réponses: Langues de golf, SCIENCE (ou il a écrit V XD)
Christopher
1
@Pureferret J'ai ajouté une explication.
DJMcMayhem
2

Gelée , 37 35 octets

ȷ2b1
Ḍ+“£Æßæç‘Ṭ+¢s⁵j3;0$€Fṭ0ị“_*¶|”

Essayez-le en ligne!

Comment ça fonctionne

ȷ2b1                             - the literal [1,1,1,1,...,1,1,1] with 100 elements
Ḍ+“£Æßæç‘Ṭ+¢s⁵j3;0$€Fṭ0ị“_*¶|”   - input (x,y)
Ḍ                                - convert (x,y) to 10*x+y
 +                               - add, to get the five "*" positions,
  “£Æßæç‘                        - the literal [2,13,21,22,23]
         Ṭ                       - return an array with those positions as truthy elements
          +¢                    - Now we format: pad to length 100 with the above literal
            s⁵j3                 - add newlines (represented by 3) to each set of 10
                ;0$€F            - add pipes (represented by 0) to each
                     ṭ0          - add a 0 to the beginning
                       ị“_*¶|”   - index into the string “_*¶|”
fireflame241
la source
1
Comment saisissez-vous / générez-vous vos programmes?
RobotCaleb
1
@RobotCaleb: généralement copier-coller à partir de la page de codes Jelly . Je les exécute sur le nexus TIO lorsque je ne suis pas sur ma machine principale, et un clone du référentiel Jelly sur mon ordinateur principal.
fireflame241
2

Python 2 , 151 octets

Jouera plus au golf.

def f(x,y):r,x=[list('|_'*10+'|')for i in[1]*10],x*2;r[y][x+3]=r[y+1][x+5]=r[y+2][x+1]=r[y+2][x+3]=r[y+2][x+5]='*';print'\n'.join(''.join(i)for i in r)

Essayez-le en ligne!

totalement humain
la source
Si vous êtes prêt à passer à Python 3, vous pouvez enregistrer 3 octets en utilisant à la [*'|_'*10+'|']place de l' list()appel.
L3viathan
2

Perl 6 , 88 octets

->\x,\y{(^10 »*»i X+ ^10).map:{<|* |_>[$_!=
(1-2i|2-i|0|1|2)+x+y*i+2i]~"|
"x(.re==9)}}
  • Des nombres complexes sont utilisés pour représenter les coordonnées.

  • ^10 »*» i X+ ^10 génère la grille de tous les nombres complexes avec des composants entiers de zéro à neuf.

  • Renvoie une liste de chaînes, chacune contenant une ligne.

Sean
la source
Intéressant, je ne savais pas que Perl utilise non-ASCII. Que fait »-il? Comment est-il encodé?
DJMcMayhem
1
C'est juste le DROIT POINTING GUILLEMET d'Unicode, U + 00BB, encodé en UTF-8. En Perl 6, il peut tout aussi bien être écrit sous la forme de deux crochets, >>mais c'est le même nombre d'octets que le guillemet, donc pour le golf, je préfère ce dernier car il a l'air un peu plus classe à mon humble avis. Quant à ce qu'il fait, il transforme l'opérateur qu'il entoure en un "hyper-opérateur" qui s'applique par paire aux listes ou aux valeurs de chaque côté. Ici, il multiplie chaque élément de la gamme 0-9par i, donnant 0, i, 2i, ..., 9i.
Sean
1

Haskell , 96 octets

r=[0..9]
x#y=['|':(r>>=(\i->[last$'_':['*'|elem(i-x,j-y)$zip[1,2,0,1,2][0,1,2,2,2]],'|']))|j<-r]

Prend deux entiers ( xet y) et renvoie une liste de Strings, c'est-à-dire une liste 2D de type [[Char]].


Suite de tests:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let (x, y) = (read $ args !! 0, read $ args !! 1)
    mapM_ putStrLn (x#y)
Quatrième augmenté
la source
1

Mathematica, 115 113 octets

x(a="|_"~Table~10~Table~10;(a[[##]]="|*")&@@(#+x)&/@({{0,1,2,2,2},{1,2,0,1,2}});""<>Riffle[#<>"|"&/@a,"\n"])

Cela prend l'entrée au {row, col}format et est indexé 1, mais peut être transformé en index 0 sans ajouter d'octets.

Quelques notes:

  1. \n est un caractère de nouvelle ligne, prend 1 octet.
  2. est \[Function], prend 3 octets.
  3. est \[Transpose], prend 3 octets.

Notez que "tableau de chaîne" est autorisé, donc je peux simplement supprimer Riffle, donne

Mathematica, 98 97 octets

x(a="|_"~Table~10~Table~10;(a[[##]]="|*")&@@(#+x)&/@({{0,1,2,2,2},{1,2,0,1,2}});#<>"|"&/@a)
user202729
la source
1

Java 8, 165 144 octets

x->y->{String r="";for(int i=0,j;++i<11;r+="\n")for(r+="|",j=0;++j<11;)r+=(i==x&j==y+1)|(i==x+1&j==y+2)|(i==x+2&j>=y&j<y+3)?"*|":"_|";return r;}

Explication:

Essayez-le ici.

x->y->{                  // Method with two integer parameters and String return-type
  String r="";           //  Result-String
  for(int i=0,j;++i<11;  //  Loop (1) over the rows
     r+="\n|")           //    And after each iteration add a new-line to the result-String
    for(r+="|",          //   Start by appending "|" at the start of the line
      j=0;++j<11;        //   Loop (2) over the columns
      r+=(i==x&j==y+1)|(i==x+1&j==y+2)|(i==x+2&j>=y&j<y+3)?
                         //    If this coordinate should contain a '*'
        "*|"             //     Append "*|"
       :                 //    Else:
        "_|"             //     Append "_|"
    );                   //   End of loop (2)
                         //  End of loop (1) (implicit / single-line body)
  return r;              //  Return the result-String
}                        // End of method
Kevin Cruijssen
la source
1
L'explication a un code différent de votre réponse? Regardez la première affectation à r.
Computronium du
@Computronium Oups, merci de l'avoir remarqué, corrigé. Le décompte était correct, l'explication était correcte, le lien TIO était correct, mais la réponse réelle était toujours l'ancienne incorrecte.
Kevin Cruijssen
1

JavaScript (ES6), 99 octets

x=>y=>eval('for(i=0,o="";i<101;o+=((d=i-x-y*10)==1|d==12|d>19&d<23?"|*":"|_")+(++i%10?"":`|\n`))o')

Prend la saisie par curry: f(5)(2)pour x = 5, y = 2. Les coordonnées sont indexées zéro.

Extrait de test

f=
x=>y=>eval('for(i=0,o="";i<101;o+=((d=i-x-y*10)==1|d==12|d>19&d<23?"|*":"|_")+(++i%10?"":`|\n`))o')

xi.oninput=yi.oninput=_=>O.innerHTML=f(xi.value)(yi.value)
O.innerHTML=f(xi.value=5)(yi.value=2)
<style>*{font-family:Consolas;}input{width:2.5em;}</style>
x: <input id="xi" type="number" min="0" max="7">,
y: <input id="yi" type="number" min="0" max="7">
<pre id="O">

Justin Mariner
la source
0

SOGL , 23 octets

LIΖ|_ΟL∙.«."¾'┼ΞΧ⌠²‘5nž

note: ceci s'attend à ce que l'entrée soit indexée 1

Explication:

LI                       push 11
  Ζ|_                    push "|" and "_"
     Ο                   make an altrenates string [with 11 separators, which are "|" and parts "_"]
      L∙                 get an array of 10 of those
        .«               take input and multiply by 2 (x pos)
          .              take input (y pos)
           "¾'┼ΞΧ⌠²‘     push "_|*|__|_|**|*|*" - the glider in the map
                    5n   split into an array with items of length 5
                      ž  replace in the 1st [grid] array at positions [inp1*2, inp2] to 2nd array [glider]
dzaima
la source
0

Python 2 , 133 octets

x,y=input()
a=[[z for z in'_'*10]for o in'|'*10]
b=a[y+2]
a[y][x+1]=a[y+1][x+2]=b[x]=b[x+1]=b[x+2]="*"
for b in a:print o+o.join(b)+o

Essayez-le en ligne!

ElPedro
la source
0

Fusain , 28 octets

UO²¹χ|_J×N²N“ "}IyE%%mLBMφ/”

Essayez-le en ligne! Lien vers le mode verbeux pour la description.

ASCII uniquement
la source
Je suis déçu que le charbon ne soit pas, eh bien ... uniquement ASCII;)
Beta Decay
Vous pouvez supprimer l' |_avant avant \npour enregistrer un octet compressé. (J'ai essayé plusieurs façons d'imprimer le planeur mais aucun n'a sauvé d'octets.)
Neil