Armata alfabetu

34

Kula armatnia jest wystrzeliwana, tak że w pierwszym łączniku swojego lotu unosi się Nw koronach drzew, podczas drugiego łącznika przezN-1 drzew itp., Aż osiągnie najwyższy punkt swojej trajektorii. Następnie zaczyna spadać o 1, 2 itd. Koron drzew na linkę oczną, aż uderzy o ziemię. W tym samym czasie kula armatnia porusza się poziomo ze stałą prędkością 1 wierzchołka / linkę oczną.

Twoim zadaniem jest narysowanie trajektorii kolejnymi literami z alfabetu angielskiego. Jeśli zabraknie Ci liter, zacznij od nowa 'A'. Napisz funkcję lub program. Dane wejściowe to liczba całkowita N( 1≤N≤15). Wynikiem może być macierz znaków w dowolnej rozsądnej formie, na przykład ciąg oddzielony znakiem nowej linii lub lista ciągów. Litery mogą być pisane małymi lub wielkimi literami. Dodatkowe spacje wiodące i końcowe są dozwolone. Standardowe luki są zabronione. Krótszy kod jest lepszy.

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
źródło
7
Blisko spokrewnione .
Dom Hastings
2
Dlaczego O i P są na tym samym poziomie w przykładzie? Jeśli poprawnie odczytałem specyfikację, wydaje się, że powinna ona iść o jeden wierzchołek drzewa dla P i schodzić o jeden dla Q.
Skyler
2
@ Skyler Przy każdym tiku alfabet przechodzi 1 w prawo i N w pionie. N zmniejsza również każdy tik. Pomiędzy Oi Ptyknięcie idzie 1 w prawo, ale 0 totemów w górę lub w dół.
Olivier Grégoire
4
Wygląda na to, że armaty alfabetu są teraz kanoniczne.
Carl Witthoft
2
@ng Hah, majstrowałem przy rozwiązaniu Perla @ TonHospel i wymyśliłem 1 bajt mniej, ale obsługuje on tylko do 14 !
Dom Hastings

Odpowiedzi:

8

05AB1E , 33 32 29 28 bajtów

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

Wypróbuj online!

Wyjaśnienie

>*                             # 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
źródło
Wydaje mi się, że Nú»coś takiego można wykorzystać do drukowania zamiast tego])~.c
Magic Octopus Urn
Wszystko, co mogłem wymyślić, to ta implementacja tutaj, ale gorzej o 2 bajty.
Magic Octopus Urn
8

Stax , 29 24 bajtów

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

Uruchom i debuguj online

Odpowiada to reprezentacji ascii tego samego programu.

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
rekurencyjny
źródło
7

R, 169 163 161 153 150 110 109 bajtów

To podejście wypełnia matrycę, a następnie drukuje matrycę.

Grał w golfa

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

Dzięki @Giuseppe za 153.

Dzięki @JDL za 150.

Zobacz komentarz @ Giuseppe dla 112, a niektóre zmiany dla 110 teraz 109. Zgrywanie oryginalnego kodu.

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

Jeśli drukujesz prawidłowe dane wyjściowe, to 73 bajty

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

