Posiziona un aliante!


17

Questo:

inserisci qui la descrizione dell'immagine

è un aliante .

In Conway's Game of Life, l' aliante è un modello famoso che attraversa rapidamente la tavola. Per la sfida di oggi, disegneremo una scheda Game of Life di arte ASCII e posizioneremo un aliante su di essa.

La scheda con cui stiamo iniziando è questa:

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

Questa scheda è composta interamente da tubi |e sottolineature _ed è 10x10. È necessario scrivere un programma o una funzione che accetta due numeri interi, 'x' e 'y', e produce questa stessa scheda con un aliante a quelle coordinate. Ad esempio, se avevi un aliante in posizione (1, 1)(indicizzato 0), devi produrre quanto segue:

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

Puoi supporre che l'aliante non sarà mai posto fuori dai limiti, quindi sia x che y saranno sempre nella [0-7]gamma. Puoi anche scegliere di prendere le coordinate 1 indicizzate, ma devi specificarle nella tua risposta. In questo caso, gli ingressi saranno sempre [1-8]nell'intervallo. Ecco alcuni esempi (tutti con indice 0):

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

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

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

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

Come al solito, puoi prendere il tuo IO in qualsiasi formato ragionevole. Questo include, ma non è limitato a una stringa con newline, una matrice di stringhe, una matrice di stringhe 2d o la scrittura in un file / STDOUT. Si può anche scegliere quale ordine di prendere x e y in.

Dato che si tratta di , le scappatoie standard sono vietate e rendono il codice più corto che puoi!


Possiamo cambiare quale angolo identifica la posizione dell'aliante?
Stephen,

@StephenS No, le coordinate dovrebbero identificare dove inizia l'angolo in alto a sinistra dell'aliante.
DJMcMayhem


2
the glider is a famous pattern that slowly traverses across the boar.. Lentamente? È l'oggetto in movimento diagonale più veloce in GoL. Raggiunge 1/4 della velocità della luce.
Christoph,

1
@Christoph, buon punto, possiamo osservare che la sua lunghezza non sembra contrarsi nella direzione di marcia, ma non conosco alcun modo per misurare la sua massa a velocità relativistiche.
Wossname

Risposte:



5

V , 31 , 30 byte

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

Provalo online!

hexdump:

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

Questo accetta input come argomenti del programma e 1-indicizzato.

Spiegazione:

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

Due domande: cosa? e come?
Pureferret,

1
@Pureferret due risposte: lingue da golf, SCIENZA (o ha scritto V XD)
Christopher

1
@Pureferret Ho aggiunto una spiegazione.
DJMcMayhem

2

Gelatina , 37 35 byte

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

Provalo online!

Come funziona

ȷ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 “_*¶|”

1
Come si digitano / generano i programmi?
RobotCaleb

1
@RobotCaleb: generalmente copia-incolla dalla tabella codici Jelly . Li eseguo sul Nexus TIO quando non sul mio computer principale e un clone del repository Jelly sul mio computer principale.
fireflame241

2

Python 2 , 151 byte

Golferà di più.

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)

Provalo online!


Se sei disposto a passare a Python 3, puoi salvare 3 byte utilizzando [*'|_'*10+'|']invece della list()chiamata.
L3viathan,

2

Perl 6 , 88 byte

->\x,\y{(^10 »*»i X+ ^10).map:{<|* |_>[$_!=
(1-2i|2-i|0|1|2)+x+y*i+2i]~"|
"x(.re==9)}}
  • I numeri complessi sono usati per rappresentare le coordinate.

  • ^10 »*» i X+ ^10 genera la griglia di tutti i numeri complessi con componenti interi da zero a nove.

  • Restituisce un elenco di stringhe, ognuna contenente una riga.


Interessante, non sapevo che Perl utilizza non-ASCII. Cosa fa »? Come viene codificato?
DJMcMayhem

1
È solo GUILLEMET RIGHT POINTING di Unicode, U + 00BB, codificato in UTF-8. In Perl 6 può anche essere scritto come due parentesi angolari >>, ma è lo stesso numero di byte del guillemet, quindi per il golf preferisco quest'ultimo poiché sembra un IMHO un po 'più elegante. Per quanto riguarda ciò che fa, trasforma l'operatore che circonda in un "iperoperatore" che si applica in coppia agli elenchi o ai valori su entrambi i lati. Qui, moltiplica ogni elemento dell'intervallo 0-9per i, dando 0, i, 2i, ..., 9i.
Sean,

1

Haskell , 96 byte

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]

Comprende due numeri interi ( xe y) e restituisce un elenco di Strings, ovvero un elenco di tipo 2D [[Char]].


Suite di test:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let (x, y) = (read $ args !! 0, read $ args !! 1)
    mapM_ putStrLn (x#y)


1

Mathematica, 115 113 byte

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

dove

Questo accetta input in {row, col}formato ed è 1 indicizzato, ma può essere trasformato in 0 indicizzato senza aggiungere byte.

Alcune note:

  1. \n è un carattere di nuova riga, richiede 1 byte.
  2. è \[Function], richiede 3 byte.
  3. è \[Transpose], richiede 3 byte.

Si noti che "array di stringhe" è consentito, quindi posso semplicemente rimuovere Riffle, dà

Mathematica, 98 97 byte

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

1

Java 8, 165 144 byte

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

Spiegazione:

Provalo qui.

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

1
La spiegazione ha un codice diverso dalla tua risposta? Guarda il primo incarico a r.
Computronio

@Computronium Oops, grazie per averlo notato, risolto. Il conteggio dei saluti era corretto, la spiegazione era corretta, il collegamento TIO era corretto, ma la risposta effettiva era ancora quella errata precedente.
Kevin Cruijssen,

1

JavaScript (ES6), 99 byte

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')

Accetta input tramite curry: f(5)(2)per x = 5, y = 2. Le coordinate sono indicizzate a zero.

Test dello snippet

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">


0

SOGL , 23 byte

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

nota: questo prevede che l'input sia 1-indicizzato

Spiegazione:

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]

0

Python 2 , 133 byte

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

Provalo online!


0

Carbone , 28 byte

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

Provalo online! Collegamento alla modalità dettagliata per la descrizione.


Sono deluso dal fatto che Charcoal non lo sia, beh ... solo ASCII;)
Decadimento beta

È possibile rimuovere il |_prima di \nper salvare un byte compresso. (Ho provato diversi modi per stampare l'aliante ma nessuno ha salvato alcun byte.)
Neil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.