Simples hoje. Escreva o programa mais curto que desenhe um "alfabeto dente de serra", com um número inteiro positivo para a altura. Você deve escrever o nome da sua linguagem de programação quando chegar à letra em que começa.
Por exemplo, se sua linguagem é Python e a entrada é 1
a saída, deve ser:
ABCDEFGHIJKLMNOPythonQRSTUVWXYZ
Se a entrada for 2
a saída deve ser:
B D F H J L N Python R T V X Z
A C E G I K M O Q S U W Y
Se a entrada for 4
a saída deve ser:
D J Python V
C E I K O Q U W
B F H L N R T X Z
A G M S Y
Notas
A
sempre começa no canto inferior esquerdo.- A entrada pode ser via stdin ou chamada de função ou similar. Saída para stdout.
- A entrada acima
26
não precisa funcionar. - Sem espaços à direita.
Respostas:
se n tiver a altura:
C + códigos de escape: 81
C: 110
fonte
cc
dá erro "<bebe.c: 1: 17: erro: 'n' não declarado (primeiro uso nesta função)".n
uma variável global definida para um número de sua escolha (como Martin havia perguntado anteriormente).C, 134
Compila no gcc com alguns avisos. Novas linhas não estão incluídas na contagem de caracteres.
122 caracteres se a entrada já estiver armazenada
n
.Obrigado a user2992539 , tolos e edc65 por melhorias.
fonte
puts("")
vez deprintf("\n")
.p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);
vez deif((c-...
n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
TI-BASIC - 148 bytes (texto bruto), 186 bytes (gráfico)
Em resposta ao OP, a maravilhosa TI-83 (e mais recente) vem com um tamanho de 16 x 8 (apenas usando o texto grande padrão) ou com um tamanho de 94 x 62 pixels (que com texto pequeno vale cerca de 10 linhas )
Agora, isso tem um pequeno problema (ao qual eu gostaria de esclarecimentos). As imposições de tamanho não podem ser "ignoradas" pelo intérprete; em outras palavras, se tentássemos definir a altura do dente da serra em 20, isso causaria um erro impedindo a execução completa do código. Eu poderia escrever um código que, em um ambiente infinito, produzisse a saída correta, exceto que não fosse executado na máquina.
Com isso dito, apresento as versões (em execução) dos programas. Todos eles dependem da variável que
N
está sendo definida na altura desejada nas linhas antes de executar:Abordagem de texto não processado
Para que isso funcione independentemente do terminal, mude
For(C,1,16
paraFor(C,1,33
e remova a verificação do limite superior (R<2 or
). Aqui está a saída com5→N
:Abordagem gráfica (isso também pode precisar
AxisOff
de clareza)Este funciona bem, com duas peculiaridades menores. A altura ainda é um problema, embora a largura não seja. No entanto, não espaquei as letras; portanto, em alguns casos (quando a letra começa a subir ou descer do dente de serra), as letras podem ser cortadas por seus sucessores. Para fazê-lo funcionar independentemente do terminal, remova a verificação do limite superior (
R<7 or
). A seguir, segue o gráfico:fonte
0→F
você pode fazer oDelvar F
que economiza 1 byte uma vez tokenizado. Além disso, tenho certeza de que você pode fatorar a saída / texto no final, graças a uma condição de teste booleano inline para a coordenada e, para issoC+7→C
, escreva-a em um breve se (não então / else / end)Pure Bash (sem coreutils), 181 bytes
Saída:
Com o objetivo
cat -E
de provar que não há novas linhas à direita.fonte
JavaScript (ES6) 231
244Editar Correção de bug, algumas reordenações e uma maneira diferente de gerenciar a altura == 1
Além disso, alterada para uma função, pois isso é permitido pelo OP, portanto, nenhum prompt () para entrada
Nenhuma alteração no algoritmo geral que provavelmente NÃO é a melhor para este desafio
Explicado
Exemplos
1
3 subindo
4 no topo
7 descendo
fonte
JAVA (393)
Como sempre, um ótimo idioma para jogar golfe:
fonte
java.util.Arrays;
. :-(String x="ABC...Z";
e substituir ofor(char c...
cabeçalho loop comfor (char c=65;++c<91;){
, Eu amo caracteres em Java =)c=='J'
porc==74
, economiza mais dois bytes no total.public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}
@Quincunx: não há mais necessidade de import.util.Arrays; =)Ruby, 112 bytes
Espera que a entrada seja armazenada
h
.Deixe-me saber se isso precisa de esclarecimentos.
fonte
%
.puts o...
por$><<o...
.J: 75 bytes
Usando a maravilhosa alteração conjunta . Como sempre, o pedido de informação é feio e desajeitado, sem entrar em detalhes por lá. A solução principal leva três gerúndios (uma espécie de verbo com substantivo (também conhecido como função)):
c) gerar a matriz para fazer as pazes
x (a
b
c}) ya) é uma pesquisa bastante trivial na tabela ascii
c) é ainda mais trivial
b) é o interessante. O moral é que os índices horizontais devem começar de 0 a y-1 e recuar, repetindo isso 26 vezes. Por exemplo. para y == 4:
Implementar isso fornece para b):
E sim, fato útil: o nome de J é ... "J".
fonte
3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'
A parte mais feia nessa solução são os 8 caracteres apenas para a altura 1 do caso especial, mas isso provavelmente pode ser reduzido.R (204)
Resultado
fonte
for
declarações (for(i in 1:x)cat(...
por exemplo) ou do espaço ao redor%in%
.Javascript -
248224235Aqui está um link para o jsfiddle, onde você pode testá-lo.
edit: Criou um log do console para uma fonte monoespaçada e removeu as vírgulas se inserir == 1.
fonte
|0
ou~~
. 2: é mais curto criar o array w diretamente, semsplit
.for(w=[],v=0;v<z;v++)w[v]="\n";
(i==9?" ":" ")
você poderia usar(i^9?" ":" ")
, o que salva um personagem.Perl 119
Este programa recebe entrada
STDIN
e imprime o resultado emSTDOUT
.E bônus - uma versão que é contra as regras, pois imprime espaços à direita, mas acrescenta alguma interação:
... e alguns testes abaixo:
fonte
J,
67 5761 caracteresUse como uma função:
Explicação: esta solução usa uma abordagem diferente da outra solução J. Em vez de gerar uma onda dente de serra 0 1 2 3 2 1 0 1 ... , observei o espaçamento entre letras consecutivas. Por exemplo, para n = 4 se você vai do A para cima, enrole para a segunda coluna e alcance B, então você encontrar quatro espaços entre A e B. Este padrão de espaçamento entre as letras é muito regular: para n = 4 a o padrão é 4 4 4 2 2 2 4 4 4 ... .
Portanto, a idéia é primeiro criar a matriz achatada (e transposta) e, em seguida, remodelá-la e inverter para que pareça correta. A rotina de saída é simples (por ser J, pelo menos): dtb é "excluir espaços em branco à direita" e
"1
diz "operar em cada linha". dtb e echo são fornecidos pela biblioteca padrão.Agradecimentos a Zsbán Ambrus por alguma ajuda no golfe.
fonte
MetaPost (207)
Você pode tentar aqui.
fonte
Bash (213)
(223)Pequenos ajustes e estamos reduzidos a 213.
O original tinha um bug menor. Testado e confirmado para funcionar na versão 4.2.37 do bash.
Agradecemos a @manatwork por apontar o bug e algumas dicas.
fonte
;
apenas algumas para torná-lo um pouco mais legível? Não afetará sua pontuação de golfeHaskell - 432 bytes (infelizmente ...)
Isso acabou sendo muito mais difícil do que eu esperava realizar puramente, portanto, a grande contagem de bytes. Tenho certeza de que eu (ou alguém) poderia fazer melhor, mas passei muito tempo nisso. A versão para golfe é a seguinte:
Para executar, carregue o código
ghci
e executeputStr $ s Int
ondeInt
está a altura desejada. Você também pode adicionarsob os
import
s em um arquivo de texto, compile-oghc
e passe a altura como um argumento de linha de comando. Versão não destruída:fonte
const
porpure
(usando a instância Aplicative para funções) para salvar alguns bytes.C # / LINQ:
Breve explicação:
Enumerable.Range(0, N).Select(...)
faz com que uma sequência seja gerada para cada linha que é concatenada em uma única sequência comString.Join(Environment.NewLine, ...)
. Para cada linha com a qual percorremos todos os 26 caracteresEnumerable.Range(0, 26).Select(...)
, o teste no início da expressão lambda determina se um caracter ou espaço deve ser gerado enquantoi==2
verifica "C" e o converte em "C #" ou em dois espaços, dependendo da linha . EleString.Concat(...)
converte o resultadoIEnumerable<char>
de cada linha em uma cadeia de caracteres antes de passá-la paraTrimEnd(...)
remover de forma limpa qualquer espaço em branco à direita.fonte
PHP
(216)(205)Nova versão:
Versão antiga:
espera que a variável $ i seja a altura.
fonte
C,
214169 bytes, sem espaços à direitaAgradeço a @ edc65 e @tolos por suas sugestões úteis.
fonte
scanf
eprintf
) recebam protótipos, caso contrário, você terá um comportamento indefinido.#include <stdio.h>
é, obviamente, a maneira mais curta de fornecer um protótipo para ambosscanf
eprintf
.int
declaração para main se você não estiver retornando nada. Pode cair parênteses extras, substitua' '
com32
eif(!C)m=c
com uma declaração ternarny, e como eu só aprendi (acima) substituaprintf("\n")
computs("")
de 18 caracteres:n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}
Javascript (
204 185150)EDITAR
Economizou 13 bytes ao não criar uma matriz e .join ("\ n"). Necessário virar os loops for. Então, com a ajuda do filho de codificação C, tornou o código muito inteligente para salvar outros 12 bytes.
Aqui está a versão legível mostrando a alteração lógica.
Golfe (161):
Golfe e ofuscado (149):
fonte
.substr(a,1)
=>[a]
h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
K, 60 bytes
Bem simples, e parece que acabei de superar a solução J. :)
Primeiro, gere um alfabeto:
E uma onda dente de serra de comprimento apropriado:
Coloque cada letra do alfabeto com espaços à esquerda:
Coloque o alfabeto e a onda quadrada juntos e gire cada linha:
E a transposição disso é a nossa resposta:
Experimente aqui em OK .
fonte
C:142139 caracteresTerrivelmente longo, espero poder encurtar um pouco:Um pouco mais legível:
Edit: Eu perdi a regra "sem espaços à direita", mas voltarei.
fonte
Scala, 246 bytes
reformatado e comentou:
Resultados:
fonte
Python - 137
Entrada a ser armazenada em ieg
i=8
fonte
Raquete
Aqui está uma versão funcional e limpa: sugestões para encurtá-lo de boas-vindas.
Saída
fonte