Bảng chữ cái pháo


34

Một khẩu súng thần công được bắn để trong liên kết mắt đầu tiên của chuyến bay, nó bay lên bằng Nngọn cây, trong liên kết mắt thứ hai bằng N-1ngọn cây, v.v ... cho đến khi đạt đến điểm cao nhất của quỹ đạo. Sau đó, nó bắt đầu giảm 1, 2, v.v ... trên mỗi nhãn cầu cho đến khi nó chạm đất. Đồng thời, đạn đại bác đang di chuyển theo chiều ngang với vận tốc không đổi 1 ngọn / mắt.

Nhiệm vụ của bạn là vẽ quỹ đạo với các chữ cái liên tiếp từ bảng chữ cái tiếng Anh. Nếu bạn hết thư, hãy bắt đầu lại từ 'A'. Viết một hàm hoặc một chương trình. Đầu vào là một số nguyên N( 1≤N≤15). Đầu ra có thể là một ma trận ký tự ở bất kỳ dạng hợp lý nào, ví dụ như một chuỗi được phân tách bằng dòng mới hoặc một danh sách các chuỗi. Chữ cái có thể là tất cả chữ thường hoặc tất cả chữ hoa. Thêm không gian hàng đầu và dấu được cho phép. Sơ hở tiêu chuẩn bị cấm. Mã ngắn hơn là tốt hơn.

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
Tại sao O và P ở cùng cấp độ trong ví dụ? Nếu tôi đọc thông số kỹ thuật một cách chính xác, có vẻ như nó sẽ tăng một ngọn cho P và hạ xuống một cho Q.
Skyler

2
@Skyler Tại mỗi tích tắc, bảng chữ cái đi 1 sang phải và N theo chiều dọc. N cũng giảm mỗi tích tắc. Giữa OP, đánh dấu đi 1 bên phải, nhưng 0 lên hoặc xuống phường.
Olivier Grégoire

4
Hình như đại bác bảng chữ cái bây giờ là canon.
Carl Witthoft

2
@ngn Hah, tôi đã mày mò giải pháp Perl của @ TonHosp và đưa ra ít hơn 1 byte, nhưng nó chỉ hỗ trợ tối đa 14 !
Dom Hastings

Câu trả lời:


8

05AB1E , 33 32 29 28 byte

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

Hãy thử trực tuyến!

Giải trình

>*                             # 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

Tôi cảm thấy thích Nú»hoặc một cái gì đó tương tự có thể được sử dụng để in khi bạn đi thay vì])~.c
Bạch tuộc ma thuật Urn

Tất cả những gì tôi có thể đưa ra là việc triển khai ở đây nhưng tệ hơn 2 byte.
Bạch tuộc ma thuật Urn

8

Stax , 29 24 byte

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

Chạy và gỡ lỗi trực tuyến

Đại diện ascii tương ứng của cùng một chương trình là đây.

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

Cách tiếp cận này điền vào một ma trận và sau đó in ma trận.

Chơi gôn

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

Cảm ơn @Giuseppe cho 153.

Cảm ơn @JDL cho 150.

Xem bình luận của @ Giuseppe cho 112 và một số chỉnh sửa cho 110 bây giờ 109. Rip mã gốc.

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

Nếu vẽ một đầu ra hợp lệ thì 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)

nhập mô tả hình ảnh ở đây


153 byte - giải pháp của bạn đã in thêm một khoảng trống ở đỉnh mà tôi đã sửa, và sau đó tôi cũng đánh gôn một vài thứ. Câu trả lời tốt đẹp!
Giuseppe

bạn có thể sử dụng Mapthay vì mapply?
JDL

@JDL Bạn nói đúng. Tôi luôn nghĩ rằng Map là một trình bao bọc lapplythay vì mapply. Cảm ơn 150
Vlo

Điều này tiếp tục làm phiền tôi, vì tôi nghĩ nên có cách lập chỉ mục ma trận theo row,columncặp trực tiếp [thay vì phải đi qua mapply(hoặc Map), vì vậy tôi đã tìm ra cách để làm điều đó. Tôi cũng nhớ rằng writetồn tại và có thể thay thế catcho 112 byte !
Giuseppe

@Giuseppe Nhận xét của tôi về "" không hoạt động, nhưng với [<-, chúng tôi có thể quản lý để nén mọi thứ trong một dòng, loại bỏ sự cần thiết của một số định nghĩa biến. 110 byte: tio.run/##K/qfpmCj@z@tNC@5JDM/ Kẻ
Vlo


5

MATL , 29 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến!

Chưa được kiểm soát:

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

thật thú vị, tôi không thể biên dịch cái này (không có chính) nhưng TIO có thể
ngn

1
@ngn Nó chỉ là một hàm , bạn cần thêm phần mainđể biên dịch nó. Trên TIO, phần mainnằm trong phần chân trang.
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))))

