Daily Challenge #52 - Building a Pyramid

twitter logo ใƒป1 min read

Daily Challenge (121 Part Series)

1) Daily Challenge #1 - String Peeler 2) Daily Challenge #2 - String Diamond 3 ... 119 3) Daily Challenge #3 - Vowel Counter 4) Daily Challenge #4 - Checkbook Balancing 5) Daily Challenge #5 - Ten Minute Walk 6) Daily Challenge #6 - Grandma and her friends 7) Daily Challenge #7 - Factorial Decomposition 8) Daily Challenge #8 - Scrabble Word Calculator 9) Daily Challenge #9 - What's Your Number? 10) Daily Challenge #10 - Calculator 11) Daily Challenge #11 - Cubic Numbers 12) Daily Challenge #12 - Next Larger Number 13) Daily Challenge #13 - Twice Linear 14) Daily Challenge #14 - Square into Squares 15) Daily Challenge #15 - Stop gninnipS My sdroW! 16) Daily Challenge #16 - Number of People on the Bus 17) Daily Challenge #17 - Double Trouble 18) Daily Challenge #18 - Triple Trouble 19) Daily Challenge #19 - Turn numbers into words 20) Daily Challenge Post #20 - Number Check 21) Daily Challenge #21 - Human Readable Time 22) Daily Challenge #22 - Simple Pig Latin 23) Daily Challenge #23 - Morse Code Decoder 24) Daily Challenge #24 - Shortest Step 25) Daily Challenge #25 - Double Cola 26) Daily Challenge #26 - Ranking Position 27) Daily Challenge #27 - Unlucky Days 28) Daily Challenge #28 - Kill the Monster! 29) Daily Challenge #29 - Xs and Os 30) Daily Challenge #30 - What is the price? 31) Daily Challenge #31 - Count IPv4 Addresses 32) Daily Challenge #32 - Hide Phone Numbers 33) Daily Challenge #33 - Did you mean...? 34) Daily Challenge #34 - WeIrD StRiNg CaSe 35) Daily Challenge #35 - Find the Outlier 36) Daily Challenge #36 - Let's go for a run! 37) Daily Challenge #37 - Name Swap 38) Daily Challenge #38 - Middle Name 39) Daily Challenge #39 - Virus 40) Daily Challenge #40 - Counting Sheep 41) Daily Challenge #41 - Greed is Good 42) Daily Challenge #42 - Caesar Cipher 43) Daily Challenge #43 - Boardgame Fight Resolver 44) Daily Challenge #44 - Mexican Wave 45) Daily Challenge #45 - Change Machine 46) Daily Challenge #46 - ??? 47) Daily Challenge #47 - Alphabets 48) Daily Challenge #48 - Facebook Likes 49) Daily Challenge #49 - Dollars and Cents 50) Daily Challenge #50 - Number Neighbor 51) Daily Challenge #51 - Valid Curly Braces 52) Daily Challenge #52 - Building a Pyramid 53) Daily Challenge #53 - Faro Shuffle 54) Daily Challenge #54 - What century is it? 55) Daily Challenge #55 - Building a Pile of Cubes 56) Daily Challenge #56 - Coffee Shop 57) Daily Challenge #57 - BMI Calculator 58) Daily Challenge #58 - Smelting Iron Ingots 59) Daily Challenge #59 - Snail Sort 60) Daily Challenge #60 - Find the Missing Letter 61) Daily Challenge #61 - Evolution Rate 62) Daily Challenge #62 - Josephus Survivor 63) Daily Challenge #63- Two Sum 64) Daily Challenge #64- Drying Potatoes 65) Daily Challenge #65- A Disguised Sequence 66) Daily Challenge #66- Friend List 67) Daily Challenge #67- Phone Directory 68) Daily Challenge #68 - Grade Book 69) Daily Challenge #69 - Going to the Cinema 70) Daily Challenge #70 - Pole Vault Competition Results 71) Daily Challenge #71 - See you next Happy Year 72) Daily Challenge #72 - Matrix Shift 73) Daily Challenge #73 - ATM Heist 74) Daily Challenge #74 - Free Pizza 75) Daily Challenge #75 - Set Alarm 76) Daily Challenge #76 - Bingo! (or not...) 77) Daily Challenge #77 - Bird Mountain 78) Daily Challenge #78 - Number of Proper Fractions with Denominator d 79) Daily Challenge #79 - Connect Four 80) Daily Challenge #80 - Longest Vowel Change 81) Daily Challenge #81 - Even or Odd 82) Daily Challenge #82 - English Beggars 83) Daily Challenge #83 - Deodorant Evaporator 84) Daily Challenge #84 - Third Angle of a Triangle 85) Daily Challenge #85 - Unwanted Dollars 86) Daily Challenge #86 - Wouldn't, not Would. 87) Daily Challenge #87 - Pony Express 88) Daily Challenge #88 - Recursive Ninjas 89) Daily Challenge #89 - Extract domain name from URL 90) Daily Challenge #90 - One Step at a Time 91) Daily Challenge #91 - Bananas 92) Daily Challenge #92 - Boggle Board 93) Daily Challenge #93 - Range Extraction 94) Daily Challenge #94 - Last Digit 95) Daily Challenge #95 - CamelCase Method 96) Daily Challenge #96 - Easter Egg Crush Test 97) Daily Challenge #97 - Greed is Good 98) Daily Challenge #98 - Make a Spiral 99) Daily Challenge #99 - Balance the Scales 100) Daily Challenge #100 - Round Up 101) Daily Challenge #101 - Parentheses Generator 102) Daily Challenge #102 - Pentabonacci 103) Daily Challenge #103 - Simple Symbols 104) Daily Challenge #104 - Matrixify 105) Daily Challenge #105 - High-Sum Matrix Drop 106) Daily Challenge #106 - Average Fuel Consumption 107) Daily Challenge #107 - Escape the Mines 108) Daily Challenge #108 - Find the Counterfeit Coin 109) Daily Challenge #109 - Decorate with Wallpaper 110) Daily Challenge #110 - Love VS. Friendship 111) Daily Challenge #111 - 99 Bottles of Beer 112) Daily Challenge #112 - Functions of Integers on the Cartesian Plane 113) Daily Challenge #113 - Iterative Rotation Cipher 114) Daily Challenge #114 - Speed Control 115) Daily Challenge #115 - Look and Say Sequence 116) Daily Challenge #116 - Shortest Knight Path 117) Daily Challenge #117 - MinMinMax 118) Daily Challenge #118 - Reversing a Process 119) Daily Challenge #119 - Adding Big Numbers 120) Daily Challenge #120 - Growth of a Population 121) Daily Challenge #121 - Who has the most money?

