Алфавіт гармати


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


2
Чому O і P на прикладі однакові? Якщо я читаю специфікацію правильно, то, здається, вона повинна піднятися на верхівку вершини на P і спуститися на одну для Q.
Skyler

2
@Skyler При кожному галочці алфавіт іде 1 праворуч і N вертикально. N зменшує також кожен галочку. Між Oі P, галочка йде 1 праворуч, але 0 нагору або вниз.
Олів'є Грегоар

4
Схоже, гармати з алфавітом зараз є каноном.
Карл Віттофт

2
@ngn Hah, я займався рішенням Perl @ TonHospel і придумав 1 байт менше, але він підтримує лише 14 !
Дом Гастінгс

Відповіді:


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 байти.
Чарівний восьминога Урна

8

Стакс , 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.

Дивіться коментар @ Джузеппе за номером 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)

enter image description here


153 байти - ваше рішення надрукувало додатковий простір на вершині, який я зафіксував, а потім я також покатав кілька речей. Гарна відповідь!
Джузеппе

ви можете використовувати Mapзамість mapply?
JDL

@JDL Ви маєте рацію. Я завжди думаю, що Map - це обгортка, lapplyа не mapply. Дякую за 150
Вло

Це постійно турбувало мене, тому що я думав, що має бути спосіб індексувати матрицю row,columnпарами безпосередньо, [а не проходити mapply(або Map), тому я знайшов спосіб це зробити. Я також згадав, що writeіснує і може замінити catна 112 байт !
Джузеппе

@Giuseppe Мій коментар про "" не спрацював, але за допомогою <<- ми можемо вдавити все до одного рядка, усуваючи необхідність у певних змінних визначеннях. 110 байт: tio.run/##K/qfpmCj@z@tNC@5JDM/…
Вло


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 можна
пізніше

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дзвінків і застосувати деякі загальні трюки з гольфу, щоб вирізати персонажів. Також я створив псевдоніми 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 і повертає список рядків.


Це не відповідь, оскільки, мабуть, взагалі немає спроб займатися гольфом (ви навіть так говорите).
Олів'є Грегоар

Гаразд, це набагато краще! ;-)
Олів'є Грегоар

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 рік. :)
Дом Гастінгс

1
@DomHastings Yourrs вдало спробував синергію між двома майже повтореними обчисленнями листів. Та й мене дратує.
Тон Євангелія

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, який спирається на дуже хакерський склад чисел до рядкового типу. Повертається об'єкт - це масив unicode.

Редагувати : збережено 9 байт, замінивши numpy-код, який генерував символи AZ ( (r_[0:2*N]%26+65).view('U1')[::2]) map, як запропоновано тут .


2

Пітон 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 байти завдяки Джо Кінгу


@JoKing Спасибі, я завжди забуваю про ~оператора!
Меттью Йенсен

Крім того, можна змінити , 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 байт, але якщо є, я не зміг його побачити ....
Jonah



1

Ябасич , 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}

півгодинного зусилля з деяким зусиллям, щоб відголити кілька байт, але, напевно, тут можна зробити багато іншого. повернеться до цього. веселий виклик!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.