Диагональный алфавит на вход


26

Вдохновленный этим постом . Для тех, кто помечает этот вопрос как дубликат, я призываю вас на самом деле прочитать вопрос, чтобы увидеть, что мой является модификацией связанного. Связанный не требует ввода и должен просто печатать алфавит по диагонали.

Соревнование

Учитывая ввод между 1-26 включительно, напечатайте алфавит по диагонали, но начните печатать вертикально в индексе данного ввода.

Примеры

Учитывая вход:

16

Ваша программа должна вывести:

a
 b
  c
   d
    e
     f
      g
       h
        i
         j
          k
           l
            m
             n
              o
               p
               q
               r
               s
               t
               u
               v
               w
               x
               y
               z

Входные данные:

4

Выход:

a
 b
  c
   d
   e
   f
   g
   h
   i
   j
   k
   l
   m
   n
   o
   p
   q
   r
   s
   t
   v
   w
   x
   y
   z

Входные данные:

1

Выход:

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z

Входные данные:

26

Выход:

a
 b
  c
   d
    e
     f
      g
       h
        i
         j
          k
           l
            m
             n
              o
               p
                q
                 r
                  s
                   t
                    u
                     v
                      w
                       x
                        y
                         z

счет

Это , поэтому выигрывает самый короткий ответ на каждом языке.

Удачи!


6
Можем ли мы выбрать индексирование 0 или 1?
— notjagan

Является ли приемлемым последовательное ведущее пространство?
— Джузеппе

Приемлемы ли пробелы?
— Дом Гастингс

Можем ли мы использовать заглавные буквы?
— 17

Можем ли мы вернуть список строк?
— Адам

Ответы:


13

Древесный уголь , 9 байт

↘✂β⁰N↓✂βη

Попробуйте онлайн!

Как это работает

↘✂β⁰N↓✂βη
 ✂β⁰N         the alphabet from position 0 to the input
↘               print diagonally, down and to the right
        ✂βη    the alphabet starting from the position of the input
       ↓        print downwards

Это решение больше не работает в текущей версии Charcoal (скорее всего, из-за исправления ошибки), но проблема решена с помощью 10 байт ↘✂β⁰N↓✂βIθ.


2
Я не уверен, почему это работает; это может быть ошибка, которая была введена пару недель назад. (Обычно вы должны использовать Iθвместо η.)
— Нейл

@Neil Кажется, сегодня сломан. Использование Iθ решает это.
— JP de la Torre

Сохраните 1 байт, используя …βNвместо ✂β⁰N.
— Нил

7

05AB1E , 11 байт

AvNI<‚Wysú,

Первый раз пробую 05AB1E, так что я открыт для советов.

Попробуйте онлайн!

Если разрешен вход с нулевым индексом от 0to 25, это может быть 10 байтов, опуская <.


Niiice! Именно то, что я получил. Я попытался «поднять», но это не работает, как планировалось. Я думаю, что это довольно оптимально :).
— Волшебная Урна Осьминога

4

JavaScript (ES2017), 73 72 71 66 байт

Сохранено несколько байтов благодаря @JustinMariner

f=(n,x=26)=>x?f(n,x-1)+(x+9).toString(36).padStart(x<n?x:n)+`
`:''

1
Это добавляет 10после zв конце из-за наличия ++xдо x.toString(). Исправлены ошибки и игра в гольф до 68 байт с использованием padStart: TIO
— Джастин Маринер

@JustinMariner Спасибо, я думаю, что мог бы переключиться на ES8 для этого ...
— ETHproductions

Можете ли вы сохранить что-нибудь, карри? n=>g=(x=26)=>x?f(x-1)+(x+9).toString(36).padStart(x<n?x:n)+'\n':""
— Лохматый

@ Shaggy Возможно, я не знаю, разрешен ли такой тип карри.
— ETHпродукция