Challenge
Write a function that will draw a pyramid. The function should take one integer parameter that will describe how many lines tall the pyramid should be.

This challenge is simple, but requires a bit of reflection to get it right. Here is an example in Node.js hosted on Repl.it.

Example
pyramid(5);

Good luck!


This challenge comes from @aminnairi here on DEV! Want to propose a challenge idea for a future post? Email yo+challenge@dev.to with your suggestions!

twitter logo DISCUSS (19)
markdown guide
 

Fun challenge :) I did it in React, so here's the function:

  const pyramid = count => {
    return Array(count).fill().map((_, n) => {
      return <span key={n}>
        {Array((n + 1)*2 - 1).fill().map(i => {
          return "*"
        })}
      </span>
    })
  }

and here's a demo!

 

Python one-liner yet again :)

>>> pyramid = lambda x: print('\n'.join(f'{a}' for a in [' '*(((2*(x-i)-1)//2))+'*'*(i*2+1) for i in range(x)]))
>>> pyramid(5)
    *
   ***
  *****
 *******
*********
>>> pyramid(4)
   *
  ***
 *****
*******
>>> pyramid(1)
*
 
 

I have no Go pun this time. Sorry, I need coffee for that.

pyramid.go

package pyramid

// Pyramid creates a text pyramid of the given height
func Pyramid(height int) string {
    if height <= 0 {
        return ""
    }

    // Determine width of pyramid base
    width := (height * 2) - 1

    // Get middle of pyramid
    middle := int(width / 2)
    row := 0

    // Initialize a base row with only spaces
    base := make([]rune, width, width)
    for i := range base {
        base[i] = ' '
    }

    // Set the top row 'block'
    base[middle] = '*'

    var pyramid string

    // Build the pyramid starting from the top
    for row < height {
        base[middle+row] = '*'
        base[middle-row] = '*'
        pyramid += string(base) + "\n"

        row++
    }

    return pyramid
}

pyramid_test.go

package pyramid

import "testing"

func TestPyramid(t *testing.T) {
    testCases := []struct {
        description string
        input       int
        expected    string
    }{
        {
            "small pyramid",
            3,
            "  *  \n *** \n*****\n",
        },
        {
            "no height",
            0,
            "",
        },
        {
            "negative height",
            -3,
            "",
        },
        {
            "big pyramid",
            7,
            "      *      \n     ***     \n    *****    \n   *******   \n  *********  \n *********** \n*************\n",
        },
    }

    for _, test := range testCases {
        if result := Pyramid(test.input); result != test.expected {
            t.Fatalf("FAIL: %s - Pyramid(%d): %s, expected: %s", test.description, test.input, result, test.expected)
        }
        t.Logf("PASS: %s", test.description)
    }
}

 

Here it is!

// Minified
f=(a)=>[...Array(a)].map((_,i)=>(c=' '.repeat(a-i),`${c}${'*'.repeat(2*i+1)}${c}`)).join`\n`

// Readable
const pyramid = (input) => {
  return [...Array(input)].map((_, index) => {
    const padding = ' '.repeat(input - index);
    const stars = '*'.repeat(2 * index + 1);
    return `${padding}${stars}${padding}`;
  }).join('\n');
}

The right padding isn't necessary, but hey why not

'\n' + pyramid(10)
"
          *          
         ***         
        *****        
       *******       
      *********      
     ***********     
    *************    
   ***************   
  *****************  
 ******************* "
 

Since this is pretty much the top half of a string diamond I took my answer from that challenge and used just the first half of the code but it isn't working like expected, can someone tell me where I went wrong? ๐Ÿ˜ฅ

Ruby:

def riamond_i_mean_ryramid(karat)
  unless karat.odd? && karat > 0
    raise ArgumentError.new("You want a #{karat} karat ~~diamond~~ pyramid? That's crazy!")
  end
  cut = 1
  layers = []
  until cut > karat
    layers.push(("*" * cut).center(karat))
 

My solution in js

const padSpaceToSides = (str, len) => {
  const padlen = len - str.length,
    right = Math.ceil(padlen / 2),
    left = padlen - right;
  return str = Array(left + 1).join(' ') + str + Array(right + 1).join(' ');
},
pyramid = (height, atom = '*') => {
  const start = 1,
    step = 2;
  for(let i = start; i < height * 2; i += step) {
    console.log(padSpaceToSides(atom.repeat(i), height * 2 - 1));
  }
};

pyramid(10)

Output

 
const pyramid = n => Array(n).fill(1)
    .map((_, lineno) => lineno * 2 + 1)
    .map(x => [x, (n * 2 - 1 - x) / 2])
    .map(([x, y]) => [Array(x).fill('*').join(''), Array(y).fill(' ').join('')])
    .map(([x, y]) => `${y}${x}${y}`).join('\n');
 

My try. I used padStart and padEnd, and abused default parameters a bit, just for fun.

const PYRAMID = "*";
const AIR = "ยท";

const pyramid = (n, {maxWidth = (n * 2) - 1, leftPadding = maxWidth / 2} = {}) => 
    Array.from({length: n}, (_, idx, __, {width = (( idx + 1 ) * 2) - 1} = {}) => 
        PYRAMID.repeat(width)
            .padStart(idx + leftPadding + 1, AIR)
            .padEnd(maxWidth, AIR)
    ).join("\n");
 

Javascript, can be run from the command line:

const floors = Number(process.argv[2]);

for (let currentFloor = 1; currentFloor <= floors; currentFloor += 1) {
  console.log(
    '*'.repeat(2 * currentFloor - 1)
      .padStart((floors + currentFloor - 1), ' '),
  );
}
 

F#:

let pyramid (x: int) =
  let print maxWidth count =
    (String.replicate (maxWidth - count) " ") + (String.replicate (2*count-1) "*")

  let pr = (x - 1) * 2 + 1 |> print

  for i in [1..x] do
     i |> pr |> printfn "%s"
 

CSS

This is a variation of my solution for challenge #2. Just add the class "triangle" to a block element, and specify the lines in the CSS variable --stars:

.triangle {
  --stars: 10;
  width: calc(2 * var(--stars) * 10px);
  height: calc((var(--stars)) * 15px);
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="10px" height="15px" viewBox="0 0 10 15"><text x="5" y="12" fill="black" dominant-baseline="middle" text-anchor="middle">*</text></svg>');
  background-position: top center;
  clip-path: polygon(50% 0, 100% 100%, 0% 100%);
}

The idea is having an inline SVG background with the asterisks, then clipping the shape of the triangle. Here is a demo on Codepen:

 
def pyramid(lines):
  for line in range(1, 1 + lines * 2, 2):
    print(' ' * (lines - line // 2 - 1) + '*' * line)
 
var pyramid = (height) => {
  var pyramidLayer = '*';
  width = height * 2;
  for(var i=1;i<width;i++) {
     if(i % 2 === 1) {
        console.log(pyramidLayer.padStart((width+i)/2, ' '));
    }
    pyramidLayer += '*';
  }
}
pyramid(5);
 
 
function pyramid(i) {
    for( k = 1; i != 0; k++) {
        console.log(" ".repeat(--i) + "*".repeat(k*2-1));
    }
}
 

Rust:

pub fn pyramid(floors: usize) -> String {
    (0..floors)
        .map(|f| " ".repeat(floors - f - 1) + &"*".repeat(2 * f + 1))
        .collect::<Vec<_>>()
        .join("\n")
}
 
 
Classic DEV Post from Feb 1

Asynchronous vs Synchronous Programming

Getting started with Async and Sync programming

dev.to staff profile image
The hardworking team behind dev.to โค๏ธ