El triángulo del alfabeto ataca de nuevo


24

Tarea

Su tarea es imprimir este texto exacto:

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

Especificaciones

  • Puede hacerlo en minúsculas en lugar de mayúsculas.
  • Se permiten líneas nuevas al final del triángulo.
  • Se permiten espacios finales después de cada línea.
  • Debe imprimir en STDOUT en lugar de generar una matriz de cadenas.

Tanteo

Este es el . Programa con el menor recuento de bytes gana.


1
¿Qué quieres decir con "huelgas de nuevo"? ¿Hubo otro desafío que hiciste así?
haykam


1
Parece bastante trivial ¿realmente necesitamos (otro) desafío del alfabeto?
Rohan Jhunjhunwala

2
Es un buen desafío, pero creo que hemos superado la saturación de estos desafíos del alfabeto, nada personal.
Rohan Jhunjhunwala

En realidad, buscando un desafío alfabético para que la letra en una posición no se pueda calcular mediante expresiones simples de sus coordenadas que involucran la modfunción. Puedo hacer uno si tengo tiempo.
Weijun Zhou

Respuestas:


39

Vim, 29 bytes

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

Donde representa la tecla Retorno, la tecla Escape y βla tecla Retroceso.

ingrese la descripción de la imagen aquí


3
¿Cómo siempre me ganas a la respuesta vim en estos? Aargh +1 de todos modos, ¡no puedo votar a Vim ! :)
DJMcMayhem

77
Todavía creo que deberías usar en lugar de . Y en lugar de β. Para eso están hechos estos caracteres Unicode. 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

1
Cambié el encabezado a Python 2 porque el código no funcionaría en Python 3.
Leaky Nun

7

Jalea , 10 bytes

26RḤ’RØAṁY

Pruébalo en línea!

Cómo 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.

¿"Double" se llamaba "Unhalve" en aquel entonces? Además, es genial !! [esperando felicitar por 100k rep]
Erik the Outgolfer

Es solo un mnemotécnico. Hes la mitad y es su inverso ( unhalve ).
Dennis

Solo pienso en /2o *2, así que es "Reducir a la mitad" o "Doble". Por eso estaba confundido.
Erik the Outgolfer

También 10 bytes:27Ḷ²IRØAṁY
Leaky Nun

También 10 bytes:51Rm2RØAṁY
HyperNeutrino

7

VBA Excel (80 bytes, 1742 bytes)


Excel, 1742 bytes

Inspirado por la respuesta creativa de la ugoren , logré encontrar una fórmula de Excel para crear el patrón como se muestra en el OP.

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

Pegue esta fórmula en la celda A1, luego arrastre por todo el rango A1: A26.

La longitud de la fórmula es de 67 bytes, pero debe replicarla 26 veces, por lo que es igual a 67 * 26 = 1742 bytes. Aquí está la salida:

ingrese la descripción de la imagen aquí


Excel VBA, 80 bytes

Ahora es posible que integremos Excel con VBA para automatizar el proceso y guardar muchos bytes, ya que VBA está integrado en la mayoría de las aplicaciones de Microsoft Office, incluido Excel. Escriba y ejecute el siguiente código en la ventana Inmediato (use las teclas de combinación CTRL+ Gpara mostrarlo en el Editor de Visual Basic):

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

El programa funciona imprimiendo la fórmula de Excel anterior en el rango A1: A26. Desafortunadamente, tanto Excel como VBA no tienen un alfabeto incorporado.


Los nombres de las columnas me parecen un alfabeto incorporado. Use los primeros 26 nombres de columna.
mbomb007

1
@ mbomb007 ¿Y qué? Creo que sería más difícil usarlos en lugar de cadenas.
Erik the Outgolfer

@EriktheGolfer Entonces? Mi punto era que no es un alfabeto incorporado.
mbomb007

1
@ mbomb007 Dijiste "Usa los primeros 26 nombres de columna", que percibí como "Usa los primeros 26 nombres de columna en lugar de lo que usas actualmente", por eso respondí.
Erik the Outgolfer

@EriktheGolfer Es una sugerencia. Idk cuántos bytes serían.
mbomb007

5

Haskell, 67 bytes

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

Una recursión simple a lo largo ide la línea. En cada paso, los siguientes icaracteres se toman de una repetición infinita del alfabeto.


4

Mathematica, 90 bytes

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

