ปืนใหญ่ตัวอักษร


34

กระสุนปืนใหญ่ถูกยิงเพื่อให้ในช่วงแรกของการบินขึ้นไปบนตาของมันด้วยNยอดไม้ในช่วงที่สองโดยมีN-1ยอดไม้แหลมและอื่น ๆ จนกว่าจะถึงจุดสูงสุดของวิถี จากนั้นมันก็จะตกลงมา 1, 2, ฯลฯ ยอดไม้ต่อการกะพริบตาจนกว่ามันจะกระทบพื้น ในขณะเดียวกันลูกกระสุนปืนใหญ่ก็เคลื่อนที่ในแนวนอนด้วยความเร็วคงที่เท่ากับ 1 ยอดไม้ / กะพริบตา

งานของคุณคือวาดวิถีด้วยตัวอักษรต่อเนื่องจากตัวอักษรภาษาอังกฤษ 'A'ถ้าคุณวิ่งออกมาจากตัวอักษรเริ่มต้นอีกครั้งจาก เขียนฟังก์ชั่นหรือโปรแกรม อินพุตเป็นจำนวนเต็มN( 1≤N≤15) เอาต์พุตสามารถเป็นเมทริกซ์อักขระในรูปแบบที่สมเหตุสมผลตัวอย่างเช่นสตริงที่คั่นด้วยบรรทัดใหม่หรือรายการสตริง ตัวอักษรอาจเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ทั้งหมด อนุญาตให้มีช่องว่างนำหน้าและต่อท้ายพิเศษ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม รหัสสั้นจะดีกว่า

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

7
เกี่ยวข้องอย่างใกล้ชิด
Dom Hastings

2
เหตุใด O และ P จึงอยู่ในระดับเดียวกันในตัวอย่าง ถ้าฉันอ่านข้อมูลจำเพาะอย่างถูกต้องดูเหมือนว่ามันควรจะเพิ่มขึ้นหนึ่งยอดไม้สำหรับ P และสืบเชื้อสายมาโดยหนึ่งสำหรับ Q.
Skyler

2
@Skyler ทุก ๆ ที่ติ๊กตัวอักษรไปทางขวา 1 และ N ในแนวตั้ง ไม่มีการลดทุกเห็บเช่นกัน ระหว่างOและPเห็บไป 1 ทางขวา แต่ 0 ขึ้น - ลงหรือวอร์ด
Olivier Grégoire

4
ดูเหมือนว่าปืนใหญ่ตัวอักษรตอนนี้จะเป็นศีล
Carl Witthoft

2
@ngn Hah ฉันกำลังแก้ไขปัญหา Perl ของ @ TonHospelและลดน้อยลง 1 ไบต์แต่สนับสนุนได้มากถึง 14เท่านั้น!
Dom Hastings

คำตอบ:


8

05AB1E , 33 32 29 28 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

ฉันรู้สึกเหมือนNú»หรืออะไรทำนองนั้นที่สามารถใช้พิมพ์เมื่อคุณไปแทน])~.c
Magic Octopus Urn

ทั้งหมดที่ฉันสามารถทำได้คือการนำนี่ไปใช้แต่มันแย่กว่า 2 ไบต์
Magic Octopus Urn

8

Stax , 29 24 ไบต์

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

เรียกใช้และตรวจแก้จุดบกพร่องออนไลน์

การแสดง ascii ที่สอดคล้องกันของโปรแกรมเดียวกันคือสิ่งนี้

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 ไบต์

วิธีการนี้จะเติมในเมทริกซ์แล้วพิมพ์เมทริกซ์

แข็งแรงเล่นกอล์ฟ

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

ขอบคุณ @Giuseppe ในราคา 153

ขอบคุณ @JDL สำหรับ 150

ดูความคิดเห็นของ @ Giuseppe สำหรับ 112 และการแก้ไขสำหรับ 110 ตอนนี้ 109. ฉีกรหัสเดิม

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

หากพล็อตเอาท์พุทที่ถูกต้องคือ 73 ไบต์

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

