Monday, July 2, 2012

Euler Problem 12

I skipped a number of Euler problems since my last post. Anyway, here’s my powershell solution to Problem 12.

http://projecteuler.net/problem=12

It’s not that elegant but it solved the problem in less than 4mins :-)

  1. function Count-Divisors($num
  2.     $totalDivisors = 2 
  3.     $subTotal = 0 
  4.     $localDivisor = 2 
  5.     $localNum = $num 
  6.      
  7.     while($localNum -gt 1) 
  8.     { 
  9.         if(($localNum%$localDivisor) -eq 0) 
  10.         { 
  11.             $subTotal++ 
  12.             $localNum/=$localDivisor 
  13.         } 
  14.         else 
  15.         { 
  16.             if($subTotal -gt 0) 
  17.             { 
  18.                 $totalDivisors*=($subTotal+1) 
  19.                 $subTotal = 0 
  20.             } 
  21.             $localDivisor++ 
  22.         } 
  23.     } 
  24.      
  25.     return $totalDivisors 
  26.  
  27. function Get-FTNumber($start, $divisors
  28.     $i=$start 
  29.     while ((Count-Divisors ($i * ($i+1)/2)) -le $divisors
  30.     { 
  31.         $i++ 
  32.     } 
  33.      
  34.     return ($i * ($i+1)/2) 
  35.  
  36. echo (Get-FTNumber 2 500) 

Sunday, October 2, 2011

Display Top Level Folder/File Sizes

It’s been a long, long time since my last post. Last week, I was having a problem with my office hard disk. It doesn’t have much disk space anymore and it’s performing very, very slow. I thought it would be nice to have a powershell script which displays the top level folder/file sizes in a given path. It’s also cool to have the largest folder/file displayed on top.

I’m a huge fan of one-liners. Hence, here’s my solution in one powershell line.

  1. ls | select Name, @{Name="Type";Expression={if($_.psIsContainer){"Directory"}else{"Folder"}}}, @{Name="Size(MB)";Expression={[Math]::Round($(ls $_.FullName -recurse| measure Length -sum).Sum/1MB, 2)}}| sort -property "Size(MB)" -desc 

Note: This script also indicates whether it’s a folder or file and rounds off the size to 2 decimal points in MB.

Saturday, September 12, 2009

Euler Problem 6

The sum of the squares of the first ten natural numbers is,

12 + 22 + ... + 102 = 385

The square of the sum of the first ten natural numbers is,

(1 + 2 + ... + 10)2 = 552 = 3025

Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

Powershell Solution:

  1. $SumOfSq = 1..100|%{[Math]::pow($_,2)}|measure -sum|%{$_.sum} 
  2. $SqOfSum = 1..100|measure -sum|%{[Math]::pow($_.sum,2)} 
  3. echo ($SqOfSum - $SumOfSq

Note: The solution may not be the optimized one… just a quick hack… I’ll revisit later for optimization if time permits… :-)

Friday, September 11, 2009

Euler Problem 5

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?

Powershell Solution:

This can be done manually (pen/paper) using prime factorization.
However, since I love powershell… We’ll use it with prime factorization in mind…

  1. function Get-Factors($number
  2.     [Array]$result = {1} 
  3.     $factor = 2 
  4.     while($number -gt 1) 
  5.     { 
  6.         if($number%$factor -eq 0) 
  7.         { 
  8.             $result += $factor 
  9.             $number /= $factor 
  10.         }  
  11.         else 
  12.         { 
  13.             $factor += 1 
  14.         } 
  15.     }  
  16.      
  17.     return $result 
  18.  
  19. function Get-NextMultiple($currentMultiple, $currentFactor
  20.     foreach($factor in Get-Factors($currentFactor)) 
  21.     { 
  22.         $currentMultiple = $currentMultiple * $factor.ToString() 
  23.         if($currentMultiple%$currentFactor -eq 0) 
  24.         { 
  25.             return $currentMultiple 
  26.         } 
  27.     } 
  28.  
  29. $currentMultiple = 1 
  30. 1..20|foreach{($currentMultiple = Get-NextMultiple $currentMultiple $_)}|measure -max|%{$_.Maximum} 

Note: The solution may not be the optimized one… just a quick hack… I’ll revisit later for optimization if time permits… :-)

Thursday, September 10, 2009

Euler Problem 4

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

Find the largest palindrome made from the product of two 3-digit numbers.

Powershell Solution:

  1. function Reverse-Text([string] $text
  2.     if($text.Length -eq 1) 
  3.     { 
  4.         return $text 
  5.     } 
  6.     else 
  7.     { 
  8.         return (Reverse-Text($text.Substring(1, $text.Length-1))) + $text[0] 
  9.     } 
  10.  
  11. $start = 999 
  12. $end = 100 
  13. $max_palindrome = 0 
  14. for($num1 = $start; $num1 -ge $end; $num1--) 
  15.     for($num2 = $num1; $num2 -ge $end; $num2--) 
  16.     { 
  17.         $product = $num1*$num2 
  18.         if($product.ToString() -eq (Reverse-Text($product))) 
  19.         { 
  20.             if($product -gt $max_palindrome
  21.             { 
  22.                 $max_palindrome = $product 
  23.             } 
  24.         } 
  25.     } 
  26.  
  27. echo $max_palindrome 
Note: The solution may not be the optimized one… just a quick hack… I’ll revisit later for optimization if time permits… :-)

Euler Problem 3

The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?

Quick Powershell Solution:

  1. $num = 600851475143  
  2. $max_prime = 1 
  3.  
  4. $end1 = 0 
  5. while($end1 -eq 0) 
  6.     $factor = 2 
  7.     $end2 = 0 
  8.     while($end2 -eq 0) 
  9.     { 
  10.         if($num%$factor -eq 0) 
  11.         { 
  12.             if($max_prime -lt $factor
  13.             { 
  14.                 $max_prime = $factor 
  15.             } 
  16.              
  17.             $num = $num/$factor 
  18.             $end2 = 1 
  19.         } 
  20.         $factor = $factor+1 
  21.     } 
  22.      
  23.     if($num -eq 1) 
  24.     { 
  25.         $end1 = 1 
  26.     } 
  27.  
  28. echo $max_prime 

Note: The solution may not be the optimized one… just a quick hack… I’ll revisit later for optimization if time permits… :-)

Wednesday, September 9, 2009

Euler Problem 2

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Find the sum of all the even-valued terms in the sequence which do not exceed four million.

Powershell Solution:

  1. $n1 = 1 
  2. $n2 = 1 
  3. $sum = 0 
  4. while(($n1+$n2) -lt 4e+6) 
  5.     if($n2 -gt $n1
  6.     { 
  7.         $n1=$n1+$n2 
  8.         if($n1%2 -eq 0) 
  9.         { 
  10.             $sum = $sum + $n1 
  11.         } 
  12.     } 
  13.     else 
  14.     { 
  15.         $n2=$n1+$n2 
  16.         if($n2%2 -eq 0) 
  17.         { 
  18.             $sum = $sum + $n2 
  19.         } 
  20.     } 
  21. }  
  22. $sum 

$sum = 4613732

The above solution doesn’t look that elegant though…
I think it can still be optimized… but anyway, I’ll try again if I have the time…