Полудиагональный алфавит


35

Учитывая букву английского алфавита, ваша задача состоит в том, чтобы построить полудиагональный алфавит для ввода.

Как построить полудиагональный алфавит?

Краткое описание : Во-первых, вы берете позицию буквы в алфавите P( Pздесь 1-индексирован). Затем вы печатаете каждую букву до ввода (включительно) в строке, которой предшествует, P-1и повторяете эту букву Pраз, чередуя с пробелами.

Примеры :

  • Учитывая F, ваша программа должна вывести:

     
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
    
  • Учитывая K, ваша программа должна вывести:

    A
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
          GGGGGGG 
           HHHHHHHH 
            IIIIIIIII 
             JJJJJJJJJJ 
              KKKKKKKKKKK 
    
  • Учитывая A, ваша программа должна вывести:

    A
    

правила

  • Вы можете выбрать строчные или прописные символы, но это должно быть согласовано.

  • Вы можете иметь посторонние места следующим образом:

    • Один последовательный ведущий пробел (на каждой строке).
    • Завершающий или ведущий символ новой строки.
    • Конечные пробелы.
  • Ввод и вывод могут быть взяты любым стандартным средним, и применяются лазейки по умолчанию.

  • Вместо этого вам разрешено выводить список строк, если вы также предоставляете версию .

  • Это , поэтому выигрывает самый короткий код в байтах!

Вдохновленный этим вызовом .


Выводится ли список строк нормально?
Адам

2
Почему отрицательный голос? Что я могу улучшить?

1
Когда вы говорите «P здесь 1-индексирован», здесь относится к задаче или к примеру?
Дэйв

3
@pizzakingme Нет, вы не можете.

Ответы:


10

Python 3 , 59 байт

lambda l:[' '*i+'%c '%(i+65)*-~i for i in range(ord(l)-64)]

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

Python 3 , 61 байт

lambda l:[' '*i+-~i*(chr(i+65)+' ')for i in range(ord(l)-64)]

Попробуйте онлайн! (ссылка на красивую версию для печати)


8
Я не вижу абсолютно никаких причин для понижения. Может ли @downvoter объяснить?
г-н Xcoder

1
Я полагаю, что это просто ошибка, или, может быть, кому-то не нравится отсутствие объяснения (последнее вряд ли ИМО)
Конор О'Брайен,

Мне не нравится Python, и я не могу реализовать его с помощью Python, поэтому ответ для меня бесполезен? Шучу, но всплывающие подсказки кнопок, вероятно, не соответствуют правилам этого сайта
Томас Уэллер

Это только у меня или у мистера Xcoder есть 1 представитель ...?
Стэн Струм



7

PowerShell , 45 42 байта

65..$args[0]|%{" "*$i+++"$([char]$_) "*$i}

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

Принимает входные данные в виде буквенного символа, затем перебирает заглавные буквы до этой точки, каждая итерация предшествует соответствующему количеству пробелов, а затем гибриду char / space.

Сохранено 3 байта благодаря TessellatingHeckler.


@ TessellatingHeckler Действительно. Я так много играл в гольф, что "$args"здесь не сработало, я забыл о [0]методе. Ха - ха.
AdmBorkBork

5

JavaScript (ES6), 85 байт

Работает в нижнем регистре для ввода и вывода. Выводит пробел и пробел в каждой строке.

f=(c,k=10,C=k.toString(36),r=s=>`${s} `.repeat(k-9))=>r``+r(C)+(C==c?'':`
`+f(c,k+1))

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


`${s} `может быть заменено (s+"")на одно байтовое сохранение
Лука

@ Люк, мне нужно это место. Его можно заменить (s+" "), но это так же долго.
Арно

5

APL (Dyalog) , 26 байтов

Запрашивает скалярный характер. Распечатывает список строк.

(∊⍴∘'',' ',¨⍨⊢⍴⊃∘⎕A)¨⍳⎕A⍳⎕

Попробуйте онлайн! (имеет ASCII художественную версию на один дополнительный байт)

 запрос на ввод

⎕A⍳ найти ɩ NDEX в lphabet

 первое , что многие ɩ ntegers

