diff options
| author | David Ferrone <zapwai@gmail.com> | 2024-03-15 11:21:15 -0400 |
|---|---|---|
| committer | David Ferrone <zapwai@gmail.com> | 2024-03-15 11:21:15 -0400 |
| commit | 60c68b3209b3c09d3cbd29b4ef33080546a43fbd (patch) | |
| tree | 48d43fa4f9c8ea2492e7ab11146b7df7bb1a1679 /challenge-009 | |
| parent | 2a68a16c1d8727b183d85c88f31ae6cec6a869b1 (diff) | |
| download | perlweeklychallenge-club-60c68b3209b3c09d3cbd29b4ef33080546a43fbd.tar.gz perlweeklychallenge-club-60c68b3209b3c09d3cbd29b4ef33080546a43fbd.tar.bz2 perlweeklychallenge-club-60c68b3209b3c09d3cbd29b4ef33080546a43fbd.zip | |
Weekly Challenge Blast from the Past
Diffstat (limited to 'challenge-009')
| -rw-r--r-- | challenge-009/zapwai/README | 1 | ||||
| -rw-r--r-- | challenge-009/zapwai/c/ch-1.c | 41 | ||||
| -rw-r--r-- | challenge-009/zapwai/c/ch-2.c | 98 | ||||
| -rw-r--r-- | challenge-009/zapwai/c/vec.h | 91 | ||||
| -rw-r--r-- | challenge-009/zapwai/javascript/ch-1.js | 27 | ||||
| -rw-r--r-- | challenge-009/zapwai/javascript/ch-2.js | 60 | ||||
| -rw-r--r-- | challenge-009/zapwai/perl/ch-1.pl | 15 | ||||
| -rw-r--r-- | challenge-009/zapwai/perl/ch-2.pl | 65 | ||||
| -rw-r--r-- | challenge-009/zapwai/python/ch-1.py | 18 | ||||
| -rw-r--r-- | challenge-009/zapwai/python/ch-2.py | 48 | ||||
| -rw-r--r-- | challenge-009/zapwai/rust/ch-1.rs | 27 | ||||
| -rw-r--r-- | challenge-009/zapwai/rust/ch-2.rs | 61 |
12 files changed, 552 insertions, 0 deletions
diff --git a/challenge-009/zapwai/README b/challenge-009/zapwai/README new file mode 100644 index 0000000000..037b3777ef --- /dev/null +++ b/challenge-009/zapwai/README @@ -0,0 +1 @@ +Solutions by David Ferrone. diff --git a/challenge-009/zapwai/c/ch-1.c b/challenge-009/zapwai/c/ch-1.c new file mode 100644 index 0000000000..f5cd77486f --- /dev/null +++ b/challenge-009/zapwai/c/ch-1.c @@ -0,0 +1,41 @@ +#include <stdio.h> +#include <stdbool.h> + +bool has_distinct_digits(int num) { + int x = num; + int digit[50] = {0}; + int num_length = 0; + digit[0] = x % 10; + do { + num_length++; + x /= 10; + digit[num_length] = x % 10; + } while (x > 0); + int freq[10] = {0}; + for (int i = 0; i < num_length; i++) + freq[digit[i]]++; + for (int i = 0; i < num_length; i++) + if (freq[digit[i]] > 1) + return false; + return true; +} + +int numlength(int num) { + int cnt = 0; + do { + num /= 10; + cnt++; + } while (num > 0); + return cnt; +} + +int main() { + for (int i = 0; i < 150; i++) { + int sqnum = i*i; + int num_length = 5; + if (has_distinct_digits(sqnum) && (numlength(sqnum) == 5)) { + printf("%d -> %d\n", i, sqnum); + break; + } + } +} diff --git a/challenge-009/zapwai/c/ch-2.c b/challenge-009/zapwai/c/ch-2.c new file mode 100644 index 0000000000..8049efe734 --- /dev/null +++ b/challenge-009/zapwai/c/ch-2.c @@ -0,0 +1,98 @@ +#include <stdio.h> +#include "vec.h" + +void display_array(int* a, int alen) { + printf("{"); + for (int i = 0; i < alen - 1; i++) + printf("%d, ", a[i]); + printf("%d}\n", a[alen - 1]); +} + +void standard(int* a, int alen) { + vec v; + init_vec(&v); + int rank = 1; + int lvl = a[0]; + for (int i = 0; i < alen; i++) { + if (a[i] > lvl) { + rank = i + 1; + lvl = a[i]; + } + push(&v, rank); + } + printf("Stand: "); + display(&v); + destroy_vec(&v); +} + +void modified(int* b, int blen) { + vec v; + init_vec(&v); + + vec a; + init_vec(&a); + for (int i = 0; i < blen; i++) + push(&a, b[i]); + reverse(&a); + + int lvl = a.data[0]; + int rank = blen; + for (int i = 0; i < blen; i++) { + if (a.data[i] < lvl) { + rank = blen - i; + lvl = a.data[i]; + } + push(&v, rank); + } + reverse(&v); + printf("Modif: "); + display(&v); + destroy_vec(&v); +} + +void dense(int* a, int alen) { + vec v; + init_vec(&v); + int rank = 1; + int lvl = a[0]; + + for (int i = 0; i < alen; i++) { + if (a[i] > lvl) { + rank++; + lvl = a[i]; + } + push(&v, rank); + } + printf("Dense: "); + display(&v); + destroy_vec(&v); +} + +void proc(int* a, int alen) { + printf("Input: "); + display_array(a, alen); + standard(a, alen); + modified(a, alen); + dense(a, alen); + printf("\n"); +} + + +int main() { + int a1[] = {1, 2, 2, 3}; + int alen1 = sizeof(a1) / sizeof(int); + + int a2[] = {1, 4, 6, 6, 8, 10, 10}; + int alen2 = sizeof(a2) / sizeof(int); + + int a3[] = {1, 2, 2, 4, 4, 4, 5, 7, 9, 11, 11, 11}; + int alen3 = sizeof(a3) / sizeof(int); + + int a4[] = {3, 3, 6, 6}; + int alen4 = sizeof(a4) / sizeof(int); + + proc(a1, alen1); + proc(a2, alen2); + proc(a3, alen3); + proc(a4, alen4); +} diff --git a/challenge-009/zapwai/c/vec.h b/challenge-009/zapwai/c/vec.h new file mode 100644 index 0000000000..e7db6d41dc --- /dev/null +++ b/challenge-009/zapwai/c/vec.h @@ -0,0 +1,91 @@ +#include <stdlib.h> +typedef struct vector { + size_t cap; /* actual size allocated (reduces calls to realloc)*/ + size_t size; /* size of data */ + int* data; /* integer data */ +} vec; + +void init_vec(struct vector* v) { + v->size = 0; + v->cap = 10; + v->data = malloc(v->cap * sizeof(int)); +} +void destroy_vec(struct vector* v) { + free (v->data); /* good habit */ +} + +/* If a vector needs more memory, add 10 slots */ +void stretch_vec(struct vector* v) { + if (v->size == v->cap) { + v->cap += 10; + v->data = realloc(v->data, sizeof(int) * v->cap); + } +} +void push(struct vector* v, int value) { + v->size++; + stretch_vec(v); + v->data[v->size - 1] = value; +} +void unshift(struct vector* v, int value) { + v->size++; + stretch_vec(v); + for (int i = v->size - 1; i > 0; i--) { + v->data[i] = v->data[i - 1]; + } + v->data[0] = value; +} +int shift(struct vector* v) { + int x = v->data[0]; + v->size--; + for (int i = 0; i < v->size; i++) { + v->data[i] = v->data[i + 1]; + } + v->data[v->size] = 0; + return x; +} +int pop(struct vector* v) { + int x = v->data[v->size-- - 1]; + v->data[v->size] = 0; + return x; +} + +void push_list(struct vector* v, int* list) { + // ... +} + +void sort(struct vector* v) { + int cnt; + do { + cnt = 0; + for (int i = 0; i < v->size - 1; i++) { + if (v->data[i] > v->data[i + 1]) { + cnt++; + int tmp = v->data[i]; + v->data[i] = v->data[i+1]; + v->data[i+1] = tmp; + } + } + } while(cnt > 0); +} + +void reverse(struct vector* v) { + int k = v->size / 2; + for (int i = 0; i < k; i++) { + int x = v->data[k-1-i]; + int idx = (v->size % 2 == 0) ? k+i : k+1+i; + v->data[k-1-i] = v->data[idx]; + v->data[idx] = x; + } +} + +void display(struct vector* v) { + printf("["); + if (v->size > 0){ + for (int i = 0; i < v->size - 1; i++) + printf("%d, ", v->data[i]); + printf("%d", v->data[v->size-1]); + } + printf("]\n"); +} + +/* to do : allow list of chars, or strings. Maybe a union for data? */ diff --git a/challenge-009/zapwai/javascript/ch-1.js b/challenge-009/zapwai/javascript/ch-1.js new file mode 100644 index 0000000000..332befe132 --- /dev/null +++ b/challenge-009/zapwai/javascript/ch-1.js @@ -0,0 +1,27 @@ +function has_distinct_digits(num) { + letters = num.toString().split(''); + freq = Array(10).fill(0); + for (let l of letters) { + n = parseInt(l, 10); + freq[n]++; + } + for (let l of letters) { + n = parseInt(l, 10); + if (freq[n] > 1) { + return false; + } + } + return true; +} + +function proc() { + for (let i = 0; i < 150; i++) { + num = i*i; + if ((num.toString().length == 5) && has_distinct_digits(num)) { + console.log(i, num); + break; + } + } +} + +proc(); diff --git a/challenge-009/zapwai/javascript/ch-2.js b/challenge-009/zapwai/javascript/ch-2.js new file mode 100644 index 0000000000..15f8e7ea02 --- /dev/null +++ b/challenge-009/zapwai/javascript/ch-2.js @@ -0,0 +1,60 @@ +function std(a) { + b = []; + rank = 1; + lvl = a[0]; + for (let i = 0; i < a.length; i++) { + if (a[i] > lvl) { + rank = i + 1; + lvl = a[i]; + } + b.push(rank); + } + console.log("Stand:", b); +} + +function modi(a) { + b = []; + a.reverse(); + lvl = a[0]; + rank = a.length; + for (let i = 0; i < a.length; i++) { + if (a[i] < lvl) { + rank = a.length - i; + lvl = a[i]; + } + b.push(rank); + } + b.reverse(); + console.log("Modif:", b); +} + +function den(a) { + b = []; + rank = 1; + lvl = a[0]; + for (let i = 0; i < a.length; i++) { + if (a[i] > lvl) { + rank += 1; + lvl = a[i]; + } + b.push(rank); + } + console.log("Dense:", b); +} + + +function proc(a) { + console.log("Input:", a); + std(Array.from(a)); + modi(Array.from(a)); + den(a); +} + +let list1 = [1, 2, 2, 3]; +let list2 = [1, 4, 6, 6, 8, 10, 10]; +let list3 = [1, 2, 2, 4, 4, 4, 5, 7, 9, 11, 11, 11]; +let list4 = [3, 3, 6, 6]; + +for (let a of [list1, list2, list3, list4]) + proc(a); + diff --git a/challenge-009/zapwai/perl/ch-1.pl b/challenge-009/zapwai/perl/ch-1.pl new file mode 100644 index 0000000000..5b664dcb82 --- /dev/null +++ b/challenge-009/zapwai/perl/ch-1.pl @@ -0,0 +1,15 @@ +use v5.36; + +sub has_distinct_digits ($num) { + my @dig = split("",$num); + my %num = map { $_ => 1 } @dig; + return (scalar keys %num == scalar @dig); +} + +for (2 .. 1000) { + if (has_distinct_digits($_**2) and length $_*$_ >= 5) { + say "Square this: $_ to get ", $_*$_; + last; + } +} + diff --git a/challenge-009/zapwai/perl/ch-2.pl b/challenge-009/zapwai/perl/ch-2.pl new file mode 100644 index 0000000000..61f3a8eda6 --- /dev/null +++ b/challenge-009/zapwai/perl/ch-2.pl @@ -0,0 +1,65 @@ +use v5.38; +my @list1 = (1, 2, 2, 3); +my @list2 = (1, 4, 6, 6, 8, 10, 10); +my @list3 = (1, 2, 2, 4, 4, 4, 5, 7, 9, 11, 11, 11); +my @list4 = (3, 3, 6, 6); +proc($_) foreach (\@list1, \@list2, \@list3, \@list4); + +sub proc($ref) { + say "Input: (", join(", ", @$ref), ")"; + my %rank; + my $cnt; + $rank{$_} = ++$cnt foreach (sort { $a <=> $b } @$ref); + my @ranks; + push @ranks, $rank{$_} for (sort {$a <=> $b} keys %rank); + say "Stand: (", join(", ", standard(\@ranks)), ")"; + say "Modif: (", join(", ", modified(\@ranks)), ")"; + say "Dense: (", join(", ", dense(\@ranks)), ")\n"; +} + +sub modified($ref) { + my $skipflag = $$ref[0]; + my @a; + for (0 .. $#{$ref}) { + push @a, ($$ref[$_]) x $skipflag; + $skipflag = $$ref[$_ + 1] - $$ref[$_] if ($_ != $#{$ref}); + } + @a +} + +sub standard($ref) { + my @b = modified($ref); + my @a; + my $repeat_flag = 0; + my $repeat_lvl = 1; + for (0 .. $#b) { + $repeat_lvl = $repeat_flag ? $repeat_lvl : $_ + 1; + $repeat_flag = 1 if ($_ != $#b)&&($b[$_ + 1] - $b[$_] == 0); + push @a, $repeat_flag ? $repeat_lvl : $b[$_]; + $repeat_flag = 0 if ($_ != $#b)&&($b[$_ + 1] - $b[$_] != 0); + } + @a +} + +sub dense($ref) { + my @b = standard($ref); + my @a; + my $lvl = 1; + my $catch = 0; + for (0 .. $#b) { + if ($b[$_] == $lvl) { + push @a, $b[$_]; + } elsif ($b[$_] == $catch) { + push @a, $lvl; + } elsif ($b[$_] == $lvl + 1) { + $lvl++; + push @a, $b[$_]; + } else { + $catch = $b[$_]; + $lvl++; + push @a, $lvl; + } + } + @a +} + diff --git a/challenge-009/zapwai/python/ch-1.py b/challenge-009/zapwai/python/ch-1.py new file mode 100644 index 0000000000..7b7ab0247e --- /dev/null +++ b/challenge-009/zapwai/python/ch-1.py @@ -0,0 +1,18 @@ +def has_distinct_digits(num): + h = [] + h.append( num % 10 ) + num_length = len(str(num)) + while num > 0: + num = num // 10 + h.append( num % 10 ) + h.pop() + uniq = set(h) + return len(uniq) == num_length; + +def proc(): + for i in range(150): + if len(str(i*i)) >= 5 and has_distinct_digits(i*i): + print(i,"has the square:",i*i) + break; + +proc() diff --git a/challenge-009/zapwai/python/ch-2.py b/challenge-009/zapwai/python/ch-2.py new file mode 100644 index 0000000000..543465f65a --- /dev/null +++ b/challenge-009/zapwai/python/ch-2.py @@ -0,0 +1,48 @@ +def std(a): + ans = [] + rank = 1 + lvl = a[0] + for i in range(len(a)): + if a[i] > lvl: + rank = i + 1 + lvl = a[i] + ans.append(rank) + return ans + +def mod(a): + ans = [] + a.reverse() + lvl = a[0] + rank = len(a) + for i in range(len(a)): + if a[i] < lvl: + rank = len(a) - i + lvl = a[i] + ans.append(rank) + ans.reverse() + return ans + +def den(a): + ans = [] + rank = 1 + lvl = a[0] + for i in range(len(a)): + if a[i] > lvl: + rank += 1 + lvl = a[i] + ans.append(rank) + return ans + +def proc(a): + a.sort() + print("Input:", a) + print("Stand:", std(a.copy())) + print("Modif:", mod(a.copy())) + print("Dense:", den(a.copy()), "\n") + +list1 = [1, 2, 2, 3] +list2 = [1, 4, 6, 6, 8, 10, 10] +list3 = [1, 2, 2, 4, 4, 4, 5, 7, 9, 11, 11, 11] +list4 = [3, 3, 6, 6] +for a in [list1, list2, list3, list4]: + proc(a) diff --git a/challenge-009/zapwai/rust/ch-1.rs b/challenge-009/zapwai/rust/ch-1.rs new file mode 100644 index 0000000000..5c4c76ef04 --- /dev/null +++ b/challenge-009/zapwai/rust/ch-1.rs @@ -0,0 +1,27 @@ +fn has_distinct_digits(num :i32) -> bool { + let dig = num.to_string().chars().collect::<Vec<_>>(); + let mut count = [0; 10]; + for d in dig { + if let Some(digit) = d.to_digit(10) { + count[digit as usize] += 1; + } else { + return false; + } + } + for &d in count.iter() { + if d > 1 { + return false; + } + } + return true; +} + +fn main() { + let v = (1 .. 1500).collect::<Vec<i32>>(); + for i in v { + if has_distinct_digits(i*i) && (i*i).to_string().len() == 5 { + println!("{} -> {}", i, i*i); + break; + } + } +} diff --git a/challenge-009/zapwai/rust/ch-2.rs b/challenge-009/zapwai/rust/ch-2.rs new file mode 100644 index 0000000000..ccc445e546 --- /dev/null +++ b/challenge-009/zapwai/rust/ch-2.rs @@ -0,0 +1,61 @@ +#![allow(unused)] + +fn std(a :Vec<i32>) -> Vec<i32> { + let mut b = Vec::new(); + let mut rank = 1; + let mut lvl = a[0]; + for i in 0 .. a.len() { + if a[i] > lvl { + rank = i + 1; + lvl = a[i]; + } + b.push(rank as i32); + } + return b; +} + +fn modi(a :Vec<i32>) -> Vec<i32> { + let mut b = Vec::new(); + let mut c = a.clone(); + c.reverse(); + let mut lvl = c[0]; + let mut rank = c.len(); + for i in 0 .. c.len() { + if c[i] < lvl { + rank = c.len() - i; + lvl = c[i] + } + b.push(rank as i32); + } + b.reverse(); + return b; +} + +fn den(a :Vec<i32>) -> Vec<i32> { + let mut b = Vec::new(); + let mut rank = 1; + let mut lvl = a[0]; + for i in 0 .. a.len() { + if a[i] > lvl { + rank += 1; + lvl = a[i]; + } + b.push(rank as i32); + } + return b; +} + +fn proc(a :Vec<i32>) { + println!("Input: {:?}", a); + println!("Stand: {:?}", std(a.clone())); + println!("Modif: {:?}", modi(a.clone())); + println!("Dense: {:?}\n", den(a.clone())); +} + +fn main() { + let list1 = vec![1, 2, 2, 3]; + let list2 = vec![1, 4, 6, 6, 8, 10, 10]; + let list3 = vec![1, 2, 2, 4, 4, 4, 5, 7, 9, 11, 11, 11]; + let list4 = vec![3, 3, 6, 6]; + for a in [list1, list2, list3, list4] { proc(a); } +} |
