Coloque um planador!


17

Este:

insira a descrição da imagem aqui

é um planador .

No Jogo da Vida de Conway, o planador é um famoso padrão que atravessa rapidamente o tabuleiro. Para o desafio de hoje, desenharemos um jogo da vida em arte ASCII e colocaremos um planador nele.

O quadro que estamos começando é o seguinte:

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

Esta placa é composta inteiramente de tubos |e sublinhados _e é 10x10. Você deve escrever um programa ou função que consiga dois números inteiros, 'x' e 'y', e produza a mesma placa com um planador nessas coordenadas. Por exemplo, se você tinha um planador na posição (1, 1)(indexado 0), deve produzir o seguinte:

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

Você pode supor que o planador nunca será colocado fora dos limites; portanto, xey sempre estarão dentro do [0-7]intervalo. Você também pode optar por assumir as coordenadas indexadas em 1, mas você deve especificar isso em sua resposta. Nesse caso, as entradas estarão sempre na [1-8]faixa. Aqui estão alguns exemplos (todos com índice 0):

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

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

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

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

Como de costume, você pode levar seu IO em qualquer formato razoável. Isso inclui, mas não se limita a, uma sequência com novas linhas, uma matriz de sequências, uma matriz 2D de sequências ou a gravação em um arquivo / STDOUT. Você também pode escolher em qual ordem aceitar x e y .

Como se trata de , as brechas padrão são proibidas e tornam o código mais curto possível!


Podemos mudar qual canto identifica a posição do planador?
Stephen

@StephenS Não, as coordenadas devem identificar onde o canto superior esquerdo do planador começa.
DJMcMayhem


2
the glider is a famous pattern that slowly traverses across the boar.. Lentamente? É o objeto móvel diagonal mais rápido do GoL. Atinge 1/4 da velocidade da luz.
Christoph

11
@Christoph, bom ponto, podemos observar que seu comprimento não parece se contrair na direção da viagem, mas eu não conheço nenhuma maneira de medir sua massa em velocidades relativísticas.
Wossname

Respostas:



5

V , 31 , 30 bytes

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

Experimente online!

Hexdump:

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

Isso recebe a entrada como argumentos do programa e é indexada 1.

Explicação:

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

Duas perguntas: o que? e como?
Pureferret

11
@Pureferret duas respostas: linguagens de golfe, a ciência (ou escreveu V XD)
Christopher

11
@Pureferret Adicionei uma explicação.
DJMcMayhem

2

Gelatina , 37 35 bytes

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

Experimente online!

Como funciona

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

11
Como você digita / gera seus programas?
precisa saber é o seguinte

11
@ RobotCaleb: geralmente copiar e colar da página de códigos Jelly . Eu os executo no nexo TIO quando não estiver na minha máquina principal e em um clone do repositório Jelly no meu computador principal.
fireflame241

2

Python 2 , 151 bytes

Golf mais.

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)

Experimente online!


Se você quiser mudar para o Python 3, poderá salvar 3 bytes usando em [*'|_'*10+'|']vez da list()chamada.
L3viathan

2

Perl 6 , 88 bytes

->\x,\y{(^10 »*»i X+ ^10).map:{<|* |_>[$_!=
(1-2i|2-i|0|1|2)+x+y*i+2i]~"|
"x(.re==9)}}
  • Números complexos são usados ​​para representar as coordenadas.

  • ^10 »*» i X+ ^10 gera a grade de todos os números complexos com componentes inteiros de zero a nove.

  • Retorna uma lista de strings, cada uma mantendo uma linha.


Interessante, eu não sabia que o Perl utiliza não-ASCII. O que »faz? Como é codificado?
DJMcMayhem

11
É apenas o RIGHT POINTING GUILLEMET do Unicode, U + 00BB, codificado em UTF-8. No Perl 6, pode ser escrito como dois colchetes angulares >>, mas esse é o mesmo número de bytes que o guillemet; portanto, para o golfe, prefiro o último, pois parece um pouco IMHO de classe. Quanto ao que faz, transforma o operador que rodeia em um "hiperoperador" que se aplica em pares às listas ou valores de ambos os lados. Aqui, ele se multiplica cada elemento da gama 0-9por i, dando 0, i, 2i, ..., 9i.
Sean

1

Haskell , 96 bytes

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]

Pega dois inteiros ( xe y) e retorna uma lista de Strings, ou seja, uma lista 2D do tipo [[Char]].


Suíte de teste:

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 bytes

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

Onde

Isso recebe entrada no {row, col}formato e é indexado em 1, mas pode ser transformado em indexado em 0 sem adicionar bytes.

Algumas notas:

  1. \n é um caractere de nova linha, leva 1 byte.
  2. é \[Function], leva 3 bytes.
  3. é \[Transpose], leva 3 bytes.

Note que "array de string" é permitido, então eu posso remover Riffle , dá

Mathematica, 98 97 bytes

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

1

Java 8, 165 144 bytes

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

Explicação:

Experimente aqui.

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

11
A explicação tem um código diferente da sua resposta? Veja a primeira atribuição a r.
Computronium

@Computronium Opa, obrigado por reparar, corrigido. O bye-contagem foi correta, explicação era correta, TIO-link foi correta, mas a resposta real ainda era o antigo incorreta ..
Kevin Cruijssen

1

JavaScript (ES6), 99 bytes

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

Toma entrada através de currying: f(5)(2) para x = 5, y = 2. As coordenadas são indexadas a zero.

Snippet de teste

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 bytes

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

Nota: isso espera que a entrada seja indexada 1

Explicação:

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

Carvão , 28 bytes

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

Experimente online! Link para o modo detalhado para descrição.


Estou desapontado que o carvão vegetal não seja, bem ... somente ASCII;)
Decay Beta

Você pode remover o |_antes do \npara salvar um byte compactado. (Eu tentei várias maneiras de imprimir o planador mas nenhum salva quaisquer bytes.)
Neil
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.