Desenhe o alfabeto dente de serra


42

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 é 1a saída, deve ser:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Se a entrada for 2a 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 4a 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 26não precisa funcionar.
  • Sem espaços à direita.

9
São permitidas linguagens de programação com nomes de uma letra? (C, J, K, etc.)
isaacg

@isaacg Claro. Eu imagino que pode ser mais fácil neles.
22614 Calvin's Hobbies

1
Pode-se simplesmente esperar que a entrada seja armazenada em uma variável?
Martin Ender

@ MartinBüttner Sim, tudo bem.
22714 Calvin's Hobbies

13
Aliás, esta não é uma onda em dente de serra, isto é uma onda triangular: P
QWR

Respostas:


14

se n tiver a altura:

C + códigos de escape: 81

x;main(y){for(y=n--;x<26;x++)printf("\033[%d;%dH%c",n?x/n&1?y++:y--:y,x+1,x+65);}

C: 110

x;char a[702]={[0 ...701]=32};main(y){for(y=--n;x<26;a[x*27-1]=10)a[27*(n?x/n&1?y++:y--:y)+x]=x+++65;puts(a);}

5
Eu admito derrota. O que na Terra. : D
Martin Ender

Posso pedir instruções de compilação? ccdá erro "<bebe.c: 1: 17: erro: 'n' não declarado (primeiro uso nesta função)".
manatwork

2
bem, é muito pior do que parece. primeiro, o segundo contém espaços à direita; segundo, os dois se baseiam em numa variável global definida para um número de sua escolha (como Martin havia perguntado anteriormente).
29283 bebe

Ah, então eu tenho que fornecer n da maneira que puder. Ri muito. Ainda impressionado.
29814 manatwork

19

C, 134

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);
}

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.


3
Você pode usar em puts("")vez de printf("\n").
Somnium 28/07

2
Salve 4 caracteres com em p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);vez deif((c-...

1
Desculpe pelo comentário anterior (excluído) .Eu estava errado. Brincando com sinais e abusando do fato de que o primeiro argumento de main é 1 se não houver parâmetros: 134n,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); }
edc65

