Setas de impressão simples


23

Para a prática de golfe, tenho feito as tarefas na aula de Introdução à Python da minha namorada. Descobri que, para essa tarefa, havia várias estratégias muito próximas na contagem de caracteres, e tenho certeza que as pessoas aqui podem encontrar maneiras ainda melhores. Embora eu esteja mais interessado em maneiras de fazer isso em Python, eu gostaria de saber o máximo de golfe que esse programa pode obter, portanto, esse é o código de golfe e as respostas mais curtas.

As regras:

A tarefa está descrita abaixo. O usuário deve ser solicitado a inserir duas vezes, embora os prompts não precisem dizer nada e possam estar em uma ordem diferente.

Aplicam-se brechas padrão.


Tarefa 3: Setas

Escreva um programa que solicite ao usuário um número de colunas e ele imprima o padrão como visto abaixo. Você pode assumir que o usuário fornecerá números positivos. Seu programa deve lidar com as setas esquerda e direita. Aqui estão alguns exemplos de execução:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *

23
Isso parece homewo ... oh, deixa pra lá.
TessellatingHeckler

São permitidos espaços à direita em cada linha?
Lirtosiast

@ThomasKwa yes.
aks.

Podemos usar caracteres de controle para mover o cursor, como nesta pergunta ?
Lirtosiast

@ThomasKwa Claro ... embora eu sinceramente não tenha certeza do que isso significa e esteja interessado em vê-lo em ação.
aks.

Respostas:


8

Pitão, 23 bytes

Pode ou não ser válido, com base na resposta a este comentário . Independentemente disso, achei isso legal e, se for inválido, as outras respostas de Pyth também são inválidas. ;) Bem, é válido , porque eu aparentemente perdi o óbvio. : /

EDIT: Eu ganhei !!!! YESSS !!!! Primeira vez! : D

j+_J_Wqz\r.e+*dkb*\*QtJ

Demonstração ao vivo.


1
m+*\ d\*Qem vez de enumerar as coisas. Salva 2 bytes.
Jakube 11/10

7

Pyth, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

Experimente online

A idéia básica aqui é criar uma string que, por exemplo, 5, fique assim:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

E depois vire de cabeça para baixo se recebermos lcomo entrada. Depois, pegamos todas as últimas input-1linhas dessa sequência e as imprimimos.


7

Python 2, 81 79 bytes

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Ainda pode ser jogável, mas veremos :)


2
Boa idéia de ter as entradas como variáveis le r. Eu não tinha percebido que a entrada está evalno mesmo ambiente que o código.
Xnor

4

Pitão, 30 28 27 bytes

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

Experimente online.

Aparentemente, atualmente estou empatado com FryAmTheEggman com uma abordagem completamente diferente. (Eu acho que esse é engenhoso.)

Exemplo

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

Explicação

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print

@ Pietu1998 Ainda estou interessado em uma descrição básica do que você está fazendo. Vejo que você só tem 1 loop e nenhum mapa ou lambda ...
aks.

@aks. Eu adicionei uma explicação.
PurkkaKoodari

4

PowerShell, 91 85 102 Bytes

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Obtém as colunas e as armazena $c. Subtraímos um porque cada coluna também possui um *e estamos interessados ​​apenas em quantos espaços são necessários.
  • Se o valor digitado for a 1, imprima *e saia - o restante do script não faz diferença. +
  • A próxima seção primeiro obtém a direção e testa se é -eqnecessário l, depois cria uma matriz com base na indexação em uma matriz de matrizes geradas dinamicamente com base no valor de $c. Magia. Basicamente, é quantos espaços por linha precisamos.
  • Por exemplo, para 5 resta coleção seria válida (0,1,2,3,4,3,2,1,0).
  • Pega a matriz e a canaliza em um %loop Foreach-Object , onde produzimos uma sequência de X números de espaços e, em seguida, o*

Exemplo de uso:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Editar - variável removida $ecanalizando a coleção diretamente
Edit2 - responde corretamente por 1 coluna, agora

