Meriam alfabet

34

Bola cannon ditembakkan sehingga pada eyeblink pertama penerbangannya ia naik oleh Npuncak pohon, selama eyeblink kedua oleh N-1puncak pohon, dll hingga mencapai titik tertinggi lintasannya. Kemudian mulai jatuh 1, 2, dll puncak pohon per eyeblink sampai menyentuh tanah. Pada saat yang sama, bola meriam bergerak secara horizontal dengan kecepatan konstan 1 treetop / eyeblink.

Tugas Anda adalah menggambar lintasan dengan huruf berurutan dari alfabet bahasa Inggris. Jika Anda kehabisan surat, mulai lagi dari 'A'. Tulis fungsi atau program. Inputnya adalah integer N( 1≤N≤15). Outputnya dapat berupa matriks karakter dalam bentuk apa pun yang masuk akal, misalnya string yang dipisahkan baris baru atau daftar string. Huruf dapat berupa huruf kecil atau huruf besar semua. Ruang memimpin dan trailing tambahan diizinkan. Celah standar dilarang. Kode yang lebih pendek lebih baik.

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
ngn
sumber
7
Berhubungan erat .
Dom Hastings
2
Mengapa O dan P berada pada level yang sama dalam contoh? Jika saya membaca spec dengan benar, sepertinya ia akan naik satu pucuk pohon untuk P dan turun satu per satu untuk Q.
Skyler
2
@ Skyler Pada setiap centang, alfabet 1 berbelok ke kanan dan N vertikal. N juga mengurangi setiap centang. Di antara Odan P, centang bergerak 1 ke kanan, tetapi 0 naik atau turun.
Olivier Grégoire
4
Sepertinya meriam alfabet sekarang kanon.
Carl Witthoft
2
@ ngn Hah, saya bermain-main dengan solusi Perl @ TonHospel dan menghasilkan 1 byte lebih sedikit, tetapi hanya mendukung hingga 14 !
Dom Hastings

Jawaban:

8

05AB1E , 33 32 29 28 byte

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

Cobalah online!

Penjelasan

>*                             # 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
Emigna
sumber
Saya merasa seperti Nú»atau sesuatu seperti itu dapat digunakan untuk mencetak saat Anda pergi alih-alih])~.c
Magic Octopus Mm
Yang bisa saya lakukan adalah implementasi ini di sini tapi itu lebih buruk dengan 2 byte.
Magic Octopus Mm
8

Stax , 29 24 byte

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

Jalankan dan debug secara online

Representasi ascii yang sesuai dari program yang sama adalah ini.

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
rekursif
sumber
7

R, 169 163 161 153 150 110 109 byte

Pendekatan ini mengisi matriks dan kemudian mencetak matriks.

Golf

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

Terima kasih @Giuseppe untuk 153.

Terima kasih @JDL untuk 150.

Lihat @ Giuseppe komentar untuk 112, dan beberapa suntingan untuk 110 sekarang 109. Rip kode asli.

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

Jika merencanakan output yang valid maka 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)

masukkan deskripsi gambar di sini

Vlo
sumber
153 byte - solusi Anda mencetak ruang ekstra di puncak yang saya perbaiki, dan kemudian saya juga menurunkan beberapa hal. Jawaban bagus!
Giuseppe
dapatkah Anda menggunakan Mapbukan mapply?
JDL
@JDL Anda benar. Saya selalu berpikir bahwa Peta adalah pembungkus untuk lapplybukan mapply. Terima kasih untuk 150
Vlo
Ini terus mengganggu saya, karena saya pikir harus ada cara untuk mengindeks matriks dengan row,columnpasangan langsung [daripada harus melalui mapply(atau Map), jadi saya menemukan cara untuk melakukan itu. Saya juga ingat bahwa writeada dan dapat menggantikan catuntuk 112 byte !
Giuseppe
@Giuseppe Komentar saya tentang "" tidak berfungsi, tetapi dengan [<-, kita dapat mengatur untuk memeras segala sesuatu dalam satu baris, menghilangkan kebutuhan untuk beberapa definisi variabel. 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)],[]))]

Cobalah online!

TFeld
sumber
5

MATL , 29 byte

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

Cobalah online!

Bagaimana itu bekerja

,        % 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
Luis Mendo
sumber
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);}

Cobalah online!

Penjelasan

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
Olivier Grégoire
sumber
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);}

Cobalah online!

Belum dibuka:

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);
}
Steadybox
sumber
menarik, saya tidak bisa mengkompilasi ini (tidak ada main) tapi TIO bisa
ngn
1
@ ngn Ini hanya fungsi , Anda perlu menambahkan mainuntuk mengkompilasinya. Pada TIO, mainada di bagian footer.
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))))

Pada titik tertentu saya terlibat dalam reversepanggilan dan menyerah pada ide untuk membuatnya sesingkat mungkin. Saya hanya ingin memiliki solusi yang berfungsi. Ini dia ...

Agak tidak serigala

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

Memperbarui