13

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 Nestá sendo definida na altura desejada nas linhas antes de executar:

  • Abordagem de texto não processado

    :ClrHome
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :8→R
    :For(C,1,16
    :If N=1
    :Then
    :0→F
    :Else
    :If R<2 or 10-R>N
    :1→F
    :If R>7
    :-1→F
    :End
    :If C≠20
    :Then
    :Output(R,C,sub(Str1,C,1
    :Else
    :Output(R,C,sub(Str1,C,8
    :C+7→C
    :End
    :R+F→R
    :End
    

    Para que isso funcione independentemente do terminal, mude For(C,1,16para For(C,1,33e remova a verificação do limite superior ( R<2 or). Aqui está a saída com 5→N:

    insira a descrição da imagem aqui

  • Abordagem gráfica (isso também pode precisar AxisOffde clareza)

    :ClrDraw
    :N*6→N
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :57→R
    :For(C,1,56
    :If N=6
    :Then
    :0→F
    :Else
    :If R<7 or 64-R>N
    :6→F
    :If R>51
    :-6→F
    :End
    :If C≠20
    :Then
    :If C>50
    :Then
    :Text(R,C,sub(Str1,C-23,1
    :Else
    :Text(R,C,sub(Str1,C,1
    :End
    :Else
    :Text(R,C,sub(Str1,C,8
    :C+30→C
    :End
    :R+F→R
    :End
    

    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:

    insira a descrição da imagem aqui


Agora eu tenho que portar isso para a minha calculadora gráfica
Liam McInroy

Comentário rápido: em vez de 0→Fvocê pode fazer o Delvar Fque 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 isso C+7→C, escreva-a em um breve se (não então / else / end)
Adriweb

11

Pure Bash (sem coreutils), 181 bytes

m=$1
for l in A Bash {C..Z};{
((m))||s=++
((m>$1-2))&&s=--
for((m=$1==1?1:m,m$s,i=0;i<$1;i++));{
((i-m))&&a[i]+=${l//?/ }||a[i]+=$l
}
}
shopt -s extglob
printf %s\\n "${a[@]%%+( )}"

Saída:

Com o objetivo cat -Ede provar que não há novas linhas à direita.

$ ./sawtooth.sh 1 | cat -E
ABashCDEFGHIJKLMNOPQRSTUVWXYZ$
$ ./sawtooth.sh 5 | cat -E
       E       M       U$
      D F     L N     T V$
     C   G   K   O   S   W$
 Bash     H J     P R     X Z$
A          I       Q       Y$
$ 

10

JavaScript (ES6) 231 244

Editar 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

F=h=>{for(p=s=[i=z=b=t=''];++p<h;)i=1,z=b=' ',s[p]=t;for(p=--h,k=64;++k<91;)s[p]+=t+String.fromCharCode(k),k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))),p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b;console.log(s.join('\n'))}

Explicado

F=h=>{
  // row in s for output must be initialized to ''. In the same step I make other initializations
  for(p=s=[i=z=b=t='']; ++p < h;) // initialize for height 1, all increment and spacing can be null
    i=1,z=b=' ',s[p]=t; // the for body is entered only if height > 1, initializing spacing and increment to the right values
  for(p=--h,k=64;++k<91;)
    s[p]+=t+String.fromCharCode(k),
    k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))), // if 'J' modify each line of output adding the name or spacing
    p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b; // index bouncing
  console.log(s.join('\n'))
}

Exemplos

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 subindo

  C   G            K   O   S   W
 B D F H Javascript L N P R T V X Z
A   E   I            M   Q   U   Y

4 no topo

   D     Javascript     P     V
  C E   I          K   O Q   U W
 B   F H            L N   R T   X Z
A     G              M     S     Y

7 descendo

      G                    S
     F H                  R T
    E   I                Q   U
   D     Javascript     P     V
  C                K   O       W
 B                  L N         X Z
A                    M           Y

9

JAVA (393)

Como sempre, um ótimo idioma para jogar golfe:

public class P{public static void main(String[]a){int h=Integer.valueOf(a[0]);String x="ABCDEFGHIJKLMNOPQRSTUVWXYZ";String[]l=new String[h];Arrays.fill(l,"");int i=h-1;int d=-1;for(char c:x.toCharArray()){for(int n=0;n<l.length;n++){String k=(n==i)?(c=='J')?"Java":c+"":(c=='J')?"    ":" ";l[n]+=k;}if(i==0&&d==-1)d=1;if(i==h-1&&d==1)d=-1;if(h>1)i+=d;}for(String s:l){System.out.println(s);}}}

2
Infelizmente, você esqueceu a importação java.util.Arrays;. :-(
Justin

Mas você pode imporve seu código: eliminar String x="ABC...Z";e substituir o for(char c...cabeçalho loop com for (char c=65;++c<91;){, Eu amo caracteres em Java =)
flawr

Além disso, você pode substituir c=='J'por c==74, economiza mais dois bytes no total.
flawr

2
Tenho certeza de que você pode melhorar ainda mais se condensar o se usar alguns XORs para essas declarações if, mas aqui minha versão aprimorada: (325) 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; =)
flawr

9

Ruby, 112 bytes

o="#{' '*29}
"*h
26.times{|i|o[(h-i%(h<2?1:2*h-2)-1).abs*30+i+(i>17?3:0)]=(i+65).chr}
puts o.gsub('R   ','Ruby')

Espera que a entrada seja armazenada h.

Deixe-me saber se isso precisa de esclarecimentos.


Muito menor, mas você pode remover o espaço depois %.
Hobbies de Calvin

@ Calvin'sHobbies Ha, eu não confiava na minha sintaxe destacando lá: D. Irá corrigir isso mais tarde.
Martin Ender

Você pode substituir puts o...por $><<o....
Jordânia

6

J: 75 bytes

NB. without IO |:26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}5
2(1!:2)~|.26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}".1!:1[1

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)):

  • a) gerando o alfabeto
  • b) gerar os índices
  • c) gerar a matriz para fazer as pazes

    x (a bc}) y

a) é 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:

0 1 2 3 2 1 0 1 2 3 2 1 ...

Implementar isso fornece para b):

