Напівдіагональний алфавіт


35

Враховуючи букву англійського алфавіту, ваше завдання - побудувати напівдіагональний алфавіт до введення.

Як побудувати напівдіагональний алфавіт?

Короткий опис : Спочатку ви займаєте положення літери в алфавіті P( Pтут 1-індексовано). Потім ви друкуєте кожну букву до тих пір, поки не буде введено (включаючи) рядок, який передує P-1та повторює цей час літери P, переплітаючи пробіли.

Приклади :

  • Враховуючи F, ваша програма повинна виводити:

    А 
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
    
  • Враховуючи K, ваша програма повинна виводити:

    А
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
          GGGGGGG 
           HHHHHHHH 
            IIIIIIIII 
             JJJJJJJJJJJ 
              KKKKKKKKKKK 
    
  • Враховуючи A, ваша програма повинна виводити:

    A
    

Правила

  • Ви можете вибрати або малі, або великі символи, але це повинно бути послідовно.

  • У вас можуть бути сторонні пробіли:

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

  • Натомість вам дозволяється виводити список рядків, якщо ви також надаєте версію .

  • Це , тому найкоротший код у байтах виграє!

Натхненний цим викликом .


Чи вихід з списку рядків добре?
Адам

2
Чому потік? Що я можу покращити?

1
Коли ви говорите "P тут 1-індексований", чи посилається тут на виклик чи приклад?
Дейв

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

1
Я випадково отримав цікавий зразок, коли грав у
sergiol

Відповіді:


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
Я б міг уявити, що це просто неправильне клацання або, можливо, комусь не подобається відсутність пояснень (останнє - навряд чи IMO)
Conor O'Brien

Мені не подобається Python, і я не можу реалізувати програму Python, тому відповідь не корисна для мене? Жартую, але підказки щодо кнопок, ймовірно, не відповідають правилам цього сайту
Thomas Weller

Це тільки я або це говорить, що містер 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+"")на одне байтове збереження
Лука

@Luke мені потрібен цей простір. Його можна замінити (s+" "), але це так само довго.
Арнольд

5

APL (Dyalog) , 26 байт

Підказки до скалярного характеру. Друкує список рядків.

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

Спробуйте в Інтернеті! (має арт-версію ASCII в одному додатковому байті)

 запит на введення

⎕A⍳ знайти ɩ ndex в A lphabet

 перше , що багато ɩ ntegers

( Застосувати таку негласну функцію до кожного:

⊃∘⎕A вибрати argument'th лист лист від A lphabet

⊢⍴ циклічно переробити його на довжину аргументу

' ',¨⍨ додайте пробіл до кожного

⍴∘'', додайте рядок довжини аргументу (із пробілами)

ϵ список (згладити)


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


4

Perl 5 , 31 байт

30 байт коду + 1 для -l.

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

Спробуйте в Інтернеті!


Ви можете скоротити це, використовуючи sayзамість -lпрапора: Спробуйте в Інтернеті!
Xcali

@Xcali Я розірваний -E/ -M5.01, я sayзначно використовував у минулому, і, ймовірно, зловживав би тим, що sayє альтернативою для printвиклику з обмеженим джерелом чи подібного, можливо, але заради -3, я буду тримати як є зараз. Дивіться цей мета-пост для справедливого аргументу . Хоча оцініть вклад!
Дом Гастінгс

3

Діалог 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-er одночасно вирішує ту саму проблему! :) Я думаю , що в codegolf ви дозволили видалити зовнішнє {}, замініть з , і стверджую , що це «повна програма» , а не функція. Це зробило б ваше рішення найкращим (поки що).
ngn

Має бути хорошим знаком :) Дякую за пропозицію. Я бачив це зроблено, але не знав, де провести межу. Я здогадуюсь, що я можу зберегти 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
Це змагається. Ви можете видалити заголовок зауваження.

Це корисно для тих, хто не знав про нову мета, як я
Conor O'Brien

3

05AB1E , 10 байт

A¹¡н«ðâƶāú

