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


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

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

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


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!


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

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

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

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.


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.


Wygląda na to, że może to być krótszy sposób, ale nie jestem pewien, jak: /
— 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!


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 .


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


@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


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

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)



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

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.


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.