($(,|.@}.@}:)@i.) <"1@,. i.@[)       NB. is equivalent too
(tine0 tine1 tine2)                  NB. a fork with tines defined as
tine0 =: 
  hook0 =: hook0_0 hook0_1           NB. a dyadic hook: x (g h) y -: x g h y
     hook0_0 =: $                    NB. reshape
     hook0_1 =: (hook1_0 hook1_1)@i. NB. do hook1 after making 0-y
       hook1_0=: ,                   NB. append to self
       hook1_1=: |.@}.@}:            NB. rotated version of y after beheading and curtailing
tine2 =: i.@[                  NB. generate 0-x
tine1 =: <"1@,.                NB. glue together coordinates.

E sim, fato útil: o nome de J é ... "J".


Vale a pena usar alterar? Parece-me mais fácil dizer algo como 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.
22414 b_jonas

Obrigado pela sugestão! O seu é realmente muito mais curto, e a emenda provavelmente é um exagero. Como é tão diferente, talvez você queira publicá-lo como uma solução?
Jpjacobs 30/07/14

A especificação diz "sem espaços finais" e minha solução imprime espaços finais.
22414 b_jonas

5

R (204)

f=function(x) {
  m=matrix(" ",x,26)
  i=x
  d=ifelse(x==1,0,-1)
  for (j in 1:26) {
    m[i,j]=LETTERS[j]
    if (!((i+d) %in% 1:x)) d=-d
    i=i+d
  }
  for (i in 1:x) cat(m[i,],"\n",sep="")
}

Resultado

> f(1)
ABCDEFGHIJKLMNOPQRSTUVWXYZ
> f(2)
 B D F H J L N P R T V X Z
A C E G I K M O Q S U W Y 
> f(3)
  C   G   K   O   S   W   
 B D F H J L N P R T V X Z
A   E   I   M   Q   U   Y 
> f(7)
      G           S       
     F H         R T      
    E   I       Q   U     
   D     J     P     V    
  C       K   O       W   
 B         L N         X Z
A           M           Y 

Eu vi o que você fez lá! Muito inteligente ...
Kroltan

1
+1 limpo! Você pode se livrar dos espaços ao redor de suas fordeclarações ( for(i in 1:x)cat(...por exemplo) ou do espaço ao redor %in%.
plannapus

3

Javascript - 248 224 235

z=~~prompt(),y="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");y[9]="Javascript";for(w=[],v=0;v<z;v++)w[v]="\n";v--;for(i=0;i<26;i++){for(j=0;j<z;j++)w[j]+=j-v?i-9?" ":"          ":y[i];~~(i/(z-1))%2?v++:v--;}if(z==1)w=y;console.log(w.join(""))

Aqui 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.


Sugestões: 1: parseInt e Math.floor podem ser alteradas com uma operação de coação de número inteiro como |0ou ~~. 2: é mais curto criar o array w diretamente, sem split. for(w=[],v=0;v<z;v++)w[v]="\n";
edc65

... e não é uma declaração de saída (console.log ou o que você usa no seu violino, que é parte da contagem de caracteres)
edc65

@ edc65 Obrigado pelas dicas. Você estava certo, eu esqueci a saída aqui, então eu adicionei um alerta, mas não há fonte mono espaçada, então parece bastante caótico.
Izlin 28/07/14

@izlin Em vez de (i==9?" ":" ")você poderia usar (i^9?" ":" "), o que salva um personagem.
rev

1
SOCORRO! alguém pode explicar? (Por que há duas vezes <code> v = 0 </ code>?)
flawr

3

Perl 119

$s.=/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]for(0..26)x($m=<>);print$s=~s/\s+$//rg

