Triângulo do alfabeto ataca novamente

24

Tarefa

Sua tarefa é imprimir este texto exato:

A
BCD
EFGHI
JKLMNOP
QRSTUVWXY
ZABCDEFGHIJ
KLMNOPQRSTUVW
XYZABCDEFGHIJKL
MNOPQRSTUVWXYZABC
DEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQ
RSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLM
NOPQRSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLMNOPQ
RSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

Especificações

  • Você pode fazer tudo em minúsculas em vez de todas em maiúsculas.
  • Trailing newlines no final do triângulo é permitido.
  • Espaços à direita após cada linha é permitida.
  • Você deve imprimir em STDOUT em vez de gerar uma matriz de seqüências de caracteres.

Pontuação

Isso é . Programa com menores vitórias na contagem de bytes.

Freira Furada
fonte
11
O que você quer dizer com "ataca novamente"? Houve outro desafio que você fez assim?
precisa saber é o seguinte
11
Parece bastante trivial que realmente precisamos (outro) desafio de alfabeto?
Rohan Jhunjhunwala
2
É um bom desafio, mas acho que superamos a saturação desses desafios do alfabeto, nada pessoal.
Rohan Jhunjhunwala
Na verdade, procurando um desafio de alfabeto que a letra em uma posição não possa ser calculada por expressões simples de suas coordenadas que envolvem a modfunção. Pode me fazer um se tiver tempo.
Weijun Zhou 31/01

Respostas:

39

Vim, 29 bytes

:h<_↵↵↵y$ZZ26P0qqa↵♥βjllq25@q

Onde representa a tecla Return, a tecla Escape e βa tecla Backspace.

insira a descrição da imagem aqui

Lynn
fonte
3
Como você sempre me bate na resposta vim sobre isso? Aargh +1 de qualquer maneira, não posso deixar de votar no vim! :)
DJMcMayhem
7
Eu ainda acho que você deveria usar em vez de . E ao invés de β. É para isso que esses caracteres Unicode foram criados. utf8icons.com/subsets/control-pictures
mbomb007
9

Python 2, 65 bytes

i=1
a=bytearray(range(65,91))*26
while a:print a[:i];a=a[i:];i+=2
xsot
fonte
11
Eu mudei o cabeçalho para Python 2 porque o código não iria trabalhar em Python 3.
Leaky Nun
7

Gelatina , 10 bytes

26RḤ’RØAṁY

Experimente online!

Como funciona

26RḤ’RØAṁY  Main link. No Arguments.

26          Set the return value to 26.
  R         Range; yield [1, 2, ..., 25, 26].
   Ḥ        Unhalve; yield [2, 4, ..., 50, 52].
    ’       Decrement; yield [1, 3, ..., 49, 51].
     R      Range; yield [[1], [1, 2, 3], ..., [1, ..., 49], [1, ..., 51]].
      ØA    Yield the uppercase alphabet.
        ṁ   Mold the alphabet as the array of ranges. This repeats the uppercase
            letters over an over again, until all integers in the range arrays
            have been replaced with letters.
         Y  Join, separating by linefeeds.
Dennis
fonte
Era "Double" chamado "Unhalve" naquela época? Além disso, é ótimo !! [esperando para dizer parabéns por 100k repetições]
Erik the Outgolfer
É apenas um mnemônico. Hé dividido pela metade e é seu inverso (não- dividido ).
Dennis
Eu só penso em /2ou *2, então é "Halve" ou "Double". Por isso fiquei confuso.
Erik the Outgolfer
Também 10 bytes:27Ḷ²IRØAṁY
Freira gotejante
Também 10 bytes:51Rm2RØAṁY
HyperNeutrino
7

Excel VBA (80 bytes, 1742 bytes)


Excel, 1742 bytes

Inspirado pela resposta criativa do ugoren , consegui encontrar uma fórmula do Excel para criar o padrão, conforme mostrado no OP.

=MID(REPT("ABCDEFGHIJKLMNOPQRSTUVWXYZ",26),(ROW()-1)^2+1,2*ROW()-1)

