Cannone Alfabeto


34

Una palla di cannone viene sparata in modo tale che nel primo battito di ciglia del suo volo sale dalle Ncime degli alberi, durante il secondo battito di ciglia dalle N-1cime degli alberi, ecc. Fino a raggiungere il punto più alto della sua traiettoria. Quindi inizia a cadere di 1, 2, ecc. Sulle cime degli alberi per ogni battito di ciglia fino a quando non colpisce il terreno. Allo stesso tempo, la palla di cannone si muove in orizzontale con una velocità costante di 1 cima d'albero / battito di ciglia.

Il tuo compito è disegnare la traiettoria con lettere consecutive dall'alfabeto inglese. Se finisci le lettere, ricomincia da 'A'. Scrivi una funzione o un programma. L'input è un numero intero N( 1≤N≤15). L'output può essere una matrice di caratteri in qualsiasi forma ragionevole, ad esempio una stringa separata da una nuova riga o un elenco di stringhe. Le lettere possono essere tutte minuscole o tutte maiuscole. Sono consentiti spazi iniziali e finali aggiuntivi. Sono vietate le scappatoie standard. Il codice più corto è migliore.

in:
5
out:
    OP
   N  Q
   M  R
  L    S
  K    T
  J    U
 I      V
 H      W
 G      X
 F      Y
E        Z
D        A
C        B
B        C
A        D

in:
1
out:
AB


2
Perché O e P sono allo stesso livello nell'esempio? Se leggo correttamente le specifiche, sembra che dovrebbe salire di una cima d'albero per P e scendere di una per Q.
Skyler,

2
@Skyler Ad ogni segno di spunta, l'alfabeto va 1 a destra e N in verticale. N diminuisce anche ogni segno di spunta. Tra Oe P, il segno di spunta va 1 a destra, ma 0 verso l'alto o verso il basso.
Olivier Grégoire,

4
Sembra che i cannoni alfabetici siano ormai canoni.
Carl Witthoft,

2
@ngn Hah, stavo armeggiando con la soluzione Perl di @ TonHospel e ho trovato 1 byte in meno, ma supporta solo fino a 14 !
Dom Hastings,

Risposte:


8

05AB1E , 33 32 29 28 byte

>*As∍2ä`R)ζRIL£vyε`N·úJ])˜.c

Provalo online!

Spiegazione

>*                             # push input*(input+1)
  As∍                          # take that many characters from the alphabet (with wrap)
     2ä                        # split in 2 parts
       `R)                     # reverse the second part
          ζ                    # zip (gives a list of pairs)
           R                   # reverse
            IL£                # split into parts of sizes equal to [1,2...]
               vy              # for each (part y, index N)
                 ε             # for each pair in that part
                  `N·úJ        # insert N*2 spaces between the characters
                       ]       # end loops
                        )˜     # wrap in a flattened list
                          .c   # format as lines padded to equal length

Mi sento Nú»o qualcosa del genere che potrebbe essere usato per la stampa man mano che vai invece])~.c
Magic Octopus Urn

Tutto quello che ho potuto escogitare è questa implementazione qui, ma è peggio di 2 byte.
Magic Octopus Urn,

8

Stax , 29 24 byte

╦'♫ΓqπL⌂δ@╚n>DI∙Q┴òkεwö╔

Esegui ed esegui il debug online

La corrispondente rappresentazione ASCII dello stesso programma è questa.