Tại một số điểm tôi đã bị rối trong reverse các cuộc gọi và từ bỏ ý tưởng để làm cho nó càng ngắn càng tốt. Tôi chỉ muốn có một giải pháp làm việc. Bạn đi đây ...

Sắp xếp không có người

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

Cập nhật

Được thúc đẩy bởi nhận xét của Olivier, tôi đã cố gắng cắt giảm nhiều reversecuộc gọi và áp dụng một số thủ thuật đánh gôn nói chung để cắt các nhân vật. Ngoài ra tôi tạo bí danh cho reverse, map-indexed, concat, repeatstrbởi vì tôi sử dụng chúng mỗi nhiều lần.

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

Bị đánh cắp

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

Tạo hàm cchấp nhận giá trị n và trả về danh sách các dòng.


Đây không phải là một câu trả lời vì rõ ràng là không có nỗ lực để chơi golf (bạn thậm chí nói như vậy).
Olivier Grégoire

Được rồi, điều này là tốt hơn nhiều! ;-)
Olivier Grégoire

3

Than , 33 31 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 2 byte chỉ nhờ @ ASCII. Giải trình:

≔⁰η

Khởi tạo chữ cái hiện tại dưới dạng một chỉ mục vào bảng chữ cái viết hoa thành 0.

F…±N⊕θ«

Tạo một vòng lặp từ phủ định của đầu vào đến đầu vào bao gồm.

¿ι→↓

Thông thường mỗi cột nằm bên phải của trước đó. Tuy nhiên, không có cột cho số không. Thay vào đó, một sự điều chỉnh là cần thiết để đảm bảo rằng bên trái và bên phải thẳng hàng.

F↔ι«

Vòng lặp cho mỗi chữ cái trong cột.

P§αη

In thư hiện tại.

≦⊕η

Tăng chỉ số thư.

¿›ι⁰↓↑

Di chuyển lên hoặc xuống tùy thuộc vào phía nào của quỹ đạo chúng ta đang đi.


Có vẻ như có thể có một cách ngắn hơn để làm điều này nhưng không chắc chắn bằng cách nào: /
ASCII


3

Perl 5 , -n 112 92 90 88 byte

Đối với một lần dài khủng khiếp printfdường như để giành chiến thắng.

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

Hãy thử trực tuyến!


Cải thiện tốt đẹp! Tôi đã cố gắng để (A..Z)x9làm việc, nhưng nó chỉ là quá giới hạn! Chỉ có điều đó cho 91 thôi. :)
Dom Hastings

1
@DomHastings Yours là một sự cố gắng tuyệt vời giữa sự kết hợp giữa hai phép tính chữ gần như lặp đi lặp lại. Điều đó làm tôi khó chịu quá.
TonMedel

2

Python3 + gọn gàng, 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

Điều này tạo ra một mảng có kích thước phù hợp, tìm các chỉ số cho quỹ đạo và gán ký tự phù hợp cho chúng. Phần phức tạp nhất là tạo ra các ký tự AZ, dựa trên một chuỗi các số rất hackish thành một kiểu chuỗi. Đối tượng trả về là một mảng unicode.

Chỉnh sửa : Đã lưu 9 byte thay thế mã numpy đã tạo các ký tự AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) bằng map, như được đề xuất ở đây .


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

Hãy thử trực tuyến!

Tạo từng lớp đệ quy, cho kích thước và bù.

-3 byte nhờ Jo King


@JoKing Cảm ơn, tôi luôn quên về ~nhà điều hành!
Matthew Jensen

Bạn cũng có thể thay đổi n and ... or''để n*' 'and ...cho byte khác
Jo vua

2

J , 78 75 byte

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

Hãy thử trực tuyến!

-3 cảm ơn ngn


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

Cảm ơn @ngn. Đây là một trong những nơi mà cảm giác như cần có một giải pháp trong 40-50 byte, nhưng nếu có thì tôi không thể nhìn thấy nó ....
Jonah



1

Yabasic , 125 byte

Một giải pháp sử dụng chế độ đồ họa để in các ký tự ở cột và hàng chính xác của màn hình.

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

Vì giải pháp này sử dụng chế độ đồ họa, nó không thể được thực thi trên TIO.

Đầu ra

Dưới đây là đầu ra cho đầu vào 7

Đầu ra chương trình (n = 7)



1

QBasic 1.1 , 124 byte

Đưa đầu vào và bắn một phát đại bác. Do giới hạn kích thước màn hình,n cần phải 6.

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

Hãy thử trực tuyến!

Tôi đã cố gắng hết sức. Hãy cho tôi biết nếu có bất kỳ tối ưu hóa là có thể.


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}

một số sắp xếp lại + bài tập để tiết kiệm 5 byte


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

nỗ lực nửa giờ với một số nỗ lực để loại bỏ một vài byte, nhưng có lẽ còn nhiều điều có thể được thực hiện ở đây. sẽ trở lại với nó thử thách thú vị!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.