Cole esta fórmula na célula A1 e arraste todo o intervalo A1: A26.

O comprimento da fórmula é 67 bytes, mas você deve replicá-lo 26 vezes, portanto é igual a 67 * 26 = 1742 bytes. Aqui está a saída:

insira a descrição da imagem aqui


Excel VBA, 80 bytes

Agora é possível integrar o Excel ao VBA para automatizar o processo e economizar muitos bytes, pois o VBA está incorporado na maioria dos aplicativos do Microsoft Office, incluindo o Excel. Escreva e execute o seguinte código na Janela Imediata (use as teclas de combinação CTRL+ Gpara exibi-lo no Editor do Visual Basic):

[A1:A26]="=MID(REPT(""ABCDEFGHIJKLMNOPQRSTUVWXYZ"",26),(ROW()-1)^2+1,2*ROW()-1)"

O programa funciona imprimindo a fórmula do Excel acima no intervalo A1: A26. Infelizmente, o Excel e o VBA não possuem alfabeto interno.

Anastasiya-Romanova 秀
fonte
Os nomes das colunas me parecem um alfabeto embutido. Use os 26 primeiros nomes de coluna.
precisa saber é o seguinte
11
@ mbomb007 E daí? Eu acho que seria mais difícil usá-los em vez de cordas.
Erik the Outgolfer
@EriktheGolfer So? Meu ponto era que não é um alfabeto builtin.
mbomb007
11
@ mbomb007 Você disse "Use os 26 primeiros nomes de colunas", que eu percebi como "Use os 26 primeiros nomes de colunas em vez do que você usa atualmente", foi por isso que respondi.
Erik the Outgolfer
@EriktheGolfer É uma sugestão. Idk quantos bytes seria.
Mbomb007
5

Haskell, 67 bytes

_#53=[]
s#i=take i s:drop i s#(i+2)
mapM putStrLn$cycle['A'..'Z']#1

Uma recursão simples ao longo do comprimento ida linha. Em cada etapa, os próximos icaracteres são retirados de uma repetição infinita do alfabeto.

nimi
fonte
4

Mathematica, 90 bytes