Ах, чокнутый, похоже, что ваше предложение разрешить это больше не является консенсусом :(
— Лохматый

4

Python 2, 61 58 57 байт

n=input()-1
for i in range(26):print(' '*i)[:n]+chr(i+97)

-3 байта благодаря Роду

-1 байт благодаря мистеру Xcoder



@Pavel Это не будет работать с тех пор input, будет вызываться каждый раз, когда forцикл повторяется, даже если есть только одна строка ввода.
— notjagan


57 байт с использованием подписки.
— Мистер Кскодер


4

Рубин, 51 46 43 байта

->n{(0..25).map{|x|(' '*x)[0,n-1]<<(x+97)}}

Возвращает список строк.

Похоже, что парни из Python что-то делали со своими подписчиками. -5 байт, вдохновленные улучшением решения Ppperry, предложенного г-ном Xcoder.

Предыдущее решение с rjust(51 байт):

->n{i=0;(?a..?z).map{|c|c.rjust i+=n>c.ord-97?1:0}}


3

R, 99 89 байт

@MickeyT сэкономил 10 байт

функция

function(x)for(i in 1:26)cat(paste(c(rep(" ",min(x,i)),letters[i]),collapse=""),sep="\n")

демонстрация

f <- function(x)for(i in 1:26)cat(paste(c(rep(" ",min(x,i)),letters[i]),collapse=""),sep="\n")
f(1)
f(10)
f(15)
f(26)

1
Пара небольших сбережений. Скорее тогда ifelseпопробуй min. print.noquoteможет быть заменен catна '\n'в пасте. \nМожет быть прямой возврат каретки. Фигурные скобки для тела функции могут быть сброшены.
— MickyT

Вы можете сохранить некоторые больше, используя writeвместо того , catи paste:write(c(rep(" ",min(x,i)),letters[i]),"",26,,"")
— user2390246

3

Retina , 72 68 байт

^
z
{2=`
$`
}T`l`_l`^.
\D
$.`$* $&¶
\d+
$* 
s`( *)( +)(?=.*¶\1 $)
$1

Попробуйте онлайн! Выходные данные включают конечные пробелы. Сохраните 1 байт, удалив пробел до $нумерации, если индексирование разрешено. Изменить: 4 байта сохранены с помощью генератора алфавита @ MartinEnder. Объяснение:

^
z
{2=`
$`
}T`l`_l`^.

Вставьте алфавит.

\D
$.`$* $&¶

Диагонализируй это.

\d+
$* 

Преобразовать ввод в унарный как пробелы.

s`( *)( +)(?=.*¶\1 $)
$1

Обрежьте слишком длинные строки, чтобы ни одна строка не была длиннее пустой строки в конце.


2

Mathematica, 103 байта

(T=Table;a=Alphabet[];c=Column)[c/@{T[""<>{T[" ",i],a[[i]]},{i,#}],T[""<>{T[" ",#],a[[i]]},{i,#,26}]}]&

2

Pyth , 21 17 15 байт

Сделано на телефоне с 3% заряда батареи.

VlG+*d?>QNNQ@GN

Объяснение:

VlG        For each character in the alphabet (G)
+          Concatenate...
 *d        Space (d) times...
   ?>QNNQ  Ternary; if Q (input) is less than N, return N, else Q
 @GN       The Nth character of the alphabet (G)

Попробуйте онлайн!


1
@totallyhuman У меня только что была потрясающая пицца в Лас-Вегасе, Нью-Мексико
— Стэн

Нашел несколько короче подходов и решил опубликовать свой ответ .
— Мистер Кскодер

@ Mr.Xcoder Да, хорошо поработали над этим.
— Стэн Струм




2

Haskell, 58 54 байта

f n=do m<-[1..26];([2..min n m]>>" ")++['`'..]!!m:"\n"

Попробуйте онлайн!

Как это работает

f n=                  -- input number is n
  do m<-[1..26]       -- for each m from [1..26], construct a string and concatenate
                      -- them into a single string. The string is:
   [2..min n m]>>" "  -- min(n,m)-1 spaces,
      ++              -- followed by
   ['`'..]!!m         -- the m-th char after `
      :               -- followed by
   "\n"               -- a newline 

Редактировать: @Lynn сохранил 4 байта. Благодарность!



@Lynn; Благодарность! Я всегда забываю делать записи для списков.
— Ними



1

JavaScript (Node.js) , 72 байта

n=>[..."abcdefghijklmnopqrstuvwxyz"].map((e,i)=>" ".repeat(i<n?i:n-1)+e)

Возвращает список строк.

Попробуйте онлайн!


Могу я спросить, почему node.js? похоже на действительный нормальный JS
— Downgoat

@Downgoat Это автоматическое форматирование
— Конор О'Брайен

Кстати, вы можете сохранить байты, используя.padStart
— Downgoat

Подожди, как я думал, в основном это превращает ответ ETH
— Downgoat

Переключитесь на ES8 и сохраните байт padEndвместо repeat.
— Лохматый


1

Python 2 , 52 байта

lambda n:['%*c'%(min(i+1,n),i+97)for i in range(26)]

Попробуйте онлайн!

Я предполагаю, что список строк в порядке ...

Самое короткое, что я мог получить с рекурсией:

f=lambda n,i=0:i<26and['%*c'%(min(i+1,n),i+97)]+f(n,i+1)or[]





1

C # (.NET Core) , 66 + 18 байт

n=>new int[26].Select((x,i)=>$"{(char)(i+97)}".PadLeft(i<n?i+1:n))

Количество байтов также включает в себя

using System.Linq;

Попробуйте онлайн!

Это возвращает коллекцию строк, по одной для каждой строки. Если это не разрешено, ответ будет увеличен на 17 байт дляstring.Concat() и \nвнутри строки

Объяснение:

n =>
    new int[26]                      // Create a new collection of size 26
    .Select((x, i) =>                // Replace its members with:
        $"{(char)(i + 97)}"          // String of an alphabet character corresponding to the index
        .PadLeft(i < n ? i + 1 : n)  // Add spaces to the left
    )

1

MATL, 14 байтов

26:tiXl2Y2oZ?c

Попробуйте это в MATL Online

объяснение

26      % number literal
:       % range; vector of equally spaced values [1...26]
t       % duplicate
i       % explicitly grab the input
Xl      % clamp the array to have a maximum value of the input
2Y2     % predefined literal: ['a'...'z']
o       % convert to a numeric array
Z?      % create sparse matrix using the first two inputs as the rows/columns 
        % and the letters 'a'...'z' as the values
c       % convert back to character and implicitly display

1

Pyth , 12 байт

j.e+<*kdtQbG

Попробуй это здесь!

Если списки строк разрешены, это может быть сокращено до 11 байтов :

.e+<*kdtQbG

Pyth , 12 байт

VG+<*dxGNtQN

Попробуй это здесь!

Pyth , 14 байт

jm+<*d;tQ@Gd26

Попробуй это здесь.

Если списки строк разрешены, это может быть сокращено до 13 байтов :

m+<*d;tQ@Gd26

Как это работает?

В отличие от большинства других ответов, это отображает / перебирает строчный алфавит во всех 3 решениях.

Объяснение № 1

j.e+<*kdtQbG - Full program.

 .e        G - Enumerated map over "abcdefghijklmnopqrstuvwxyz", with indexes k and values b.
     *kd     - Repeat a space a number of times equal to the letter's index.
    <   tQ   - Crop the spaces after the input.
   +      b  - Concatenate with the letter.
j            - (Optional): Join by newlines.

Объяснение № 2

VG+<*dxGNtQN  - Full program.

VG            - For N in "abcdefghijklmnopqrstuvwxyz".
      xGN     - Index of the letter in the alphabet.
    *d        - Repeat the space a number of times equal to the index above.
   <     tQ   - But crop anything higher than the input.
  +        N  - Append the letter (at the end)

Объяснение № 3

jm+<*d;tQ@Gd26 - Full program.

 m          26 - Map over [0...26) with a variable d.
    *d;        - Space repeated d times.
   <   tQ      - Crop anything whose length is higher than the input.
  +      @Gd   - Concatenate with the letter at that index in the alphabet.
j              - (Optional): Join by newlines.



1

q / kdb +, 33 31 байт

Решение:

-1{(&[x-1;til 26]#'" "),'.Q.a};

Пример:

q)-1{(&[x-1;til 26]#'" "),'.Q.a}16;
a
 b
  c
   d
    e
     f
      g
       h
        i
         j
          k
           l
            m
             n
              o
               p
               q
               r
               s
               t
               u
               v
               w
               x
               y
               z

Объяснение:

Создайте список пробелов (26 (до длины минимума ввода и диапазона 0..25), объедините каждую букву алфавита, напечатайте в stdout.

-1{(&[x-1;til 26]#'" "),'.Q.a}; / solution
-1                            ; / print result to stdout and swallow return
  {                          }  / lambda function
                         .Q.a   / "abcd..xyz"
                       ,'       / concatenate (,) each
   (                  )         / do all this together
    &[   ;      ]               / minimum of each 
      x-1                       / implicit input (e.g. 10) minus 1 (e.g. 9)
          til 26                / 0 1 2 ... 23 24 25
                   '#" "        / take " " each number of times (0 1 2 )

Заметки:

  • -2 байта путем перенастройки скобок

1

Java 1.8 (без лямбды), 98 байт

void m(int i){int c=0,o=97;String s="";for(;c++<26;s+=c<i?" ":"")System.out.println(s+(char)o++);}

Логика проста. Не обеспечивает проверки входных данных, очень плохо!

  • Обновление: только функция! Спасибо, Оливье Грегуар

1
Чтобы сэкономить несколько байтов, используйте for(;c++<26;s+=c<i?" ":"")System.out.println(s+(char)o++);Также, вы можете написать только функцию или лямбду вместо полной программы.
— Оливье Грегуар

Если бы я включил только тело функции, то как бы читатель узнал, что к ней a[0]относится? Я думаю, что фрагменты не являются справедливыми, если они не компилируются; Задача столь же интересна с языком, богатым конструкциями.
— Дуглас

1
Здравствуйте! Я сказал функцию или лямбда, а не фрагмент. ;-) Таким образом, вы можете написать void f(int i){...}(без статической необходимости) или i->{...}вместо всей вашей программы. Посмотреть все советы по Java . Смотрите мой ответ на этот же вызов , как пример. Веселитесь на сайте! :-)
— Оливье Грегуар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.