aboutsummaryrefslogtreecommitdiff
path: root/challenge-138
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2021-11-14 19:04:39 +0100
committerAbigail <abigail@abigail.be>2021-11-14 19:05:04 +0100
commit522e70815e8a79ccd7f628768e6699bf54747dd5 (patch)
treed8e23b976fee0c9e07c5636d3acd1e0619f223fa /challenge-138
parentc1db8bac0eaafcc7e7c94d712ce24dc69b776c53 (diff)
downloadperlweeklychallenge-club-522e70815e8a79ccd7f628768e6699bf54747dd5.tar.gz
perlweeklychallenge-club-522e70815e8a79ccd7f628768e6699bf54747dd5.tar.bz2
perlweeklychallenge-club-522e70815e8a79ccd7f628768e6699bf54747dd5.zip
Solutions for week 138, part 2 in 14 languages.
Diffstat (limited to 'challenge-138')
-rw-r--r--challenge-138/abigail/awk/ch-2.awk29
-rw-r--r--challenge-138/abigail/bash/ch-2.sh51
-rw-r--r--challenge-138/abigail/c/ch-2.c39
-rw-r--r--challenge-138/abigail/go/ch-2.go46
-rw-r--r--challenge-138/abigail/java/ch-2.java42
-rw-r--r--challenge-138/abigail/lua/ch-2.lua40
-rw-r--r--challenge-138/abigail/node/ch-2.js34
-rw-r--r--challenge-138/abigail/pascal/ch-2.p51
-rw-r--r--challenge-138/abigail/perl/ch-2.pl2
-rw-r--r--challenge-138/abigail/python/ch-2.py34
-rw-r--r--challenge-138/abigail/r/ch-2.r41
-rw-r--r--challenge-138/abigail/ruby/ch-2.rb39
-rw-r--r--challenge-138/abigail/scheme/ch-2.scm40
-rw-r--r--challenge-138/abigail/tcl/ch-2.tcl34
14 files changed, 521 insertions, 1 deletions
diff --git a/challenge-138/abigail/awk/ch-2.awk b/challenge-138/abigail/awk/ch-2.awk
new file mode 100644
index 0000000000..b0fca5ffc4
--- /dev/null
+++ b/challenge-138/abigail/awk/ch-2.awk
@@ -0,0 +1,29 @@
+#!/usr/bin/awk
+
+#
+# See ../README.md
+#
+
+#
+# Run as: awk -f ch-2.awk < input-file
+#
+
+function can_split (target, number, pow_10) {
+ if (target > number || target < 0) {return 0}
+ if (target == number) {return 1}
+
+ pow_10 = 10
+
+ while (pow_10 <= number) {
+ if (can_split(target - (number % pow_10), int (number / pow_10))) {
+ return 1
+ }
+ pow_10 *= 10
+ }
+
+ return 0
+}
+
+{
+ print ($1 > 1 && can_split(sqrt ($1), $1) ? 1 : 0)
+}
diff --git a/challenge-138/abigail/bash/ch-2.sh b/challenge-138/abigail/bash/ch-2.sh
new file mode 100644
index 0000000000..f8de32c814
--- /dev/null
+++ b/challenge-138/abigail/bash/ch-2.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+#
+# See ../README.md
+#
+
+#
+# Run as: bash ch-2.sh < input-file
+#
+
+set -f
+
+function can_split () {
+ local target=$1
+ local number=$2
+
+ if ((target > number))
+ then can_split=0; return
+ fi
+ if ((target < 0))
+ then can_split=0; return
+ fi
+ if ((target == number))
+ then can_split=1; return
+ fi
+
+ local pow_10=10
+
+ while ((pow_10 <= number))
+ do can_split $((target - (number % pow_10))) $((number / pow_10))
+ if ((can_split == 1))
+ then return
+ fi
+ ((pow_10 *= 10))
+ done
+
+ can_split=0
+}
+
+
+while read num
+do sqrt=$(echo "sqrt($num)" | bc)
+ if ((num > 1))
+ then can_split $sqrt $num
+ if ((can_split == 1))
+ then echo 1
+ else echo 0
+ fi
+ else echo 0
+ fi
+done
diff --git a/challenge-138/abigail/c/ch-2.c b/challenge-138/abigail/c/ch-2.c
new file mode 100644
index 0000000000..2b92934899
--- /dev/null
+++ b/challenge-138/abigail/c/ch-2.c
@@ -0,0 +1,39 @@
+# include <stdlib.h>
+# include <stdio.h>
+# include <string.h>
+# include <stdbool.h>
+# include <math.h>
+
+/*
+ * See ../README.md
+ */
+
+/*
+ * Run as: cc -o ch-2.o ch-2.c; ./ch-2.o < input-file
+ */
+
+bool can_split (long long target, long long number) {
+ if (target > number || target < 0) {return false;}
+ if (target == number) {return true;}
+
+ long long pow_10 = 10;
+
+ while (pow_10 <= number) {
+ if (can_split (target - (number % pow_10), number / pow_10)) {
+ return true;
+ }
+ pow_10 *= 10;
+ }
+
+ return false;
+}
+
+int main (void) {
+ long long number;
+
+ while (scanf ("%lld", &number) == 1) {
+ printf ("%d\n", number > 1 &&
+ can_split ((long long) sqrt (number), number) ? 1 : 0);
+ }
+ return (0);
+}
diff --git a/challenge-138/abigail/go/ch-2.go b/challenge-138/abigail/go/ch-2.go
new file mode 100644
index 0000000000..981efe77ee
--- /dev/null
+++ b/challenge-138/abigail/go/ch-2.go
@@ -0,0 +1,46 @@
+package main
+
+//
+// See ../README.md
+//
+
+//
+// Run as: go run ch-2.go < input-file
+//
+
+import (
+ "fmt"
+ "math"
+)
+
+func can_split (target int, number int) bool {
+ if target > number || target < 0 {return false}
+ if target == number {return true}
+
+ pow_10 := 10
+
+ for pow_10 <= number {
+ if can_split (target - (number % pow_10), number / pow_10) {
+ return true
+ }
+ pow_10 *= 10
+ }
+
+ return false
+}
+
+func main () {
+ for {
+ var number, sqrt int
+ n, err := fmt . Scanf ("%d", &number)
+ if (n != 1 || err != nil) {
+ break
+ }
+ sqrt = int (math . Round (math . Sqrt (float64 (number))))
+ if number > 1 && can_split (sqrt, number) {
+ fmt . Println (1)
+ } else {
+ fmt . Println (0)
+ }
+ }
+}
diff --git a/challenge-138/abigail/java/ch-2.java b/challenge-138/abigail/java/ch-2.java
new file mode 100644
index 0000000000..065fd97f4f
--- /dev/null
+++ b/challenge-138/abigail/java/ch-2.java
@@ -0,0 +1,42 @@
+//
+// See ../README.md
+//
+
+//
+// Run as: ln ch-2.java ch2.java; javac ch2.java; java ch2 < input-file
+//
+
+import java.util.*;
+import java.lang.*;
+
+public class ch2 {
+ public static boolean can_split (long target, long number) {
+ if (target > number || target < 0) {return false;}
+ if (target == number) {return true;}
+
+ long pow_10 = 10;
+
+ while (pow_10 <= number) {
+ if (can_split (target - (number % pow_10), number / pow_10)) {
+ return true;
+ }
+ pow_10 *= 10;
+ }
+
+ return false;
+ }
+
+ public static void main (String [] args) {
+ Scanner scanner = new Scanner (System . in);
+ while (scanner . hasNextInt ()) {
+ int number = scanner . nextInt ();
+ int sqrt = (int) Math . round (Math . sqrt (number));
+ if (number > 1 && can_split (sqrt, number)) {
+ System . out . println (1);
+ }
+ else {
+ System . out . println (0);
+ }
+ }
+ }
+}
diff --git a/challenge-138/abigail/lua/ch-2.lua b/challenge-138/abigail/lua/ch-2.lua
new file mode 100644
index 0000000000..fa7fbe87b6
--- /dev/null
+++ b/challenge-138/abigail/lua/ch-2.lua
@@ -0,0 +1,40 @@
+#!/opt/local/bin/lua
+
+--
+-- See ../README.md
+--
+
+--
+-- Run as: lua ch-2.lua < input-file
+--
+
+function can_split (target, number)
+ if target > number or target < 0 then
+ return false
+ end
+ if target == number then
+ return true
+ end
+
+ local pow_10 = 10
+
+ while pow_10 <= number do
+ if can_split (target - (number % pow_10),
+ math . floor (number / pow_10)) then
+ return true
+ end
+ pow_10 = pow_10 * 10
+ end
+
+ return false
+end
+
+for number in io . lines () do
+ number = tonumber (number)
+ if number > 1 and
+ can_split (math . floor (math . sqrt (number)), number) then
+ print (1)
+ else
+ print (0)
+ end
+end
diff --git a/challenge-138/abigail/node/ch-2.js b/challenge-138/abigail/node/ch-2.js
new file mode 100644
index 0000000000..571e5ff5f2
--- /dev/null
+++ b/challenge-138/abigail/node/ch-2.js
@@ -0,0 +1,34 @@
+#!/usr/local/bin/node
+
+//
+// See ../README.md
+//
+
+//
+// Run as: node ch-2.js < input-file
+//
+
+function can_split (target, number) {
+ if (target > number || target < 0) {return false}
+ if (target == number) {return true}
+
+ let pow_10 = 10
+
+ while (pow_10 <= number) {
+ if (can_split (target - (number % pow_10),
+ Math . floor (number / pow_10))) {
+ return true
+ }
+ pow_10 *= 10
+ }
+
+ return false
+}
+
+
+ require ('readline')
+. createInterface ({input: process . stdin})
+. on ('line', number => {
+ console . log (number > 1 && can_split
+ (Math . trunc (Math . sqrt (number)), number) ? 1 : 0)
+})
diff --git a/challenge-138/abigail/pascal/ch-2.p b/challenge-138/abigail/pascal/ch-2.p
new file mode 100644
index 0000000000..cb5790803a
--- /dev/null
+++ b/challenge-138/abigail/pascal/ch-2.p
@@ -0,0 +1,51 @@
+Program ch2;
+
+(* *)
+(* See ../README.md *)
+(* *)
+
+(* *)
+(* Run as: fpc -och-2.out ch-2.p; ./ch-2.out < input-file *)
+(* *)
+
+function can_split (target: longint; number: longint): boolean;
+ var
+ pow_10: longint;
+ begin
+ if (target > number) or (target < 0) then begin
+ can_split := false;
+ exit;
+ end;
+ if (target = number) then begin
+ can_split := true;
+ exit;
+ end;
+
+ pow_10 := 10;
+
+ while pow_10 <= number do begin
+ if can_split (target - (number mod pow_10),
+ number div pow_10) then begin
+ can_split := true;
+ exit;
+ end;
+
+ pow_10 := pow_10 * 10;
+ end;
+
+ can_split := false;
+ exit;
+ end;
+
+var
+ number: longint;
+
+begin
+ while not eof do begin
+ readln (number);
+ if (number > 1) and can_split (round (sqrt (number)), number) then
+ writeln (1)
+ else
+ writeln (0)
+ end
+end.
diff --git a/challenge-138/abigail/perl/ch-2.pl b/challenge-138/abigail/perl/ch-2.pl
index b9169688ee..236868a59a 100644
--- a/challenge-138/abigail/perl/ch-2.pl
+++ b/challenge-138/abigail/perl/ch-2.pl
@@ -47,7 +47,7 @@ sub can_split ($target, $number) {
# and division we can trivially port to other language solutions,
# while taking substrings requires more work.
#
- while ($pow_10 < $number) {
+ while ($pow_10 <= $number) {
use integer;
return 1 if can_split ($target - ($number % $pow_10),
$number / $pow_10);
diff --git a/challenge-138/abigail/python/ch-2.py b/challenge-138/abigail/python/ch-2.py
new file mode 100644
index 0000000000..4f8b64186f
--- /dev/null
+++ b/challenge-138/abigail/python/ch-2.py
@@ -0,0 +1,34 @@
+#!/opt/local/bin/python
+
+#
+# See ../README.md
+#
+
+#
+# Run as: python ch-2.py < input-file
+#
+
+import fileinput
+import math
+
+def can_split (target, number):
+ if target > number or target < 0:
+ return 0
+ if target == number:
+ return 1
+
+ pow_10 = 10
+
+ while pow_10 <= number:
+ if can_split (target - (number % pow_10), number // pow_10):
+ return 1
+ pow_10 = 10 * pow_10
+
+ return 0
+
+for number in fileinput . input ():
+ number = int (number)
+ if number > 1 and can_split (int (math . sqrt (number)), number):
+ print (1)
+ else:
+ print (0)
diff --git a/challenge-138/abigail/r/ch-2.r b/challenge-138/abigail/r/ch-2.r
new file mode 100644
index 0000000000..4443c358fa
--- /dev/null
+++ b/challenge-138/abigail/r/ch-2.r
@@ -0,0 +1,41 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: Rscript ch-2.r < input-file
+#
+
+
+can_split <- function (target, number) {
+ if (target > number || target < 0) {return (0)}
+ if (target == number) {return (1)}
+
+ pow_10 <- 10
+
+ while (pow_10 <= number) {
+ if (can_split (target - (number %% pow_10), number %/% pow_10)) {
+ return (1)
+ }
+ pow_10 <- pow_10 * 10
+ }
+
+ return (0)
+}
+
+
+
+stdin <- file ('stdin', 'r')
+repeat {
+ number <- readLines (stdin, n = 1)
+ if (length (number) == 0) {
+ break
+ }
+ number = as.integer (number)
+ if (number > 1 & can_split (sqrt (number), number)) {
+ cat ("1\n")
+ }
+ else {
+ cat ("0\n")
+ }
+}
diff --git a/challenge-138/abigail/ruby/ch-2.rb b/challenge-138/abigail/ruby/ch-2.rb
new file mode 100644
index 0000000000..16eeec5a8e
--- /dev/null
+++ b/challenge-138/abigail/ruby/ch-2.rb
@@ -0,0 +1,39 @@
+#!/usr/bin/ruby
+
+#
+# See ../README.md
+#
+
+#
+# Run as: ruby ch-2.rb < input-file
+#
+
+def can_split (target, number)
+ if target > number || target < 0 then
+ return false
+ end
+ if target == number then
+ return true
+ end
+
+ pow_10 = 10
+
+ while pow_10 <= number do
+ if can_split(target - (number % pow_10), number / pow_10) then
+ return true
+ end
+ pow_10 *= 10
+ end
+
+ return false
+end
+
+ARGF . each_line do
+ | number |
+ number = number . to_i
+ if number > 1 && can_split((Math . sqrt(number)) . to_i, number) then
+ puts (1)
+ else
+ puts (0)
+ end
+end
diff --git a/challenge-138/abigail/scheme/ch-2.scm b/challenge-138/abigail/scheme/ch-2.scm
new file mode 100644
index 0000000000..5164184903
--- /dev/null
+++ b/challenge-138/abigail/scheme/ch-2.scm
@@ -0,0 +1,40 @@
+;;;
+;;; See ../README.md
+;;;
+
+;;;
+;;; Run as: guile --no-auto-compile ch-2.scm
+;;;
+
+(define (can-split target number)
+ (define r #f)
+ (cond ((> target number) #f)
+ ((< target 0) #f)
+ ((= target number) #t)
+ (else
+ (begin
+ (do ((pow_10 10 (* 10 pow_10)))
+ ((or (> pow_10 number) r))
+ (set! r (can-split (- target (modulo number pow_10))
+ (quotient number pow_10))))
+ r)))
+)
+
+
+(define (main)
+ (define number (read))
+ (define ssqq)
+ (if (not (eof-object? number))
+ (begin
+ (set! ssqq (inexact->exact (round (sqrt number))))
+ (if (and (> number 1) (can-split ssqq number))
+ (display 1)
+ (display 0))
+ (newline)
+ (main)
+ )
+ )
+)
+
+(main)
+
diff --git a/challenge-138/abigail/tcl/ch-2.tcl b/challenge-138/abigail/tcl/ch-2.tcl
new file mode 100644
index 0000000000..70c212d31e
--- /dev/null
+++ b/challenge-138/abigail/tcl/ch-2.tcl
@@ -0,0 +1,34 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: tclsh ch-2.tcl < input-file
+#
+
+proc can_split {target number} {
+ if {$target > $number} {return 0}
+ if {$target < 0} {return 0}
+ if {$target == $number} {return 1}
+ set pow_10 10
+ while {$pow_10 < $number} {
+ if {[can_split [expr $target - ($number % $pow_10)] \
+ [expr $number / $pow_10]]} {return 1}
+ set pow_10 [expr $pow_10 * 10]
+ }
+ return 0
+}
+
+
+while {[gets stdin number] >= 0} {
+ set sqrt [expr isqrt ($number)]
+ if {$number > 1} {
+ if {[can_split $sqrt $number]} {
+ puts 1
+ } {
+ puts 0
+ }
+ } {
+ puts 0
+ }
+}