Este programa recebe entrada STDINe imprime o resultado em STDOUT.

E bônus - uma versão que é contra as regras, pois imprime espaços à direita, mas acrescenta alguma interação:

#!/usr/bin/perl -p
$r=0;$_=join'',map{/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]}(0..26)x($m=$_)

... e alguns testes abaixo:

1
ABCDEFGHIJKLMNOPerlQRSTUVWXYZ
2
 B D F H J L N Perl R T V X Z
A C E G I K M O    Q S U W Y
4
   D     J     Perl     V
  C E   I K   O    Q   U W
 B   F H   L N      R T   X Z
A     G     M        S     Y
6
     F         Perl         Z
    E G       O    Q       Y
   D   H     N      R     X
  C     I   M        S   W
 B       J L          T V
A         K            U

3

J, 67 57 61 caracteres

echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)

Use como uma função:

   echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)
   D     J     P     V
  C E   I K   O Q   U W
 B   F H   L N   R T   X Z
A     G     M     S     Y

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 "1diz "operar em cada linha". dtb e echo são fornecidos pela biblioteca padrão.

Agradecimentos a Zsbán Ambrus por alguma ajuda no golfe.


3

MetaPost (207)

numeric h,d,y;h=5;d=-1;y=1;u=5mm;pair p;string s;for x=1upto26:p:=(x,y)*u;s:=char(x+64);if x=13:s:="MetaPost";elseif x>13:p:=(x+2,y)*u;fi;label.rt(s,p);if(y=h)or(y=1):d:=d*-1;fi;if h=1:d:=0;fi;y:=y+d;endfor;

insira a descrição da imagem aqui

Você pode tentar aqui.


2

Bash (213) (223)

read i
p=0
d=1
printf '\n%.0s' `seq $i`
for l in {A..Z}
do (($p==$i-1))&&((p=$p*-1))
(($i==1))&&p=0
(($p!=0))&&echo -en "\033[s\033[${p#-}A"
[[ "$l" == "B" ]]&&l="Bash"
echo -en $l"\033[s\033[${p#-}B"
((p++))
done

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.


Editei sua postagem adicionando destaque de sintaxe a ela, mas agora vejo que ela destacou incorretamente uma parte do seu código como um comentário e revirei-a. Eu só disse isso em caso você estava se perguntando por que eu rolei de volta :)
ProgramFOX

@ProgramFOX Está tudo bem. Obrigado de qualquer maneira!
OKW

Eu acho que há um bug menor em algum lugar, pois a saída está diminuindo lentamente. (Pelo menos no Bash 4.3.) Algumas pequenas melhorias para reduzir o tamanho para 194 caracteres: omita o sigilo na avaliação aritmética, não tente citar duas vezes a cadeia de caracteres entre aspas duplas: pastebin.com/zKa3zdwR
manatwork

Você pode usar novas linhas em vez de ;apenas algumas para torná-lo um pouco mais legível? Não afetará sua pontuação de golfe
Digital Trauma

2

Haskell - 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:

import Data.Matrix
import Data.Vector(toList)
r=repeat
s h=y h$l(take 26(case h of 1->r 1;_->concat$r$[h,h-1..1]++[2..h-1]))['A'..'Z']$matrix h 32(const ' ')<|>matrix h 1(const '\n')
l _[]m=m
l(x:i)(r:e)m=l i e$u m(let z=26-length i in if z<9 then z else z+6)x r
l _ _ m=m
u m c r h=case h of 'H'->t c r"Haskell"m;_->setElem h(r,c)m
t _ _[]m=m
t c r(x:i)m=t(c+1)r i$setElem x(r,c)m
y h m=concat[toList$getRow x m|x<-[1..h]]

