29
\$\begingroup\$

Inspired by this post. For those marking this question as a duplicate I urge you to actually read the question to see that mine is a modification of the one linked. The one linked does not ask for an input and is to just print the alphabet diagonally.

The Challenge

Given an input between 1-26 inclusively, print the alphabet diagonally, but begin printing vertically at the index of the given input.

Examples

Given the input:

16

Your program should output:

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

Input:

4

Output:

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

Input:

1

Output:

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

Input:

26

Output:

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

Scoring

This is , so the shortest answer in each language wins.

Good luck!

\$\endgroup\$
8
  • 7
    \$\begingroup\$ May we choose to use either 0- or 1-indexing? \$\endgroup\$
    – notjagan
    Commented Aug 19, 2017 at 3:45
  • \$\begingroup\$ Is a consistent leading space acceptable? \$\endgroup\$
    – Giuseppe
    Commented Aug 19, 2017 at 6:26
  • 1
    \$\begingroup\$ @Giuseppe sure, no problem! \$\endgroup\$ Commented Aug 22, 2017 at 17:33
  • 1
    \$\begingroup\$ @DomHastings yes, they are! \$\endgroup\$ Commented Aug 22, 2017 at 17:34
  • 1
    \$\begingroup\$ @Adám yes to both of your questions! \$\endgroup\$ Commented Aug 22, 2017 at 17:34

51 Answers 51

13
\$\begingroup\$

Charcoal, 9 bytes

↘✂β⁰N↓✂βη

Try it online!

How it works

↘✂β⁰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

This solution no longer works in the current version of Charcoal (most likely due to a bug fix), but the issue is resolved for 10 bytes with ↘✂β⁰N↓✂βIθ.

\$\endgroup\$
3
  • 2
    \$\begingroup\$ I'm not sure why that works; it may be a bug that was introduced a couple of weeks ago. (You'd normally have to use Iθ instead of η.) \$\endgroup\$
    – Neil
    Commented Aug 19, 2017 at 10:07
  • \$\begingroup\$ @Neil It seem broken today. Using Iθ solves it. \$\endgroup\$ Commented Aug 19, 2017 at 21:56
  • \$\begingroup\$ Save 1 byte by using …βN instead of ✂β⁰N. \$\endgroup\$
    – Neil
    Commented Dec 21, 2017 at 15:31
7
\$\begingroup\$

05AB1E, 11 bytes

AvNI<‚Wysú,

First time trying 05AB1E, so I'm open to tips.

Try it online!

If a zero-indexed input from 0 to 25 is allowed, this can be 10 bytes by omitting the <.

\$\endgroup\$
1
  • \$\begingroup\$ Niiice! Exactly what I got. I tried "lift" but it's not working as planned. I think that's pretty optimal :). \$\endgroup\$ Commented Aug 22, 2017 at 19:22
4
\$\begingroup\$

JavaScript (ES2017), 73 72 71 66 bytes

Saved some bytes thanks to @JustinMariner

f=(n,x=26)=>x?f(n,x-1)+(x+9).toString(36).padStart(x<n?x:n)+`
`:''
\$\endgroup\$
5
  • 1
    \$\begingroup\$ This adds a 10 after z at the end due to having ++x before x.toString(). Bugfixed and golfed to 68 bytes using padStart: TIO \$\endgroup\$ Commented Aug 19, 2017 at 2:29
  • \$\begingroup\$ @JustinMariner Thanks, I think I might switch to ES8 for that... \$\endgroup\$ Commented Aug 19, 2017 at 2:45
  • \$\begingroup\$ Can you save anything by currying? n=>g=(x=26)=>x?f(x-1)+(x+9).toString(36).padStart(x<n?x:n)+'\n':"" \$\endgroup\$
    – Shaggy
    Commented Aug 19, 2017 at 10:07
  • \$\begingroup\$ @Shaggy Perhaps, I don't know if that type of currying is allowed though. \$\endgroup\$ Commented Aug 19, 2017 at 17:06
  • \$\begingroup\$ Ah, nuts, looks like your proposal to allow this is no longer a consensus :( \$\endgroup\$
    – Shaggy
    Commented Aug 21, 2017 at 8:59
4
\$\begingroup\$

Ruby, 51 46 43 bytes

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

Returns a list of strings.

Looks like the Python guys were on to something with their subscripts. -5 bytes by taking inspiration from Mr. Xcoder's improvement of ppperry's solution.

Previous solution with rjust (51 bytes):

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

Python 2, 61 58 57 56 bytes

def f(i,j=0):exec"print(' '*~-i)[:j]+chr(97+j);j+=1;"*26

-3 bytes thanks to Rod

-2 more bytes thanks to Mr. Xcoder

\$\endgroup\$
5
3
\$\begingroup\$

Python 2, 62 50 57 bytes

x=input();n=m=1
exec"print'%*c'%(m,n+96);n+=1;m+=x>m;"*26

Try it online!

Steals heavily from this answer by Dennis.

\$\endgroup\$
0
3
\$\begingroup\$

R, 99 89 bytes

@MickeyT saved 10 bytes

function

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

demo

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)
\$\endgroup\$
2
  • 1
    \$\begingroup\$ A couple of little savings. Rather then the ifelse try min. print.noquote can be replaced with cat with a '\n' in the paste. The \n can be a straight carriage return. Curly braces for the function body can be dropped. \$\endgroup\$
    – MickyT
    Commented Aug 21, 2017 at 0:02
  • \$\begingroup\$ You can save some more by using write rather than cat and paste: write(c(rep(" ",min(x,i)),letters[i]),"",26,,"") \$\endgroup\$ Commented Aug 21, 2017 at 10:18
