Criando um quadrado cruzado
Você deve inserir um número inteiro de um ou mais e gerar um quadrado com qualquer caractere imprimível de sua escolha com uma cruz diagonal no centro.
A idéia geral é que a saída seja um quadrado oco que tenha uma cruz diagonal:
No exemplo acima, os '*' representam a caixa externa e os '#' representam a cruz diagonal.
Observe que o exemplo acima usa dois caracteres diferentes, para que seja mais fácil ver a aparência da saída, seu programa deve usar apenas um caractere.
Um número inteiro de 1 ou mais, é garantido que seja ímpar.
Um quadrado que é composto de um personagem de sua escolha com uma cruz no meio.
A cruz deve ser diagonal
O quadrado pode ser emitido através da função ou gravado na saída
Novas linhas à direita estão bem
Pode imprimir como gráfico, diagrama ou imagem, se você desejar
Funções ou programas completos são permitidos
Você pode obter informações através do seu meio preferido
As brechas padrão não são permitidas
Os programas devem funcionar sem nenhuma declaração adicional, isto usingé C#, devem estar incluídos na entrada
Você pode imprimir a partir de uma função ou imprimir o resultado
Este é o código de golfe, portanto a solução mais curta vence.
Também poderíamos indexar essas saídas 0,1,2,3,...?
@flawr Não estou 100% de certeza que você quer dizer
@TheLethalCoder Ele pergunta se pode receber informações ne imprimir um quadrado de tamanho 2n+1.
@MartinEnder Oh, então, nos meus exemplos, a entrada 1 dá, *mas para ele será a entrada 0?
@TheLethalCoder Sim, e a entrada 1renderia seu exemplo para 3.
MATL , 20 19 17 bytes
Você pode experimentá-lo experimentalmente no MATL online . Pode ser necessário atualizar a página se ela não funcionar.
Versão ASCII: 19 bytes
Mas pelo menos verifique se as linhas são paralelas e retangulares. : D
@flawr Hm? O que você quer dizer?
Pelo menos no meio parece que os lados dos quadrados estão inclinados, mas são apenas ilusões. Ou é? (Também pode ser um buraco negro atrás de minha tela, tempo entortar espaço.)
@flawr Ou talvez vá ao oftalmologista :-P
Não funciona no MATL online, versão 19.0.0. Hmmm ...
Excel VBA, 168 bytes
Acho que o Excel, com a ajuda do VBA, é uma ferramenta eficaz e suficiente para esse desafio. Defina a planilha do Excel como a seguir
Sim, usamos os pequenos pixels clássicos em forma de quadrado, como nos velhos tempos, usando as células em uma planilha como os pixels. Ha-ha ...
Aqui eu uso a célula A1 como entrada e altero a cor da fonte para vermelho. Por que vermelho? Como o vermelho é de três letras, é adequado para jogar golfe. Escreva e execute o seguinte código na janela imediata:
Ungolfed o código:
Loop na diagonal das células do intervalo: Cells(i, i).Interior.Color = vbRed
Etapa final e saída: Cells(i, N + 1 - i).Interior.Color = vbRed
— Anastasiya-Romanova 秀
Cells.RowHeight=48:set r=[A1]:r.Resize(r,r).Interior.Color=0:[B2].Resize(r-2,r-2).Clear:For i=1To[A1]:set r=Union(r,Cells(i,i),Cells(i,r-i+1)):Next:r.Interior.Color=0
Usa a idéia de Jonathan Allan de gerar números binários como:
As linhas são criadas com aritmética de bits e exibidas em binário. Cada parte foi inserida no resto. As peças são produzidas por potências de 2 n(fixas) e i(caindo) via
Lado esquerdo 1
Lado direito n
Diagonais ien/i
Superior e inferior n-1quando i==1ou i==n.
Na verdade, (1) e (4) são combinados produzindo 1quando 1<i<ne de n-1outra forma.
Totalmente alterado:
Retorna uma lista de strings, caracteres usando 1e 0.
-6 bytes graças ao TheBikingViking
Teste em ideone
Anterior Python 2 @ 110
Guardar a 6 bytes, convertendo para um lambda e reestrutura o e-ou expressão: lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)].
@TheBikingViking Ah, você está certo - eu realmente deveria ter jogado um pouco de bobeira (minha intenção original) antes de colocar a idéia lá fora e dormir: p.
3 bytes salvos graças ao @LeakyNun ;
1 byte economizado graças a @ OliverGrégoire na minha resposta para o Draw um quadrado vazio de # com um desafio de largura determinado ;
2 bytes salvos graças a @cliffroot .
Ungolfed & código de teste:
String c(int n){String r="";for(int i=-1,j;++i<n;r+="\n")for(j=0;j<n;r+=i<1|j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ")return r;}4 bytes salvos
@LeakyNun 3 na verdade. Você ainda precisaria do ;por trás do loop for interno.
em primeiro lugar, eu acredito que deve ser i-->0, em vez de n-->0e você também pode usar i*j<1em vez de i<1|j<1 para 2 bytes
@cliffroot Claro que você tinha que encontrar algo. Hehe, jk, obrigado! ;) Eu lembro que eu tenha feito algo parecido antes em outra resposta, então muito ruim eu esqueci de fazer isso aqui ..: S
Como a saída gráfica também é permitida:
Quais saídas, por exemplo
As versões somente ascii seriam:
Isso está usando a indexação 0,1,2,3,...
Como alternativa com a indexação 1,3,7,...:
Bom, não apenas a saída gráfica parece melhor na tela, como também é mais curto em termos de bytes. Geralmente, tornar algo mais gráfico em vez de simples ASCII aumentaria apenas a contagem de bytes (geralmente em muito).
C #, 112 101 bytes
Agradeço ao TheLethalCoder por me lembrar que essas coisas anônimas de instrução ou expressão lambda são permitidas em C #.
Quem disse que o C # não é uma linguagem divertida para o golfe?
— Scepheo
Eu sei direito? 27591 bytes: p
Logotipo, 155 bytes
Solução gráfica, implementada em função
Eu refiz minha resposta para o Triangulo do Alfabeto e mudei um pouco os ângulos. Como antes, rdesenha uma linha de caracteres. Desta vez, a bfunção desenha uma caixa desenhando uma borda reta e uma diagonal, girando e repetindo quatro vezes. Isso faz com que as diagonais sejam desenhadas duas vezes (umas sobre as outras), mas era menos código do que manipulá-las separadamente. Essa resposta também lida corretamente com números pares. Eu tive que adicionar um tratamento especial a uma entrada 1para impedir que ela prosseguisse.
Eu o implementei como uma função, bque assume o tamanho como argumento:
Experimente no intérprete de logotipo da Calormen.com . Para chamá-lo, anexe uma linha e ligue bno seguinte formato:
... ou experimente o prato de amostrador, que extrai quatro amostras nos tamanhos 5, 7, 9 e 11, girando 90 graus entre:
Observe que é mais eficiente expressar a condição usando% em% do que i == 1 | j == 1 | ...
É possível jogar fora um caractere se a entrada for garantida em mais de um: n=scan();for(i in n:1){for(j in n:2){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(i,n))z="*";cat(z)};cat("*\n")}
Economizou 2 bytes, graças ao flawr .
Economizou mais 4 bytes usando a compreensão da lista.
5 bytes economizados combinando o aprimoramento do flawr comany
4 bytes salvos substituindo anyporelem
Eu tenho certeza que isso ainda pode ser melhorado, mas é isso que eu criei por enquanto.
Você está usando [1..s]duas vezes, acho que você pode definir isso where.
Isso resultaria em 102 bytes também, pois teríamos que adicionar um espaço extra antes da palavra-chave where. c s=unlines$(\m->(m#)<$>z)<$>z where z=[1..s];m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
Ah, certo, mas você pode fazer parte de <$>[1..s]uma função, certo? Likec s=unlines$f(\m->f(m#))where m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' ';f=(<$>[1..s])
Bom ponto, isso realmente funciona. :)
PS:c s=unlines$f$f.(#)where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
— flawr 26/08/16
— Shaun Wild
+1! Eu especificaria que é o Java 8, btw. Além disso, você pode jogar um pouco removendo o int antes je usá-lo int i=0,j;. Você também pode substituir todos ||por |e remover os parênteses na verificação ternária. Além disso, você usa s-1quatro vezes, então eu colocaria isso em uma variável. Além disso, você pode alterar ==0para <1. Portanto, no total, ele se torna s->{for(int i=0,j,x=s-1;i<s;i++)for(j=0;j<s;j++)System.out.print(x-i==j|i==j|i<1|j<1|i==x|j==x?j==x?"*\n":"*":" ");}( 116 bytes ) um pouco mais curto que minha resposta ao Java 7 , uma ótima abordagem!
@KevinCruijssen Eu sempre acabo com uma resposta mais curta, mas com mais espaço para melhorias do que você, LMAO. Bem jogou golfe meu amigo.
— Shaun selvagem
Ele Ele. xD Sinta-se à vontade para usar a versão de 116 bytes. É o seu código, apenas joguei um pouco mais. ;) Minha resposta do Java 7 (que infelizmente é mais longa) usa uma abordagem um pouco diferente. Se eu o editasse na versão de 116 bytes, basicamente roubaria sua resposta, o que não quero.
Não adianta apenas copiar e colar seus tacos, normalmente eu posto uma simulação rápida e depois volto a ela mais tarde para ver se perdi alguma coisa que pudesse ser jogada no golfe. Mas você o arruinou para mim :( haha ​​jk
Ah desculpa. A maioria das dicas que eu dei estão realmente presentes nas Dicas para jogar golfe em Java . Acho que sou apenas 2quick4u. ;)
19 bytes graças a Quentin.
7 bytes salvos alternando de um loop aninhado duplo para um loop.
Sugestões de golfe são bem-vindas.
Eu nunca programa em C, mas não é possível colocar o int no primeiro loop for como em Java? Ou seja, int i,j;for(i=0;afor(int i=0,j;
A última vez que usei C, você não conseguiu nem colocar o int i,j;depois do scanf!
Tente n+~i-jetc.
O GCC é bom em remover #includecompletamente.
@ Neil O que você quer dizer com você não conseguiu colocar isso depois disso?
Desajeitado, mas funciona bem o suficiente.
Definitivamente, as sugestões de golfe são bem-vindas, já faz muito tempo que eu não uso o PowerShell.
— fuandon
SILOS , 212 bytes
:) Obrigado por trazer mais atenção a essa linguagem
@RohanJhunjhunwala Gostei de programar nele, obrigado por criar uma linguagem tão brilhante.
GNU sed, 117 114 + 1 (sinalizador r) = 115 bytes
Como o sed não tem suporte nativo para números, a entrada é dada em unário com base nesse consenso . A segunda metade do quadrado é a primeira metade que foi armazenada em ordem inversa no espaço de espera.
Isso foi um retrocesso! Eu usei o módulo tartaruga do python.
Aqui está o resultado quando n = 200:
+1 para criatividade
Tecnicamente, eu poderia remover o material de impressão e ir para algo como
Isso tornaria 135 ou 121 bytes, dependendo se você conta as coisas da sintaxe da função.
Versão legível:
— AmazingDreams
Pitão, 27 25 bytes
Provavelmente jogável.
Modifica uma lista dos caracteres da linha para colocar *o primeiro, o último, o décimo e o penúltimo lugar. A primeira e a última linha iniciam como todas *e as demais como todos os espaços. Também funciona para os pares. Uma lambdaexpressão é provavelmente mais curta que a modificação, mas eu gosto desse método.
Cria um sistema de coordenadas com a origem no centro e calcula onde os *s devem ir. Produz uma matriz de seqüências de caracteres, uma por linha.
Javascript ( 289 270 bytes)
EDIT: economizou 19 bytes graças a Philipp Flenker.
— Paul Schmitz
Desde novas linhas de fuga estão bem, eu acho que você não precisa do cheque desize==1
— Philipp Flenker
@PhilippFlenker Correct.
Corra com a -nbandeira.
A nova linha literal economiza 1 byte acima \nou$/ .
Legível:
O código imprime a linha superior e a salva $c, depois imprime vários espaços com os slots apropriados substituídos pora s, depois imprime a linha superior novamente.
A atribuição à $\variável diz ao intérprete para imprimir o conteúdo (um asterisco, uma nova linha e outro asterisco) depois de cada vez print, mas isso NÃO ocorre depois de a say.
(Não, o SB NÃO usa gráficos indexados em 1 ...)
Carvão, 8 bytes (não competitivo; desafio pós-data do idioma)
Experimente online! Link é a versão detalhada do código. Explicação: Quando usado como parâmetro para o PolygonHollowcomando, +desenha uma caixa e as setas criam as diagonais. Existem outros caracteres de atalho, mas eles precisariam ser redefinidos para serem úteis, por exemplo, Yé equivalente a, ↖↗↓mas se fosse equivalente a ↗↓↖isso, Y+seria suficiente.