Para executar, carregue o código ghcie execute putStr $ s Intonde Intestá a altura desejada. Você também pode adicionar

import System.Environment
main :: IO ()
main = fmap (s . read . head) getArgs >>= putStr

sob os imports em um arquivo de texto, compile-o ghce passe a altura como um argumento de linha de comando. Versão não destruída:

import System.Environment
import Data.Matrix
import Data.Vector (toList)

main :: IO ()
main = fmap (sawtooth . read . head) getArgs >>= putStr

type M = Matrix Char

sawtooth :: Int -> String
sawtooth height = let mat     = matrix height 32 (const ' ') <|> matrix height 1 (const '\n')
                      numbers = take 26 (case height of 1 -> repeat 1
                                                        _ -> concat $ repeat $ [height,height-1..1]++[2..height-1])
                      chars   = ['A'..'Z']
                  in toString height $ makeMatrix numbers chars mat

makeMatrix :: [Int] -> String -> M -> M
makeMatrix []     []     mat = mat
makeMatrix (x:xs) (s:ss) mat = makeMatrix xs ss $ updateMatrix
                                                    mat (let z = 26 - length xs in if z < 9 then z else z + 6) x s
makeMatrix _      _      mat = mat

updateMatrix :: M -> Int -> Int -> Char -> M
updateMatrix mat col row char = case char of 'H' -> insertHaskell col row "Haskell" mat
                                             _   -> setElem char (row, col) mat

insertHaskell :: Int -> Int -> String -> M -> M
insertHaskell _   _   []     mat = mat
insertHaskell col row (x:xs) mat = insertHaskell (col+1) row xs $ setElem x (row, col) mat

toString ::Int -> M -> String
toString height mat = concat [ toList $ getRow x mat | x <- [1..height] ]

Acredito que você pode substituir constpor pure(usando a instância Aplicative para funções) para salvar alguns bytes.
Esolanging Fruit

2

C # / LINQ:

using System;
using System.Linq;

namespace SawtoothAlphabet
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = Int32.Parse(args[0]);   // eg 4
            Console.WriteLine(
                String.Join(Environment.NewLine, Enumerable.Range(0, N).Select(line =>
                    String.Concat(Enumerable.Range(0, 26).Select(i =>
                        line == Math.Abs(i % (2 * (N - 1)) - (N - 1))
                            ? (i == 2) ? "C#" : Char.ConvertFromUtf32(i + 'A')
                            : (i == 2) ? "  " : " ")
            ).TrimEnd())));
        }
    }
}

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 com String.Join(Environment.NewLine, ...). Para cada linha com a qual percorremos todos os 26 caracteres Enumerable.Range(0, 26).Select(...), o teste no início da expressão lambda determina se um caracter ou espaço deve ser gerado enquanto i==2verifica "C" e o converte em "C #" ou em dois espaços, dependendo da linha . Ele String.Concat(...)converte o resultado IEnumerable<char>de cada linha em uma cadeia de caracteres antes de passá-la para TrimEnd(...)remover de forma limpa qualquer espaço em branco à direita.


1

PHP (216) (205)

Nova versão:

$b=array_fill(65,26,' ');$b[80]='   ';$b=array_fill(0,$i,$b);for($j=--$i,$x=64;++$x<91;$i||$j=0){$b[$j][$x]=chr($x);$x==80&&$b[$j][$x]='PHP';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

Versão antiga:

$b=array_fill(0,$i,array_fill(0,28,' '));for($j=--$i,$x=-1;++$x<28;$i||$j=0){$q=&$b[$j];$q[$x]=chr($x-($x&16)/8+65);$x==15&&($q[++$x]='H')*$q[++$x]='P';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

espera que a variável $ i seja a altura.


1

C, 214 169 bytes, sem espaços à direita

Agradeço a @ edc65 e @tolos por suas sugestões úteis.

#define C ((c-i+n-65)%z&&(c+i+n-67)%z)
n,i,m,c,z;main(){scanf("%d",&n);z=n<2?1:2*n-2;for(;i++<n;){for(m=c=64;c++<90;)m=C?m:c;for(c=64;c++<m;)putchar(C?32:c);puts("");}}

3
É uma batalha perdida, mas eu persisto: #include <stdio.h> não é necessário em muitos casos, seja o gcc ou qualquer outro compilador. É C padrão e válido de qualquer maneira.
edc65

2
@ edc65: Depende do que você considera "C válido". É K&R C válido pelo AFAIK, mas o ANSI / ISO C exige que funções variadas (que incluem scanfe printf) 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 ambos scanfe printf.
Celtschk

@celtschk K&R válido é suficiente para mim no código de golfe. E 'em muitos casos' (quando apenas usa putos, por exemplo) é C89 válido. O que eu quero enfatizar é que esse não é um comportamento estranho do gcc. (Thks para a nota sobre as funções variádicos, pelo menos)
edc65

1
Globais são do tipo int e inicializados com zero. Também pode descartar a intdeclaração para main se você não estiver retornando nada. Pode cair parênteses extras, substitua ' 'com 32e if(!C)m=ccom uma declaração ternarny, e como eu só aprendi (acima) substitua printf("\n")com puts("")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("");}}

1

Javascript ( 204 185 150)

h=m=4;d=h>1?-1:0;o=[];for(a=0;a<35;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m+=d;if(m<2||m==h)d=-d}}console.log(o.join("\n"))

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.

for (row = height; row; row--) {
    rowOfNextActiveLetter = 1;
    direction = height > 1 ? -1 : 0;
    output = "";
    for (a = 0; a < 35; a++) {
        output += (row == rowOfNextActiveLetter ? "ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a] : "");
        if (a < 9 || a > 17) {
            rowOfNextActiveLetter -= direction;
            if (rowOfNextActiveLetter < 2 || rowOfNextActiveLetter == height)direction = -direction
        }
    }
    console.log(output)
}

Golfe (161):

for(r=h;r;r--){m=1;d=h>1?-1:0;o="";for(a=0;a<35;a++){o+=(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m-=d;if(m<2||m==h)d=-d}}console.log(o)}

Golfe e ofuscado (149):

for(r=h;r;r--,console.log(o))for(m=1,d=h>1?1:0,o="",a=0;a<35;)if(o+=r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ",a<9|a++>17)d=(m+=d)<2|m==h?-d:d

Gosto mesmo que não o entenda completamente. Mas de qualquer maneira você pode cortar 9 caracteres remoção substr e usando o índice de direta .substr(a,1)=>[a]
edc65

Você pode reduzi-lo ainda mais usando operadores bit a bit e iteradores coalescentes para 182: 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"))
Wally West

whoops, limpou um demasiados espaços
John Nowlin

1

K, 60 bytes

`0:'{+{x!y}.'+(26#{(!x),|1_!x-1}x;(((x-1)#" "),)'`c$65+!26)}

Bem simples, e parece que acabei de superar a solução J. :)

Primeiro, gere um alfabeto:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

E uma onda dente de serra de comprimento apropriado:

  26#{(!x),|1_!x-1}5
0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1