Спробуйте в Інтернеті!

-2 завдяки Аднану .

Додайте, »щоб зробити його друком окремими рядками.


Ви можете опустити <як один послідовний провідний простір добре.
Емінья

@Emigna Дякую!
Erik the Outgolfer

A¹¡н«ðâƶāúповинен працювати на 10 байт
Аднан

@Adnan Я думаю, що ¹¡це змусить його не працювати ... о, так ось чому там «є. : p
Erik the 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')}

Безголівки:

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 байт, що приймають дані від stdin.
Джузеппе

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

@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. Спробуйте в Інтернеті!

Пояснення

Я використовую те, як Хаск друкує списки списків рядків: з'єднуйте внутрішні списки з пробілами та зовнішні списки новими рядками.

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: Ми зробили це зовсім аналогічно, але дуже приємна ідея додати простір перед підйомом, усунувши необхідність в стику, зробивши ваш коротшим. Я не читав, що провідні / кінцеві пробіли та вихідні дані, як список, не в порядку, тому, сподіваюся, я навчу читати всю проблему перед реалізацією: P
Emigna

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

A¹¡н«замість ADIk>£повинні працювати
Аднан

@Adnan: Дякую! Я мав, A¹¡нале не вважав, «щоб отримати останній лист, тому він був недостатньо хорошим: P
Emigna


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

Джапт -R , 24 23 17 15 байт

Виводить масив, включає провідний новий рядок та провідний та кінцевий простір у кожному рядку.

IòUc ÏçSiXd¹iYç

Перевірте це

  • 1 байт збережений за допомогою Олівера і ще 6 завдяки йому вказує на кращий спосіб генерувати початковий масив.

1

Вугілля деревне , 18 байт

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

Спробуйте в Інтернеті!


Ні, ти не можеш дозволити 05AB1E бити вугілля ...: P
абсолютнолюдсько


На жаль, довільне пробільне пробіл не дозволено, інакше E…·?θ⁺× κ⪫× κιце зробить роботу в 14 байт.
Ніл

@Neil Один провідний пробіл дозволений, але я не впевнений, як ?потрапив туди. Це має бути Aзамість цього я думаю. О, зачекайте, о, о, я бачу, що ви маєте на увазі.
Ерік Аутгольфер



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

Charcoal, 15 bytes

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

Try it online! Link is to verbose version of code. Explanation:

 …·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.

If extra padding was legal, this would work for 14 bytes:

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

Try it online! Link is to verbose version of code.


1

Mathematica, 70 bytes

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

lowercase

outputs a list

thanx @ngenisis for corrections

For version place Column@ at the beginning


1

Excel VBA, 72 Bytes

Anonymous VBE immediate window function that takes input from cell A1 and outputs to the VBE immediate window

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

1

Pyth, 17 bytes

.e+*kd*+bdhk<GhxG

Try it here (pretty print version).


How does this work?

  • hxG - Takes the index of the input in the lowercase alphabet.

  • <G - Trims every character after the input from the alphabet.

  • .e - Enumerated Map. Maps over the trimmed alphabet with the indexes as k and the letters as b.

  • *kd - Append k spaces.

  • +bd - b + a space (the current letter + space).

  • *...hk - Repeat k+1 times.

  • +(...)(...) - Concatenate.


1
One of my favorite things about Pyth is writing an answer and finding that someone wrote the same answer, character for character. It hits that Python "there is a best answer" spot perfectly!
Dave

@pizzakingme Yeah, I wonder if I can do better
Mr. Xcoder

the space addition feels wrong, I think better is possible
Dave

@pizzakingme I could get .e+*kdjd*bhk<GhxG as 17 bytes as well
Mr. Xcoder

16 bytes: .e+*kd*+bdhkhcGQ
Dave

1

C++ (gcc), 164 bytes

#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';}}

My first attempt after a long time lurking!

Ungolfed code below:

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

Try it online!


I know there has to be a bunch of golfing things to do, but so far, that's the smallest I've gotten.
Drise
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.