Alfabeto diagonal para a entrada


26

Inspirado por este post . Para aqueles que marcaram essa pergunta como duplicada, peço que você realmente leia a pergunta para ver que a minha é uma modificação da que está vinculada. O link não solicita uma entrada e é apenas para imprimir o alfabeto na diagonal.

O desafio

Dada uma entrada entre 1 e 26, inclusive, imprima o alfabeto na diagonal, mas comece a imprimir verticalmente no índice da entrada fornecida.

Exemplos

Dada a entrada:

16

Seu programa deve gerar:

a
 b
  c
   d
    e
     f
      g
       h
        i
         j
          k
           l
            m
             n
              o
               p
               q
               r
               s
               t
               u
               v
               w
               x
               y
               z

Entrada:

4

Saída:

a
 b
  c
   d
   e
   f
   g
   h
   i
   j
   k
   l
   m
   n
   o
   p
   q
   r
   s
   t
   v
   w
   x
   y
   z

Entrada:

1

Saída:

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z

Entrada:

26

Saída:

a
 b
  c
   d
    e
     f
      g
       h
        i
         j
          k
           l
            m
             n
              o
               p
                q
                 r
                  s
                   t
                    u
                     v
                      w
                       x
                        y
                         z

Pontuação

Isso é , então a resposta mais curta em cada idioma vence.

Boa sorte!


6
Podemos optar por usar a indexação 0 ou 1?
precisa saber é o seguinte

Um espaço líder consistente é aceitável?
19417 Giuseppe

Os espaços à direita são aceitáveis?
Dom Hastings

Podemos usar maiúsculas?
Adám 20/08/19

Podemos retornar uma lista de strings?
Adám 21/08/19

Respostas:


13

Carvão , 9 bytes

↘✂β⁰N↓✂βη

Experimente online!

Como funciona

↘✂β⁰N↓✂βη
 ✂β⁰N         the alphabet from position 0 to the input
↘               print diagonally, down and to the right
        ✂βη    the alphabet starting from the position of the input
       ↓        print downwards

Esta solução não funciona mais na versão atual do Charcoal (provavelmente devido a uma correção de bug), mas o problema foi resolvido por 10 bytes com ↘✂β⁰N↓✂βIθ.


2
Não sei por que isso funciona; pode ser um bug que foi introduzido há algumas semanas. (Você normalmente tem que usar Iθem vez de η.)
Neil

@ Neil Parece quebrado hoje. Usando Iθ resolve.
JP de la Torre

Salve 1 byte usando em …βNvez de ✂β⁰N.
Neil

7

05AB1E , 11 bytes

AvNI<‚Wysú,

Primeira vez que experimentei 05AB1E, estou aberto a dicas.

Experimente online!

Se uma entrada indexada a zero de 0a 25for permitida, pode ser de 10 bytes, omitindo o <.


Niiice! Exatamente o que eu consegui. Eu tentei "levantar", mas não está funcionando como planejado. Eu acho que é ótimo :).
Magic Octopus Urn

4

JavaScript (ES2017), 73 72 71 66 bytes

Salvo alguns bytes graças a @JustinMariner

f=(n,x=26)=>x?f(n,x-1)+(x+9).toString(36).padStart(x<n?x:n)+`
`:''

1
Isso adiciona um 10depois zno final devido a ter ++xantes x.toString(). Corrigido o erro e jogava golfe em 68 bytes usando padStart: TIO
Justin Mariner

Graças @JustinMariner, eu acho que eu poderia mudar para ES8 para isso ...
ETHproductions

Você pode salvar alguma coisa currying? n=>g=(x=26)=>x?f(x-1)+(x+9).toString(36).padStart(x<n?x:n)+'\n':""
Salsicha

@ Shagy Talvez, eu não sei se esse tipo de curry é permitido embora.
ETHproduções

