Em uma pergunta de stackoverflow agora excluída, alguém postou o seguinte:
Escreva um programa ou função para imprimir padrões alternados *
e com #
base em um número inteiro n
. Alguns exemplos:
Entrada: n=1
Saída:
*
Entrada n=5
Saída de :
*####
###**
***##
###**
*####
Entrada: n=8
Saída:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Uma vez que parecia um desafio muito legal de código de golfe, aqui está.
Como esses padrões são construídos?
A primeira linha começa com uma única *
, seguida pela n-1
quantidade de final #
.
A segunda linha contém duas *
, com n-2
quantidade de liderança #
.
A terceira linha começa com três *
, seguidas pela n-3
quantidade de#
.
etc.
Quando chegamos ao meio (n/2
), contamos novamente com a quantidade de *
, que pode ser vista nos exemplos acima.
Observe que, para números de entrada ímpares, o par de linhas inversas (portanto, a primeira e a última; a segunda e a penúltima; etc.) são exatamente iguais. No n=5
exemplo, a primeira e a última linha são *####
; a segunda e a penúltima linha são ###**
.
Para números de entrada pares, no entanto, o par de linhas inversas é invertido. No n=8
exemplo, a primeira e a última linha são *#######
e #######*
; a segunda e a penúltima linha são######**
e **######
; etc.
Regras do desafio:
- Você pode usar dois caracteres distintos para impressão em vez de
*
e#
. Você pode usarA
eB
;3
e7
;<
e>
; etc. Por favor, indique em suas respostas o que você usou. - Você pode assumir
n
que será um número inteiro positivo (>= 1
) - Você tem permissão para produzir uma lista / matriz de cadeias para cada linha ou uma matriz 2D de caracteres, em vez de imprimi-las em STDOUT.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste (primeiro n=1
a n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Respostas:
Geléia , 9 bytes
Experimente online!
Explicação
fonte
Python 2 , 62 bytes
Experimente online!
Usos
x
e espaço.As linhas são calculadas assim:
Usando o
%*s
especificador para escolher entren
e-n
.fonte
Perl 6 , 57 bytes
Experimente online!
Usa o mesmo método da resposta Python de Lynn . Saídas usando
*
e espaço.fonte
MATL,
343118 bytesExperimente no MATL Online
Usa 0 para * e 1 para #. Baseado na resposta de Lynn's Jelly .
Resposta mais antiga, 31 bytes:
Experimente no MATL Online
Usa 1 para * e 0 para #.
fonte
APL (Dyalog Classic) , 18 bytes
Experimente online!
saídas em
AB
vez de*#
⎕
entrada avaliada f—⍳⎕
o vetor0 1 ... n-1
⊢⌊⌽
min (⌊
) entre si (⊢
) e o reverso (⌽
) - ver trens⊂>⊢⌊⌽
onde o⍳
vetor como um todo (⊂
) é menor que cada um de seus⊢⌊⌽
- retorna um vetor de vetores booleanos (0/1)⊢∘⌽\
reverter todos os outros vetores↑
misture em uma matriz⎕a
o alfabeto em maiúsculas,'AB
...Z'
⎕a[
]
substitua0
1
por'A'
'B'
fonte
⎕a[...}
convertê-los paraA
eB
sem espaços é mais curto do que mantê-los como0
e1
sem espaços, considerando que você o usou, mas é curioso saber se há muita diferença de bytes se você os mantiver como0
e1
.⎕d[
...]
ou⊃¨⍕¨
... Na última expressão⍕¨
é "formato cada" - ele transforma cada número em um vetor de caracteres aninhado , então precisamos "primeiro cada "(⊃¨
) para obter apenas escalares de caracteres (e, portanto, nenhum espaço em branco ao imprimir).Carvão , 21 bytes
Experimente online! Usos
0
e1
. Link é uma versão detalhada do código e inclui§*#
quais traduzem a saída para*
e#
na pergunta. Explicação:fonte
Gelatina ,
1215 bytes+3 correção
n=1
de bug de borda :(Um programa completo que aceita um número inteiro que imprime a saída conforme definido no OP usando
0
e1
para*
e#
respectivamente.Experimente online!
Quão?
fonte
Gelatina , 15 bytes
Experimente online!
Programa completo.
*
=1
#
=0
fonte
Java 10, 145 bytes
Todo o ternário torna um pouco confuso, mas funciona bem. Tentei aplainar o loop aninhado e várias outras coisas, mas elas apenas aumentaram a contagem de bytes. Experimente online aqui .
Ungolfed:
Java
811,179127 bytesExperimente on-line aqui (o TIO ainda não possui o Java 11, portanto, ele usa um método personalizado que resulta na mesma contagem de bytes que
String#repeat()
).Agradecimentos a Kevin Cruijssen por jogar 52 bytes de forma impressionante!
Ungolfed:
fonte
"*".repeat(...)
e"#".repeat(...)
(bem como devolver uma cadeia em vez de imprimir diretamente e golfen-j-1
an+~j
):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
método é realmente bom para jogar golfe.Lua ,
148133 BytesExperimente online!
-15 bytes graças a @KevinCruijssen e @JoKing.
fonte
(n+1)/2
para-~n/2
;or n-i+1
paraor-~n-i
;i%2==0
parai%2<1
; ereverse() or
parareverse()or
. Além disso, sua versão do TIO e contagem de bytes contêm um ponto-e-vírgula à direita, o que não parece ser necessário. Boa primeira resposta, no entanto. +1 de mim. E bem-vindo ao PPCG! :)-~n
está fazendo nas suas sugestões? Definitivamente funciona, mas não entendo o porquê.~
é um operador de negação bit a bit unário. O que é importante para o codegolfing, no entanto, é que~i
possui o mesmo valor que-i-1
. Portanto, podemos usar em-~i
vez dei+1
e em~-i
vez dei-1
. Isso é útil em dois casos, que eu poderia utilizar em sua resposta: livrar-se dos parênteses, porque-
e~
ter precedência do operador sobre outras operações matemáticas, portanto(n+1)/2
pode ser-~n/2
. E a outra parte útil é livrar-se de espaços em alguns casos, como fiz comor-~n-i
.~
parax+1
ex-1
e Use unário~
paraa-b-1
ea+b+1
. Todas as dicas gerais, bem como dicas específicas de idiomas ( dicas para jogar golfe em Lua , neste caso), podem ser interessantes para ler. :)Kotlin , 86 bytes
Experimente online!
Usa
x
e espaço como símbolos de saída. Deriva da resposta de Lynnfonte
Perl 5 +
-pa -MPOSIX -M5.010
, 58 bytesExperimente online!
fonte
C (gcc) ,
10499 bytesExperimente online!
fonte
C (gcc) ,
118108 bytesEste não vai ganhar, mas é uma abordagem diferente (ou pelo menos acho que sim!) Em vez de fazer manipulações de cordas, uso o fato de que10x- 1 sobre [ 1 .. n ] = { 9 , 99 , 999 , . . . } , que pode ser multiplicado para obter o padrão apropriado;
printf()
então faz o preenchimento zero para justificação à direita.Infelizmente,
int
só tem alcance suficiente para fazer até 9 dígitos (em plataformas de 32 bits), então você precisa ir paralong
padrões maiores; uma linguagem que faz aritmética MP nativamente pode ser capaz de usar isso para alguma coisa.Agradecimentos a ceilingcat pela sugestão.
Experimente online!
Prova de conceito de que isso funciona com aritmética MP:
C # (compilador C # mono) ,
187165 bytes(143 bytes + 22 bytes para
using System.Numerics;
o cabeçalho)Experimente online!
fonte
Vim, 99 pressionamentos de tecla
É sempre interessante tentar fazer o vim com argumentos de entrada. É muito antinatural, então não será incrivelmente curto. Provavelmente existem outras boas abordagens para isso.
A entrada é assumida como sendo por si só em um buffer. Presume-se que os registros estejam vazios. Supõe-se que o editor seja alto o suficiente para conter o resultado sem rolar (isso pode ser tecnicamente evitado com o custo de algumas teclas).
Explicação
E na base64, com caracteres reais (insira
input
e pressione as teclaskeys
e execute usandovim -u NONE -s keys input
)fonte
R , 75 bytes
Experimente online!
n
como parâmetro e retornando uma matriz de0/1
onde0
corresponde'*'
e1
corresponde a'#'
fonte
K (ngn / k) , 22 bytes
Experimente online!
{
}
função com argumentox
!x
a lista(0;1;
...;x-1)
i:
atribuir ai
i&|i
mínimos (&
)i
e seu inverso (|
)i>/:
compare com maior que (>
) emi
relação a cada elemento da lista à direita (/:
) - retorne uma matriz booleana (lista de listas)i|:/'
para cada ('
) j ini
, invertida (|:
- precisamos que a:
força|
seja unária) o elemento correspondente j vezes (n f/ x
aplica-sef
n
vezesx
). Efetivamente, inverta todas as outras linhas."*#"
use elementos da matriz como índices na string"*#"
fonte