Data update
This commit is contained in:
parent
0df55f9f24
commit
aec8ed51b6
1045 changed files with 18889 additions and 2777 deletions
|
|
@ -25,65 +25,63 @@ BEGIN
|
|||
[]CHAR sign char = []CHAR( "-", " ", "+" )[ AT -1 ];
|
||||
# we don't distinguish between strings starting "+1" and starting " 1" #
|
||||
FOR s1 FROM -1 TO 0 DO
|
||||
sum string[ 1 ] := sign char[ s1 ];
|
||||
FOR s2 FROM -1 TO 1 DO
|
||||
sum string[ 3 ] := sign char[ s2 ];
|
||||
FOR s3 FROM -1 TO 1 DO
|
||||
sum string[ 5 ] := sign char[ s3 ];
|
||||
FOR s4 FROM -1 TO 1 DO
|
||||
sum string[ 7 ] := sign char[ s4 ];
|
||||
FOR s5 FROM -1 TO 1 DO
|
||||
sum string[ 9 ] := sign char[ s5 ];
|
||||
FOR s6 FROM -1 TO 1 DO
|
||||
sum string[ 11 ] := sign char[ s6 ];
|
||||
FOR s7 FROM -1 TO 1 DO
|
||||
sum string[ 13 ] := sign char[ s7 ];
|
||||
FOR s8 FROM -1 TO 1 DO
|
||||
sum string[ 15 ] := sign char[ s8 ];
|
||||
FOR s9 FROM -1 TO 1 DO
|
||||
sum string[ 17 ] := sign char[ s9 ];
|
||||
INT number := 0;
|
||||
INT part := IF s1 < 0 THEN -1 ELSE 1 FI;
|
||||
IF s2 = 0 THEN part *:= 10 +:= 2 * SIGN part ELSE number +:= part; part := 2 * s2 FI;
|
||||
IF s3 = 0 THEN part *:= 10 +:= 3 * SIGN part ELSE number +:= part; part := 3 * s3 FI;
|
||||
IF s4 = 0 THEN part *:= 10 +:= 4 * SIGN part ELSE number +:= part; part := 4 * s4 FI;
|
||||
IF s5 = 0 THEN part *:= 10 +:= 5 * SIGN part ELSE number +:= part; part := 5 * s5 FI;
|
||||
IF s6 = 0 THEN part *:= 10 +:= 6 * SIGN part ELSE number +:= part; part := 6 * s6 FI;
|
||||
IF s7 = 0 THEN part *:= 10 +:= 7 * SIGN part ELSE number +:= part; part := 7 * s7 FI;
|
||||
IF s8 = 0 THEN part *:= 10 +:= 8 * SIGN part ELSE number +:= part; part := 8 * s8 FI;
|
||||
IF s9 = 0 THEN part *:= 10 +:= 9 * SIGN part ELSE number +:= part; part := 9 * s9 FI;
|
||||
number +:= part;
|
||||
IF number >= LWB solutions
|
||||
AND number <= UPB solutions
|
||||
THEN
|
||||
solutions[ number ] +:= ";" + sum string;
|
||||
count [ number ] +:= 1
|
||||
FI;
|
||||
BOOL inserted := FALSE;
|
||||
FOR l pos FROM LWB largest TO UPB largest WHILE NOT inserted DO
|
||||
IF number > largest[ l pos ] THEN
|
||||
# found a new larger number #
|
||||
FOR m pos FROM UPB largest BY -1 TO l pos + 1 DO
|
||||
largest [ m pos ] := largest [ m pos - 1 ];
|
||||
largest count[ m pos ] := largest count[ m pos - 1 ]
|
||||
OD;
|
||||
largest [ l pos ] := number;
|
||||
largest count[ l pos ] := 1;
|
||||
inserted := TRUE
|
||||
ELIF number = largest[ l pos ] THEN
|
||||
# have another way of generating this number #
|
||||
largest count[ l pos ] +:= 1;
|
||||
inserted := TRUE
|
||||
FI
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
sum string[ 1 ] := sign char[ s1 ];
|
||||
FOR s2 FROM -1 TO 1 DO
|
||||
sum string[ 3 ] := sign char[ s2 ];
|
||||
FOR s3 FROM -1 TO 1 DO
|
||||
sum string[ 5 ] := sign char[ s3 ];
|
||||
FOR s4 FROM -1 TO 1 DO
|
||||
sum string[ 7 ] := sign char[ s4 ];
|
||||
FOR s5 FROM -1 TO 1 DO
|
||||
sum string[ 9 ] := sign char[ s5 ];
|
||||
FOR s6 FROM -1 TO 1 DO
|
||||
sum string[ 11 ] := sign char[ s6 ];
|
||||
FOR s7 FROM -1 TO 1 DO
|
||||
sum string[ 13 ] := sign char[ s7 ];
|
||||
FOR s8 FROM -1 TO 1 DO
|
||||
sum string[ 15 ] := sign char[ s8 ];
|
||||
FOR s9 FROM -1 TO 1 DO
|
||||
sum string[ 17 ] := sign char[ s9 ];
|
||||
INT number := 0;
|
||||
INT part := IF s1 < 0 THEN -1 ELSE 1 FI;
|
||||
IF s2 = 0 THEN part *:= 10 +:= 2 * SIGN part ELSE number +:= part; part := 2 * s2 FI;
|
||||
IF s3 = 0 THEN part *:= 10 +:= 3 * SIGN part ELSE number +:= part; part := 3 * s3 FI;
|
||||
IF s4 = 0 THEN part *:= 10 +:= 4 * SIGN part ELSE number +:= part; part := 4 * s4 FI;
|
||||
IF s5 = 0 THEN part *:= 10 +:= 5 * SIGN part ELSE number +:= part; part := 5 * s5 FI;
|
||||
IF s6 = 0 THEN part *:= 10 +:= 6 * SIGN part ELSE number +:= part; part := 6 * s6 FI;
|
||||
IF s7 = 0 THEN part *:= 10 +:= 7 * SIGN part ELSE number +:= part; part := 7 * s7 FI;
|
||||
IF s8 = 0 THEN part *:= 10 +:= 8 * SIGN part ELSE number +:= part; part := 8 * s8 FI;
|
||||
IF s9 = 0 THEN part *:= 10 +:= 9 * SIGN part ELSE number +:= part; part := 9 * s9 FI;
|
||||
number +:= part;
|
||||
IF number >= LWB solutions AND number <= UPB solutions THEN
|
||||
solutions[ number ] +:= ";" + sum string;
|
||||
count [ number ] +:= 1
|
||||
FI;
|
||||
BOOL inserted := FALSE;
|
||||
FOR l pos FROM LWB largest TO UPB largest WHILE NOT inserted DO
|
||||
IF number > largest[ l pos ] THEN
|
||||
# found a new larger number #
|
||||
FOR m pos FROM UPB largest BY -1 TO l pos + 1 DO
|
||||
largest [ m pos ] := largest [ m pos - 1 ];
|
||||
largest count[ m pos ] := largest count[ m pos - 1 ]
|
||||
OD;
|
||||
largest [ l pos ] := number;
|
||||
largest count[ l pos ] := 1;
|
||||
inserted := TRUE
|
||||
ELIF number = largest[ l pos ] THEN
|
||||
# have another way of generating this number #
|
||||
largest count[ l pos ] +:= 1;
|
||||
inserted := TRUE
|
||||
FI
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD
|
||||
OD;
|
||||
|
||||
# show the solutions for 100 #
|
||||
|
|
@ -110,7 +108,8 @@ BEGIN
|
|||
number with max := largest[ n ]
|
||||
FI
|
||||
OD;
|
||||
print( ( whole( number with max, 0 ), " has the maximum number of solutions: ", whole( max solutions, 0 ), newline ) );
|
||||
print( ( whole( number with max, 0 ), " has the maximum number of solutions: " ) );
|
||||
print( ( whole( max solutions, 0 ), newline ) );
|
||||
# find the smallest positive number that has no solutions #
|
||||
BOOL have solutions := TRUE;
|
||||
FOR n FROM 0 TO max number
|
||||
|
|
|
|||
102
Task/Sum-to-100/EasyLang/sum-to-100.easy
Normal file
102
Task/Sum-to-100/EasyLang/sum-to-100.easy
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
ADD = 0
|
||||
SUB = 1
|
||||
nexpr = 13122 - 1
|
||||
len f[] nexpr + 1
|
||||
arrbase f[] 0
|
||||
#
|
||||
func evaluate code .
|
||||
power = 1
|
||||
for k = 9 downto 1
|
||||
numb += power * k
|
||||
m = code mod 3
|
||||
if m = ADD
|
||||
value += numb
|
||||
numb = 0
|
||||
power = 1
|
||||
elif m = SUB
|
||||
value -= numb
|
||||
numb = 0
|
||||
power = 1
|
||||
else
|
||||
power *= 10
|
||||
.
|
||||
code = code div 3
|
||||
.
|
||||
return value
|
||||
.
|
||||
proc init . .
|
||||
for i = 0 to nexpr
|
||||
f[i] = evaluate i
|
||||
.
|
||||
.
|
||||
call init
|
||||
proc out code . .
|
||||
a = 19683
|
||||
b = 6561
|
||||
for k = 1 to 9
|
||||
h = code mod a div b
|
||||
if h = ADD
|
||||
if k > 1
|
||||
s$ &= "+"
|
||||
.
|
||||
elif h = SUB
|
||||
s$ &= "-"
|
||||
.
|
||||
a = b
|
||||
b = b div 3
|
||||
s$ &= strchar (48 + k)
|
||||
.
|
||||
print evaluate code & " = " & s$
|
||||
.
|
||||
print "Show all solutions that sum to 100\n"
|
||||
for i = 0 to nexpr
|
||||
if f[i] = 100
|
||||
out i
|
||||
.
|
||||
.
|
||||
print "\nShow the sum that has the maximum number of solutions\n"
|
||||
for i = 0 to nexpr
|
||||
test = f[i]
|
||||
if test > 0
|
||||
ntest = 0
|
||||
for j = 0 to nexpr
|
||||
if f[j] = test
|
||||
ntest += 1
|
||||
.
|
||||
.
|
||||
if ntest > nbest
|
||||
best = test
|
||||
nbest = ntest
|
||||
.
|
||||
.
|
||||
.
|
||||
print best & " has " & nbest & " solutions"
|
||||
print "\nShow the lowest positive number that can't be expressed\n"
|
||||
for i = 0 to 123456789
|
||||
for j = 0 to nexpr
|
||||
if i = f[j]
|
||||
break 1
|
||||
.
|
||||
.
|
||||
if j > nexpr
|
||||
break 1
|
||||
.
|
||||
.
|
||||
print i
|
||||
print "\nShow the ten highest numbers that can be expressed\n"
|
||||
limit = 123456789 + 1
|
||||
for i = 1 to 10
|
||||
best = 0
|
||||
for j = 0 to nexpr
|
||||
test = f[j]
|
||||
if test < limit and test > best
|
||||
best = test
|
||||
.
|
||||
.
|
||||
for j = 0 to nexpr
|
||||
if f[j] = best
|
||||
out j
|
||||
.
|
||||
.
|
||||
limit = best
|
||||
.
|
||||
129
Task/Sum-to-100/Rust/sum-to-100.rust
Normal file
129
Task/Sum-to-100/Rust/sum-to-100.rust
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
use std::collections::BTreeMap;
|
||||
use std::fmt;
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
enum Operator {
|
||||
None,
|
||||
Plus,
|
||||
Minus,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct Expression {
|
||||
ops: [Operator; 9],
|
||||
}
|
||||
|
||||
impl Expression {
|
||||
fn new() -> Expression {
|
||||
Expression {
|
||||
ops: [Operator::None; 9],
|
||||
}
|
||||
}
|
||||
fn sum(&self) -> i32 {
|
||||
let mut result: i32 = 0;
|
||||
let mut n: i32 = 0;
|
||||
let mut p: i32 = 1;
|
||||
let mut i: usize = 9;
|
||||
while i > 0 {
|
||||
n += p * (i as i32);
|
||||
i -= 1;
|
||||
match self.ops[i] {
|
||||
Operator::None => p *= 10,
|
||||
Operator::Plus => {
|
||||
p = 1;
|
||||
result += n;
|
||||
n = 0;
|
||||
}
|
||||
Operator::Minus => {
|
||||
p = 1;
|
||||
result -= n;
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
result += n;
|
||||
result
|
||||
}
|
||||
fn next(&mut self) -> bool {
|
||||
let mut i: usize = 9;
|
||||
while i > 0 {
|
||||
i -= 1;
|
||||
match self.ops[i] {
|
||||
Operator::None => {
|
||||
self.ops[i] = if i == 0 {
|
||||
Operator::Minus
|
||||
} else {
|
||||
Operator::Plus
|
||||
};
|
||||
return true;
|
||||
}
|
||||
Operator::Plus => {
|
||||
self.ops[i] = Operator::Minus;
|
||||
return true;
|
||||
}
|
||||
Operator::Minus => self.ops[i] = Operator::None,
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for Expression {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
for i in 0..9 {
|
||||
match self.ops[i] {
|
||||
Operator::None => {}
|
||||
Operator::Plus => write!(f, "+")?,
|
||||
Operator::Minus => write!(f, "-")?,
|
||||
}
|
||||
write!(f, "{}", i + 1)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut exp = Expression::new();
|
||||
let mut sums: BTreeMap<i32, Vec<Expression>> = BTreeMap::new();
|
||||
loop {
|
||||
sums.entry(exp.sum()).or_insert(Vec::new()).push(exp.clone());
|
||||
if !exp.next() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
println!("Solutions that sum to 100:");
|
||||
if let Some(expressions) = sums.get(&100) {
|
||||
for e in expressions {
|
||||
println!("100 = {}", e);
|
||||
}
|
||||
}
|
||||
|
||||
let mut max_sum = 0;
|
||||
let mut max_count = 0;
|
||||
for (sum, expressions) in &sums {
|
||||
let count = expressions.len();
|
||||
if count > max_count {
|
||||
max_count = count;
|
||||
max_sum = *sum;
|
||||
}
|
||||
}
|
||||
println!(
|
||||
"\nThe sum with the greatest number of solutions is {} ({}).",
|
||||
max_sum, max_count
|
||||
);
|
||||
|
||||
let mut n = 1;
|
||||
while sums.contains_key(&n) {
|
||||
n += 1;
|
||||
}
|
||||
println!(
|
||||
"\nThe smallest positive number that cannot be expressed is {}.",
|
||||
n
|
||||
);
|
||||
|
||||
println!("\nThe ten highest numbers that can be expressed are:");
|
||||
for (sum, expressions) in sums.iter().rev().take(10) {
|
||||
println!("{} = {}", sum, expressions[0]);
|
||||
}
|
||||
}
|
||||
42
Task/Sum-to-100/UNIX-Shell/sum-to-100.sh
Normal file
42
Task/Sum-to-100/UNIX-Shell/sum-to-100.sh
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
sumto100() {
|
||||
typeset expr sum max_count=0 max_values i
|
||||
typeset -A histogram
|
||||
printf 'Strings that evaluate to 100:\n'
|
||||
for expr in {,-}1{,+,-}2{,+,-}3{,+,-}4{,+,-}5{,+,-}6{,+,-}7{,+,-}8{,+,-}9
|
||||
do
|
||||
(( sum = expr ))
|
||||
if (( sum == 100 )); then
|
||||
printf '\t%s\n' "$expr"
|
||||
fi
|
||||
histogram[$sum]=$(( ${histogram[$sum]:-0}+1 ))
|
||||
if (( histogram[$sum] > max_count )); then
|
||||
(( max_count = histogram[$sum] ))
|
||||
max_values=( $sum )
|
||||
elif (( histogram[$sum] == max_count )); then
|
||||
max_values+=( $sum )
|
||||
fi
|
||||
done
|
||||
printf '\nMost solutions for any number is %d: ' "$max_count"
|
||||
if [[ -n $ZSH_VERSION ]]; then
|
||||
printf '%s\n\n' "${(j:, :)max_values}"
|
||||
else
|
||||
printf '%s' "${max_values[0]}"
|
||||
printf ', %s' "${max_values[@]:1}"
|
||||
printf '\n\n'
|
||||
fi
|
||||
|
||||
for (( i=1; i<123456789; ++i )); do
|
||||
if (( !histogram[$i] )); then
|
||||
printf "Lowest positive sum that can't be expressed: %d\n\n" "$i"
|
||||
break
|
||||
fi
|
||||
done
|
||||
printf 'Ten highest reachable numbers:\n';
|
||||
if [[ -n $ZSH_VERSION ]]; then
|
||||
printf '\t%9d\n' "${(k@)histogram}"
|
||||
else
|
||||
printf '\t%9d\n' "${!histogram[@]}"
|
||||
fi | sort -nr | head -n 10
|
||||
}
|
||||
|
||||
sumto100
|
||||
Loading…
Add table
Add a link
Reference in a new issue