int o = a[0] < a[1] ? 0 :1; for (int i = 1; i < a.length-1; i++) if( 0!= (a[i] < a[i+1]?0:1) ) return "not sorted"; return o ==0?"ascending" : "descending";
Tuesday, April 26, 2016
how can we know this array is sorted in java
this is easy example
Project Euler problem 303
My effort to solve it
1. make 3digit generator and divide with n
2. 9999 is never solved in time.
3. find 9, 99, 999, 9999 in pattern.
4. finally solve it in 9s
Tuesday, April 19, 2016
find the ways to make specific number with dice
this problem is about hexanacci number
long a = 0,b= 0,c= 0,d= 0,e= 0,f=1, t = 0; for (int i = 1; i <= n; i++) { t = a+b+c+d+e+f; a=b; b=c; c=d; d=e; e=f; f=t; } return t+"";
| Hexanacci numbers: a(n+1) = a(n)+...+a(n-5) with a(0)=...=a(4)=0, a(5)=1. |
Thursday, April 7, 2016
huffman coding ( encoding and decoding) algorithm in python
this is short code written by python.
Huffman encoding and decoding
I studied using this site and write code
http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding/
import random
dic = {}
class MinHeapNode:
def setNode(self, left, right, freq, char):
self.left = left
self.right = right
self.freq = freq
self.char = char
return self
def huffmanCoding(arr, freq):
heapArr = []
for i in range(len(arr)):
heapArr.append(MinHeapNode().setNode(None, None , freq[i], arr[i]))
print(heapArr[i].freq, heapArr[i].char)
while(len(heapArr)>1):
left = heapArr.pop(0)
right = heapArr.pop(0)
insertionSort(heapArr, MinHeapNode().setNode(left, right, left.freq+right.freq, left.char + right.char))
rootheap= heapArr.pop()
return rootheap
def printHeap(heap, str):
if heap.left != None:
printHeap(heap.left, str + '0')
if heap.right !=None:
printHeap(heap.right, str + '1' )
if heap.left == None:
print(heap.char, str)
dic[heap.char] = str
def insertionSort(heapArr, heap):
index = len(heapArr)
for i in range(len(heapArr)):
if heap.freq < heapArr[i].freq:
index = i
break
heapArr.insert(index, heap)
def makeNewString(arr, freq):
freqcopy = freq[:]
arrcopy = arr[:]
strval = ''
while len(freqcopy) >0:
number = random.randrange(0,len(freqcopy))
freqcopy[number] = freqcopy[number]-1 strval = strval + arrcopy[number]
if freqcopy[number] == 0:
freqcopy.pop(number)
arrcopy.pop(number)
return strval
def endcoding(str):
strval = '' for i in range(len(str)):
strval = strval + dic[str[i]]
return strval
def huffmandecode(rootheap, strvalencoded):
index = 0;
orgstr = '';
while index < len(strvalencoded):
str = getchar(rootheap, index, strvalencoded)
index = index + len(dic[str])
orgstr = orgstr + str
return orgstr
def getchar(rootheap, index, strvalencoded):
if rootheap.left == None:
return rootheap.char
number = int(strvalencoded[index])
if number ==0:
return getchar(rootheap.left, index+1, strvalencoded)
if number ==1:
return getchar(rootheap.right, index+1, strvalencoded)
arr = ['a', 'b', 'c', 'd', 'e', 'f']
freq = [5, 9, 12, 13, 16, 45]
rootheap = huffmanCoding(arr, freq)
printHeap(rootheap, '')
strval = makeNewString(arr, freq)
print("org ", strval)
strvalencoded = endcoding(strval)
print("encoded ",strvalencoded)
orgencoded = huffmandecode(rootheap, strvalencoded)
print("decoded ", orgencoded)
Wednesday, March 30, 2016
Tuesday, March 29, 2016
python disjoint set (union find)
# make setdef MakeSet(number): return node().set(number) # find rootdef find(x): if x.parent.number == x.number: return x else: return find(x.parent) # merge two setsdef union(x, y): xRoot = find(x) yRoot = find(y) xRoot.parent = yRoot class node(): def set(self, number): self.parent = self self.number = number return self # make setsets = list(map(lambda x:MakeSet(x), range(10))) for i in range(len(sets)): print(sets[i].number, sets[i].parent) # one set is 0-4 super root is 4for i in range(0, 4): union(sets[i], sets[i+1]) # the otehr set is 5~9 super root is 9for i in range(5, len(sets)-1): union(sets[i], sets[i+1]) # test for all nodes finding root nodefor i in range(len(sets)): print(i ," parent -> ", find(sets[i]).number)
Wednesday, March 23, 2016
Problem 491
Examples:
Is the number 2547039 divisible by 11?
First find the difference between sum of its digits at odd and even places.
(Sum of digits at odd places) - (Sum of digits at even places)
= (9 + 0 + 4 + 2) - (3 + 7 + 5)
= 15 - 15 = 0
The number is 0, so the number 2547039 is divisible by 11
I approach this problem by using above condition.
1. recursive function
2. combination
my java code is below
package numberFrom400; import java.util.Arrays; import euler.util.EulerUtil; public class number491 { public static long totalCase = 0; public static int total = 0; public static int sum = 90; public static void main(String args[]){ long start = System.currentTimeMillis(); int numbers[] = new int[10]; searching(0, 0, numbers); System.out.println(totalCase); System.out.println(System.currentTimeMillis()-start); } public static void searching(int position, int count, int[]arr ){ if(position>=arr.length){ if(count == 10){ // 여기서 시작한다. 왼쪽 섬 int subsum = 0; for (int i = 0; i < arr.length; i++) { if(arr[i] != 0){ int val = i *arr[i]; subsum += val; } } if((subsum -(sum - subsum))%11 ==0){ // System.out.println("this num is divisible"); // System.out.println(Arrays.toString(arr)); // System.out.println(Arrays.toString(reversse(arr)) + " re "); // 여기가 Divisible이 가능한 위치 int twocount = 0; for (int i = 0; i < arr.length; i++) { if(arr[i]== 2){ twocount ++; } } long leftCase = EulerUtil.getFactorial(10)/(long)Math.pow(2, twocount); if(arr[0] ==1 ){ leftCase = (leftCase - EulerUtil.getFactorial(9)/(long)Math.pow(2, twocount)); }else if (arr[0] ==2) { leftCase = (leftCase - EulerUtil.getFactorial(9)/(long)Math.pow(2, twocount-1)); } int[] reverse = reversse(arr); // right case twocount = 0; for (int i = 0; i < reverse.length; i++) { if(reverse[i]== 2){ twocount ++; } } long rightCase = EulerUtil.getFactorial(10)/(long)Math.pow(2, twocount); totalCase = totalCase + (leftCase * rightCase ); }else{ } total++; return; }else if(count > 5){ return; } return; } for (int i = 0; i < 3; i++) { arr[position] = i; searching(position+1, count+i, arr); arr[position] = 0; } } public static int[] reversse (int arr[]){ int reverse[]= new int[arr.length]; for (int i = 0; i < arr.length; i++) { reverse[i] = 2 - arr[i]; } return reverse; } }
Subscribe to:
Posts (Atom)