Il triangolo alfabetico colpisce ancora


24

Compito

Il tuo compito è stampare questo testo esatto:

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

Specifiche

  • Puoi farlo in minuscolo anziché maiuscolo.
  • È consentito il trascinamento di nuove righe alla fine del triangolo.
  • Spazi di trascinamento dopo ogni riga sono ammessi.
  • È necessario stampare su STDOUT anziché emettere una matrice di stringhe.

punteggio

Questo è . Il programma con il conteggio dei byte più basso vince.


1
Cosa intendi con "scioperi ancora"? C'è stata un'altra sfida che hai fatto in questo modo?
Haykam,


1
Sembra abbastanza banale, abbiamo davvero bisogno di (un'altra) sfida alfabetica?
Rohan Jhunjhunwala,

2
È una buona sfida, ma penso che abbiamo superato la saturazione di queste sfide dell'alfabeto, niente di personale.
Rohan Jhunjhunwala,

In realtà alla ricerca di una sfida alfabetica che la lettera in una posizione non può essere calcolata da semplici espressioni dalle sue coordinate che coinvolgono la modfunzione. Posso crearne uno io stesso se ho tempo.
Weijun Zhou,

Risposte:


39

Vim, 29 byte

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

Dove rappresenta il tasto Invio, il tasto Esc e βil tasto Backspace.

enter image description here


3
Come mi batti sempre alla risposta vim su questi? Aargh +1 comunque, non posso non votare vim! :)
DJMcMayhem

7
Penso ancora che dovresti usare al posto di . E invece di β. Questo è ciò per cui sono stati creati questi caratteri Unicode. utf8icons.com/subsets/control-pictures
mbomb007

9

Python 2, 65 byte

i=1
a=bytearray(range(65,91))*26
while a:print a[:i];a=a[i:];i+=2

1
Ho cambiato l'intestazione in Python 2 perché il codice non funzionava in Python 3.
Leaky Nun

7

Gelatina , 10 byte

26RḤ’RØAṁY

Provalo online!

Come funziona

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.

Allora "Double" si chiamava "Unhalve"? Inoltre, è fantastico !! [in attesa di congratulazioni per un rappresentante di 100k]
Erik the Outgolfer,

È solo un mnemonico. Hè dimezzato ed è il suo inverso ( inalterato ).
Dennis,

Penso solo a /2o *2, quindi è "Dimezzare" o "Doppio". Ecco perché ero confuso.
Erik the Outgolfer,

Anche 10 byte:27Ḷ²IRØAṁY
Leaky Nun,

Anche 10 byte:51Rm2RØAṁY
HyperNeutrino il

7

VBA Excel (80 byte, 1742 byte)


Excel, 1742 byte

Ispirato dalla risposta creativa di ugoren , sono riuscito a trovare una formula di Excel per creare il modello come mostrato nel PO.

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

Incolla questa formula nella cella A1, quindi trascina tutto l'intervallo A1: A26.

La lunghezza della formula è 67 byte, ma è necessario replicarla 26 volte, quindi è uguale a 67 * 26 = 1742 byte. Ecco l'output:

enter image description here


Excel VBA, 80 byte

Ora è possibile integrare Excel con VBA per automatizzare il processo e salvare molti byte poiché VBA è integrato nella maggior parte delle applicazioni di Microsoft Office, incluso Excel. Scrivi ed esegui il seguente codice nella finestra immediata (usa i tasti combinazione CTRL+ Gper visualizzarlo in Visual Basic Editor):

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

Il programma funziona stampando la formula di Excel sopra nell'intervallo A1: A26. Sfortunatamente, sia Excel che VBA non hanno un alfabeto incorporato.


I nomi delle colonne mi sembrano un alfabeto incorporato. Usa i primi 26 nomi di colonne.
mbomb007,

1
@ mbomb007 E allora? Penso che sarebbe più difficile usarli al posto delle stringhe.
Erik the Outgolfer,