( Применить следующую молчаливую функцию к каждому:

⊃∘⎕A выбрать argument'th письмо письмо от A lphabet

⊢⍴ циклически изменить его до длины аргумента

' ',¨⍨ добавить пробел к каждому

⍴∘'', добавить строку длины аргумента (дополненную пробелами)

ε NLIST (Flatten)


Художественная версия ASCII имеет только слева; смешать список строк в таблицу символов.


4

Perl 5 , 31 байт

Код 30 байтов + 1 для -l.

print$"x$-,"$_ "x++$-for A..<>

Try it online!


Вы можете сократить это, используя sayвместо -lфлага: Попробуйте онлайн!
Xcali

@Xcali Я разорвалась на -E/ -M5.01, я много использовала sayв прошлом, и, вероятно, злоупотреблю тем, что sayявляется альтернативой printв ограниченном исходном вызове или подобном, возможно, но ради -3, я буду держать как есть на данный момент. См. Этот мета пост для справедливого аргумента . Цените вход хотя!
Дом Гастингс

3

Dyalog APL, 38 байт

{↑{(y/' '),(2×y←⎕A⍳⍵)⍴⍵,' '}¨⎕A↑⍨⎕A⍳⍵}

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

Как?

⎕A↑⍨ - возьмите алфавит до

⎕A⍳⍵ - вводимый символ

¨ - за каждый символ

    ⍵,' ' - возьми чар и пробел

    (...)⍴ - преобразовать в

    2×y←⎕A⍳⍵ - вдвое больше индекса символа в алфавите

    (y/' ') - и добавьте пробелы индекса-символа

- затем сгладить


3

APL (Dyalog Classic) , 26 байтов

{↑{(≠\⍵<⍳3×⍵)\⍵⊃⎕A}¨⍳⎕A⍳⍵}

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

объяснение

                      ⍳⎕A⍳⍵  generate indexes up to position of right arg 
{                          on each index apply function
   (≠\⍵<⍳3×⍵)                generate boolean mask for expansion (each line has a length 3 times its index ⍵, starting with  blanks and then alternating letter blank)
             \⍵⊃⎕A          expand character in position 
                             mix result into text matrix

Боже мой ... 4 APL-ера решают одну и ту же проблему одновременно! :) Я думаю, что в Codegolf вы можете удалить внешнее {}, заменить на и заявить, что это "полная программа", а не функция. Это сделало бы ваше решение лучшим (пока).
17

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

3

V , 28, 26, 25 , 23 байта ( конкурирующие )

¬A[/a
lDÓ./& ò
ò-Ûä$Û>

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

Обратите внимание, что, хотя я планировал добавлять определенные функции в течение длительного времени, эта проблема и подтолкнула меня к окончательному выполнению.

Выходные данные содержат один начальный пробел в каждой строке и один завершающий символ новой строки.

HexDump:

00000000: ac41 5b2f 1261 0a6c 44d3 2e2f 2620 f20a  .A[/.a.lD../& ..
00000010: f22d dbe4 24db 3e                        .-..$.>

Объяснение:

¬A[         " Insert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ['
   /        " Search for...
    <C-r>a  "   The input
l           " Move one character to the right
 D          " And delete every character after the cursor
  Ó         " Search for...
   .        "   Any character
    /       " And replace it with...
     & ò    "   That character followed by a space and a newline
ò           " Recursively...
 -          "   Move to the beginning of the next line up
  Ûä$       "   Make *line number* copies of the current line
     Û>     "   And indent this line by *line number* spaces

1
Это конкурирует. Вы можете удалить заголовок комментария.

Это полезно для тех, кто не знал о новой мета, таких как я
Конор О'Брайен

3

05AB1E , 10 байтов

A¹¡н«ðâƶāú

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

-2 спасибо Аднану .

Добавить, »чтобы он печатался отдельными строками.


Вы могли бы опустить, так <как одно последовательное начальное пространство в порядке.
Эминья,

@ Emigna Спасибо!
Эрик Outgolfer

A¹¡н«ðâƶāúдолжен работать на 10 байтов
Аднан

@ Adnan Думаю, ¹¡это не сработает ... так вот почему там «есть. : p
Эрик Outgolfer

3

R, 94 88 байт

-6 байт благодаря Джузеппе

function(x,l=LETTERS)for(i in 1:match(x,l))cat(rep(' ',i-1),rep(paste(l[i],' '),i),'\n')}

Ungolfed:

f=function(x,l=letters){
  for(i in 1:which(l==x)){
    A=paste(l[i],' ')
    cat(rep(' ',i-1),rep(A,i),'\n')
  }
}

88 байт : возвращение анонимной функции - это нормально, вы можете избавиться от фигурных скобок, так fкак это одна строка, и использование matchвместо whichсохранения байта.
Джузеппе


68 байт, принимая входные данные от стандартного ввода.
Джузеппе

3

Haskell, 52 44 байта

f k=[[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]

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

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

f k=                  -- main function is f, input parameter k
  [   |s<-['A'..k]]   -- for each s from ['A'..k]
     >>=              -- map (and collect the results in a single string) the function: 
         (['A'..s]>>) --  replace each element in ['A'..s] with
    [  ,  ]           --  over the list, containing
     " "              --   a single space to get the indent
        s:" "         --   s followed by space to get the letter sequence

Изменить: @jferard: сохранены три байта. Благодарность!


49 байтов:f k=[tail$[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]
Джферард

@jferard: Большое спасибо. Перечитывая задачу, я заметил, что в каждой строке допускается пробел, поэтому нам не нужно tail$.
Ними

2

JavaScript (ES8), 92 байта

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

Используются строчные буквы. Линии имеют один ведущий и один завершающий пробел. Возвращает массив строк.

Тестовый фрагмент

let f=

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

;O.innerText=f("k").join`\n`
<pre id=O></pre>


2

Шелуха , 13 байт

z+ḣ∞øzRNC1…'A

Принимает символ в одинарных кавычках в качестве аргумента командной строки, выводит результат в STDOUT. Попробуйте онлайн!

объяснение

Я использую способ, которым Husk печатает списки списков строк: объединяйте внутренние списки с пробелами и внешние списки с новыми строками.

z+ḣ∞øzRNC1…'A  Implicit input, say 'C'
          …'A  Range from A: "ABC"
        C1     Cut into strings of length 1: ["A","B","C"]
     z N       Zip with positive integers
      R        using repetition: x = [["A"],["B","B"],["C","C","C"]]
   ∞ø          The empty string repeated infinitely: ["","","",...
  ḣ            Prefixes: [[],[""],["",""],["","",""],...
z+             Zip with x using concatenation: [["A"],["","B","B"],["","","C","C","C"]]
               Implicitly join each inner list with spaces, join the resulting strings with newlines and print.

2

05AB1E , 15 14 13 байт

Спас 1 байт благодаря Аднану

A¹¡н«ƶ€S»¶¡āú»

Попробуйте онлайн! или художественная версия Ascii

объяснение

A                # push lowercase alphabet
 ¹¡              # split at input
   н             # get the first part
    «            # append the input
     ƶ           # repeat each a number of times corresponding to its 1-based index
      €S         # split each to a list of chars
        »        # join on spaces and newlines
         ¶¡      # split on newlines
           āú    # prepend spaces to each corresponding to its 1-based index
             »   # join on newlines


@EriktheOutgolfer: Мы сделали это примерно так же, но ваша очень хорошая идея добавить пробел перед поднятием, исключив необходимость соединения, сделала вашу короче. Я не читал ни пробелы в
начале

tl; dr: векторизация: p
Эрик Outgolfer

A¹¡н«вместо того, ADIk>£чтобы работать
Аднан

@Adnan: Спасибо! Я получил, A¹¡нно не «
думал


2

QBasic, 79 74 72 байта

Спасибо Тейлору Скотту за байтовую экономию (дважды!)

FOR i=1TO ASC(INPUT$(1))-64
?TAB(i)
FOR j=1TO i
?CHR$(64+i)" ";
NEXT j,i

Использует прописные буквы. Ввод осуществляется нажатием клавиши и не отображается на экране.

объяснение

Цикл iот 1позиции буквы до буквы алфавита ( начиная с 1). Для каждого iмы переместимся в столбец iэкрана с помощью TAB; затем, iраз мы печатаем iбукву алфавита, за которой следует пробел.


Как оказалось, вы можете использовать INPUT$(1)команду как прямую замену переменной z$для дельты -2 байта
Тейлор Скотт

@TaylorScott Хорошая идея, спасибо!
DLosc

2

Japt -R , 24 23 17 15 байт

Выводит массив, содержащий начальный символ новой строки и начальный и конечный пробел в каждой строке.

IòUc ÏçSiXd¹iYç

Попробуй это

  • 1 байт был сохранен с помощью Оливера, а еще 6 - благодаря тому, что он указал лучший способ генерации исходного массива.

1

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

F⁺⌕αθ¹«P×⁺§αι ⁺ι¹↘

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


Нет, ты не можешь позволить 05AB1E побить древесный уголь ...: P
полностью человек


К сожалению, произвольные начальные пробелы не допускаются, иначе E…·?θ⁺× κ⪫× κιбы работа выполнялась в 14 байтах.
Нил

@Neil Один ведущий пробел разрешен, но я не уверен, как ?туда попал. Это должно быть Aвместо этого, я думаю. Ой, подождите, оооо, я понимаю, что вы имеете в виду.
Эрик Outgolfer



1

JavaScript, 102 94 байта

2 байта сохранены благодаря Нейлу

f=
a=>[...Array(parseInt(a,36)-9)].map((a,b)=>''.padEnd(b).padEnd(b*3+1,(b+10).toString(36)+' '))

console.log(f('k').join`\n`)


1

Сетчатка , 51 байт

^.
$&$&
}T`L`_L`^.
.
$.`$* $&$.`$* ¶
+`(\w) \B
$&$1

Попробуйте онлайн! Объяснение:

^.
$&$&

Дублируйте (первое) письмо.

}T`L`_L`^.

Поверните его обратно на 1 в алфавите или удалите, если это дубликат A. Продолжайте дублировать и вращать, пока мы не дублируем A, после чего удаление отменяет дублирование и цикл завершается.

.
$.`$* $&$.`$* ¶

Замените каждую букву строкой с буквой с обеих сторон.

+`(\w) \B
$&$1

Вставьте дубликаты букв между всеми парами отступов справа от существующих букв.



1

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

F…·AS«P⪫E…@ιι ↘

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

 …·AS           Inclusive character range from A to the input
F    «          Loop over each character
         …@ι    Exclusive range from @ to the current character
        E   ι   Replace each element with the current character
       ⪫        Join with spaces
      P         Print without moving the cursor.
              ↘ Move the cursor down and right.

Если дополнительное заполнение было разрешено, это сработало бы для 14 байтов:

E…·?θ⁺× κ⪫× κι

Попробуйте онлайн! Ссылка на подробную версию кода.


1

Mathematica, 70 байт

(T=Table)[""<>{" "~T~i,T[Alphabet[][[i]]<>" ",i]},{i,LetterNumber@#}]&

в нижнем регистре

выводит список

спасибо @ngenisis за исправления

Для версии место Column@в начале


1

Excel VBA, 72 байта

Функция анонимного непосредственного окна VBE, которая принимает входные данные из ячейки A1и выводит их в непосредственное окно VBE

For i=1To Asc([A1])-64:[B1]=i:?Space(i-1)[REPT(CHAR(B1+64)&" ",B1)]:Next

1

Pyth , 17 байт

.e+*kd*+bdhk<GhxG

Попробуйте это здесь (красивая версия для печати).


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

  • hxG - Принимает индекс ввода в строчном алфавите.

  • <G - Обрезает каждый символ после ввода из алфавита.

  • .e- Пронумерованная карта. Карты над обрезанным алфавитом с индексами как kи буквами как b.

  • *kd- Добавить kпробелы.

  • +bd- b+ пробел (текущая буква + пробел).

  • *...hk- Повторите k+1раз.

  • +(...)(...) - сцепить.


1
Одна из моих любимых вещей в Pyth - написать ответ и найти, что кто-то написал тот же ответ, символ за персонажем. Это поражает, что Python «есть лучший ответ» отлично!
Дэйв

@pizzakingme Да, мне интересно, смогу ли я добиться большего успеха
мистер Xcoder

добавление пространства кажется неправильным, я думаю, что лучше возможно
Дэйв

@pizzakingme Я также могу получить .e+*kdjd*bhk<GhxGкак 17 байтов
г-н Xcoder

16 байтов:.e+*kd*+bdhkhcGQ
Дейв

1

C ++ (gcc) , 164 байта

#include<iostream>
#define f for(int i=0;i<o-'`';i++)
using namespace std;int main(){char c;cin>>c;for(char o='a';o<=c;o++){f cout<<' ';f cout<<o<<' ';cout<<'\n';}}

Моя первая попытка после долгого укрытия!

Разрушенный код ниже:

#include <iostream>

using namespace std;
#define f for (auto i = 0; i < output - '`'; i++)

int main()
{
  char input;

  cin >> input;

  for (char output = 'a'; output <= input; output++)
  {
    f cout << ' ';

    f cout << output << ' ';

    cout << endl;
  }
}

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


Я знаю, что нужно заниматься чем-то вроде игры в гольф, но пока это самое маленькое, что я получил.
Drise
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.