アルファベットキャノン


34

キャノンボールが発射されるため、飛行の最初の瞬きでは、ツリートップで上昇しN、2回目の瞬きでは、ツリートップで上昇しN-1、軌道の最高点に到達します。その後、瞬きごとに1、2などの梢で落ち始め、地面に落ちます。同時に、砲弾は1つのツリートップ/瞬きの一定速度で水平方向に移動します。

あなたの仕事は、英語のアルファベットから連続した文字で軌跡を描くことです。文字が足りなくなった場合は、からやり直してください'A'。関数またはプログラムを作成します。入力は整数N1≤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


2
例でOとPが同じレベルになっているのはなぜですか?仕様を正しく読んだ場合、Pのツリートップを1つ上げ、Qのツリートップを1つ下げる必要があるようです。-
スカイラー

2
@Skylerティックごとに、アルファベットは右に1、縦にNになります。Nもティックごとに減少します。間OP、ダニは、右に1を行くが、0アップまたはダウン病棟。
オリビエグレゴワール

4
アルファベットの大砲は今では大砲のように見えます。
カールウィットソフト

2
@ngnああ、@ TonHospelのPerlソリューションをいじっていて、1バイト少なくなりましたが、最大14個しかサポートしていません!
ドムヘイスティングス

回答:


8

05AB1E33 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
マジックタコ

私が思いついたのはここでのこの実装だけですが、それは2バイト悪化しています。
魔法のタコ

8

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

153の@Giuseppeに感謝します。

150の@JDLに感謝します。

112については@Giuseppeのコメントを、110は109についてのいくつかの編集を参照してください。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)

enter image description here


153バイト -あなたのソリューションは、頂点に余分なスペースを印刷しました。いい答えだ!
ジュゼッペ

Map代わりに使用できますmapplyか?
JDL

@JDLその通りです。Mapはのlapply代わりにラッパーであるといつも思っていますmapply。150をありがとう
Vlo

これは私を悩ませ続けました。なぜなら、(または)を通過row,columnするので[はなく、直接ペアでマトリックスにインデックスを付ける方法があるはずだと思っていたので、それを行う方法を見つけたからです。また、それが存在し、112バイトで置き換えられることも思い出しました!mapplyMapwritecat
ジュゼッペ

@Giuseppe ""に関する私のコメントは機能しませんでしたが、[<-を使用すると、すべての行を1行にまとめることができ、変数定義が不要になります。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電話にからまって、できるだけ短くするというアイデアをあきらめました。実用的なソリューションが必要でした。どうぞ...

種類なし

(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コールをカットし、キャラクターをカットするためにいくつかの一般的なゴルフのトリックを適用することができました。また、私はのエイリアスを作成しreversemap-indexedconcatrepeatstr私は彼らに複数回、それぞれを使用しているため。

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

非ゴルフ

(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を受け入れる関数を作成し、行のリストを返します。


明らかにゴルフの試みはまったくないので、これは答えではありません(あなたもそう言います)。
オリビエグレゴワール

さて、これははるかに優れています!;-)
オリビエグレゴワール

3

33 31バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:@ASCIIのみのおかげで2バイト保存されました。説明:

≔⁰η

大文字のアルファベットのインデックスとして現在の文字を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だけでした。:)
ドムヘイスティングス

1
@DomHastings Yoursは、ほとんど繰り返される2つの文字計算の相乗効果をうまく試しました。それも私をいらいらさせます。
トンホスペル

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

これにより、適切なサイズの配列が作成され、軌道のインデックスが検索され、適切な文字が割り当てられます。 最も複雑な部分は、文字A〜Zの生成です。これは、文字列型への数字の非常にハック的なキャストに依存しています。 返されるオブジェクトはUnicode配列です。

編集ここで提案されているように、文字AZ((r_[0:2*N]%26+65).view('U1')[::2])を生成したnumpyコードを置き換える9バイトを保存mapました


2

Pythonの3139の 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バイト


@JoKingありがとう、私はいつも~オペレーターのことを忘れています!
マシュージェンセン

また、変更することができますn and ... or''n*' 'and ...のために別のバイト
ジョー・キング

2

J78 75バイト

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

オンラインでお試しください!

-3 ngnに感謝


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

@ngnに感謝します。これは、あるものの一つであると感じた .... 40-50バイト単位でのソリューションがあるはずのように、私はそれを見ることができませんでしたがある場合
ヨナ



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

QBasic 1.1、124バイト

入力を受け取り、大砲を撃ちます。画面サイズの制限により、n でなければなりません 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

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.