@EriktheGolfer So? Il mio punto è che non v'è un alfabeto incorporato.
mbomb007,

1
@ mbomb007 Hai detto "Usa i primi 26 nomi di colonna", che ho percepito come "Usa i primi 26 nomi di colonna invece di quello che usi attualmente", ecco perché ho risposto.
Erik the Outgolfer,

@EriktheGolfer È un suggerimento. Idk quanti byte sarebbe.
mbomb007,

5

Haskell, 67 byte

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

Una semplice ricorsione sulla lunghezza idella linea. In ogni passaggio i icaratteri successivi sono presi da un'infinita ripetizione dell'alfabeto.


4

Mathematica, 90 byte

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

Funzione anonima. Non accetta input e restituisce una stringa come output. Suggerimenti di golf benvenuti. Un esempio di cosa Internal`PartitionRaggedfa:

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

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

Mathematica ha un built-in per triangoli alfabetici?
Buffer over letto il

4

C, 79 byte

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

La mia prima risposta in C \ o /

I suggerimenti sul golf sono più che benvenuti.


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

@xsot Grazie ma temo che non siano consentite le nuove linee principali.
Leaky Nun,

1
Ma non c'è una newline leader?
xsot,

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

@immibis Immagino che dovrei pubblicarlo allora.
xsot,

4

Brachylog , 37 byte

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

Provalo online!

Spiegazione

  • Predicato principale:

    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
    
  • Predicato 1: utilizzato per generare stringhe variabili di lunghezze dispari.

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

Finalmente fai una sfida di arte ascii
Leaky Nun,

@LeakyNun Lo classificherebbe come manipolazione di stringhe più di ASCII art imo
Fatalizza il

Devo aggiungerlo al tag?
Leaky Nun,

Un buon uso del fatto che l'ultima riga è l'unica riga che termina in Zcui è perché 26è senza quadrati.
Leaky Nun,


3

JavaScript (ES6), 77 82 88

EcmaScript 6 richiede solo di salvare 1 byte usando una stringa di modello letterale per newline.

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

Meno golf

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

Test

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


\ / / una risposta ES6 che posso eseguire nel mio browser
Downgoat

Ho rubato la tua logica .toString (36) ... ora devi battere 80 byte !!
applejacks01

Ahh lo ammetto, non riesco a pensare a nessun modo per batterlo con la mia biblioteca. Grazie per la sfida!
applejacks01,

3

Perl, 42 41 39 byte

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

Solo il codice:

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

Una versione evidente più corta innesca sfortunatamente un problema interno perl (Uso del valore liberato nell'iterazione):

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

2

JavaScript, 129 byte

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
L'uso dell'operatore spread potrebbe farti risparmiare 3 byte : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ']anziché 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``.
inserireusernamehere il


2

Vai, 133 byte

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, 112 109 95 79 77 byte

Questo funzionerà anche con Octave , puoi provare online qui .

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

Quindi, dopo alcune importanti modifiche, ho salvato altri 14 32 byte. Questo sta diventando molto più simile alla lunghezza che mi sarei aspettato da MATLAB. Ho lasciato la vecchia versione qui sotto in quanto è sostanzialmente diversa.

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

Versione originale:

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, quello è finito per essere più lungo di quanto pensassi. Vedrò se non riesco a toglierlo di qualche byte.

Una versione non golfata per spiegare:

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

Ringraziamenti

  • 3 byte salvati - grazie @LuisMendo

2

XPath 3.0 (e XQuery 3.0), 84 byte

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

Spiegazione:

(1 to 26)!(65 to 90) è l'alfabeto 26 volte

(0 to 25)!(subsequence(XX, start, len),10) ne prende 26 sottosequenze, ciascuna seguita da newline

subsequence(X, .*.+1, 2*.+1) prende le successive sottosequenze con posizione iniziale e lunghezza: (1, 1), (2, 3), (5, 5), (10, 9) ecc.

codepoints-to-string() trasforma i punti di codice Unicode in caratteri


Bravo. Pensavo di sapere cosa fosse XQuery. Si scopre che non ne avevo idea.
Giordania,

Dubito che molti dei post qui ti parlino molto della lingua in cui sono scritti.
Michael Kay,


2

05AB1E (alternativo) 15 byte

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

Provalo online!

Spiegazione:

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 byte

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

Fondamentalmente, bè il vettore dei numeri dispari tra 1e 51, dando così la lunghezza di ogni riga. Ovviamente, la sumfunzione somma i numeri di questo vettore e fornisce gli indici di inizio e fine.

-5 byte grazie a @plannapus!
-4 byte grazie a @plannapus!


1
ma scusami non l'ho visto prima, ma dato che stai usando solo auna volta che non hai davvero bisogno di definirlo, il che significa che puoi radere un altro paio di byte: 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="")funziona.
plannapus,

@plannapus Silly me! Grazie ancora ! Ho anche integrato la b=seqparte nel corpo principale, quindi è ancora meno leggibile!
Frédéric,

2

R, 81 73 65 63 byte

Un semplice forapproccio ad anello. Ripeti l'alfabeto 26 volte e esegui il ciclo attraverso un intervallo di indice scorrevole che viene calcolato utilizzando (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

Buccia , 10 byte

Cİ1ṠṁK…"AZ

Provalo online!

Spiegazione

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

Lotto, 123 byte

@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 byte

26FA26×N>n£NnF¦},

Spiegazione

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

Provalo online!


1

Rexx, 74 72 byte

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

1

TSQL, 129 byte

USE MASTER all'inizio dello script è assicurarsi che la query venga eseguita nel database master, che è predefinito per molti utenti (non contando i byte per quello).

golfed:

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

Fiddle per versione precedente utilizzando il percorso xml


1

PowerShell, 68 byte

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

La sezione prima del primo punto e virgola produce una stringa contenente 26 copie dell'alfabeto maiuscolo. La sezione successiva inietta le interruzioni di riga nell'indice di ciascun numero quadrato (lavorando all'indietro, quindi non devo tenere conto dello spostamento). Infine, $aalla fine inserisce la variabile stringa sull'equivalente di PowerShell STDOUT.



1

C, 60 byte

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

putsaccetta solo un argomento. (Alcuni comportamenti indefiniti sono normalmente ammessi in codegolf, ma questo è un po 'troppo lontano dalle solite corsie)
MM

@MM Il comportamento indefinito viene sfruttato continuamente. La regola è che un invio è valido fintanto che funziona in alcuni compilatori, altrimenti dovremmo escludere esplicitamente un lungo elenco di eccezioni. Questo codice funziona in gcc quindi è un invio valido.
xsot,

1

C ++, 111 byte

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

Prima prova in uno di questi. Utilizza una "c" int per registrare la lettera che deve stampare in qualsiasi momento. Una volta che "c" supera 90 ("Z"), viene ripristinato a 65 ("A"). Stampa la piramide usando per i loop.


Bella risposta! Potresti fare if(c<92)c=65per togliere un byte, e potresti anche essere in grado di farlo int a()invece di void a(), ma non sono positivo se funziona senza il ritorno. A parte questo, penso che devi includere #include <iostream>nel conteggio dei byte.
DJMcMayhem

Credo che volevi dire if(c>90)c=65, ma grazie per il suggerimento, è una buona idea. Inoltre, suppongo che lo includerò, grazie.
limelier,

1

PHP, 76 69 byte

for(;$i<26&&$a.=join(range(A,Z));)echo substr($a,$i**2,1+2*$i++)."
";
  • Crea 26 alfabeto (più che sufficiente) e contattali in $ a
  • loop per i <26
  • visualizza $ a inizio sottostringa i ^ 2, fine 2 * i + 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.