Alfabeto Semi-Diagonal

35

Dada uma letra do alfabeto inglês, sua tarefa é criar um alfabeto semia diagonal para a entrada.

Como construir um alfabeto semi-diagonal?

Breve descrição : Primeiro, você assume a posição da letra no alfabeto P(aqui Pestá 1 indexado). Em seguida, imprima cada letra até a entrada (inclusive) em uma linha, precedida P-1e repita esse Ptempo da letra , intercalando com espaços.

Exemplos :

  • Dado F, seu programa deve gerar:

    UMA 
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
    
  • Dado K, seu programa deve gerar:

    UMA
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
          GGGGGGG 
           HHHHHHHH 
            IIIIIIIII 
             JJJJJJJJJJ 
              KKKKKKKKKKK 
    
  • Dado A, seu programa deve gerar:

    A
    

Regras

  • Você pode escolher caracteres minúsculos ou maiúsculos, mas isso deve ser consistente.

  • Você pode ter espaços estranhos da seguinte maneira:

    • Um espaço à esquerda consistente (em cada linha).
    • Uma nova linha à direita ou à direita.
    • Espaços desnecessários à direita do texto.
  • A entrada e a saída podem ser obtidas por qualquer média padrão, e as brechas padrão se aplicam.

  • Você pode produzir uma lista de linhas, desde que você também forneça a versão .

  • Isso é , então o código mais curto em bytes vence!

Inspirado por este desafio .


fonte
A saída como lista de strings está correta?
Adám 23/08/17
2
Por que o voto negativo? O que posso melhorar?
1
Quando você diz "P é indexado 1 aqui", aqui se refere ao desafio ou ao exemplo?
Dave
3
@pizzakingme Não, você não pode.
1
I accidentlly tem um padrão interessante, enquanto golfe minha resposta: tio.run/##K0nO@f@/...
sergiol

Respostas:

10

Python 3 , 59 bytes

lambda l:[' '*i+'%c '%(i+65)*-~i for i in range(ord(l)-64)]

Experimente online!

Python 3 , 61 bytes

lambda l:[' '*i+-~i*(chr(i+65)+' ')for i in range(ord(l)-64)]

Experimente online! (link para a versão impressa)

Mr. Xcoder
fonte
8
Não vejo absolutamente nenhuma razão para um voto negativo. O @downvoter pode explicar?
Mr. Xcoder
1
Eu imagino que é apenas uma misclick, ou talvez alguém não gostar de uma falta de explicação (o último é bastante improvável IMO)
Conor O'Brien
Não gosto de Python e não posso implementar com Python, então a resposta não é útil para mim? Brincadeirinha, mas o botão de dicas de ferramentas, provavelmente, não se encaixam as regras deste site
Thomas Weller
Sou eu ou diz que o Sr. Xcoder tem 1 representante ...?
Stan Strum 25/09
9

Python 2 , 63 61 59 bytes

-2 bytes graças a Rod. -2 bytes graças a Felipe Nardi Batista.

i=1
exec"print' '*i+'%c '%(i+64)*i;i+=1;"*(ord(input())-64)

Experimente online!

totalmente humano
fonte
8

C, 89 bytes

i,j;f(l){for(i=64;i++<l&&printf("%*c ",i-64,i);puts(""))for(j=i-65;j--;)printf("%c ",i);}

Experimente online!

Steadybox
fonte
7

PowerShell , 45 42 bytes

65..$args[0]|%{" "*$i+++"$([char]$_) "*$i}

Experimente online!

Pega a entrada como um caractere literal e, em seguida, passa pelas maiúsculas até esse ponto, cada iteração precede o número apropriado de espaços e, em seguida, o híbrido char \ space.

Economizou 3 bytes graças ao TessellatingHeckler.

AdmBorkBork
fonte
@TessellatingHeckler Indeed. Eu tenho jogado "$args"tanto isso, o que não funcionaria aqui, eu esqueci o [0]método. Haha
AdmBorkBork
5

JavaScript (ES6), 85 bytes

