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-003 | |
| 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-003')
| -rw-r--r-- | challenge-003/zapwai/README | 1 | ||||
| -rw-r--r-- | challenge-003/zapwai/c/ch-1.c | 37 | ||||
| -rw-r--r-- | challenge-003/zapwai/c/ch-2.c | 48 | ||||
| -rw-r--r-- | challenge-003/zapwai/c/vec.h | 94 | ||||
| -rw-r--r-- | challenge-003/zapwai/javascript/ch-1.js | 15 | ||||
| -rw-r--r-- | challenge-003/zapwai/javascript/ch-2.js | 28 | ||||
| -rw-r--r-- | challenge-003/zapwai/perl/ch-1.pl | 14 | ||||
| -rw-r--r-- | challenge-003/zapwai/perl/ch-2.pl | 24 | ||||
| -rw-r--r-- | challenge-003/zapwai/python/ch-1.py | 10 | ||||
| -rw-r--r-- | challenge-003/zapwai/python/ch-2.py | 21 | ||||
| -rw-r--r-- | challenge-003/zapwai/rust/ch-1.rs | 30 | ||||
| -rw-r--r-- | challenge-003/zapwai/rust/ch-2.rs | 43 |
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 += " "; + } + 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); +} |
