알파벳 대포


34

대포가 발사되어 비행의 첫 번째 눈 깜박임에서 N나무 꼭대기로 올라가고 두 번째 눈 깜박임 동안 나무 꼭대기로 올라가는 N-1등 탄도가 가장 높은 지점에 도달 할 때까지 발사됩니다 . 그런 다음 눈에 per 때마다 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


2
예제에서 O와 P가 같은 레벨 인 이유는 무엇입니까? 사양을 올바르게 읽으면 P에 대해 한 개의 나무 꼭대기로 올라가고 Q에 대해 하나씩 내려가는 것 같습니다.
Skyler

2
@Skyler 모든 눈금에서 알파벳은 오른쪽으로 1, N은 세로로 이동합니다. N도 모든 틱을 줄입니다. O와 사이 P의 눈금은 오른쪽으로 1이되지만 위쪽 또는 아래쪽은 0입니다.
Olivier Grégoire

4
알파벳 대포가 이제 캐논처럼 보입니다.
Carl Witthoft

2

답변:


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
듭니다

내가 생각해 낼 수있는 것은 여기 에이 구현 이지만 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,,"")

153 주셔서 감사합니다 @ 주세페.

@JDL에게 150 감사합니다.

112에 대한 @Giuseppe의 의견과 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 바이트 -귀하의 솔루션은 내가 고정 한 정점에 여분의 공간을 인쇄 한 다음 몇 가지 사항을 골랐습니다. 좋은 대답입니다!
주세페

Map대신에 사용할 수 mapply있습니까?
JDL

@JDL 당신이 맞아요. 나는 항상 Map lapply대신에 래퍼라고 생각합니다 mapply.
Vlo

이것을 통해 귀찮게했습니다. 왜냐하면 매트릭스 (또는 ) 를 거치지 않고 row,column직접 쌍으로 행렬을 인덱싱하는 방법이 있어야한다고 생각했기 때문에 그렇게 할 수있는 방법을 찾았습니다. 나는 또한 것을 기억 존재하고 교체 할 수 있습니다 에 대해 112 바이트 ! [mapplyMapwritecat
Giuseppe

@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

자바 (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

클로저, 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))))

최신 정보

Olivier의 의견에 동기를 부여하여 여러 번의 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))))))))))

언 골프

(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§αη≦⊕η¿›ι⁰↓↑

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : @ASCII 전용 덕분에 2 바이트가 절약되었습니다. 설명:

≔⁰η

대문자로 된 색인으로 현재 문자를 0으로 초기화하십시오.

F…±N⊕θ«

입력 부정에서 입력 포함으로 루프를 만듭니다.

¿ι→↓

일반적으로 각 열은 이전 열의 오른쪽에 있습니다. 그러나 0에 대한 열이 없습니다. 대신 왼쪽과 오른쪽이 정렬되도록 수정해야합니다.

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 Yours는 거의 반복되는 두 문자 계산 사이의 시너지 효과에 대한 훌륭한 시도였습니다. 저도 저에게 잉크를줍니다.
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

이것은 적절한 크기의 배열을 생성하고, 궤적에 대한 인덱스를 찾아 적절한 문자를 할당합니다. 가장 복잡한 부분은 문자 AZ를 생성하는 것입니다. 문자 AZ는 문자열 형식으로 숫자를 매우 많이 사용합니다. 반환 된 객체는 유니 코드 배열입니다.

편집 : 여기에 제안 된대로 문자 AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) 를 생성 한 numpy 코드를 9 바이트로 대체 했습니다 .map


2

파이썬 3 , 139136 바이트

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

온라인으로 사용해보십시오!

크기와 오프셋이 주어지면 각 레이어를 재귀 적으로 생성합니다.

Jo King 덕분에 -3 바이트


@ JoKing 감사합니다, 나는 항상 ~운영자 에 대해 잊어 버렸습니다 !
Matthew Jensen

당신은 또한 변경할 수 있습니다 n and ... or''n*' 'and ...대한 또 다른 바이트
조 국왕

2

J , 78 75 바이트

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

온라인으로 사용해보십시오!

ngn 덕분에 -3


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

@ngn 감사합니다. 이것은 40-50 바이트의 솔루션이 있어야한다고 생각 하는 사람들 중 하나 이지만, 거기에 없다면 그것을 볼 수 없었습니다 ....
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

QBasic 1.1 , 124 바이트

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}

30 분의 노력으로 몇 바이트를 줄이려고 노력했지만 여기서 할 수있는 일이 훨씬 더 많을 것입니다. 다시 올 것이다. 재미있는 도전!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.