Given a letter of the English alphabet, your task is to build a semi-diagonal alphabet to the input.
How to build a Semi-Diagonal alphabet?
Brief Description:
First, you take the position of the letter in the alphabet, P (P is 1-indexed here). Then, you print each letter until the input (inclusive) on a line, preceded by P-1 and repeat that letter P times, interleaving with spaces.
Examples:
Given
F, your program should output:A B B C C C D D D D E E E E E F F F F F F
Given
K, your program should output:A B B C C C D D D D E E E E E F F F F F F G G G G G G G H H H H H H H H I I I I I I I I I J J J J J J J J J J K K K K K K K K K K K
Given
A, your program should output:A
Rules
You may choose either lowercase or uppercase characters, but that should be consistent.
You may have extraneous spaces as follows:
- One consistent leading space (on each line).
- A trailing or leading newline(s).
- Trailing spaces.
Input and output can be taken by any standard mean, and default loopholes apply.
You are allowed to output a list of lines instead, as long as you also provide the ascii-art version.
This is code-golf, so the shortest code in bytes wins!
Inspired by this challenge .
-
\$\begingroup\$ Is output as list of strings ok? \$\endgroup\$Adám– Adám2017年08月23日 15:16:53 +00:00Commented Aug 23, 2017 at 15:16
-
2\$\begingroup\$ Why the downvote? What can i improve? \$\endgroup\$user70974– user709742017年08月23日 15:45:53 +00:00Commented Aug 23, 2017 at 15:45
-
1\$\begingroup\$ When you say "P is 1-indexed here", does here refer to the challenge or the example? \$\endgroup\$Dave– Dave2017年08月23日 15:48:39 +00:00Commented Aug 23, 2017 at 15:48
-
3\$\begingroup\$ @pizzakingme No, you may not. \$\endgroup\$user70974– user709742017年08月23日 16:05:08 +00:00Commented Aug 23, 2017 at 16:05
-
2\$\begingroup\$ I accidentlly got an interesting pattern while golfing my answer: tio.run/##K0nO@f@/… \$\endgroup\$sergiol– sergiol2017年10月19日 19:19:52 +00:00Commented Oct 19, 2017 at 19:19
75 Answers 75
Python 3, 59 bytes
lambda l:[' '*i+'%c '%(i+65)*-~i for i in range(ord(l)-64)]
Python 3, 61 bytes
lambda l:[' '*i+-~i*(chr(i+65)+' ')for i in range(ord(l)-64)]
Try it online! (link to pretty-print version)
-
8\$\begingroup\$ I see absolutely no reason for a downvote. Can the @downvoter explain? \$\endgroup\$Mr. Xcoder– Mr. Xcoder2017年08月23日 14:59:02 +00:00Commented Aug 23, 2017 at 14:59
-
1\$\begingroup\$ I'd imagine it's just a misclick, or perhaps someone not liking a lack of explanation (the latter is quite unlikely IMO) \$\endgroup\$Conor O'Brien– Conor O'Brien2017年08月23日 19:14:42 +00:00Commented Aug 23, 2017 at 19:14
-
\$\begingroup\$ I dislike Python and I can't implement with Python, so the answer is not useful for me? Just kidding, but the button tooltips probably do not fit the rules of this site \$\endgroup\$Thomas Weller– Thomas Weller2017年08月25日 12:20:31 +00:00Commented Aug 25, 2017 at 12:20
-
\$\begingroup\$ Is it just me or does it say Mr. Xcoder has 1 rep...? \$\endgroup\$Stan Strum– Stan Strum2017年09月25日 02:34:50 +00:00Commented Sep 25, 2017 at 2:34
C, 89 bytes
i,j;f(l){for(i=64;i++<l&&printf("%*c ",i-64,i);puts(""))for(j=i-65;j--;)printf("%c ",i);}
Python 2, (削除) 63 (削除ここまで) (削除) 61 (削除ここまで) 59 bytes
-2 bytes thanks to Rod. -2 bytes thanks to Felipe Nardi Batista.
i=1
exec"print' '*i+'%c '%(i+64)*i;i+=1;"*(ord(input())-64)
PowerShell, (削除) 45 (削除ここまで) 42 bytes
65..$args[0]|%{" "*$i+++"$([char]$_) "*$i}
Takes input as a literal char, then loops up through the capitals to that point, each iteration prepending the appropriate number of spaces and then the char\space hybrid.
Saved 3 bytes thanks to TessellatingHeckler.
-
\$\begingroup\$ @TessellatingHeckler Indeed. I've been golfing that to
"$args"so much, which wouldn't work here, I forgot about the[0]method. Haha. \$\endgroup\$AdmBorkBork– AdmBorkBork2017年08月25日 12:22:37 +00:00Commented Aug 25, 2017 at 12:22
JavaScript (ES6), 85 bytes
Works in lower case for both input and output. Outputs a leading space and a trailing space on each line.
f=(c,k=10,C=k.toString(36),r=s=>`${s} `.repeat(k-9))=>r``+r(C)+(C==c?'':`
`+f(c,k+1))
Demo
f=(c,k=10,C=k.toString(36),r=s=>`${s} `.repeat(k-9))=>r``+r(C)+(C==c?'':`
`+f(c,k+1))
O.innerText = f('m')
<pre id=O>
-
\$\begingroup\$
`${s} `can be replaced by(s+"")for one byte saving \$\endgroup\$Luke– Luke2017年08月24日 07:07:19 +00:00Commented Aug 24, 2017 at 7:07 -
\$\begingroup\$ @Luke I need this space. It can be replaced by
(s+" "), but that's just as long. \$\endgroup\$Arnauld– Arnauld2017年08月24日 09:18:48 +00:00Commented Aug 24, 2017 at 9:18
APL (Dyalog), 26 bytes
Prompts for scalar character. Prints list of lines.
(∊⍴∘'',' ', ̈⍨⊢⍴⊃∘⎕A) ̈⍳⎕A⍳⎕
Try it online! (has ASCII art version at one additional byte)
⎕ prompt for input
⎕A⍳ find ɩndex in Alphabet
⍳ first that many ɩntegers
(...) ̈ apply the following tacit function to each :
⊃∘⎕A pick the argument'th letter letter from the Alphabet
⊢⍴ cyclically reshape it to the argument length
' ', ̈⍨ append a space to each
⍴∘'', prepend a string of argument length (padded with spaces)
∊ εnlist (flatten)
The ASCII art version just has a ↑ on the very left; mix list of strings into table of characters.
-
\$\begingroup\$ You can cut this down by using
sayinstead of the-lflag: Try it online! \$\endgroup\$Xcali– Xcali2017年08月23日 21:03:09 +00:00Commented Aug 23, 2017 at 21:03 -
\$\begingroup\$ @Xcali I'm torn on
-E/-M5.01, I've usedsayconsiderably in the past, and would probably abuse the fact thatsayis an alternative toprintin a restricted source challenge or similar perhaps, but for the sake of -3, I'll keep as-is for now. See this meta post for a fair argument. Appreciate the input though! \$\endgroup\$Dom Hastings– Dom Hastings2017年08月24日 05:22:20 +00:00Commented Aug 24, 2017 at 5:22
Dyalog APL, 38 bytes
{↑{(y/' '),(×ばつy←⎕A⍳⍵)⍴⍵,' '} ̈⎕A↑⍨⎕A⍳⍵}
How?
⎕A↑⍨ - take the alphabet until
⎕A⍳⍵ - the input character
̈ - for each char
⍵,' ' - take the char and a space
(...)⍴ - reshape to
×ばつy←⎕A⍳⍵ - twice the index of the char in the alphabet
(y/' ') - and prepend index-of-char spaces
↑ - then flatten
APL (Dyalog Classic), 26 bytes
{↑{(≠\⍵&l×ばつ⍵)\⍵⊃⎕A} ̈⍳⎕A⍳⍵}
Explanation
⍳⎕A⍳⍵ generate indexes up to position of right arg ⍵
{ } ̈ on each index apply function
(≠\⍵&l×ばつ⍵) 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
-
\$\begingroup\$ Goodness... 4 APL-er solving the same problem at the same time! :) I think in codegolf you're allowed to remove the outer
{}, replace⍵with⎕, and claim it's a "complete program" rather than a function. That would make your solution the best (so far). \$\endgroup\$ngn– ngn2017年08月24日 06:40:55 +00:00Commented Aug 24, 2017 at 6:40 -
\$\begingroup\$ Must be a good sign :) Thanks for the suggestion. I've seen it done but wasn't sure where to draw the line. I guess that I can save 3 bytes if I remove curlies and mix. \$\endgroup\$Gil– Gil2017年08月24日 10:33:09 +00:00Commented Aug 24, 2017 at 10:33
V, (削除) 28, 26, 25 (削除ここまで), 23 bytes (Competing)
¬A[/a
lDÓ./& ò
ò-Ûä$Û>
Note that although I have been planning on adding certain features for a long time, this challenge was what convinced me to finally do it.
The output contains one leading space on each line and one trailing newline.
Hexdump:
00000000: ac41 5b2f 1261 0a6c 44d3 2e2f 2620 f20a .A[/.a.lD../& ..
00000010: f22d dbe4 24db 3e .-..$.>
Explanation:
¬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\$\begingroup\$ This is competing. You may remove the title remark. \$\endgroup\$user70974– user709742017年08月23日 15:32:11 +00:00Commented Aug 23, 2017 at 15:32
-
\$\begingroup\$ It's useful for those who weren't aware of the new meta, such as myself \$\endgroup\$Conor O'Brien– Conor O'Brien2017年08月23日 22:05:31 +00:00Commented Aug 23, 2017 at 22:05
Husk, 13 bytes
z+ḣ∞øzRNC1...'A
Takes a character in single quotes as command line argument, prints result to STDOUT. Try it online!
Explanation
I'm exploiting the way Husk prints lists of lists of strings: join inner lists with spaces and outer lists with newlines.
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.
-
\$\begingroup\$ You could omit the
<as one consistent leading space is okay. \$\endgroup\$Emigna– Emigna2017年08月23日 14:53:57 +00:00Commented Aug 23, 2017 at 14:53 -
\$\begingroup\$
A¹¡н«ðâƶāúshould work for 10 bytes \$\endgroup\$Adnan– Adnan2017年08月23日 18:56:40 +00:00Commented Aug 23, 2017 at 18:56 -
\$\begingroup\$ @Adnan I think that
¹¡will make it not work...oh so that's why there's a«in there. :p \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年08月24日 09:03:34 +00:00Commented Aug 24, 2017 at 9:03
R, (削除) 94 (削除ここまで) 88 bytes
-6 bytes thanks to Giuseppe
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')
}
}
Haskell, (削除) 52 (削除ここまで) 44 bytes
f k=[[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]
Returns a list of lines.
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
Edit: @jferard: saved three bytes. Thanks!
-
\$\begingroup\$ 49 bytes:
f k=[tail$[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]\$\endgroup\$jferard– jferard2017年08月25日 16:50:47 +00:00Commented Aug 25, 2017 at 16:50 -
\$\begingroup\$ @jferard: Thanks a lot. Rereading the challenge I noticed that a leading space per line is allowed, so we don't need the
tail$. \$\endgroup\$nimi– nimi2017年08月25日 18:08:47 +00:00Commented Aug 25, 2017 at 18:08
JavaScript (ES8), 92 bytes
c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))
Uses lowercase letters. Lines have one leading and one trailing space. Returns an array of lines.
Test Snippet
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>
05AB1E, (削除) 15 (削除ここまで) (削除) 14 (削除ここまで) 13 bytes
Saved 1 byte thanks to Adnan
A1¡н«ƶ€S»¶¡āú»
Try it online! or the Ascii art version
Explanation
A # push lowercase alphabet
1¡ # 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
-
\$\begingroup\$ It looks like we handled it a bit differently :D \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年08月23日 14:52:11 +00:00Commented Aug 23, 2017 at 14:52
-
\$\begingroup\$ @EriktheOutgolfer: We did it quite similarly, but your very nice idea to append a space before lifting, removing the need for the join made yours shorter. I hadn't read that leading/trailing spaces nor output as list was okay, so that'll hopefully teach me to read the whole challenge before implementing :P \$\endgroup\$Emigna– Emigna2017年08月23日 15:01:49 +00:00Commented Aug 23, 2017 at 15:01
-
\$\begingroup\$ tl;dr: vectorization :p \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年08月23日 15:05:38 +00:00Commented Aug 23, 2017 at 15:05
-
\$\begingroup\$
A¹¡н«instead ofADIk>£should work \$\endgroup\$Adnan– Adnan2017年08月23日 18:54:26 +00:00Commented Aug 23, 2017 at 18:54 -
\$\begingroup\$ @Adnan: Thanks! I did have
A¹¡нbut didn't consider«to get the last letter so it wasn't good enough :P \$\endgroup\$Emigna– Emigna2017年08月23日 20:02:25 +00:00Commented Aug 23, 2017 at 20:02
APL (Dyalog Unicode), 22 bytesSBCS
⍕⍪⊢∘⊂2,円.↑⍉⍴⍨⌸⎕a↑⍨⎕a⍳⍞
Uses ⎕io←1. Prints a leading space, which is allowed.
QBasic, (削除) 79 (削除ここまで) (削除) 74 (削除ここまで) 72 bytes
Thanks to Taylor Scott for byte savings (twice!)
FOR i=1TO ASC(INPUT$(1))-64
?TAB(i)
FOR j=1TO i
?CHR$(64+i)" ";
NEXT j,i
Uses uppercase. The input is by keypress and is not echoed to the screen.
Explanation
We loop i from 1 up to the limiting letter's position in the alphabet (1-based). For each i, we move to column i of the screen using TAB; then, i times, we print the ith letter of the alphabet followed by a space.
-
\$\begingroup\$ As it turns out you can use the
INPUT$(1)command as a direct replacement for the variablez$for a delta of -2 bytes \$\endgroup\$Taylor Raine– Taylor Raine2018年06月29日 20:14:45 +00:00Commented Jun 29, 2018 at 20:14 -
\$\begingroup\$ @TaylorScott Good idea, thanks! \$\endgroup\$DLosc– DLosc2018年06月29日 20:22:17 +00:00Commented Jun 29, 2018 at 20:22
Japt -R, (削除) 24 (削除ここまで) (削除) 23 (削除ここまで) (削除) 17 (削除ここまで) 15 bytes
Outputs an array, includes a leading newline and a leading & trailing space on each line.
IòUc ÏçSiXd1iYç
- 1 byte saved with help from Oliver and a further 6 thanks to him pointing out a better way to generate the initial array.
-
\$\begingroup\$ Nah, you can't let 05AB1E beat Charcoal... :P \$\endgroup\$totallyhuman– totallyhuman2017年08月23日 14:52:25 +00:00Commented Aug 23, 2017 at 14:52
-
\$\begingroup\$ @totallyhuman the revenge :p \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年08月23日 14:55:33 +00:00Commented Aug 23, 2017 at 14:55
-
\$\begingroup\$ Sadly arbitrary leading whitespace isn't allowed otherwise
E...·?θ+× κ⪫× κιwould do the job in 14 bytes. \$\endgroup\$Neil– Neil2017年08月23日 15:29:04 +00:00Commented Aug 23, 2017 at 15:29 -
\$\begingroup\$ @Neil One leading whitespace is allowed, but I'm not sure how
?got in there. It should beAinstead I think. Oh wait, ohhhhh I see what you mean. \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年08月23日 15:30:34 +00:00Commented Aug 23, 2017 at 15:30
Braingolf, 65 bytes
a#a-# 7-,-~vc<!?>[$_]:$_|&,(.#a-!?.>[# M]1+>[.M# M]:$_!@|v#
&@R);
Lowercase.
Contains 1 trailing space on each line, and a trailing newline at the end of output.
C# (.NET Core), 103 bytes
n=>{var i='`';var l="";for(;i<n;l+='\n'){l+="".PadLeft(i++-96);for(int s=96;s++<i;)l+=i+" ";}return l;}
JavaScript, (削除) 102 (削除ここまで) 94 bytes
2 bytes saved thanks to Neil
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`)
Retina, 51 bytes
^.
$&$&
}T`L`_L`^.
.
$.`$* $&$.`$* ¶
+`(\w) \B
$&1ドル
Try it online! Explanation:
^.
$&$&
Duplicate the (first) letter.
}T`L`_L`^.
Rotate it back 1 in the alphabet, or delete it if it's a duplicate A. Keep duplicating and rotating until we duplicate A, at which point the deletion undoes the duplication and the loop completes.
.
$.`$* $&$.`$* ¶
Replace each letter with a line with the letter padded on both sides.
+`(\w) \B
$&1ドル
Insert duplicate letters between all pairs of padding spaces to the right of existing letters.
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:
×ばつ ×ばつ κι
Try it online! Link is to verbose version of code.
Mathematica, 70 bytes
(T=Table)[""<>{" "~T~i,T[Alphabet[][[i]]<>" ",i]},{i,LetterNumber@#}]&
lowercase
outputs a list
thanx @ngenisis for corrections
For ascii-art version place Column@ at the beginning
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
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 askand the letters asb.*kd- Appendkspaces.+bd-b+ a space (the current letter + space).*...hk- Repeatk+1times.+(...)(...)- Concatenate.
-
1\$\begingroup\$ 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! \$\endgroup\$Dave– Dave2017年08月23日 15:08:32 +00:00Commented Aug 23, 2017 at 15:08
-
\$\begingroup\$ @pizzakingme Yeah, I wonder if I can do better \$\endgroup\$Mr. Xcoder– Mr. Xcoder2017年08月23日 15:09:10 +00:00Commented Aug 23, 2017 at 15:09
-
\$\begingroup\$ the space addition feels wrong, I think better is possible \$\endgroup\$Dave– Dave2017年08月23日 15:14:20 +00:00Commented Aug 23, 2017 at 15:14
-
\$\begingroup\$ @pizzakingme I could get
.e+*kdjd*bhk<GhxGas 17 bytes as well \$\endgroup\$Mr. Xcoder– Mr. Xcoder2017年08月23日 15:17:02 +00:00Commented Aug 23, 2017 at 15:17 -
\$\begingroup\$ 16 bytes:
.e+*kd*+bdhkhcGQ\$\endgroup\$Dave– Dave2017年08月23日 15:22:40 +00:00Commented Aug 23, 2017 at 15:22
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;
}
}
-
\$\begingroup\$ I know there has to be a bunch of golfing things to do, but so far, that's the smallest I've gotten. \$\endgroup\$Drise– Drise2017年08月23日 20:38:05 +00:00Commented Aug 23, 2017 at 20:38