Eu recebi esse desafio da Codingame e estou curioso sobre soluções melhores que as minhas:
Dada uma largura via entrada padrão, desenhe um quadrado oco de '#' em determinada largura e comprimento.
Exemplo:
5 resultados em
#####
# #
# #
# #
#####
Eu usei python para resolver isso, por isso estou particularmente interessado em outro código python. Mas fique à vontade para postar sua solução em qualquer idioma que desejar.
code-golf
string
ascii-art
number
code-golf
grid
code-golf
string
ascii-art
code-golf
alphabet
cipher
code-golf
math
number
code-golf
quine
code-golf
palindrome
polyglot
code-golf
number
array-manipulation
counting
logic
code-golf
string
primes
binary
decision-problem
code-golf
ascii-art
kolmogorov-complexity
popularity-contest
code-golf
probability-theory
code-golf
string
code-golf
python
polyglot
programming-puzzle
c++
code-golf
math
code-golf
binary
integer
bitwise
code-golf
rational-numbers
code-golf
string
palindrome
code-golf
ascii-art
code-golf
code-golf
string
fibonacci
code-golf
math
sequence
code-golf
code-golf
string
palindrome
code-golf
string
code-golf
math
primes
source-layout
code-golf
sequence
binary
integer
code-golf
math
arithmetic
game
code-golf
restricted-source
palindrome
code-golf
restricted-source
palindrome
code-golf
combinatorics
binary
code-golf
string
math
code-golf
ascii-art
number
code-golf
cipher
code-golf
base-conversion
counting
code-golf
sequence
random
classification
code-golf
string
subsequence
code-golf
permutations
code-golf
string
code-golf
string
cipher
code-golf
kolmogorov-complexity
arithmetic
integer
code-golf
quine
markov-chain
code-golf
string
code-golf
code-golf
ascii-art
maze
sebingel
fonte
fonte
Respostas:
Pyke, 11 bytes
Experimente aqui!
fonte
Carvão , 6 bytes
Código:
Explicação:
Experimente online!
fonte
N
também pode ser usado em uma expressão, comoint(input())
em Python. Se esse desafio fosse "desenhar um retângulo oco com largura e altura especificadas", a solução poderia serBNN#
.MATL , 12 bytes
Experimente online!
Explicação
fonte
Jolf, 8 bytes
fonte
#
necessários?Python 2,
6254 bytesRetorna
#\n#
quando a entrada é1
Versão de 55 bytes que imprime
Versão de 62 bytes que funciona para qualquer entrada:
fonte
f=
menos que o use - o que não usa.COW ,
426405348330 bytesExperimente online! Altere o número na segunda linha para qualquer número para alterar a saída.
O intérprete de COW que estou usando aqui foi escrito em Perl (e é mais recente que esse desafio), mas você ainda pode obter o mesmo resultado inserindo o código aqui .
Explicação
fonte
Python 2,
5958 bytesrepl.it
Nota: Uma entrada de
1
produz uma saída de##
, mas um quadrado vazio nunca seria produzido para uma entrada menor que3
, então acho que isso é bom.fonte
Java 7,
113112110 bytes1 byte economizado graças a @ OlivierGrégoire ;
2 bytes salvos graças a @cliffroot .
Solução derivada com base na minha resposta Criando um quadrado cruzado .
Experimente aqui.
fonte
for(int i=n,j;i-->0;r+="\n")
? Como não nos importamos com o resultado final ou o resultado final, não faz sentido manter essa ordem, certo?PowerShell v2 +,
4847 bytes-1 byte graças a JohnLBevan
Recebe entrada
$n
, define$z
como$n
hashmarks, com$n
pós-decrementado. Encapsula isso em parens para colocar uma cópia no pipeline. Em seguida, usa o operador de vírgula para criar uma matriz de$n
linhas pré-decrementadas de#
, espaços#
,. Aqueles são deixados no pipeline. Em seguida, coloca$z
novamente no pipeline. A saída via implícitaWrite-Output
no final introduz uma nova linha entre os elementos, então obtemos isso de graça.Como o código do OP não funciona para entrada
n <= 1
, entendi que isso significa que também não precisamos dar suporte à entrada1
.Exemplos
fonte
param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
C, 98 bytes
Uso:
fonte
05AB1E , 20 bytes
Experimente online!
Ou 18 bytes, se pudermos ignorar
1 <= n
:Experimente online!
fonte
WinDbg,
206200182170 bytes-6 bytes para remover parênteses
.if
e usar emj
vez de segundos.if
-18 bytes usando em
f
vez de a.for
para construir as seqüências de caracteres.-12 bytes, sem seqüências de caracteres NULL-termining, passando o comprimento para
da
A entrada é passada através do pseudo-registro
$t0
(por exemplor $t0 = 5; {above-code}
).Explicação:
Saída de amostra:
fonte
JavaScript,
6158 bytesGuardado 3 bytes graças a @lmis !
(Não se lidar com
0
ou1
)Para 13 bytes extras (a 71 bytes ), você pode!
Essas soluções são bastante simples: elas fazem muito armazenamento para não se repetirem , economizando alguns bytes. Desminificado sem o variablsm seria:
Tente!
fonte
!n?'':n==1?'#':
15 bytes adicionais no início do corpo da função, você pode manipular entradas0
e1
.n=>(b='#'[r='repeat'](n))
e, em seguida,#${" "[r](n-=2)}
etc. poupa 3 bytes, evitando a repetiçãorepeat
:)Python, 109 bytes
fonte
list(' '*n)
por[' ']*n
. Você também pode substituirx%(n-1)
comx%~-n
for
bloco em uma compreensão de lista, poderá salvar mais de 20 bytesint()
e os colchetes ao redorprint
.<1
vez de==0
.Ruby, 39 bytes
Acabou sendo mais curto dessa maneira do que todas as coisas chiques que eu estava tentando. Esteja ciente de que isso não suporta 0 ou 1.
fonte
Python 2, 50 bytes
Trabalha para
n>=2
. Imprime cada linha com um sinal de libra,n-2
do símbolo apropriado, depois outro sinal de libra.Aliasing o símbolo da libra fornece o mesmo comprimento:
Outras tentativas:
fonte
Haskell, 49 bytes
Trabalha para
n>=2
. Define a operação de colocar um caractere entre#
uman
sequência terminada em linha de novo caractere e, em seguida, aplica-o duas vezes para criar uma grade 2D.Ligue como:
fonte
C,
8382807877 bytesEsgueirar-se em uma multiplicação e salvar um byte ...
Também conte em j e economize um pouco mais ...
Contagem i de n a zero e salve alguns bytes ...
Um pouco mais fácil de entender e mais 1 byte
fonte
&&
vez de&
?Groovy,
5150 bytesfonte
PHP,
8169 bytesCorra com
-r
; fornecer entrada como argumento.Lança a
DivisionByZeroError
para input =1
.fonte
R, 68
70bytesFunciona para n> 1. Graças a @Billywob por alguns bytes, trocando a matriz por uma matriz.
Usa rbind e cbind para colocar linhas e colunas de
#
s em torno de uma matriz quadrada n-2 de espaços. As novas linhas também estão vinculadas às linhas. A nova linha na fonte é significativa. A entrada é de STDINfonte
\n
. Você pode salvar dois bytes usando emmatrix
vez dearray
.Lisp comum,
150130 bytes-20 graças a @Cyoce e @AlexL.
Uso:
Basicamente, usa
format
duas vezes para a parte superior e inferior e um loop para as linhas intermediárias. A chamada de formato para as partes superior e inferior gera uma linha começando com#
e preenchida com a largura apropriada com#
s. A chamada de formato para as linhas intermediárias funciona da mesma maneira, exceto que o preenchimento é espaços e a#
é impressa no final da linha.Nota: Sou bastante novo no Lisp e espero ter muito espaço para melhorias nisso.
fonte
s
? Ou sou função anônima?dotimes (h (- v 2))
ou poderia serdotimes(h(- v 2))
?Haskell, 67 bytes
Exemplo de uso:
Como funciona:
fonte
Gelatina , 13 bytes
TryItOnline! ou tente de 0 a 15
Quão?
fonte
Pip , 16 bytes
15 bytes de código, +1 para
-n
sinalizador.Funciona para entrada> = 2. Experimente online!
Explicação da versão um pouco não destruída
Primeiro, definimos uma função
y
que recebe um argumento de string, repete-oa-2
vezes (ondea
é a primeira entrada da linha de comando) e agrupa o resultado#
.Em seguida, aplicamos essa função duas vezes - uma vez normalmente e outra vez com o mapa - para obter o quadrado como uma lista de strings:
Para entrada de
4
,(y s)
resulta em"# #"
ey M (y s)
dentro["####"; "# #"; "# #"; "####"]
. Esse último valor é impresso, com o-n
sinalizador fazendo com que seja separado por nova linha.Truques de golfe
Para passar da versão não-golfada para a versão golfada:
Y
é um operador, o que significa que podemos usá-lo em uma expressão. Em vez deY...
seguir(ys)
, podemos simplesmente fazer(Y...s)
.y
; entãoyM(Y_Xa-2WR'#s)
não vai funcionar. Solução: troque os operandos doM
operador ap. Enquanto um deles é uma função e o outro é um tipo iterável, não importa em que ordem eles entram.fonte
Raquete 113 bytes
Ungolfed:
Teste:
Saída:
fonte
SpecBAS - 57 bytes
?
é abreviação dePRINT
,#13
é o retorno de carro que pode ser pregado no final de uma string sem a necessidade de uma+
junção a eles.O apóstrofo move o cursor de impressão uma linha abaixo.
fonte
Preso,
2927 BytesMuito tempo para uma linguagem de "golfe", mas eu esqueci o quanto ela funciona: P
Explicação:
fonte
C #,
154152 bytesGolfe:
Ungolfed:
EDIT1: Otimização da faixa de loop.
fonte
Lit , 117 bytes
Linha dividida em duas para facilitar a leitura:
Uso da amostra:
fonte