+ Se ainda for obrigatório usar a entrada como direção para as setas de 1 coluna (eu afirmo que não), podemos trocar o posicionamento do Read-Hoste perder mais alguns bytes reintroduzindo a $dvariável, por 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}

Tente colocar 1 coluna e esquerda - você obtém uma seta para a direita com 2 colunas. Tente colocar uma coluna à direita - você recebe o erro 'Argumento especificado fora do intervalo de valores válidos'. Eu pensei que seu 85 seria possível vencer, evitando os intervalos de duplicação. Mas eu não posso nem chegar perto. Contando com uma seta de 1 coluna, atualmente estou com 112 caracteres. > _ <
TessellatingHeckler

1
@TessellatingHeckler Obrigado - corrigido.
AdmBorkBork

1
Isso é empurrado para o seu até 102 eo meu é para baixo para 102. Eu não posso descobrir a olhar para isso por mais tempo, mas deve haver um mais posso apagar ...: D
TessellatingHeckler

4

TI-BASIC, 75 65 57 54 50 47 Bytes

Agradecemos a @ThomasKwa pelo cálculo correto de bytes e por 10 bytes de golfe .

Testado na minha TI-84 + Silver Edition.

Primeira submissão do TI-BASIC, sugestões de golfe são bem-vindas (ainda não sei muitos truques). Se o nome representa um fator na memória mostrada, esse era de 3 caracteres em vez de 1 (observei a contagem de bytes na própria calculadora). Este programa é limitado pelas outputrestrições da função (penso nas setas de comprimento 4), mas provavelmente poderia mudar para text, que é exibido graficamente se o comprimento for muito baixo.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Observe que isso também não limpa a tela nem a pausa.

Eu realmente sinto que a equação que estou usando pode ser mais jogada no golfe. Também parece errado excluir as aspas finais.


@ThomasKwa Thanks! Eu farei isso agora.
cole

2
Segundo: Ansé gratuito, porque você não o usa para entrada e Output(não modifica Ans. Use-o e livre-se da variável A. Você pode atribuir usando -2(Str1="R; não há necessidade de um condicional.
lirtosiast

1
@ThomasKwa, obrigado pelas dicas, parece que tenho um caminho a percorrer no TI-BASIC.
Cole

3
Terceiro: não há realmente necessidade de multiplicar o valor por -2. Basta fazer Str1="Rpara a segunda linha. Isso cria a quarta linha Output(I,(1-2Ans)abs(I-L)+AL+1,"*, que lhe dá mais 4 bytes. Mas espere, há um idioma para (1-2Ans)itit cos(πAns), que economiza um byte e mais um porque temos o parêntese aberto de graça!
lirtosiast

1
Tornar-se proficiente no golfe em qualquer idioma requer apenas prática; você vai chegar lá.
lirtosiast

2

Python 2, 89 bytes

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Funciona quase de forma idêntica à minha resposta Pyth, apenas calculando o número correto de espaços em tempo real.


2

PowerShell, 104 102 97 bytes

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB se você deseja executá-lo novamente, abra um novo PowerShell ou rv oredefina o estado da variável.

Comparado com o quão concisos os outros são, isso dói. [Dói menos aos 97 do que aos 122]. Duas partes, nenhuma delas muito surpreendente; lê um número de colunas, usa um substituto de operador ternário de índice de matriz para obter um deslocamento e executa uma função de onda iniciada no deslocamento (e um ajuste para que não caia demais mod 0).

(E ai, eu passei anos nessa função de onda, incapaz de detectar meu mal-entendido e digitando todas as parênteses honestas de que não é LISP)?


2
Isso é brilhante demais.
AdmBorkBork

2

Python 2, 98 89 bytes

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Um pouco mais demorado.


Uso

$ python2 test.py
3
"l"
  *
 *
*
 *
  *

Também aparentemente quebrado. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler

Verifique o uso. @TessellatingHeckler
Zach Gates

Ahh, inteligente. Mas suas setas de uma coluna têm duas pontas de seta. (Eu acho que você poderia jogar ainda mais, não armazenando ie d, apenas usando range(P())e if P()=='l'...)
TessellatingHeckler

Obrigado pelas sugestões! Eu também consertei as setas duplas. @TessellatingHeckler
Zach Gates

Não é possível testar o atm, mas você provavelmente poderia fazer algo como, f=[...][::2*('r'>input())-1]na verdade
SP3000

2

Perl, 85 bytes

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Uso:

perl 59874.pl <<< '6
r'

4
Eu gosto de como você nomear seu scripts de algo que você vai reconhecê-los por mais tarde ...
mbomb007

@ mbomb007 haha! Sabe, eu não cito meus scripts assim, mas achei melhor nomear algo simples para instruções de uso ... simplearrows2.plnão parece tão bom! : P
Dom Hastings

2

PHP, 156 bytes

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Cria duas matrizes, assim:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

usa a união de matriz $s+$tou $t+$spara combiná-los e array_spliceremover o elemento no meio. Finalmente, use<?=join()


com argumentos de CLI em vez de stdin meu código seria de 8 bytes mais curto;)
Fabian Schmengler

2

Python 2, 111 109 104 bytes

Solução bastante simples. Tenho certeza de que pode jogar mais. Para quem não sabe, ~x+né o mesmo que n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

Experimente online

Edit : Isso foi jogado na última linha:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")

2

Matlab, 109 105 96 bytes

Obrigado a @beaker por me salvar 9 bytes .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))