Coloque cada letra do alfabeto com espaços à esquerda:

  (((5-1)#" "),)'"ABC"
("    A"
 "    B"
 "    C")

Coloque o alfabeto e a onda quadrada juntos e gire cada linha:

  +(0 1 2;("  A";"  B";"  C"))
((0
  "  A")
 (1
  "  B")
 (2
  "  C"))

  {x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  A"
 " B "
 "C  ")

E a transposição disso é a nossa resposta:

  +{x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  C"
 " B "
 "A  ")

Experimente aqui em OK .


0

C: 142 139 caracteres

Terrivelmente longo, espero poder encurtar um pouco:

char a[26][27],i,j,p,d;main(n){for(scanf("%d",&n);i<26;d^=!p^p+2>n,p+=d-(d^n>1),i++)for(j=n;j--;a[j][i]=p^j?32:i+65);while(n)puts(a[--n]);}

Um pouco mais legível:

char a[26][27], i, j, p, d;
main(n) {
    for (
        scanf("%d", &n);
        i < 26;
        d ^= !p ^ p + 2 > n,
        p += d - (d ^ n > 1),
        i++
    )
        for (
            j = n;
            j--;
            a[j][i] = p ^ j
                ? 32
                : i + 65
        );

    while (n)
        puts(a[--n]);
}

Edit: Eu perdi a regra "sem espaços à direita", mas voltarei.


0

Scala, 246 bytes

def f(h:Int)={val a=Seq.fill(h)(Array.fill(32)(' '));var(r,x,d)=(h-1,0,if(h==1)0 else-1);def p(c:Char){a(r)(x)=c;x+=1};for(c<-'A'to'Z'){p(c);if(c==83)"cala"foreach p;r+=d;if(r==0|r==h-1)d*= -1};for(z<-a)println(new String(z)replaceAll(" +$",""))}

reformatado e comentou:

def f(h: Int) = {
  val a = Seq.fill(h)(Array.fill(32)(' '));
  // r - row; x - x coordinate, column; d - direction
  var (r, x, d) = (h - 1, 0, if(h==1) 0 else -1); 
  def p(c: Char) { // p for "put the character"
    a(r)(x) = c;
    x += 1
  };
  for(c <- 'A' to 'Z') { 
    p(c);
    if(c == 83)      // 83 == 'S'
      "cala" foreach p;
    r += d;
    if(r == 0 | r == h - 1)     // | is shorter than || 
      d *= -1
  };
  for(z <- a)
    println(new String(z) replaceAll (" +$", ""))  // trimming trailing whitespace
}

Resultados:

scala> f(4)
   D     J     P         V
  C E   I K   O Q       U W
 B   F H   L N   R     T   X Z
A     G     M     Scala     Y

scala> f(5)
    E       M           U
   D F     L N         T V
  C   G   K   O   Scala   W
 B     H J     P R         X Z
A       I       Q           Y

scala> f(1)
ABCDEFGHIJKLMNOPQRScalaTUVWXYZ

0

Python - 137

Entrada a ser armazenada em ieg i=8

l=[""]*h;k=j=0;y=h-1;exec'l[y]+=" "*(j-len(l[y]))+chr(k+65)+"ython"*(k==15);j=len(l[y]);y-=1^k/(h-(h>2))%2*-2;k+=1;'*26;print"\n".join(l)

0

Raquete

Aqui está uma versão funcional e limpa: sugestões para encurtá-lo de boas-vindas.

(define (sawtooth n)
  (define (ST i d m lns)
    (if (null? m) 
        lns
        (let* ([v (first m)]
               [spc (make-string (string-length v) #\space)]
               [I (+ i d)])
          (ST I
              (if (or (zero? I) (= (sub1 n) I)) (* d -1) d)
              (rest m)
              (for/list ([ln lns] [j n])
                       (~a ln (if (= i j) v spc)))))))
  (displayln
   (string-join 
    (ST (sub1 n)
        (if (= n 1) 0 -1) 
        (string-split "A B C D E F G H I J K L M N O P Q Racket S T U V W X Y Z")
        (make-list n "\n")))))

Saída

> (sawtooth 1)
ABCDEFGHIJKLMNOPQRacketSTUVWXYZ

> (sawtooth 2)
 B D F H J L N P Racket T V X Z 
A C E G I K M O Q      S U W Y 

> (sawtooth 8)
       H                  V     
      G I                U W    
     F   J              T   X   
    E     K            S     Y  
   D       L     Racket       Z 
  C         M   Q               
 B           N P                
A             O  
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.