aboutsummaryrefslogtreecommitdiff
path: root/challenge-003
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-003
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-003')
-rw-r--r--challenge-003/zapwai/README1
-rw-r--r--challenge-003/zapwai/c/ch-1.c37
-rw-r--r--challenge-003/zapwai/c/ch-2.c48
-rw-r--r--challenge-003/zapwai/c/vec.h94
-rw-r--r--challenge-003/zapwai/javascript/ch-1.js15
-rw-r--r--challenge-003/zapwai/javascript/ch-2.js28
-rw-r--r--challenge-003/zapwai/perl/ch-1.pl14
-rw-r--r--challenge-003/zapwai/perl/ch-2.pl24
-rw-r--r--challenge-003/zapwai/python/ch-1.py10
-rw-r--r--challenge-003/zapwai/python/ch-2.py21
-rw-r--r--challenge-003/zapwai/rust/ch-1.rs30
-rw-r--r--challenge-003/zapwai/rust/ch-2.rs43
12 files changed, 365 insertions, 0 deletions
diff --git a/challenge-003/zapwai/README b/challenge-003/zapwai/README
new file mode 100644
index 0000000000..037b3777ef
--- /dev/null
+++ b/challenge-003/zapwai/README
@@ -0,0 +1 @@
+Solutions by David Ferrone.
diff --git a/challenge-003/zapwai/c/ch-1.c b/challenge-003/zapwai/c/ch-1.c
new file mode 100644
index 0000000000..c52fe19202
--- /dev/null
+++ b/challenge-003/zapwai/c/ch-1.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include "vec.h"
+const int N = 1000;
+
+int mypow(int b, int p) {
+ int x = 1;
+ for (int i = 0; i < p; i++) {
+ x *= b;
+ if (x > N) { /* prevent overflow */
+ return 0;
+ }
+ }
+
+ return x;
+}
+
+int main() {
+ vec *v;
+ init_vec(v);
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 32; j++) {
+ for (int k = 0; k < 22; k++) {
+ int y = mypow(2,i) * mypow(3,j) * mypow(5,k);
+ if (y == 0) {
+ continue;
+ }
+ if (y <= N) {
+ push(v, y);
+ }
+ }
+ }
+ }
+ sort(v);
+ display(v);
+ destroy_vec(v);
+ return 0;
+}
diff --git a/challenge-003/zapwai/c/ch-2.c b/challenge-003/zapwai/c/ch-2.c
new file mode 100644
index 0000000000..2beffabb54
--- /dev/null
+++ b/challenge-003/zapwai/c/ch-2.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void display(int **m, int N) {
+ for (int i = 0; i < N; i++) {
+ for (int sp = 0; sp < N - i; sp++) {
+ printf(" ");
+ }
+ for (int j = 0; j <= i; j++) {
+ printf("%d ", m[i][j]);
+ }
+ printf("\n");
+ }
+}
+
+int main(int argc, char* argv[]) {
+
+ if (argc != 2) {
+ printf("Usage: %s N\n", argv[0]);
+ return 1;
+ }
+
+ int N = atoi(argv[1]);
+ int **m = malloc(N * sizeof(int*)); // Allocate memory for 2D array
+
+ for (int i = 0; i < N; i++) {
+ m[i] = malloc(N * sizeof(int));
+ }
+
+ m[0][0] = 1;
+ m[1][0] = 1;
+ m[1][1] = 1;
+ for (int i = 0; i < N; i++) {
+ for (int j = 0; j <= i; j++) {
+ if ( (j == 0) || (j == i) ) {
+ m[i][j] = 1;
+ } else {
+ m[i][j] = m[i-1][j-1] + m[i-1][j];
+ }
+ }
+ }
+ display(m, N);
+
+ for (int i = 0; i < N; i++) {
+ free(m[i]);
+ }
+ free(m);
+}
diff --git a/challenge-003/zapwai/c/vec.h b/challenge-003/zapwai/c/vec.h
new file mode 100644
index 0000000000..cece15b9ce
--- /dev/null
+++ b/challenge-003/zapwai/c/vec.h
@@ -0,0 +1,94 @@
+#ifndef VEC_H
+#define VEC_H
+#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? */
+#endif
diff --git a/challenge-003/zapwai/javascript/ch-1.js b/challenge-003/zapwai/javascript/ch-1.js
new file mode 100644
index 0000000000..efc6692c39
--- /dev/null
+++ b/challenge-003/zapwai/javascript/ch-1.js
@@ -0,0 +1,15 @@
+let n = 1000;
+let v = [];
+for (let i = 0; i < 50; i++) {
+ for (let j = 0; j < 32; j++) {
+ for (let k = 0; k < 22; k++) {
+ let x = Math.pow(2, i) * Math.pow(3, j) * Math.pow(5, k);
+ if (x > n) {
+ continue;
+ }
+ v.push(x);
+ }
+ }
+}
+v.sort(function (a, b) { return a - b; });
+console.log(v);
diff --git a/challenge-003/zapwai/javascript/ch-2.js b/challenge-003/zapwai/javascript/ch-2.js
new file mode 100644
index 0000000000..099c797138
--- /dev/null
+++ b/challenge-003/zapwai/javascript/ch-2.js
@@ -0,0 +1,28 @@
+let n = prompt("Please enter # of rows: ");
+m = [];
+m.push([1]);
+m.push([1, 1]);
+for (let i = 2; i < n; i++) {
+ row = [];
+ for (let j = 0; j <= i; j++) {
+ if ( (j == 0) || (j == i) ) {
+ row.push(1);
+ } else {
+ row.push(m[i-1][j-1] + m[i-1][j]);
+ }
+ }
+ m.push(row);
+}
+console.log(m);
+for (let i = 0; i < n; i++) {
+ let space = "";
+ for (let sp = 0; sp < n - i; sp++) {
+ space += "&nbsp";
+ }
+ document.write(space);
+ for (let j = 0; j <= i; j++) {
+ document.write(`${m[i][j]} `);
+ }
+ document.write("<br>");
+}
+
diff --git a/challenge-003/zapwai/perl/ch-1.pl b/challenge-003/zapwai/perl/ch-1.pl
new file mode 100644
index 0000000000..1af964fa99
--- /dev/null
+++ b/challenge-003/zapwai/perl/ch-1.pl
@@ -0,0 +1,14 @@
+use v5.30.0;
+my $N = $ARGV[0] || 1_000;
+my @smooth;
+for my $n (0 .. 50) { # works for input up to 1e15
+ for my $m (0 .. 32) {
+ for my $o (0 .. 22) {
+ my $x = 2**$n*3**$m*5**$o;
+ next if ($x > $N);
+ push @smooth, $x ;
+ }
+ }
+}
+@smooth = sort { $a <=> $b } @smooth;
+say "@smooth";
diff --git a/challenge-003/zapwai/perl/ch-2.pl b/challenge-003/zapwai/perl/ch-2.pl
new file mode 100644
index 0000000000..dd6d7281b3
--- /dev/null
+++ b/challenge-003/zapwai/perl/ch-2.pl
@@ -0,0 +1,24 @@
+use v5.30.0;
+my $N = $ARGV[0] || 3;
+my @L;
+$L[0][0] = 1;
+$L[1][0] = 1;
+$L[1][1] = 1;
+
+for my $i (2 .. $N) { # rows
+ for my $j (0 .. $i) {
+ if ($j < 1) {
+ $L[$i][$j] = 1;
+ } elsif ($j > $i - 1) {
+ $L[$i][$j] = 1;
+ } else{
+ $L[$i][$j] = $L[$i - 1][$j - 1] + $L[$i - 1][$j];
+ }
+# $L[$i][$j] = (($j < 1)||($j > $i - 1)) ? { 1 } : { $L[$i - 1][$j - 1] + $L[$i - 1][$j] }
+
+ }
+}
+for (0 .. $N) {
+ print " " x ($N - $_);
+ say "@{$L[$_]}"
+}
diff --git a/challenge-003/zapwai/python/ch-1.py b/challenge-003/zapwai/python/ch-1.py
new file mode 100644
index 0000000000..ae6eba52c4
--- /dev/null
+++ b/challenge-003/zapwai/python/ch-1.py
@@ -0,0 +1,10 @@
+N = 1000
+smooth = []
+for i in range(50):
+ for j in range(32):
+ for k in range(22):
+ x = pow(2,i) * pow(3,j) * pow(5,k)
+ if x < N:
+ smooth.append(x)
+smooth.sort()
+print(smooth)
diff --git a/challenge-003/zapwai/python/ch-2.py b/challenge-003/zapwai/python/ch-2.py
new file mode 100644
index 0000000000..da7acc1c7e
--- /dev/null
+++ b/challenge-003/zapwai/python/ch-2.py
@@ -0,0 +1,21 @@
+import sys
+N = 5
+if len(sys.argv) > 1:
+ N = int(sys.argv[1])
+
+m = [[0 for x in range(N)] for x in range(N)]
+m[0][0] = 1
+m[1][0] = 1
+m[1][1] = 1
+for i in range(N):
+ for j in range(i+1):
+ if ( (j == 0) or (j == i) ):
+ m[i][j] = 1
+ else:
+ m[i][j] = m[i-1][j-1] + m[i-1][j]
+for i in range(N):
+ for sp in range(N-i):
+ print(" ",end='')
+ for j in range(i+1):
+ print(m[i][j]," ", end='')
+ print()
diff --git a/challenge-003/zapwai/rust/ch-1.rs b/challenge-003/zapwai/rust/ch-1.rs
new file mode 100644
index 0000000000..541c004281
--- /dev/null
+++ b/challenge-003/zapwai/rust/ch-1.rs
@@ -0,0 +1,30 @@
+const N :i64 = 1000;
+
+fn mypow (b :i64, p :i64) -> i64 {
+ let mut x = 1;
+ for _i in 0 .. p {
+ x *= b;
+ if x > N { // to prevent overflow
+ return 0;
+ }
+ }
+ return x;
+}
+
+fn main () {
+ let mut v = vec![];
+ for i in 0 .. 50 {
+ for j in 0 .. 32 {
+ for k in 0 .. 22 {
+ let x = mypow(2_i64,i) * mypow(3_i64,j) * mypow(5_i64, k);
+ if x == 0 {
+ continue;
+ }
+ if x > N {
+ continue;
+ }
+ v.push(x);
+ }}}
+ v.sort();
+ println!("{:?}", v);
+}
diff --git a/challenge-003/zapwai/rust/ch-2.rs b/challenge-003/zapwai/rust/ch-2.rs
new file mode 100644
index 0000000000..2fddca2987
--- /dev/null
+++ b/challenge-003/zapwai/rust/ch-2.rs
@@ -0,0 +1,43 @@
+use std::env;
+const N : usize = 100;
+fn display(m : [[i32; N]; N], size: usize) {
+ for i in 0 .. size {
+ for _sp in 0 .. size - i {
+ print!(" ");
+ }
+ for j in 0 ..= i {
+ print!("{} ", m[i][j]);
+ }
+ println!("");
+ }
+}
+
+fn main() {
+ let args: Vec<String> = env::args().collect();
+ if args.len() < 2 {
+ println!("Usage: {} <N>", args[0]);
+ return;
+ }
+ let size :usize = match args[1].parse() {
+ Ok(num) => num,
+ Err(_) => {
+ println!("Please provide valid N.");
+ return;
+ }
+ };
+ let mut m = [[0; N];N];
+ m[0][0] = 1;
+ m[1][0] = 1;
+ m[1][1] = 1;
+ for i in 0 .. size {
+ for j in 0 ..= i {
+ if (j == 0) || (j == i) {
+ m[i][j] = 1;
+ }
+ else {
+ m[i][j] = m[i-1][j-1] + m[i-1][j];
+ }
+ }
+ }
+ display(m, size);
+}