VA*xRr:m|/xH({rix/|1*_%:T)mMm

VA*                             repeat alphabet input times
   xRr:m                        [x ... 1, 1 ... x] where x=input
        |/xH(                   get consecutive substrings of specified sizes
             {           m      map substrings using block
              ix<|1*            reverse string if index<x
                    _%:T)       left-pad to appropriate triangular number
                          Mm    transpose and output

7

R, 169 163 161 153 150 110 109 byte

Questo approccio riempie una matrice e quindi stampa la matrice.

golfed

function(n)write(`[<-`(matrix(" ",M<-2*n,k<-sum(1:n)),cbind(rep(1:M,c(n:1,1:n)),c(k:1,1:k)),LETTERS),1,M,,"")

Grazie @Giuseppe per 153.

Grazie @JDL per 150.

Vedi il commento di @ Giuseppe per 112 e alcune modifiche per 110 ora 109. Copia codice originale.

function(n){a=matrix(" ",M<-2*n,k<-sum(1:n))
Map(function(x,y,z)a[x,y]<<-z,rep(1:M,c(n:1,1:n)),c(k:1,1:k),head(LETTERS,2*k))
cat(rbind(a,"
"),sep="")}

Se si stampa un output valido, quindi 73 byte

function(n,k=sum(1:n))plot(rep(1:(2*n),c(n:1,1:n)),c(1:k,k:1),pc=LETTERS)

inserisci qui la descrizione dell'immagine


153 byte - la tua soluzione ha stampato uno spazio extra sull'apice che ho riparato, e poi ho anche cercato alcune cose. Bella risposta!
Giuseppe,

puoi usare Mapinvece di mapply?
JDL

@JDL Hai ragione. Penso sempre che Map sia un wrapper lapplyinvece di mapply. Grazie per 150
Vlo

Ciò continuava a infastidirmi, perché pensavo che ci dovesse essere un modo per indicizzare la matrice per row,columncoppie direttamente [invece di dover passare attraverso mapply(o Map), quindi ho trovato un modo per farlo. Ho anche ricordato che writeesiste e può sostituire catper 112 byte !
Giuseppe

@Giuseppe Il mio commento su "" non ha funzionato, ma con [<-, riusciamo a comprimere tutto in una riga, eliminando la necessità di alcune definizioni variabili. 110 byte: tio.run/##K/qfpmCj@z@tNC@5JDM/…
Vlo

6

Python 2 , 140 135 133 byte

lambda n:[' '*(n-j)+chr(~-i%26+65)+'  '*j+chr((n*-~n-i)%26+65)for i,j in zip(range(n*-~n/2,0,-1),sum([-~i*[i]for i in range(n)],[]))]

Provalo online!


5

MATL , 29 byte

,G:tPY"tf1Y2y@?tn+P])Z?]Pv1X!

Provalo online!

Come funziona

,        % Do twice
  G:     %   Push [1 2 ... n], where n is the input
  tP     %   Duplicate, flip: pushes [n n-1 ... 1]
  Y"     %   Run-length decoding: gives vector with n ones, n-1 twos ... (*)
  tf     %   Duplicate, find: gives [1 2 3 ... n*(n-1)/2] (**)
  1Y2    %   Push string 'ABC...Z'
  y      %   Duplicate from below: pushes [1 2 3 ... n*(n-1)/2]  again
  @?     %   If we are in the second iteration
    tn   %     Duplicate, length: pushes n*(n-1)/2
    +    %     Add: gives [n*(n-1)/2+1 n*(n-1)/2+2 ... n*(n-1)*2] 
    P    %     Flip: gives [n*(n-1)/2 n*(n-1)/2-1 ... n*(n-1)/2+1]
  ]      %   End if
  )      %   Index (1-based, modular) into the string. Gives a substring
         %   with the letters of one half of the parabola (***)
  Z?     %   Sparse: creates a char matrix with the substring (***) written
         %   at specified row (*) and column (**) positions. The remaining
         %   positions contain char(0), which will be displayed as space
]        % End do twice. We now have the two halves of the parabola, but
         % oriented horizontally instead of vertically
P        % Flip the second half of the parabola vertically, so that the
         % vertex matches in the two halves
v        % Concatenate the two halves vertically
1X!      % Rotate 90 degrees, so that the parabola is oriented vertically.
         % Implicitly display

4

Java (OpenJDK 8) , 121 byte

n->{for(int l=n*++n/2,r=l,i=1,j=0;l>0;j=j-->0?j:i++)System.out.printf("%"+(n-i)+"c%"+(2*i-1)+"c%n",--l%26+65,r++%26+65);}

Provalo online!

Spiegazione

n->{                             // int-accepting consumer
 for(                            //  loop
   int l=n*++n/2,                //    declare l (left) is the first character to print.
                                 //              Oh, and n is increased to reduce byte count later.
       r=l,                      //            r (right) is the second character to print.
       i=1,                      //            i is the "outer-loop" index
       j=0;                      //            j is the "inner-loop" index
   l>0;                          //    while there are characters to print        
   j=j-->0?j:i++)                //    simulate two loops in one,
                                 //      where j starts from 0 and always decreases until it reaches 0
                                 //      at which point j is reset to i and i is increased
  System.out.printf(             //   Print...
   "%"+(n-i)+"c%"+(2*i-1)+"c%n", //    2 characters
                                 //    - the first with n-i-1 whitespaces (remember, n was increased)
                                 //    - the second characters with 2*i-2 whitespaces
   --l%26+65,                    //    the first character to print is the left one, we decrease it.
   r++%26+65                     //    the second character to print is the right one, we increase it.
  );                             //   
                                 //  end loop
}                                // end consumer

3

C, 184 byte

i,j,k,l,m,h,o;f(n){char L[o=n*n][n*3];for(i=o;i--;)for(L[i][j=n*2]=h=k=0;j--;)L[i][j]=32;for(m=n;!h|~i;m-=1-h*2)for(h+(l=m)?++j:++h;l--;)L[h?i--:++i][j]=65+k++%26;for(;o--;)puts(L+o);}

Provalo online!

srotolato:

i, j, k, l, m, h, o;
f(n)
{
    char L[o=n*n][n*3];

    for (i=o; i--;)
        for (L[i][j=n*2]=h=k=0; j--;)
            L[i][j] = 32;

    for (m=n; !h|~i; m-=1-h*2)
        for (h+(l=m)?++j:++h; l--;)
            L[h?i--:++i][j] = 65 + k++%26;

    for (; o--;)
        puts(L+o);
}

interessante, non posso compilare questo (non c'è principale) ma TIO può
ngn

1
@ngn È solo una funzione , è necessario aggiungere il mainper compilarlo. Su TIO, mainè nella sezione piè di pagina.
Steadybox,

3

Clojure, 417 319 byte

(defn cannon[n](let[a(map #(char(+ 65 %))(iterate #(if(> % 24)0(inc %))0))m1(reverse(reduce #(concat %(repeat %2(- n %2)))[](range 0(inc n))))p1(map-indexed #(str(apply str(repeat %2 " "))(nth a %))m1)m2(reverse(reduce #(concat %(repeat %2(-(* 2 %2)2)))[](reverse(range 0(inc n)))))p2(reverse(map-indexed #(str(apply str (repeat %2 " "))(nth a(+(count p1)%)))m2))](doseq[x(reverse(map #(str % %2)p1 p2))](println x))))

Ad un certo punto mi sono impigliato nelle reversechiamate e ho rinunciato all'idea di renderlo il più breve possibile. Volevo solo avere una soluzione funzionante. Ecco qui...

Una specie di non golfato

(defn cannon [n]
  (let [a (map #(char (+ 65 %)) (iterate #(if (> % 24) 0 (inc %)) 0))
        m1 (reverse (reduce #(concat % (repeat %2 (- n %2))) [] (range 0 (inc n))))
        p1 (map-indexed #(str (apply str (repeat %2 " ")) (nth a %)) m1)
        m2 (reverse (reduce #(concat % (repeat %2 (- (* 2 %2) 2))) [] (reverse (range 0 (inc n)))))
        p2 (reverse (map-indexed #(str (apply str (repeat %2 " ")) (nth a (+ (count p1) %))) m2))]
    (doseq [x (reverse (map #(str % %2) p1 p2))] (println x))))

Aggiornare

Motivato dal commento di Olivier, sono riuscito a tagliare più reversechiamate e ad applicare alcuni trucchi da golf generali per tagliare i personaggi. Inoltre ho creato alias per reverse, map-indexed, concat, repeate strperché ho usato loro più volte ciascuno.

(defn c[n](let[a(map #(char(+ 65 %))(iterate #(if(> % 24)0(inc %))0))k #(reduce %[](range 0(inc n)))r #(apply str(repeat % " "))rv reverse m map-indexed c concat t repeat s str p(m #(s(r %2)(nth a %))(rv(k #(c %(t %2(- n %2))))))](rv(map #(s % %2)p(rv(m #(s(r %2)(nth a(+(count p)%)))(k #(c %(t %2(-(* 2 %2)2))))))))))

Ungolfed

(defn c [n]
  (let [a (map
           #(char (+ 65 %))
           (iterate
            #(if (> % 24) 0 (inc %))
            0))
        k #(reduce
            %
            []
            (range 0 (inc n)))
        r #(apply str (repeat % " "))
        rv reverse
        m map-indexed
        c concat
        t repeat
        s str
        p (m
           #(s
             (r %2)
             (nth a %))
           (rv (k #(c % (t %2 (- n %2))))))]
    (rv
     (map
      #(s % %2)
      p
      (rv
       (m
        #(s
          (r %2)
          (nth a (+ (count p) %)))
        (k #(c % (t %2 (- (* 2 %2) 2))))))))))

Crea la funzione cche accetta il valore n e restituisce un elenco di righe.


Questa non è una risposta in quanto apparentemente non esiste alcun tentativo di giocare a golf (lo dici anche tu).
Olivier Grégoire,

Va bene, va molto meglio! ;-)
Olivier Grégoire,

3

Carbone , 33 31 byte

≔⁰ηF…±N⊕θ«¿ι→↓F↔ι«P§αη≦⊕η¿›ι⁰↓↑

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: salvato 2 byte grazie solo a @ ASCII. Spiegazione:

≔⁰η

Inizializza la lettera corrente come indice nell'alfabeto maiuscolo a 0.

F…±N⊕θ«

Crea un ciclo dalla negazione dell'input all'input incluso.

¿ι→↓

Normalmente ogni colonna è alla destra della precedente. Tuttavia, non esiste una colonna per zero. Invece, è necessaria una correzione per garantire l'allineamento dei lati sinistro e destro.

F↔ι«

Ciclo per ogni lettera nella colonna.

P§αη

Stampa la lettera corrente.

≦⊕η

Incrementa l'indice delle lettere.

¿›ι⁰↓↑

Sposta in alto o in basso a seconda del lato della traiettoria in cui ci troviamo.


Sembra che ci potrebbe essere un modo più breve per farlo, ma non so come: /
ASCII-solo


3

Perl 5 , -n 112 92 90 88 byte

Per una volta il terribilmente lungo printfsembra vincere.

#!/usr/bin/perl -n
$p=$q=$_*($%=$_+1)/2;map{printf"%$%c%$.c
",--$p%26+65,$q++%26+65for--$%..$';$.+=2}//..$_

Provalo online!


Bel miglioramento! Stavo cercando di mettermi (A..Z)x9al lavoro, ma era troppo breve! L'ho avuto solo per 91. :)
Dom Hastings,

1
@DomHastings Il tuo è stato un bel tentativo di sinergia tra i due calcoli con lettere quasi ripetute. Anche quello mi irrita.
Ton Hospel,

2

Python3 + numpy, 124 115

from pylab import*
def i(N):
 x=zeros((N,2*N),'U');x[r_[N-1:-1:-1,0:N],r_[:2*N]]=map(chr,r_[0:2*N]%26+65)
 return x

Questo crea un array di dimensioni adeguate, trova gli indici per la traiettoria e assegna loro il carattere appropriato. La parte più complessa sta generando i personaggi AZ, che si basa su un cast di numeri molto hackish per un tipo di stringa. L'oggetto restituito è un array unicode.

Modifica : salvato 9 byte sostituendo il codice numpy che ha generato i caratteri AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) map, come suggerito qui .


2

Python 3 , 139 136 byte

f=lambda n,o=0:n and'\n'.join([f(n-1,o+n).replace('\n','\n ')]+[chr(65+(n+o+~i)%26)+'  '*~-n+chr(65+(n*n+o+i)%26)for i in range(n)])or''

Provalo online!

Genera ogni livello in modo ricorsivo, date le dimensioni e l'offset.

-3 byte grazie a Jo King


@JoKing Grazie, mi dimentico sempre ~dell'operatore!
Matthew Jensen,

Puoi anche passare n and ... or''a n*' 'and ...per un altro byte
Jo King,

2

J , 78 75 byte

(26{.65|.a.)($~#)`(;/@])`(' '$~1+{:@])}i.@+:(,.~(|.,])@i.@-:@#)@#~1+i.@-,i.

Provalo online!

-3 grazie a ngn


1
(,|.)@i.@-->i.@-,i.
ngn

Grazie @ngn. Questo è uno di quelli in cui sembrava che ci fosse una soluzione in 40-50 byte, ma se c'è non sono stato in grado di vederlo ....
Giona



1

Yabasic , 125 byte

Una soluzione di che utilizza la modalità grafica per stampare i caratteri nella colonna e nella riga corrette dello schermo.

Input""n
Clear Screen
For i=-n To n
For j=1To Abs(i)
k=i>0
?@(i+n-k,(i^2-i)/2+j-2*j^(!k)+k)Chr$(c+65)
c=Mod(c+1,26)
Next
Next

Poiché questa soluzione utilizza la modalità grafica, non può essere eseguita su TIO.

Produzione

Di seguito è riportato l'output per l'input 7

Uscita programma (n = 7)



1

QBasic 1.1 , 124 byte

n6

INPUT n
CLS
FOR i=-n TO n
FOR j=1TO ABS(i)
k=i>0
LOCATE(i^2-i)/2+j-2*j^-(k=0)-k+1,i+n+k+1
?CHR$(c+65)
c=(c+1)MOD 26
NEXT j,i

1

Python 3 , 190 byte

j,r,c,s=int(input()),range,[],[];a=(j+1)*j;b=a//2
for i in r(j):k=i+1;c.extend([j-k]*k)
for i in r(a):s+=chr(ord('A')+(i%26))
for i in r(b):print(' '*c[i]+s[b-i-1]+' '*(2*(j-c[i]-1))+s[b+i])

Provalo online!

Ho fatto del mio meglio. Fammi sapere se sono possibili ottimizzazioni.


1

k4, 76 71 byte

{+|:'p$(-k,|k:+\l)$(x#b),|:'x_b:(i:-1_0,+\l,|l)_a:(2*p:+/l:|1+!x)#.Q.a}

alcuni riordini + assegnazioni per salvare 5 byte


{+|:'(+/l)$(-k,|k:+\l)$(x#i_a),|:'((-x)#i:-1_0,+\l,|l)_a:(2*+/l:|1+!x)#.Q.a}

mezz'ora di sforzo con qualche sforzo per radere qualche byte, ma probabilmente c'è molto di più che si può fare qui. tornerà ad esso. sfida divertente!

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.