Funciona em minúsculas para entrada e saída. Gera um espaço à esquerda e à direita em cada linha.

f=(c,k=10,C=k.toString(36),r=s=>`${s} `.repeat(k-9))=>r``+r(C)+(C==c?'':`
`+f(c,k+1))

Demo

Arnauld
fonte
`${s} `pode ser substituído por (s+"")para a poupança de um byte
Lucas
@ Lucas eu preciso desse espaço. Pode ser substituído por (s+" "), mas é o mesmo tempo.
Arnauld
5

APL (Dyalog) , 26 bytes

Solicita caracteres escalares. Imprime a lista de linhas.

(∊⍴∘'',' ',¨⍨⊢⍴⊃∘⎕A)¨⍳⎕A⍳⎕

Experimente online! (possui versão artística ASCII em um byte adicional)

 solicitação de entrada

⎕A⍳ encontrar de ndex em um alfabeto

 primeiro que muitos ɩ ntegers

( Aplique a seguinte função tácita a cada um:

⊃∘⎕A escolha o argumento da letra da letra do alfabeto A

⊢⍴ remodelar ciclicamente para o comprimento do argumento

' ',¨⍨ anexar um espaço a cada

⍴∘'', precede uma sequência de comprimento de argumento (preenchida com espaços)

ε nlist (achatar)


A versão artística ASCII apenas tem um na esquerda; misture a lista de strings em uma tabela de caracteres.

Adão
fonte
4

Perl 5 , 31 bytes

Código de 30 bytes + 1 para -l.

print$"x$-,"$_ "x++$-for A..<>

Experimente online!

Dom Hastings
fonte
Você pode reduzir isso usando em sayvez da -lbandeira: Experimente online!
Xcali
@Xcali Estou arrasado -E/ -M5.01, já usei saybastante no passado e provavelmente abusaria do fato de sayser uma alternativa a printum desafio de fonte restrita ou similar, talvez, mas, pelo bem de -3, continuarei como está por enquanto. Veja este meta post para um argumento justo . Aprecie a entrada!
Dom Hastings
3

Dyalog APL, 38 bytes

{↑{(y/' '),(2×y←⎕A⍳⍵)⍴⍵,' '}¨⎕A↑⍨⎕A⍳⍵}

Experimente online!

Quão?

⎕A↑⍨ - pegue o alfabeto até

⎕A⍳⍵ - o caractere de entrada

¨ - para cada caractere

    ⍵,' ' - pegue o char e um espaço

    (...)⍴ - remodelar para

    2×y←⎕A⍳⍵ - duas vezes o índice do caractere no alfabeto

    (y/' ') - e precede espaços de índice de caracteres

- depois achatar

Uriel
fonte
3

APL (Dyalog Classic) , 26 bytes

{↑{(≠\⍵<⍳3×⍵)\⍵⊃⎕A}¨⍳⎕A⍳⍵}

Experimente online!

Explicação

                      ⍳⎕A⍳⍵  generate indexes up to position of right arg 
{                          on each index apply function
   (≠\⍵<⍳3×⍵)                generate boolean mask for expansion (each line has a length 3 times its index ⍵, starting with  blanks and then alternating letter blank)
             \⍵⊃⎕A          expand character in position 
                             mix result into text matrix
Gil
fonte
Meu Deus ... 4 APL-er resolvendo o mesmo problema ao mesmo tempo! :) Eu acho que no codegolf você tem permissão para remover o externo {}, substituir por e afirmar que é um "programa completo" em vez de uma função. Isso tornaria sua solução a melhor (até agora).
NGN
Deve ser um bom sinal :) Obrigado pela sugestão. Eu já vi isso, mas não tinha certeza de onde traçar a linha. Eu acho que posso salvar 3 bytes se eu remover caracóis e misturar.
Gil
3

V , 28, 26, 25 , 23 bytes ( Competindo )