Você pode salvar 9 bytes se você substituir as duas linhas inserindo os códigos ASCII comx=x*10+32;
copo

@beaker Muito inteligente, obrigado!
Luis Mendo

1

Ruby, 118 bytes

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - duas vezes, é claro ...

l,d=gets.split; - obtenha a entrada

l=l.to_i; - altera o comprimento para um número inteiro

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - crie uma matriz do intervalo de 0 ao comprimento

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - itere, vire as cordas para fazer as flechas

Não é exatamente o melhor golfe de todos os tempos, mas, ei.


1

PowerShell, 98 94 bytes

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Se eu conseguisse encontrar uma maneira de direcionar o Read-Host para dentro do loop foreach-object, mas solicitá-lo apenas uma vez, poderei salvar alguns bytes.

Editar: 94 bytes. Em vez de testar para a esquerda, teste para a direita (simplifica o loop).

Original 98 bytes:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Redefinindo a $_variável - Hobbit complicado. Muito esperto, e eu aprendi algo hoje.
AdmBorkBork

@TimmyD Muito complicado. E então mude a instrução if para economizar ainda mais.
Jonathan Leech-Pepin

0

> <> , 60 bytes

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

2 bytes desperdiçados na linha de fundo, que irritante!

Devido a como a entrada funciona em> <>, não é possível 'esperar' pela entrada - o icomando verifica se um caractere de entrada está disponível no STDIN. Se houver, empurra o valor ASCII desse caractere e empurra -1, se não.

Isso significa que, para usar este programa, o número e a direção já devem estar prontos no STDIN, por exemplo, 3rpara uma seta de tamanho 3 apontando para a direita. Não tenho certeza se isso desqualifica esta entrada, deixe-me saber sua opinião: o)

Também vou escrever uma descrição, se alguém quiser.


Em certo sentido, ele aguarda a entrada se você tentar executá-lo em um shell, então acho que está bem. Estou mais preocupado com o fato de que este espera que a entrada para ser um único dígito embora (a menos que eu estou destinado a entrada :para 10?)
SP3000

Um ponto excelente, eu não tinha pensado em mais de 9. Voltar para a prancheta!
Sok

1
Deixei um comentário sobre a questão principal para um esclarecimento, por precaução.
Sp3000

0

PHP, 154 bytes

Parece realmente repetitivo, mas faz o desejado:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

Executa a partir da linha de comando como:

php arrow.php 5 l
php arrow.php 5 r

-1

Python, 88 bytes

Editado

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
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.