3
\$\begingroup\$

Retina, 72 68 bytes

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

Try it online! Output includes trailing whitespace. Save 1 byte by deleting the space before the $ if zero-indexing is allowed. Edit: Saved 4 bytes by using @MartinEnder's alphabet generator. Explanation:

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

Insert the alphabet.

\D
$.`$* $&¶

Diagonalise it.

\d+
$* 

Convert the input to unary as spaces.

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

Trim overlong lines so that no line is longer than the blank line at the end.

\$\endgroup\$
2
\$\begingroup\$

Mathematica, 103 bytes

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

Jelly, 11 bytes

26Ḷ«’⁶ẋżØaY

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Common Lisp, 84 bytes

(lambda(x)(dotimes(i 26)(format t"~v,,,@a~%"(if(< i x)(1+ i)x)(code-char(+ i 97)))))

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Python, 52 bytes

Quite surprised nobody noticed the obvious approach was also as short as the others.

lambda k:[(i*" ")[:k-1]+chr(i+97)for i in range(26)]

Try it online!

Python, 53 bytes

lambda k:[min(k-1,i)*" "+chr(i+97)for i in range(26)]

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Haskell, 58 54 bytes

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

Try it online!

How it works

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 

Edit: @Lynn saved 4 bytes. Thanks!

\$\endgroup\$
2
2
\$\begingroup\$

Java (OpenJDK 8), 69 bytes

n->{for(int a=0;a++<26;)System.out.printf("%"+(a<n?a:n)+"c%n",a+96);}

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Gaia, 12 bytes

…26⊃§×¦₵a+†ṣ

Try it online!

Explanation

…             Range 0..input-1
 26⊃          Repeat the last number enough times to make it have length 26
    §×¦       Turn each number into a string of that many spaces
       ₵a+†   Add the corresponding letter to each
           ṣ  Join with newlines
\$\endgroup\$
2
\$\begingroup\$

APL (Dyalog), 12 11 bytes

-1 as OP has now clarified that returning a list of strings is fine.

Prompts for input.

⎕A↑¨⍨-⎕⌊⍳26

Try it online!

⍳26 first 26 strictly positive ɩntegers

⎕⌊ minimum of input and those

- negate those

⎕A↑⍨¨ for each letter of the Alphabet, take that many characters (from the rear, as all numbers are negative), padding with spaces as necessary


 convert list of strings into matrix (only in TIO link to enable readable output)

\$\endgroup\$
2
\$\begingroup\$

Pyth, 21 17 15 bytes

VlG+*d?>QNNQ@GN

Explanation:

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)

Try it online!

\$\endgroup\$
1
  • \$\begingroup\$ Found some considerably shorter approaches, and I decided to post my own answer. \$\endgroup\$
    – Mr. Xcoder
    Commented Aug 19, 2017 at 8:10
1
\$\begingroup\$

JavaScript (Node.js), 72 bytes

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

Returns a list of strings.

Try it online!

\$\endgroup\$
5
  • \$\begingroup\$ May I ask why node.js? seems like valid normal JS \$\endgroup\$
    – Downgoat
    Commented Aug 19, 2017 at 2:47
  • \$\begingroup\$ @Downgoat It's the TIO auto formatting \$\endgroup\$ Commented Aug 19, 2017 at 2:48
  • \$\begingroup\$ btw you can save bytes using .padStart \$\endgroup\$
    – Downgoat
    Commented Aug 19, 2017 at 2:49
  • \$\begingroup\$ Wait nvm the way I was thinking basically makes it into ETH's answer \$\endgroup\$
    – Downgoat
    Commented Aug 19, 2017 at 2:50
  • \$\begingroup\$ Switch to ES8 and save a byte with padEnd instead of repeat. \$\endgroup\$
    – Shaggy
    Commented Aug 19, 2017 at 8:41
1
\$\begingroup\$

Mathematica, 67 bytes

SparseArray[x=#;{#,#~Min~x}->Alphabet[][[#]]&~Array~26,{26,#}," "]&

Returns a SparseArray of strings. To visualize, append Grid@ in front.

Try it on Wolfram Sandbox

Usage

Grid@SparseArray[x=#;{#,#~Min~x}->Alphabet[][[#]]&~Array~26,{26,#}," "]&[5]
a
 b
  c
   d
    e
    f
    g
     
    ⋮
   
    z 
\$\endgroup\$
1
\$\begingroup\$

Python 2, 52 bytes

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

Try it online!

I'm assuming a list of strings is fine...

Shortest I could get with recursion:

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

SOGL V0.12, 12 bytes

z{ē.-.Hχ@*Ot

Try it Here!

\$\endgroup\$
1
\$\begingroup\$

Python 3, 52 bytes

lambda n:[('%*c'%(i,i+96))[-n:]for i in range(1,27)]

Try it online!

\$\endgroup\$
1
\$\begingroup\$

C (gcc), 50 bytes

i;f(n){for(;i<26;printf("%*c\n",i++<n?i:n,i+97));}

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Proton, 40 bytes

Assuming that a list of Strings is fine.

k=>[(i*" ")[to~-k]+chr(i+97)for i:0..26]

Try it online!

Proton, 49 bytes

As ASCII-art instead:

k=>'\n'.join((i*" ")[to~-k]+chr(i+97)for i:0..26)

Try it online!

\$\endgroup\$
1
\$\begingroup\$

C# (.NET Core), 66 + 18 bytes

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

Byte count also includes

using System.Linq;

Try it online!

This returns a collection of strings, one for each line. If it's not allowed, the answer will swell by 17 bytes for string.Concat() and \n inside string

Explanation:

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
    )
\$\endgroup\$
1
\$\begingroup\$

Pyth, 12 bytes

j.e+<*kdtQbG

Try it here!

If lists of Strings are allowed, this can be shortened to 11 bytes:

.e+<*kdtQbG

Pyth, 12 bytes

VG+<*dxGNtQN

Try it here!

Pyth, 14 bytes

jm+<*d;tQ@Gd26

Try it here.

If lists of Strings are allowed, this can be shortened to 13 bytes:

m+<*d;tQ@Gd26

How do these work?

Unlike most of the other answers, this maps / loops over the lowercase alphabet in all 3 solutions.

Explanation #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.

Explanation #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)

Explanation #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.
\$\endgroup\$
1
\$\begingroup\$

Haskell, 60 bytes

f n=unlines$scanl(\p c->take(n-1)(p>>" ")++[c])"a"['b'..'z']

This is a function that returns the output as a String.

Try it online.

\$\endgroup\$
1
\$\begingroup\$

Japt, 16 13 bytes

Saved 3 bytes thanks to @Oliver

;C£RiXiYmUÉ î

Test it online!

\$\endgroup\$
1
  • \$\begingroup\$ @Oliver Dang, I was tired... \$\endgroup\$ Commented Aug 19, 2017 at 17:04
1
\$\begingroup\$

q/kdb+, 33 31 bytes

Solution:

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

Example:

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

Explanation:

Create a list of spaces (26) up to the length of the minimum of the input and the range of 0..25), join with each letter of the alphabet, print to 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 )

Notes:

  • -2 bytes by rejigging the brackets
\$\endgroup\$
3
  • \$\begingroup\$ While I couldn't find a shorter q answer, the following is only 22 bytes in k4: {-1(-x&1+!26)$'$.Q.a;}. \$\endgroup\$
    – coltim
    Commented Nov 10, 2020 at 19:17
  • \$\begingroup\$ don't think you need the '? {-1(-x&1+!26)$$.Q.a;} for 21 bytes. \$\endgroup\$
    – mkst
    Commented Nov 11, 2020 at 20:50
  • \$\begingroup\$ Ooh, good catch! Did not realize $ (pad) accepts a list left-hand argument. \$\endgroup\$
    – coltim
    Commented Nov 11, 2020 at 23:08
1
\$\begingroup\$

Java 1.8 (without Lambda), 98 Bytes

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

The logic is straightforward. Provides no input data validation, very bad!

  • Update: Function only! Thank you to @Olivier Grégoire
\$\endgroup\$
3
  • 1
    \$\begingroup\$ To spare some bytes, use for(;c++<26;s+=c<i?" ":"")System.out.println(s+(char)o++); Also, you can write only a function, or a lambda instead of a full program. \$\endgroup\$ Commented Aug 20, 2017 at 23:18
  • \$\begingroup\$ If I were to include only the body of a function, then how would the reader know what a[0] refers to? I think snippets are not fair if they do not compile; the challenge is just as interesting with a language rich in constructs. \$\endgroup\$ Commented Aug 21, 2017 at 16:10
  • 1
    \$\begingroup\$ Hello! I did say a function or a lambda, not a snippet. ;-) So you can write void f(int i){...} (no static needed) or i->{...} instead of your whole program. See all Java tips. See my answer for this same challenge, as example. Have fun on the site! :-) \$\endgroup\$ Commented Aug 21, 2017 at 18:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.