26
\$\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\$
  • 6
    \$\begingroup\$ May we choose to use either 0- or 1-indexing? \$\endgroup\$ – notjagan Aug 19 '17 at 3:45
  • \$\begingroup\$ Is a consistent leading space acceptable? \$\endgroup\$ – Giuseppe Aug 19 '17 at 6:26
  • \$\begingroup\$ Are trailing spaces acceptable? \$\endgroup\$ – Dom Hastings Aug 19 '17 at 13:20
  • \$\begingroup\$ May we use uppercase? \$\endgroup\$ – Adám Aug 20 '17 at 22:29
  • \$\begingroup\$ May we return a list of strings? \$\endgroup\$ – Adám Aug 21 '17 at 11:15

45 Answers 45

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\$
  • 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 Aug 19 '17 at 10:07
  • \$\begingroup\$ @Neil It seem broken today. Using Iθ solves it. \$\endgroup\$ – JP de la Torre Aug 19 '17 at 21:56
  • \$\begingroup\$ Save 1 byte by using …βN instead of ✂β⁰N. \$\endgroup\$ – Neil Dec 21 '17 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\$
  • \$\begingroup\$ Niiice! Exactly what I got. I tried "lift" but it's not working as planned. I think that's pretty optimal :). \$\endgroup\$ – Magic Octopus Urn Aug 22 '17 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\$
  • 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\$ – Justin Mariner Aug 19 '17 at 2:29
  • \$\begingroup\$ @JustinMariner Thanks, I think I might switch to ES8 for that... \$\endgroup\$ – ETHproductions Aug 19 '17 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 Aug 19 '17 at 10:07
  • \$\begingroup\$ @Shaggy Perhaps, I don't know if that type of currying is allowed though. \$\endgroup\$ – ETHproductions Aug 19 '17 at 17:06
  • \$\begingroup\$ Ah, nuts, looks like your proposal to allow this is no longer a consensus :( \$\endgroup\$ – Shaggy Aug 21 '17 at 8:59
4
\$\begingroup\$

Python 2, 61 58 57 bytes

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

-3 bytes thanks to Rod

-1 more byte thanks to Mr. Xcoder

\$\endgroup\$
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\$
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\$
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\$
  • 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 Aug 21 '17 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\$ – user2390246 Aug 21 '17 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\$

Pyth, 21 17 15 bytes

Done on a phone with 3% battery.

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\$ @totallyhuman I just had some amazing pizza in Las Vegas, New Mexico \$\endgroup\$ – Stan Strum Aug 19 '17 at 4:36
  • \$\begingroup\$ Found some considerably shorter approaches, and I decided to post my own answer. \$\endgroup\$ – Mr. Xcoder Aug 19 '17 at 8:10
  • \$\begingroup\$ @Mr.Xcoder Yeah, good job on that. \$\endgroup\$ – Stan Strum Aug 19 '17 at 14:29
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
\$\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\$
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\$
  • \$\begingroup\$ May I ask why node.js? seems like valid normal JS \$\endgroup\$ – Downgoat Aug 19 '17 at 2:47
  • \$\begingroup\$ @Downgoat It's the TIO auto formatting \$\endgroup\$ – Conor O'Brien Aug 19 '17 at 2:48
  • \$\begingroup\$ btw you can save bytes using .padStart \$\endgroup\$ – Downgoat Aug 19 '17 at 2:49
  • \$\begingroup\$ Wait nvm the way I was thinking basically makes it into ETH's answer \$\endgroup\$ – Downgoat Aug 19 '17 at 2:50
  • \$\begingroup\$ Switch to ES8 and save a byte with padEnd instead of repeat. \$\endgroup\$ – Shaggy Aug 19 '17 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\$

MATL, 14 bytes

26:tiXl2Y2oZ?c

Try it at MATL Online

Explanation

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
\$\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\$
  • \$\begingroup\$ @Oliver Dang, I was tired... \$\endgroup\$ – ETHproductions Aug 19 '17 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\$
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\$
  • 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\$ – Olivier Grégoire Aug 20 '17 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\$ – Douglas Held Aug 21 '17 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\$ – Olivier Grégoire Aug 21 '17 at 18:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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