Vlo
źródło
153 bajty - twoje rozwiązanie wydrukowało dodatkową przestrzeń na wierzchołku, którą naprawiłem, a potem również grałem w golfa. Niezła odpowiedź!
Giuseppe
czy możesz użyć Mapzamiast mapply?
JDL 1'18
@JDL Masz rację. Zawsze myślę, że Mapa jest opakowaniem lapplyzamiast mapply. Dzięki za 150
Vlo
To mnie ciągle niepokoiło, ponieważ pomyślałem, że powinien istnieć sposób na indeksowanie macierzy przez row,columnpary bezpośrednio, [zamiast konieczności przechodzenia przez mapply(lub Map), więc znalazłem sposób, aby to zrobić. Pamiętałem też, że writeistnieje i może zastąpić catdo 112 bajtów !
Giuseppe
@Giuseppe Mój komentarz na temat „” nie zadziałał, ale za pomocą [<- możemy wycisnąć wszystko w jednym wierszu, eliminując potrzebę niektórych definicji zmiennych. 110 bajtów: tio.run/##K/qfpmCj@z@tNC@5JDM/…
Vlo
6

Python 2 , 140 135 133 bajtów

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

Wypróbuj online!

TFeld
źródło
5

MATL , 29 bajtów

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

Wypróbuj online!

Jak to działa

,        % 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
źródło
4

Java (OpenJDK 8) , 121 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
3

C 184 bajty

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

Wypróbuj online!

Rozwinięty:

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
źródło
co ciekawe, nie mogę tego skompilować (nie ma głównego), ale TIO nie może
ngn
1
@ngn To tylko funkcja , musisz ją dodać, mainaby ją skompilować. W TIO mainznajduje się w sekcji stopki.
Steadybox
3

Clojure, 417 319 bajtów

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

W pewnym momencie zaplątałem się reverse rozmowach telefonicznych i zrezygnowałem z pomysłu, żeby było jak najkrótsze. Chciałem tylko mieć działające rozwiązanie. Proszę bardzo...

W pewnym sensie nie golfa

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

Aktualizacja

Zmotywowany komentarzem Oliviera, udało mi się wyciąć wiele reversepołączeń i zastosować kilka ogólnych sztuczek golfowych, aby wyciąć postacie. Stworzyłem również dla aliasów reverse, map-indexed, concat, repeati strdlatego, że korzystali z nich wiele razy każdy.

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

Bez golfa

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

Tworzy funkcję, cktóra akceptuje wartość n i zwraca listę wierszy.

Jozuego
źródło
To nie jest odpowiedź, ponieważ najwyraźniej nie ma żadnej próby gry w golfa (nawet tak mówisz).
Olivier Grégoire
Okej, jest o wiele lepiej! ;-)
Olivier Grégoire
3

Węgiel drzewny , 33 31 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 2 bajty dzięki tylko @ ASCII. Wyjaśnienie:

≔⁰η

Zainicjuj bieżącą literę jako indeks wielkimi literami na 0.

F…±N⊕θ«

Zrób pętlę od negacji wejścia do wejścia włącznie.

¿ι→↓

Zwykle każda kolumna znajduje się na prawo od poprzedniej. Jednak nie ma kolumny dla zera. Zamiast tego konieczna jest korekta, aby zapewnić wyrównanie lewej i prawej strony.

F↔ι«

Pętla dla każdej litery w kolumnie.

P§αη

Wydrukuj bieżący list.

≦⊕η

Zwiększ indeks literowy.

¿›ι⁰↓↑

Poruszaj się w górę lub w dół w zależności od tego, po której stronie trajektorii jesteśmy.

Neil
źródło
Wygląda na to, że może to być krótszy sposób, ale nie jestem pewien, jak: /
tylko ASCII
4
31 bajtów
tylko ASCII
3

Perl 5 , -n 112 92 90 88 bajtów

Choć raz strasznie długo printfwygrywa.

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

Wypróbuj online!

Ton Hospel
źródło
Niezła poprawa! Próbowałem dostać się (A..Z)x9do pracy, ale było to po prostu za mało! Miałem to tylko dla 91 osób. :)
Dom Hastings
1
@DomHastings Twoja była miła próba synergii między dwoma prawie powtarzanymi obliczeniami literowymi. Ten też mnie denerwuje.
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

Tworzy to odpowiednio dopasowaną tablicę, wyszukuje wskaźniki trajektorii i przypisuje im odpowiedni znak. Najbardziej złożoną częścią jest generowanie znaków AZ, które opierają się na bardzo hackerskiej obsadzie liczb na ciąg znaków. Zwrócony obiekt jest tablicą Unicode.

Edycja : Zapisano 9 bajtów zastępując kod numpy, który wygenerował znaki AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) map, zgodnie z sugestią tutaj .

użytkownik2699
źródło
2

Python 3 , 139 136 bajtów

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

Wypróbuj online!

Generuje rekurencyjnie każdą warstwę, biorąc pod uwagę rozmiar i przesunięcie.

-3 bajty dzięki Jo King

Matthew Jensen
źródło
@JoKing Dzięki, zawsze zapominam o ~operatorze!
Matthew Jensen
Można także zmienić n and ... or''się n*' 'and ...na inną bajt
Jo Króla
2

J , 78 75 bajtów

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

Wypróbuj online!

-3 dzięki ngn

Jonasz
źródło
1
(,|.)@i.@-->i.@-,i.
ngn
Dzięki @ngn. Jest to jeden z tych, w których wydawało się, że powinno być rozwiązanie w 40-50 bajtach, ale jeśli tak, nie mogłem tego zobaczyć ...
Jonasz
1

Python 2 , 182 bajty

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

Wypróbuj online!

Zwraca listę list znaków. Prymitywna weryfikacja tutaj

Dead Possum
źródło
1

Yabasic , 125 bajtów

rozwiązanie, które wykorzystuje tryb graficzny drukować znaki na odpowiedniej kolumnie i wierszu ekranu.

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

Ponieważ to rozwiązanie wykorzystuje tryb graficzny, nie można go uruchomić w TIO.

Wydajność

Poniżej przedstawiono dane wejściowe 7

Wyjście programu (n = 7)

Taylor Scott
źródło
1

Rubin , 106 103 bajtów

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

Wypróbuj online!

Asone Tuhid
źródło
1

QBasic 1.1 , 124 bajty

Pobiera dane i strzela z armaty. Z powodu ograniczeń rozmiaru ekranun musi być 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
Taylor Scott
źródło
1

Python 3 , 190 bajtów

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

Wypróbuj online!

Starałem się jak mogłem. Daj mi znać, jeśli możliwe są jakiekolwiek optymalizacje.

Koishore Roy
źródło
1

k4, 76 71 bajtów

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

niektóre zmiany układu + przypisania w celu zaoszczędzenia 5 bajtów


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

półgodzinny wysiłek z pewnym wysiłkiem, aby ogolić kilka bajtów, ale prawdopodobnie jest tutaj o wiele więcej. wróci do tego. fajne wyzwanie!

bazgranina
źródło