Función anónima. No realiza ninguna entrada y devuelve una cadena como salida. Sugerencias de golf bienvenidas. Un ejemplo de lo que Internal`PartitionRaggedhace:

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

Out[1]= {{2, 3}, {5, 7, 11}, {13}}

¿Mathematica tiene incorporado un triángulo alfabético?
Buffer Over Read

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

Mi primera respuesta en C \ o /

Las sugerencias de golf son más que bienvenidas.


62:i;main(j){while(i<676)printf("\n%c"+(j*j^i++||!j++),i%26+65);}
xsot

@xsot Gracias, pero me temo que las nuevas líneas principales no están permitidas.
Leaky Nun

1
¿Pero no hay una nueva línea líder?
xsot

60:i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot

@immibis, creo que debería publicarlo entonces.
xsot

4

Brachylog , 37 bytes

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

Pruébalo en línea!

Explicación

  • 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: se utiliza para generar cadenas variables de longitudes impares.

    =            Assign a value to the Input
    :2%1,        That value must be odd
    .#@l?,       Output is a string of length Input
    

Finalmente haces un desafío ascii-art
Leaky Nun

@LeakyNun clasificaría eso como manipulación de cadenas más que imo ASCII art
Fatalize

¿Debo agregar eso a la etiqueta?
Leaky Nun

Buen uso del hecho de que la última línea es la única línea que termina en la Zcual es porque 26está libre de cuadrados.
Leaky Nun


3

JavaScript (ES6), 77 82 88

Se requiere EcmaScript 6 solo para guardar 1 byte usando un literal de cadena de plantilla para nueva línea.

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

Menos golf

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

Prueba

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


\ o / una respuesta ES6 que puedo ejecutar en mi navegador
Downgoat

Robé tu lógica .toString (36) ... ¡ahora tienes que vencer a 80 bytes!
applejacks01

Ahh, lo admito, no se me ocurre ninguna manera de superar esto con mi biblioteca. Gracias por el reto!
applejacks01

3

Perl, 42 41 39 bytes

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

Solo el código:

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

Desafortunadamente, una versión obvia más corta desencadena un problema interno de perl (uso del valor liberado en la iteración):

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

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

1
El uso del operador de propagación podría ahorrarle 3 bytes : en [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ']lugar de 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``.
insertusernamehere


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:]}}

2

MATLAB, 112109 95 79 77 bytes

Esto también funcionará con Octave , puedes probar en línea aquí .

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

Entonces, después de algunos cambios importantes, he guardado otros 14 32 bytes. Este se está pareciendo mucho más a la longitud que hubiera esperado de MATLAB. Dejé la versión anterior a continuación, ya que es sustancialmente 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

Versión 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)))

Wow, ese terminó siendo más largo de lo que pensaba. Veré si no puedo eliminar algunos bytes.

Una versión no golfista 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

Expresiones de gratitud

  • 3 bytes guardados - gracias @LuisMendo

2

XPath 3.0 (y XQuery 3.0), 84 bytes

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

Explicación:

(1 to 26)!(65 to 90) es el alfabeto 26 veces

(0 to 25)!(subsequence(XX, start, len),10) toma 26 subsecuencias de esto, cada una seguida de nueva línea

subsequence(X, .*.+1, 2*.+1) toma subsecuencias sucesivas con posición de inicio y longitud: (1, 1), (2, 3), (5, 5), (10, 9) etc.

codepoints-to-string() convierte los puntos de código Unicode en caracteres


Bravo. Pensé que sabía lo que era XQuery. Resulta que no tenía idea.
Jordania

Dudo que muchas de las publicaciones aquí le digan mucho sobre el idioma en el que están escritas.
Michael Kay


2

05AB1E (alternativo) 15 bytes

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

Pruébalo en línea!

Explicación:

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.

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="")

Sin golf:

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="")

Básicamente, bes el vector de los números impares entre 1y 51, dando así la longitud de cada línea. Obviamente, la sumfunción suma los números de este vector y proporciona los índices inicial y final.

-5 bytes gracias a @plannapus!
-4 bytes gracias a @plannapus!


1
arf, lo siento, no lo vi antes, pero como solo lo estás usando auna vez, no necesitas definirlo, lo que significa que puedes eliminar un par de bytes más: 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 tonto yo! Gracias de nuevo ! También integré la b=seqparte en el cuerpo principal, ¡así que es aún menos legible!
Frédéric

2

R, 81 73 65 63 bytes

Un forenfoque de bucle simple . Repite el alfabeto 26 veces y recorre un rango de índice deslizante que se calcula 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="")

2

Casco , 10 bytes

Cİ1ṠṁK…"AZ

Pruébalo en línea!

Explicación

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

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%%

1

05AB1E , 18 17 bytes

26FA26×N>n£NnF¦},

Explicación

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

Pruébalo en línea!


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

Sin golf:

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

1

TSQL, 129 bytes

USE MASTER al comienzo de la secuencia de comandos es para garantizar que la consulta se ejecute en la base de datos maestra, que es predeterminada para muchos usuarios (sin contar bytes para eso).

Golfizado:

USE MASTER

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

Sin golf:

USE MASTER

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

Violín

Fiddle para versiones anteriores usando la ruta xml


1

PowerShell, 68 bytes

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

La sección anterior al primer punto y coma produce una cadena que contiene 26 copias del alfabeto en mayúsculas. La siguiente sección inyecta saltos de línea en el índice de cada número cuadrado (trabajando hacia atrás para no tener que dar cuenta del desplazamiento). Finalmente, $aal final solo inserta esa variable de cadena en el equivalente de PowerShell STDOUT.



1

C, 60 bytes

i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}

putsSolo toma un argumento. (Se permite un comportamiento indefinido en codegolf normalmente, pero esto está demasiado lejos de los carriles habituales)
MM

@MM El comportamiento indefinido se explota todo el tiempo. La regla es que un envío es válido siempre que funcione en algún compilador, de lo contrario tendríamos que descartar explícitamente una larga lista de excepciones. Este código funciona en gcc, por lo que es un envío 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';}}

Primero intente con uno de estos. Utiliza una int "c" para registrar qué letra necesita imprimir en un momento dado. Una vez que "c" pasa 90 ('Z') se restablece a 65 ('A'). Imprime la pirámide con bucles.


¡Buena respuesta! Podría hacerlo if(c<92)c=65para quitar un byte, y también podría hacerlo en int a()lugar de hacerlo void a(), pero no estoy seguro si eso funciona sin la devolución. Aparte de eso, creo que debe incluir #include <iostream>en su recuento de bytes.
DJMcMayhem

Creo que quisiste decir if(c>90)c=65, pero gracias por la sugerencia, es una buena idea. Además, supongo que lo incluiré, gracias.
Limelier

1

PHP, 76 69 bytes

for(;$i<26&&$a.=join(range(A,Z));)echo substr($a,$i**2,1+2*$i++)."
";
  • Cree 26 alfabeto (más que suficiente) y contacte con ellos en $ a
  • bucle para i <26
  • mostrar $ a subcadena inicio i ^ 2, fin 2 * i + 1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.