aboutsummaryrefslogtreecommitdiff
path: root/challenge-009
diff options
context:
space:
mode:
authorDavid Ferrone <zapwai@gmail.com>2024-03-15 11:21:15 -0400
committerDavid Ferrone <zapwai@gmail.com>2024-03-15 11:21:15 -0400
commit60c68b3209b3c09d3cbd29b4ef33080546a43fbd (patch)
tree48d43fa4f9c8ea2492e7ab11146b7df7bb1a1679 /challenge-009
parent2a68a16c1d8727b183d85c88f31ae6cec6a869b1 (diff)
downloadperlweeklychallenge-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/README1
-rw-r--r--challenge-009/zapwai/c/ch-1.c41
-rw-r--r--challenge-009/zapwai/c/ch-2.c98
-rw-r--r--challenge-009/zapwai/c/vec.h91
-rw-r--r--challenge-009/zapwai/javascript/ch-1.js27
-rw-r--r--challenge-009/zapwai/javascript/ch-2.js60
-rw-r--r--challenge-009/zapwai/perl/ch-1.pl15
-rw-r--r--challenge-009/zapwai/perl/ch-2.pl65
-rw-r--r--challenge-009/zapwai/python/ch-1.py18
-rw-r--r--challenge-009/zapwai/python/ch-2.py48
-rw-r--r--challenge-009/zapwai/rust/ch-1.rs27
-rw-r--r--challenge-009/zapwai/rust/ch-2.rs61
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); }
+}