ป้อนคำอธิบายรูปภาพที่นี่


153 bytes - โซลูชันของคุณพิมพ์พื้นที่พิเศษที่จุดสูงสุดที่ฉันแก้ไขแล้วฉันก็ตีกอล์ฟสองสามอย่าง คำตอบที่ดี!
จูเซปเป้

คุณสามารถใช้Mapแทนได้mapplyหรือไม่
JDL

@JDL คุณพูดถูก ฉันมักจะคิดว่าแผนที่เป็นเสื้อคลุมสำหรับแทนlapply mapplyขอบคุณสำหรับ 150
Vlo

สิ่งนี้ทำให้ฉันรำคาญเพราะฉันคิดว่าควรมีวิธีในการทำดัชนีเมทริกซ์โดยการrow,columnจับคู่โดยตรง[แทนที่จะต้องผ่านmapply(หรือMap) ดังนั้นฉันจึงพบวิธีที่จะทำเช่นนั้น ฉันยังจำได้ว่าwriteมีอยู่และสามารถแทนที่catสำหรับ112 ไบต์ !
จูเซปเป้

@Giuseppe ความคิดเห็นของฉันเกี่ยวกับ "" ไม่ทำงาน แต่ด้วย [<-, เราสามารถจัดการบีบทุกอย่างภายในหนึ่งบรรทัดโดยไม่จำเป็นต้องนิยามตัวแปรบางอย่าง 110 ไบต์: tio.run/##K/qfpmCj@z@tNC@5JDM/…
Vlo


5

MATL , 29 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

,        % 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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

คลี่:

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

ที่น่าสนใจฉันไม่สามารถรวบรวมสิ่งนี้ (ไม่มีหลัก) แต่ TIO สามารถ
ngn

1
@ngn มันเป็นเพียงฟังก์ชั่นที่คุณต้องเพิ่มmainเพื่อคอมไพล์มัน บน TIO mainจะอยู่ในส่วนท้าย
Steadybox

3

Clojure 417 319 ไบต์

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

ในบางครั้งฉันได้รับสายพันกันreverseและเลิกคิดเพื่อทำให้สั้นที่สุด ฉันแค่อยากได้วิธีแก้ปัญหาการทำงาน ที่นี่คุณไป ...

เรียงของ ungolfed

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

ปรับปรุง

แรงบันดาลใจจากความคิดเห็นของโอลิเวียร์ฉันสามารถตัดreverseสายหลายสายและใช้เทคนิคการตีกอล์ฟทั่วไปเพื่อตัดตัวละคร นอกจากนี้ผมสร้างนามแฝงสำหรับreverse, map-indexed, concat, repeatและstrเพราะผมใช้พวกเขาหลายครั้งในแต่ละ

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

สร้างฟังก์ชั่นcที่ยอมรับค่า n และส่งคืนรายการบรรทัด


นี่ไม่ใช่คำตอบเพราะเห็นได้ชัดว่าไม่มีความพยายามในการเล่นกอล์ฟเลย (คุณพูดอย่างนั้น)
Olivier Grégoire

โอเคนี่มันดีกว่ามาก! ;-)
Olivier Grégoire

3

ถ่าน , 33 31 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึก 2 ไบต์ด้วย @ ASCII เท่านั้น คำอธิบาย:

≔⁰η

เริ่มต้นตัวอักษรปัจจุบันเป็นดัชนีในตัวอักษรตัวพิมพ์ใหญ่เป็น 0

F…±N⊕θ«

ทำการวนซ้ำจากการปฏิเสธของอินพุตไปยังอินพุตที่รวม

¿ι→↓

โดยปกติแต่ละคอลัมน์จะอยู่ทางด้านขวาของหน้าที่แล้ว อย่างไรก็ตามไม่มีคอลัมน์สำหรับศูนย์ แต่จำเป็นต้องมีการแก้ไขเพื่อให้แน่ใจว่าด้านซ้ายและขวาจัดตำแหน่ง

F↔ι«

วนซ้ำสำหรับแต่ละตัวอักษรในคอลัมน์

P§αη

พิมพ์ตัวอักษรปัจจุบัน

≦⊕η

เพิ่มดัชนีตัวอักษร

¿›ι⁰↓↑

เลื่อนขึ้นหรือลงขึ้นอยู่กับว่าเราอยู่บนวิถีใด


ดูเหมือนว่าอาจมีวิธีที่สั้นกว่าในการทำเช่นนี้ แต่ไม่แน่ใจว่า: /
ASCII- เท่านั้น


3

Perl 5 , -n 112 92 90 88 ไบต์

นาน ๆ ครั้งprintfดูเหมือนว่าจะชนะอย่างมาก

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

ลองออนไลน์!


เป็นการปรับปรุงที่ดี! ฉันพยายามไป(A..Z)x9ทำงาน แต่มันสั้นเกินขีด จำกัด ! มีที่สำหรับ 91 เท่านั้น :)
Dom Hastings