¬A[/a
lDÓ./& ò
ò-Ûä$Û>

Experimente online!

Observe que, embora eu esteja pensando em adicionar determinados recursos há muito tempo, esse desafio foi o que me convenceu a finalmente fazer isso.

A saída contém um espaço à esquerda em cada linha e uma nova linha à direita.

Hexdump:

00000000: ac41 5b2f 1261 0a6c 44d3 2e2f 2620 f20a  .A[/.a.lD../& ..
00000010: f22d dbe4 24db 3e                        .-..$.>

Explicação:

¬A[         " Insert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ['
   /        " Search for...
    <C-r>a  "   The input
l           " Move one character to the right
 D          " And delete every character after the cursor
  Ó         " Search for...
   .        "   Any character
    /       " And replace it with...
     & ò    "   That character followed by a space and a newline
ò           " Recursively...
 -          "   Move to the beginning of the next line up
  Ûä$       "   Make *line number* copies of the current line
     Û>     "   And indent this line by *line number* spaces
DJMcMayhem
fonte
1
Isso está competindo. Você pode remover a observação do título.
É útil para aqueles que não tinham conhecimento da nova meta, como eu
Conor O'Brien
3

05AB1E , 10 bytes

A¹¡н«ðâƶāú

Experimente online!

-2 graças a Adnan .

Acrescente »para imprimir em linhas separadas.

Erik, o Outgolfer
fonte
Você pode omitir o <espaço em que um espaço à esquerda consistente está correto.
Emigna
@Emigna Thanks!
Erik the Outgolfer
A¹¡н«ðâƶāúdeve funcionar para 10 bytes
Adnan
@ Adnan Eu acho que ¹¡isso fará com que não funcione ... oh, é por isso que há um «lá. : p
Erik the Outgolfer
3

R, 94 88 bytes

-6 bytes graças a Giuseppe

function(x,l=LETTERS)for(i in 1:match(x,l))cat(rep(' ',i-1),rep(paste(l[i],' '),i),'\n')}

Ungolfed:

f=function(x,l=letters){
  for(i in 1:which(l==x)){
    A=paste(l[i],' ')
    cat(rep(' ',i-1),rep(A,i),'\n')
  }
}
Andrew Haynes
fonte
88 bytes : retornar uma função anônima é bom, você pode se livrar das chaves, pois fé uma linha e usar em matchvez de whichsalvar um byte.
21417 Giuseppe
71 bytes
Giuseppe
68 bytes recebendo entrada de stdin.
Giuseppe
3

Haskell, 52 44 bytes

f k=[[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]

Retorna uma lista de linhas.

Experimente online!

f k=                  -- main function is f, input parameter k
  [   |s<-['A'..k]]   -- for each s from ['A'..k]
     >>=              -- map (and collect the results in a single string) the function: 
         (['A'..s]>>) --  replace each element in ['A'..s] with
    [  ,  ]           --  over the list, containing
     " "              --   a single space to get the indent
        s:" "         --   s followed by space to get the letter sequence

Edit: @jferard: salvou três bytes. Obrigado!

nimi
fonte
49 bytes:f k=[tail$[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]
jferard
@ jferard: Muito obrigado. Relendo o desafio, notei que um espaço inicial por linha é permitido, portanto não precisamos do tail$.
nimi 25/08
2

JavaScript (ES8), 92 bytes

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

Usa letras minúsculas. As linhas têm um espaço à esquerda e um à direita. Retorna uma matriz de linhas.

Snippet de teste

let f=

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

;O.innerText=f("k").join`\n`
<pre id=O></pre>

Justin Mariner
fonte
2

Casca , 13 bytes

z+ḣ∞øzRNC1…'A

Pega um caractere entre aspas simples como argumento de linha de comando, imprime o resultado em STDOUT. Experimente online!

Explicação

Estou explorando a maneira como Husk imprime listas de listas de strings: junte listas internas a espaços e listas externas a novas linhas.

z+ḣ∞øzRNC1…'A  Implicit input, say 'C'
          …'A  Range from A: "ABC"
        C1     Cut into strings of length 1: ["A","B","C"]
     z N       Zip with positive integers
      R        using repetition: x = [["A"],["B","B"],["C","C","C"]]
   ∞ø          The empty string repeated infinitely: ["","","",...
  ḣ            Prefixes: [[],[""],["",""],["","",""],...
z+             Zip with x using concatenation: [["A"],["","B","B"],["","","C","C","C"]]
               Implicitly join each inner list with spaces, join the resulting strings with newlines and print.
Zgarb
fonte
2

05AB1E , 15 14 13 bytes

Guardado 1 byte graças a Adnan

A¹¡н«ƶ€S»¶¡āú»

Experimente online! ou a versão artística Ascii

Explicação

A                # push lowercase alphabet
 ¹¡              # split at input
   н             # get the first part
    «            # append the input
     ƶ           # repeat each a number of times corresponding to its 1-based index
      €S         # split each to a list of chars
        »        # join on spaces and newlines
         ¶¡      # split on newlines
           āú    # prepend spaces to each corresponding to its 1-based index
             »   # join on newlines
Emigna
fonte
Parece que lidamos com isso de maneira um pouco diferente : D
Erik, o Outgolfer
@EriktheOutgolfer: Fizemos o mesmo, mas sua ótima idéia de acrescentar um espaço antes de levantar, eliminando a necessidade da junção, diminuiu a sua. Eu não tinha lido que os espaços à esquerda / à direita, nem a saída como lista estavam ok, então espero que isso me ensine a ler todo o desafio antes de implementar: P
Emigna
tl; dr: vetorização: p
Erik the Outgolfer
A¹¡н«em vez de ADIk>£funcionar
Adnan
@ Adnan: Obrigado! Eu tive, A¹¡нmas não considerei «receber a última carta, por isso não era boa o suficiente: P
Emigna
2

QBasic, 79 74 72 bytes

Agradecimentos a Taylor Scott pela economia de bytes (duas vezes!)

FOR i=1TO ASC(INPUT$(1))-64
?TAB(i)
FOR j=1TO i
?CHR$(64+i)" ";
NEXT j,i

Usa maiúsculas. A entrada é pressionada com a tecla e não é ecoada na tela.

Explicação

Nós ciclo ide 1até a posição da carta limitante no alfabeto (1-based). Para cada um i, passamos para a coluna ida tela usando TAB; depois, iimprimimos a iletra do alfabeto seguida de um espaço.

DLosc
fonte
Como se vê, você pode usar o INPUT$(1)comando como um substituto direto para a variável z$para um delta de -2 bytes
Taylor Scott
@TaylorScott Boa ideia, obrigado!
DLosc
2

Japt -R , 24 23 17 15 bytes

Produz uma matriz, inclui uma nova linha principal e um espaço inicial e final em cada linha.

IòUc ÏçSiXd¹iYç

Teste-o

  • 1 byte economizado com a ajuda de Oliver e mais 6 graças a ele apontando uma maneira melhor de gerar a matriz inicial.
Shaggy
fonte
1

Carvão , 18 bytes

F⁺⌕αθ¹«P×⁺§αι ⁺ι¹↘

Experimente online!

Erik, o Outgolfer
fonte
Nah, você não pode deixar 05AB1E derrotar o carvão ...: P
totallyhuman
@totallyhuman a vingança: p
Erik the Outgolfer
Infelizmente, espaços em branco à esquerda arbitrários não são permitidos, caso contrário E…·?θ⁺× κ⪫× κι, o trabalho seria feito em 14 bytes.
Neil
@ Neil Um espaço em branco à frente é permitido, mas não tenho certeza de como ?chegou lá. AAcho que deveria ser . Oh espera, ohhhhh Entendo o que você quer dizer.
Erik the Outgolfer
1

Braingolf , 65 bytes

a#a-# 7-,-~vc<!?>[$_]:$_|&,(.#a-!?.>[# M]1+>[.M# M]:$_!@|v#
&@R);

Experimente online!

Lowercase.

Contains 1 trailing space on each line, and a trailing newline at the end of output.

Skidsdev
fonte
1

C# (.NET Core), 103 bytes

n=>{var i='`';var l="";for(;i<n;l+='\n'){l+="".PadLeft(i++-96);for(int s=96;s++<i;)l+=i+" ";}return l;}

Try it online!

jkelm
fonte
1

JavaScript, 102 94 bytes

2 bytes saved thanks to Neil

f=
a=>[...Array(parseInt(a,36)-9)].map((a,b)=>''.padEnd(b).padEnd(b*3+1,(b+10).toString(36)+' '))

console.log(f('k').join`\n`)


fonte
1

Retina, 51 bytes

^.
$&$&
}T`L`_L`^.
.
$.`$* $&$.`$* ¶
+`(\w) \B
$&$1

Try it online! Explanation:

^.
$&$&

Duplicate the (first) letter.

}T`L`_L`^.

Rotate it back 1 in the alphabet, or delete it if it's a duplicate A. Keep duplicating and rotating until we duplicate A, at which point the deletion undoes the duplication and the loop completes.

.
$.`$* $&$.`$* ¶

Replace each letter with a line with the letter padded on both sides.

+`(\w) \B
$&$1

Insert duplicate letters between all pairs of padding spaces to the right of existing letters.

Neil
fonte
1

Charcoal, 15 bytes

F…·AS«P⪫E…@ιι ↘

Try it online! Link is to verbose version of code. Explanation:

 …·AS           Inclusive character range from A to the input
F    «          Loop over each character
         …@ι    Exclusive range from @ to the current character
        E   ι   Replace each element with the current character
       ⪫        Join with spaces
      P         Print without moving the cursor.
              ↘ Move the cursor down and right.

If extra padding was legal, this would work for 14 bytes:

E…·?θ⁺× κ⪫× κι

Try it online! Link is to verbose version of code.

Neil
fonte
1

Mathematica, 70 bytes

(T=Table)[""<>{" "~T~i,T[Alphabet[][[i]]<>" ",i]},{i,LetterNumber@#}]&

lowercase

outputs a list

thanx @ngenisis for corrections

For version place Column@ at the beginning

J42161217
fonte
1

Excel VBA, 72 Bytes

Anonymous VBE immediate window function that takes input from cell A1 and outputs to the VBE immediate window

For i=1To Asc([A1])-64:[B1]=i:?Space(i-1)[REPT(CHAR(B1+64)&" ",B1)]:Next
Taylor Scott
fonte
1

Pyth, 17 bytes

.e+*kd*+bdhk<GhxG

Try it here (pretty print version).


How does this work?

  • hxG - Takes the index of the input in the lowercase alphabet.

  • <G - Trims every character after the input from the alphabet.

  • .e - Enumerated Map. Maps over the trimmed alphabet with the indexes as k and the letters as b.

  • *kd - Append k spaces.

  • +bd - b + a space (the current letter + space).

  • *...hk - Repeat k+1 times.

  • +(...)(...) - Concatenate.

Mr. Xcoder
fonte
1
One of my favorite things about Pyth is writing an answer and finding that someone wrote the same answer, character for character. It hits that Python "there is a best answer" spot perfectly!
Dave
@pizzakingme Yeah, I wonder if I can do better
Mr. Xcoder
the space addition feels wrong, I think better is possible
Dave
@pizzakingme I could get .e+*kdjd*bhk<GhxG as 17 bytes as well
Mr. Xcoder
16 bytes: .e+*kd*+bdhkhcGQ
Dave
1

C++ (gcc), 164 bytes

#include<iostream>
#define f for(int i=0;i<o-'`';i++)
using namespace std;int main(){char c;cin>>c;for(char o='a';o<=c;o++){f cout<<' ';f cout<<o<<' ';cout<<'\n';}}

My first attempt after a long time lurking!

Ungolfed code below:

#include <iostream>

using namespace std;
#define f for (auto i = 0; i < output - '`'; i++)

int main()
{
  char input;

  cin >> input;

  for (char output = 'a'; output <= input; output++)
  {
    f cout << ' ';

    f cout << output << ' ';

    cout << endl;
  }
}

Try it online!

Drise
fonte
I know there has to be a bunch of golfing things to do, but so far, that's the smallest I've gotten.
Drise