StringRiffle[Flatten[Alphabet[]&~Array~26]~Internal`PartitionRagged~Range[1,51,2],"
",""]&

Função anônima. Não recebe entrada e retorna uma string como saída. Sugestões de golfe são bem-vindas. Um exemplo do que Internal`PartitionRaggedfaz:

In[1]:= Internal`PartitionRagged[{2, 3, 5, 7, 11, 13}, {2, 3, 1}]               

Out[1]= {{2, 3}, {5, 7, 11}, {13}}
LegionMammal978
fonte
O Mathematica possui um built-in para triângulos do alfabeto?
Buffer Over Ler
4

C, 79 bytes

main(i,j){for(i=0,j=1;i<676;i++){putchar(i%26+65);if(j*j==i+1){puts("");j++;}}}

Minha primeira resposta em C \ o /

Sugestões de golfe são mais que bem-vindas.

Freira Furada
fonte
62:i;main(j){while(i<676)printf("\n%c"+(j*j^i++||!j++),i%26+65);}
xsot
@xsot Obrigado, mas tenho medo de que novas linhas de liderança não sejam permitidas.
Leaky Nun
11
Mas não há nova linha líder?
xsot
60:i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot 21/08
@immibis Acho que devo publicá-lo então.
xsot
4

Braquilog , 37 bytes

26~l<:1aLc~j[@A:I],L~@nw
=:2%1,.#@l?,

Experimente online!

Explicação

  • Predicado principal:

    26~l         Let there be a list of 26 elements
    <            This list is an ascending list of integers
    :1aL         Apply predicate 1 to that list ; the resulting list of strings is L
    c            Concatenate the list of strings into one big string
    ~j[@A:I],    That big string is the result of juxataposing the alphabet I times to itself
    L~@n         Create a string which when splitted on line breaks results in L
    w            Write that string to STDOUT
    
  • Predicado 1: usado para gerar sequências variáveis ​​de comprimentos ímpares.

    =            Assign a value to the Input
    :2%1,        That value must be odd
    .#@l?,       Output is a string of length Input
    
Fatalizar
fonte
Finalmente você faz um desafio ascii-art #
Leaky Nun
@LeakyNun classificaria isso como a manipulação de cadeia mais do que a arte ASCII imo
Fatalize
Devo adicionar isso à tag?
Leaky Nun
Bom uso do fato de que a última linha é a única linha que termina na Zqual é porque 26é livre de quadrados.
Leaky Nun
3

JavaScript (ES6), 77 82 88

O EcmaScript 6 é necessário apenas para salvar 1 byte usando uma string de modelo literal para nova linha.

for(i=r=l=o='';l+52;r++||(r=l-=2,o+=`
`))o+=(i++%26+10).toString(36);alert(o)

Menos golfe

for(i = r = l = o = '';
    l + 52;
    r++ || (r = l -= 2, o += `\n`))
  o += (i++ % 26 + 10).toString(36);
alert(o);

Teste

for(i=r=l=o='';l+52;r++||(r=l-=2,o+=`
`))o+=(i++%26+10).toString(36);alert(o)

edc65
fonte
\ o / uma resposta ES6 que eu posso executar no meu navegador
Downgoat
Eu roubei sua lógica .toString (36) ... agora você tem que vencer 80 bytes !!
precisa saber é o seguinte
Ahh, eu admito, não consigo pensar em nenhuma maneira de superar isso com minha biblioteca. Obrigado pelo desafio!
precisa saber é o seguinte
3

Perl, 42 41 39 bytes

perl -E '@b=(A..Z)x26;say splice@b,0,$#a+=2for@b'

Apenas o código:

@b=(A..Z)x26;say splice@b,0,$#a+=2for@b

Uma versão mais curta óbvia infelizmente desencadeia um problema interno de perl (uso de valor liberado na iteração):

say splice@b,0,$#a+=2for@b=(A..Z)x26
Ton Hospel
fonte
2

JavaScript, 129 bytes

z=1,i=0,g=a=>{b=0,c="";while(a+a-1>b){c+='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``[i>26?i=0:i++];b++}console.log(c)};while(z<26)g(z++)
Quill
fonte
11
Usar o operador spread pode economizar 3 bytes : em [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ']vez de 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``.
usar o seguinte comando
2

Go, 133 bytes

package main
import S "strings"
func main(){s:=S.Repeat("ABCDEFGHIJKLMNOPQRSTUVXXYZ",26)
for i:=1;s!="";i+=2{println(s[:i]);s=s[i:]}}
Roland Illig
fonte
2

MATLAB, 112 109 95 79 77 bytes

Isso também funcionará com o Octave , você pode tentar online aqui .

a=['' 65:90 65:90]';j=0;for i=1:2:52;b=circshift(a,j);j=j-i;disp(b(1:i)');end

Então, após algumas mudanças importantes, salvei mais 14 32 bytes. Este está ficando muito mais parecido com o comprimento que eu esperava do MATLAB. Deixei a versão antiga abaixo, pois é substancialmente diferente.

a=['' 65:90 65:90]';        %Create 2 copies of the upper case alphabet
j=0;                        %Initialise cumulative sum
for i=1:2:52;               %For each line length
    b=circshift(a,j);       %Rotate the alphabet string by the cumulative offset
    j=j-i;                  %Update cumulative negative sum of offsets.
    disp(
         b(1:i)'            %Extract first 'line length' characters from rotated alphabet.
               );           %Display next line (disp adds newline automatically)
end

Versão original:

a=['' repmat(65:90,1,26)];c=cumsum(1:2:51);disp(cell2mat(arrayfun(@(s,f)[a(s:f) 10],[1,c(1:25)+1],c,'Un',0)))

Uau, esse acabou sendo mais longo do que eu pensava. Vou ver se não consigo extrair alguns bytes dele.

Uma versão não-gasta para explicar:

a=['' repmat(65:90,1,26)]; %Create 26 copies of the upper case alphabet
c=cumsum(1:2:51);          %Calculate the end index of each row in the above array, by cumulatively summing the length of each line
disp(
     cell2mat(
              arrayfun(@(s,f)
                             [a(s:f) 10], %Extract the part of the alphabet and insert a new line.
                                         [1,c(1:25)+1],c, %start index is the previous end of line plus 1. End index is as calculated by cumsum.
                       'Un',0 %The returned values are not all the same length
                       )   %Do this for each line
              )            %Convert back to a matrix now new lines inserted
     )                     %And display it

Agradecimentos

  • 3 bytes salvos - obrigado @LuisMendo
Tom Carpenter
fonte
2

XPath 3.0 (e XQuery 3.0), 84 bytes

codepoints-to-string((0 to 25)!(subsequence(((1 to 26)!(65 to 90)),.*.+1,2*.+1),10))

Explicação:

(1 to 26)!(65 to 90) é o alfabeto 26 vezes

(0 to 25)!(subsequence(XX, start, len),10) leva 26 subsequências disso, cada uma seguida por nova linha

subsequence(X, .*.+1, 2*.+1) toma subsequências sucessivas com posição inicial e comprimento: (1, 1), (2, 3), (5, 5), (10, 9) etc.

codepoints-to-string() transforma pontos de código Unicode em caracteres

Michael Kay
fonte
Bravo. Eu pensei que sabia o que era XQuery. Acontece que eu não tinha ideia.
Jordan
Duvido que muitas das mensagens aqui dizer muito sobre a língua que estão escritas em.
Michael Kay
2

05AB1E (alternativo) 15 bytes

A2×52µ¼D¾£,¾¼FÀ

Experimente online!

Explicação:

A2×              # push a string containing a-za-z
   52µ           # Loop the rest of the program until counter = 52
      ¼          # increment counter (it's 0 initially)
       D         # Duplicate the alpha string on the stack
        ¾£       # Replace alpha with alpha[0..counter]
          ,      # Pop the substring and print it
           ¾¼FÀ  # rotate the alpha string left counter++ times.
ruds
fonte
2

R, 120 115 111 bytes

v=c();for(i in 1:26){v=c(v,c(rep(LETTERS,26)[(sum((b=seq(1,51,2))[1:i-1])+1):sum(b[1:i])],"\n"))};cat(v,sep="")

Ungolfed:

a=rep(LETTERS,26)
b=seq(1,51,2)
v=vector()

for(i in 1:26)
    {
    v=c(v,c(a[(sum(b[1:i-1])+1):sum(b[1:i])],"\n"))
    }

cat(v,sep="")

Basicamente, bé o vetor dos números ímpares entre 1e 51, dando assim o comprimento de cada linha. Obviamente, a sumfunção soma os números desse vetor e fornece os índices inicial e final.

-5 bytes graças a @plannapus!
-4 bytes graças a @plannapus!

Frédéric
fonte
11
arf, desculpe, eu não vi isso antes, mas como você está usando apenas auma vez, não precisa defini-lo, o que significa que você pode raspar mais alguns bytes: b=seq(1,51,2);v=c();for(i in 1:26){v=c(v,c(rep(LETTERS,26)[(sum(b[1:i-1])+1):sum(b[1:i])],"\n"))};cat(v,sep="")funciona.
plannapus
@plannapus Silly me! Obrigado novamente ! Também integrei a b=seqpeça no corpo principal, para que fique ainda menos legível!
Frédéric
2

R, 81 73 65 63 bytes

Uma forabordagem simples de loop. Repita o alfabeto 26 vezes e passe por um intervalo de índice deslizante calculado usando (i^2-2*i+2):i^2.

for(i in 1:26)cat(rep(LETTERS,26)[(i^2-2*i+2):i^2],"\n",sep="")
Billywob
fonte
2

Casca , 10 bytes

Cİ1ṠṁK…"AZ

Experimente online!

Explicação

Cİ1ṠṁK…"AZ
      …"AZ    Get the alphabet
   ṠṁK        Replace each letter with the whole alphabet
C             Cut the resulting string into lines with lengths
 İ1            equal to the list of odd numbers
Leo
fonte
1

Lote, 123 bytes

@set s=
@for /l %%i in (1,2,51)do @call set s=%%s%%ABCDEFGHIJKLMNOPQRSTUVWXYZ&call echo %%s:~0,%%i%%&call set s=%%s:~%%i%%
Neil
fonte
1

05AB1E , 18 17 bytes

26FA26×N>n£NnF¦},

Explicação

26F                 # for N in range(0, 26) do
   A26×             # the alphabet repeated 26 times
       N>n£         # take (N+1)^2 letters
           NnF¦}    # throw away the first N^2 letters
                ,   # print with newline

Experimente online!

Emigna
fonte
1

Rexx, 74 72 bytes

i=1;m=1;do 26;say substr(copies(xrange('A','Z'),26),i,m);i=i+m;m=m+2;end

Ungolfed:

i=1
m=1
do 26
  say substr(copies(xrange('A','Z'),26),i,m)
  i=i+m
  m=m+2
end
aja
fonte
1

TSQL, 129 bytes

O USE MASTER no início do script é garantir que a consulta seja executada no banco de dados mestre, o padrão para muitos usuários (sem contar bytes para isso).

Golfe:

USE MASTER

SELECT SUBSTRING(REPLICATE('ABCDEFGHIJKLMNOPQRSTUVWXYZ',26),number*number+1,number*2+1)FROM spt_values WHERE number<26and'P'=type

Ungolfed:

USE MASTER

SELECT SUBSTRING(REPLICATE('ABCDEFGHIJKLMNOPQRSTUVWXYZ',26),number*number+1,number*2+1)
FROM spt_values
WHERE number<26and'P'=type

Violino

Violino para a versão mais antiga usando o caminho xml

t-clausen.dk
fonte
1

PowerShell, 68 bytes

$a=-join(65..90|%{[char]$_})*26;26..1|%{$a=$a.Insert($_*$_,"`n")};$a

A seção antes do primeiro ponto e vírgula produz uma sequência contendo 26 cópias do alfabeto maiúsculo. A próxima seção injeta quebras de linha no índice de cada número quadrado (trabalhando para trás, para que eu não precise explicar a mudança). Por fim, $ano final, apenas empurra essa variável de string para o equivalente do PowerShell STDOUT.

Ben N
fonte
1

C, 60 bytes

i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot
fonte
putsleva apenas um argumento. (Algum comportamento indefinido é permitido no codegolf normalmente, mas isso é um pouco longe demais das faixas usuais) #
MM
@MM O comportamento indefinido é explorado o tempo todo. A regra é que uma submissão é válida desde que funcione em algum compilador; caso contrário, teríamos que excluir explicitamente uma longa lista de exceções. Esse código funciona no gcc, por isso é um envio válido.
xsot
1

C ++, 111 bytes

void a(){int c=65,i,j;for(i=0;i<26;i++){for(j=0;j<=2*i;j++){std::cout<<(char)c;c++;if(c==91)c=65;}std::cout<<'\n';}}

Primeiro tente um desses. Usa um int "c" para registrar qual letra ele precisa imprimir a qualquer momento. Depois que "c" passa 90 ('Z'), ele é redefinido para 65 ('A'). Imprime a pirâmide usando loops.

limelier
fonte
Boa resposta! Você poderia fazer if(c<92)c=65para levar um byte off, e você também pode ser capaz de fazer int a(), em vez de void a(), mas eu não sou positivo se que funciona sem o retorno. Fora isso, acho que você precisa incluir #include <iostream>na sua contagem de bytes.
DJMcMayhem
Acredito que você quis dizer if(c>90)c=65, mas obrigado pela sugestão, é uma boa ideia. Além disso, acho que vou incluí-lo, obrigado.
limelier
1

PHP, 76 69 bytes

for(;$i<26&&$a.=join(range(A,Z));)echo substr($a,$i**2,1+2*$i++)."
";
  • Crie 26 alfabeto (mais que o suficiente) e entre em contato com eles em $ a
  • loop para i <26
  • exibir $ a substring start i ^ 2, final 2 * i + 1
Crypto
fonte