1
@DomHastings ขอแสดงความยินดีเป็นอย่างยิ่งที่ได้ลองใช้การทำงานร่วมกันระหว่างการคำนวณตัวอักษรทั้งสองซ้ำ ๆ อันนั้นก็ทำให้ฉันรำคาญเช่นกัน
Ton Hospel

2

Python3 + จำนวนมาก 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

สิ่งนี้สร้างอาร์เรย์ที่มีขนาดที่เหมาะสมค้นหาดัชนีสำหรับวิถีและกำหนดอักขระที่เหมาะสมให้กับพวกเขา ส่วนที่ซับซ้อนที่สุดคือการสร้างตัวละคร AZ ซึ่งขึ้นอยู่กับตัวละครที่แฮ็คของตัวเลขเป็นประเภทสตริง วัตถุที่ส่งคืนเป็นอาร์เรย์ Unicode

แก้ไข : บันทึกไว้ 9 ไบต์เปลี่ยนรหัส numpy ที่สร้างตัวอักษร AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) ด้วยmapตามที่แนะนำที่นี่


2

Python 3 , 139 136 ไบต์

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

ลองออนไลน์!

สร้างแต่ละชั้นซ้ำโดยกำหนดขนาดและชดเชย

-3 ไบต์ขอบคุณ Jo King


@ โจกิ้งขอบคุณฉันมักจะลืม~ผู้ประกอบการ!
แมทธิวเซ่น

นอกจากนี้คุณยังสามารถเปลี่ยนn and ... or''ไปn*' 'and ...สำหรับไบต์อีก
โจคิง

2

J , 78 75 ไบต์

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

ลองออนไลน์!

-3 ขอบคุณ ngn


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

ขอบคุณ @ngn นี่เป็นหนึ่งในที่ที่รู้สึกว่าควรจะมีวิธีแก้ปัญหาใน 40-50 bytes แต่ถ้ามีฉันไม่สามารถดูได้ ....
Jonah



1

Yabasic , 125 ไบต์

การแก้ปัญหาที่ใช้โหมดกราฟิกในการพิมพ์ตัวอักษรที่คอลัมน์ที่ถูกต้องและแถวของหน้าจอ

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

เนื่องจากโซลูชันนี้ใช้โหมดกราฟิกจึงไม่สามารถเรียกใช้งานบน TIO

เอาท์พุต

ด้านล่างคือเอาต์พุตสำหรับอินพุต 7

เอาต์พุตโปรแกรม (n = 7)




1

Python 3 , 190 ไบต์

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

ลองออนไลน์!

ฉันพยายามที่สุดแล้ว. แจ้งให้เราทราบหากการเพิ่มประสิทธิภาพเป็นไปได้


1

k4, 76 71 ไบต์

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

การจัดเรียงใหม่ + กำหนดให้บันทึก 5 ไบต์


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

พยายามครึ่งชั่วโมงด้วยความพยายามที่จะปัดทิ้งไม่กี่ไบต์ แต่อาจมีอีกมากที่สามารถทำได้ที่นี่ จะกลับมา สนุกท้าทาย!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.