Ah, nozes, parece que sua proposta para permitir que isso não seja mais um consenso :(
Shaggy

4

Python 2, 61 58 57 bytes

n=input()-1
for i in range(26):print(' '*i)[:n]+chr(i+97)

-3 bytes graças a Rod

-1 byte a mais graças ao Sr. Xcoder



@ Pavel Isso não funcionaria desde então, inputseria chamado toda vez que o forloop iterar, mesmo que haja apenas uma linha de entrada.
precisa saber é o seguinte


57 bytes usando subscrição.
Mr. Xcoder


4

Ruby, 51 46 43 bytes

->n{(0..25).map{|x|(' '*x)[0,n-1]<<(x+97)}}

Retorna uma lista de strings.

Parece que os caras do Python estavam envolvidos em algo com seus subscritos. -5 bytes, inspirando-se na melhoria do Sr. Xcoder da solução da ppperry.

Solução anterior com rjust(51 bytes):

->n{i=0;(?a..?z).map{|c|c.rjust i+=n>c.ord-97?1:0}}


3

R, 99 89 bytes

@MickeyT salvou 10 bytes

função

function(x)for(i in 1:26)cat(paste(c(rep(" ",min(x,i)),letters[i]),collapse=""),sep="\n")

demonstração

f <- function(x)for(i in 1:26)cat(paste(c(rep(" ",min(x,i)),letters[i]),collapse=""),sep="\n")
f(1)
f(10)
f(15)
f(26)

1
Poucas economias. Em vez disso, ifelsetente min. print.noquotepode ser substituído por catum '\n'na pasta. A \npode ser um retorno do carro linear. As chaves do corpo da função podem ser removidas.
MickyT

Você pode economizar um pouco mais usando em writevez de cate paste:write(c(rep(" ",min(x,i)),letters[i]),"",26,,"")
#

3

Retina , 72 68 bytes

^
z
{2=`
$`
}T`l`_l`^.
\D
$.`$* $&¶
\d+
$* 
s`( *)( +)(?=.*¶\1 $)
$1

Experimente online! A saída inclui espaço em branco à direita. Economize 1 byte excluindo o espaço antes da $indexação se zero for permitida. Editar: salvou 4 bytes usando o gerador de alfabeto do @ MartinEnder. Explicação:

^
z
{2=`
$`
}T`l`_l`^.

Insira o alfabeto.

\D
$.`$* $&¶

Diagonalize-o.

\d+
$* 

Converta a entrada em unário como espaços.

s`( *)( +)(?=.*¶\1 $)
$1

Aparar linhas longas, para que nenhuma linha seja maior que a linha em branco no final.


2

Mathematica, 103 bytes

(T=Table;a=Alphabet[];c=Column)[c/@{T[""<>{T[" ",i],a[[i]]},{i,#}],T[""<>{T[" ",#],a[[i]]},{i,#,26}]}]&

2

Pitão , 21 17 15 bytes

Feito em um telefone com 3% de bateria.

VlG+*d?>QNNQ@GN

Explicação:

VlG        For each character in the alphabet (G)
+          Concatenate...
 *d        Space (d) times...
   ?>QNNQ  Ternary; if Q (input) is less than N, return N, else Q
 @GN       The Nth character of the alphabet (G)

Experimente online!


1
@totallyhuman Acabei de comer uma pizza incrível em Las Vegas, Novo México
Stan Strum

Encontrei algumas abordagens consideravelmente mais curtas e decidi postar minha própria resposta .
Sr. Xcoder

@ Mr.Xcoder Sim, bom trabalho nisso.
19417 Stan Strum




2

Haskell, 58 54 bytes

f n=do m<-[1..26];([2..min n m]>>" ")++['`'..]!!m:"\n"

Experimente online!

Como funciona

f n=                  -- input number is n
  do m<-[1..26]       -- for each m from [1..26], construct a string and concatenate
                      -- them into a single string. The string is:
   [2..min n m]>>" "  -- min(n,m)-1 spaces,
      ++              -- followed by
   ['`'..]!!m         -- the m-th char after `
      :               -- followed by
   "\n"               -- a newline 

Edit: @Lynn salvou 4 bytes. Obrigado!



@Lynn; Obrigado! Eu sempre esqueço a notação para listas.
nimi


2

Gaia , 12 bytes

…26⊃§×¦₵a+†ṣ

Experimente online!

Explicação

…             Range 0..input-1
 26⊃          Repeat the last number enough times to make it have length 26
    §×¦       Turn each number into a string of that many spaces
       ₵a+†   Add the corresponding letter to each
           ṣ  Join with newlines

1

JavaScript (Node.js) , 72 bytes

n=>[..."abcdefghijklmnopqrstuvwxyz"].map((e,i)=>" ".repeat(i<n?i:n-1)+e)

Retorna uma lista de strings.

Experimente online!


Posso perguntar por que o node.js? parece JS normal válido
Downgoat

@Downgoat É o TIO formatação auto
Conor O'Brien

btw você pode salvar bytes utilizando.padStart
Downgoat

Espere nvm do jeito que eu estava pensando basicamente torna-lo em resposta da ETH
Downgoat

Alterne para o ES8 e salve um byte em padEndvez de repeat.
Shaggy

1

Mathematica, 67 bytes

SparseArray[x=#;{#,#~Min~x}->Alphabet[][[#]]&~Array~26,{26,#}," "]&

Retorna um SparseArrayde strings. Para visualizar, acrescente Grid@na frente.

Experimente na Wolfram Sandbox

Uso

Grid@SparseArray[x=#;{#,#~Min~x}->Alphabet[][[#]]&~Array~26,{26,#}," "]&[5]
a
 b
  c
   d
    e
    f
    g

    ⋮

    z 

1

Python 2 , 52 bytes

lambda n:['%*c'%(min(i+1,n),i+97)for i in range(26)]

Experimente online!

Estou assumindo que uma lista de seqüências de caracteres está bem ...

O mais curto que pude obter com recursão:

f=lambda n,i=0:i<26and['%*c'%(min(i+1,n),i+97)]+f(n,i+1)or[]





1

C # (.NET Core) , 66 + 18 bytes

n=>new int[26].Select((x,i)=>$"{(char)(i+97)}".PadLeft(i<n?i+1:n))

A contagem de bytes também inclui

using System.Linq;

Experimente online!

Isso retorna uma coleção de strings, uma para cada linha. Se não for permitido, a resposta aumentará 17 bytes para string.Concat()e\n dentro da string

Explicação:

n =>
    new int[26]                      // Create a new collection of size 26
    .Select((x, i) =>                // Replace its members with:
        $"{(char)(i + 97)}"          // String of an alphabet character corresponding to the index
        .PadLeft(i < n ? i + 1 : n)  // Add spaces to the left
    )

1

MATL, 14 bytes

26:tiXl2Y2oZ?c

Experimente no MATL Online

Explicação

26      % number literal
:       % range; vector of equally spaced values [1...26]
t       % duplicate
i       % explicitly grab the input
Xl      % clamp the array to have a maximum value of the input
2Y2     % predefined literal: ['a'...'z']
o       % convert to a numeric array
Z?      % create sparse matrix using the first two inputs as the rows/columns 
        % and the letters 'a'...'z' as the values
c       % convert back to character and implicitly display

1

Pitão , 12 bytes

j.e+<*kdtQbG

Experimente aqui!

Se listas de Strings forem permitidas, isso poderá ser reduzido para 11 bytes :

.e+<*kdtQbG

Pitão , 12 bytes

VG+<*dxGNtQN

Experimente aqui!

Pitão , 14 bytes

jm+<*d;tQ@Gd26

Experimente aqui.

Se listas de Strings forem permitidas, isso poderá ser reduzido para 13 bytes :

m+<*d;tQ@Gd26

Como isso funciona?

Ao contrário da maioria das outras respostas, este mapeia / faz um loop sobre o alfabeto minúsculo em todas as 3 soluções.

Explicação nº 1

j.e+<*kdtQbG - Full program.

 .e        G - Enumerated map over "abcdefghijklmnopqrstuvwxyz", with indexes k and values b.
     *kd     - Repeat a space a number of times equal to the letter's index.
    <   tQ   - Crop the spaces after the input.
   +      b  - Concatenate with the letter.
j            - (Optional): Join by newlines.

Explicação nº 2

VG+<*dxGNtQN  - Full program.

VG            - For N in "abcdefghijklmnopqrstuvwxyz".
      xGN     - Index of the letter in the alphabet.
    *d        - Repeat the space a number of times equal to the index above.
   <     tQ   - But crop anything higher than the input.
  +        N  - Append the letter (at the end)

Explicação nº 3

jm+<*d;tQ@Gd26 - Full program.

 m          26 - Map over [0...26) with a variable d.
    *d;        - Space repeated d times.
   <   tQ      - Crop anything whose length is higher than the input.
  +      @Gd   - Concatenate with the letter at that index in the alphabet.
j              - (Optional): Join by newlines.



1

q / kdb +, 33 31 bytes

Solução:

-1{(&[x-1;til 26]#'" "),'.Q.a};

Exemplo:

q)-1{(&[x-1;til 26]#'" "),'.Q.a}16;
a
 b
  c
   d
    e
     f
      g
       h
        i
         j
          k
           l
            m
             n
              o
               p
               q
               r
               s
               t
               u
               v
               w
               x
               y
               z

Explicação:

Crie uma lista de espaços (26) até o comprimento mínimo da entrada e o intervalo de 0..25), junte-se a cada letra do alfabeto e imprima em stdout.

-1{(&[x-1;til 26]#'" "),'.Q.a}; / solution
-1                            ; / print result to stdout and swallow return
  {                          }  / lambda function
                         .Q.a   / "abcd..xyz"
                       ,'       / concatenate (,) each
   (                  )         / do all this together
    &[   ;      ]               / minimum of each 
      x-1                       / implicit input (e.g. 10) minus 1 (e.g. 9)
          til 26                / 0 1 2 ... 23 24 25
                   '#" "        / take " " each number of times (0 1 2 )

Notas:

  • -2 bytes, rejeitando os colchetes

1

Java 1.8 (sem Lambda), 98 bytes

void m(int i){int c=0,o=97;String s="";for(;c++<26;s+=c<i?" ":"")System.out.println(s+(char)o++);}

A lógica é direta. Não fornece validação de dados de entrada, muito ruim!

  • Atualização: Somente função! Obrigado a @Olivier Grégoire

1
Para poupar alguns bytes, use for(;c++<26;s+=c<i?" ":"")System.out.println(s+(char)o++);Além disso, você pode escrever apenas uma função ou um lambda em vez de um programa completo.
Olivier Grégoire

Se eu incluísse apenas o corpo de uma função, como o leitor saberia a que a[0]se refere? Eu acho que trechos não são justos se não compilarem; o desafio é igualmente interessante com uma linguagem rica em construções.
Douglas Held

1
Olá! Eu disse uma função ou um lambda, não um trecho. ;-) Então você pode escrever void f(int i){...}(não é necessário estática) ou em i->{...}vez de todo o seu programa. Veja todas as dicas sobre Java . Veja minha resposta para esse mesmo desafio , como exemplo. Divirta-se no site! :-)
Olivier Grégoire
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.