Termotivasi oleh komentar Olivier, saya berhasil memotong beberapa reversepanggilan dan menerapkan beberapa trik golf umum untuk memotong karakter. Juga saya buat alias untuk reverse, map-indexed, concat, repeatdan strkarena saya menggunakan mereka beberapa kali setiap.

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

Tidak disatukan

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

Menciptakan fungsi cyang menerima nilai n dan mengembalikan daftar garis.

Joshua
sumber
Ini bukan jawaban karena tampaknya tidak ada upaya untuk bermain golf sama sekali (Anda bahkan berkata begitu).
Olivier Grégoire
Oke, ini jauh lebih baik! ;-)
Olivier Grégoire
3

Arang , 33 31 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 2 byte berkat hanya @ ASCII. Penjelasan:

≔⁰η

Inisialisasi huruf saat ini sebagai indeks ke huruf besar ke 0.

F…±N⊕θ«

Buat perulangan dari negasi input ke input inklusif.

¿ι→↓

Biasanya setiap kolom berada di sebelah kanan kolom sebelumnya. Namun, tidak ada kolom untuk nol. Sebaliknya, koreksi diperlukan untuk memastikan bahwa sisi kiri dan kanan sejajar.

F↔ι«

Ulangi untuk setiap huruf di kolom.

P§αη

Cetak huruf saat ini.

≦⊕η

Tambahkan indeks surat.

¿›ι⁰↓↑

Bergerak naik atau turun tergantung pada sisi lintasan mana kita berada.

Neil
sumber
Sepertinya ada cara yang lebih pendek untuk melakukan ini tetapi tidak yakin bagaimana: /
ASCII-satunya
4
31 byte
ASCII-satunya
3

Perl 5 , -n 112 92 90 88 byte

Untuk sekali yang sangat lama printfsepertinya menang.

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

Cobalah online!

Ton Hospel
sumber
Perbaikan bagus! Saya berusaha untuk mulai (A..Z)x9bekerja, tetapi itu terlalu pendek dari batasnya! Punya itu untuk 91 saja. :)
Dom Hastings
1
@HomHastings Hormat adalah usaha yang bagus untuk mensinergikan antara dua perhitungan huruf yang hampir berulang. Yang itu juga mengganggu saya.
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

Ini menciptakan array berukuran tepat, menemukan indeks untuk lintasan dan menetapkan karakter yang sesuai untuk mereka. Bagian yang paling kompleks adalah menghasilkan karakter AZ, yang bergantung pada sejumlah angka yang sangat hackish ke tipe string. Objek yang dikembalikan adalah array unicode.

Sunting : Disimpan 9 byte menggantikan kode numpy yang menghasilkan karakter AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) dengan map, seperti yang disarankan di sini .

pengguna2699
sumber
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''

Cobalah online!

Menghasilkan setiap lapisan secara rekursif, mengingat ukuran dan mengimbangi.

-3 byte terima kasih kepada Jo King

Matthew Jensen
sumber
@JoKing Terima kasih, saya selalu lupa tentang ~operator!
Matthew Jensen
Anda juga dapat mengubah n and ... or''ke n*' 'and ...untuk byte lain
Jo Raja
2

J , 78 75 byte

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

Cobalah online!

-3 Terima kasih kepada ngn

Jonah
sumber
1
(,|.)@i.@-->i.@-,i.
ngn
Terima kasih @ ngn. Ini adalah salah satu di mana rasanya harus ada solusi dalam 40-50 byte, tetapi jika ada saya tidak dapat melihatnya ....
Jonah
1

Python 2 , 182 byte

I=input()
S=list('ZYXWVUTSRQPONMLKJIHGFEDCBA'*I)
R=range
print zip(*[(' '*(sum(R(abs(i))))+eval('S.pop()+'*abs(i)+"''")[::[-1,1][i>0]]).ljust(sum(range(I+1)))for i in R(-I,I+1)if i])

Cobalah online!

Mengembalikan daftar daftar karakter. Verifikasi primitif di sini

Possum Mati
sumber
1

Yabasic , 125 byte

Sebuah solusi yang menggunakan modus grafis untuk mencetak karakter pada kolom yang benar dan baris dari layar.

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

Karena solusi ini menggunakan mode grafis, itu tidak dapat dijalankan pada TIO.

Keluaran

Di bawah ini adalah output untuk input 7

Output Program (n = 7)

Taylor Scott
sumber
1

Ruby , 106 103 byte

->n,f=2*s=-~n*n/2-1{l=*?A..?Z;(1..n).map{|i|i.times{puts' '*(n-i)+l[(f-s)%26]+' '*~-i*2+l[(s+=1)%26]}}}

Cobalah online!

Asone Tuhid
sumber
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
Taylor Scott
sumber
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])

Cobalah online!

Saya mencoba yang terbaik. Beri tahu saya jika ada optimasi yang dimungkinkan.

Koishore Roy
sumber
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}

beberapa penataan ulang + tugas untuk menghemat 5 byte


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

upaya setengah jam dengan beberapa upaya untuk memangkas beberapa byte, tetapi mungkin ada banyak lagi yang bisa dilakukan di sini. akan kembali ke sana. tantangan yang menyenangkan!

tulisan cakar ayam
sumber