June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
172
Task/Zeckendorf-arithmetic/D/zeckendorf-arithmetic.d
Normal file
172
Task/Zeckendorf-arithmetic/D/zeckendorf-arithmetic.d
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
import std.stdio;
|
||||
|
||||
int inv(int a) {
|
||||
return a ^ -1;
|
||||
}
|
||||
|
||||
class Zeckendorf {
|
||||
private int dVal;
|
||||
private int dLen;
|
||||
|
||||
private void a(int n) {
|
||||
auto i = n;
|
||||
while (true) {
|
||||
if (dLen < i) dLen = i;
|
||||
auto j = (dVal >> (i * 2)) & 3;
|
||||
switch(j) {
|
||||
case 0:
|
||||
case 1:
|
||||
return;
|
||||
case 2:
|
||||
if (((dVal >> ((i + 1) * 2)) & 1) != 1) return;
|
||||
dVal += 1 << (i * 2 + 1);
|
||||
return;
|
||||
case 3:
|
||||
dVal = dVal & (3 << (i * 2)).inv();
|
||||
b((i + 1) * 2);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private void b(int pos) {
|
||||
if (pos == 0) {
|
||||
this++;
|
||||
return;
|
||||
}
|
||||
if (((dVal >> pos) & 1) == 0) {
|
||||
dVal += 1 << pos;
|
||||
a(pos / 2);
|
||||
if (pos > 1) a(pos / 2 - 1);
|
||||
} else {
|
||||
dVal = dVal & (1 << pos).inv();
|
||||
b(pos + 1);
|
||||
b(pos - (pos > 1 ? 2 : 1));
|
||||
}
|
||||
}
|
||||
|
||||
private void c(int pos) {
|
||||
if (((dVal >> pos) & 1) == 1) {
|
||||
dVal = dVal & (1 << pos).inv();
|
||||
return;
|
||||
}
|
||||
c(pos + 1);
|
||||
if (pos > 0) {
|
||||
b(pos - 1);
|
||||
} else {
|
||||
++this;
|
||||
}
|
||||
}
|
||||
|
||||
this(string x = "0") {
|
||||
int q = 1;
|
||||
int i = x.length - 1;
|
||||
dLen = i / 2;
|
||||
while (i >= 0) {
|
||||
dVal += (x[i] - '0') * q;
|
||||
q *= 2;
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
auto opUnary(string op : "++")() {
|
||||
dVal += 1;
|
||||
a(0);
|
||||
return this;
|
||||
}
|
||||
|
||||
void opOpAssign(string op : "+")(Zeckendorf rhs) {
|
||||
foreach (gn; 0..(rhs.dLen + 1) * 2) {
|
||||
if (((rhs.dVal >> gn) & 1) == 1) {
|
||||
b(gn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void opOpAssign(string op : "-")(Zeckendorf rhs) {
|
||||
foreach (gn; 0..(rhs.dLen + 1) * 2) {
|
||||
if (((rhs.dVal >> gn) & 1) == 1) {
|
||||
c(gn);
|
||||
}
|
||||
}
|
||||
while ((((dVal >> dLen * 2) & 3) == 0) || (dLen == 0)) {
|
||||
dLen--;
|
||||
}
|
||||
}
|
||||
|
||||
void opOpAssign(string op : "*")(Zeckendorf rhs) {
|
||||
auto na = rhs.dup;
|
||||
auto nb = rhs.dup;
|
||||
Zeckendorf nt;
|
||||
auto nr = "0".Z;
|
||||
foreach (i; 0..(dLen + 1) * 2) {
|
||||
if (((dVal >> i) & 1) > 0) nr += nb;
|
||||
nt = nb.dup;
|
||||
nb += na;
|
||||
na = nt.dup;
|
||||
}
|
||||
dVal = nr.dVal;
|
||||
dLen = nr.dLen;
|
||||
}
|
||||
|
||||
void toString(scope void delegate(const(char)[]) sink) const {
|
||||
if (dVal == 0) {
|
||||
sink("0");
|
||||
return;
|
||||
}
|
||||
sink(dig1[(dVal >> (dLen * 2)) & 3]);
|
||||
foreach_reverse (i; 0..dLen) {
|
||||
sink(dig[(dVal >> (i * 2)) & 3]);
|
||||
}
|
||||
}
|
||||
|
||||
Zeckendorf dup() {
|
||||
auto z = "0".Z;
|
||||
z.dVal = dVal;
|
||||
z.dLen = dLen;
|
||||
return z;
|
||||
}
|
||||
|
||||
enum dig = ["00", "01", "10"];
|
||||
enum dig1 = ["", "1", "10"];
|
||||
}
|
||||
|
||||
auto Z(string val) {
|
||||
return new Zeckendorf(val);
|
||||
}
|
||||
|
||||
void main() {
|
||||
writeln("Addition:");
|
||||
auto g = "10".Z;
|
||||
g += "10".Z;
|
||||
writeln(g);
|
||||
g += "10".Z;
|
||||
writeln(g);
|
||||
g += "1001".Z;
|
||||
writeln(g);
|
||||
g += "1000".Z;
|
||||
writeln(g);
|
||||
g += "10101".Z;
|
||||
writeln(g);
|
||||
writeln();
|
||||
|
||||
writeln("Subtraction:");
|
||||
g = "1000".Z;
|
||||
g -= "101".Z;
|
||||
writeln(g);
|
||||
g = "10101010".Z;
|
||||
g -= "1010101".Z;
|
||||
writeln(g);
|
||||
writeln();
|
||||
|
||||
writeln("Multiplication:");
|
||||
g = "1001".Z;
|
||||
g *= "101".Z;
|
||||
writeln(g);
|
||||
g = "101010".Z;
|
||||
g += "101".Z;
|
||||
writeln(g);
|
||||
}
|
||||
186
Task/Zeckendorf-arithmetic/Java/zeckendorf-arithmetic.java
Normal file
186
Task/Zeckendorf-arithmetic/Java/zeckendorf-arithmetic.java
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
import java.util.List;
|
||||
|
||||
public class Zeckendorf implements Comparable<Zeckendorf> {
|
||||
private static List<String> dig = List.of("00", "01", "10");
|
||||
private static List<String> dig1 = List.of("", "1", "10");
|
||||
|
||||
private String x;
|
||||
private int dVal = 0;
|
||||
private int dLen = 0;
|
||||
|
||||
public Zeckendorf() {
|
||||
this("0");
|
||||
}
|
||||
|
||||
public Zeckendorf(String x) {
|
||||
this.x = x;
|
||||
|
||||
int q = 1;
|
||||
int i = x.length() - 1;
|
||||
dLen = i / 2;
|
||||
while (i >= 0) {
|
||||
dVal += (x.charAt(i) - '0') * q;
|
||||
q *= 2;
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
private void a(int n) {
|
||||
int i = n;
|
||||
while (true) {
|
||||
if (dLen < i) dLen = i;
|
||||
int j = (dVal >> (i * 2)) & 3;
|
||||
switch (j) {
|
||||
case 0:
|
||||
case 1:
|
||||
return;
|
||||
case 2:
|
||||
if (((dVal >> ((i + 1) * 2)) & 1) != 1) return;
|
||||
dVal += 1 << (i * 2 + 1);
|
||||
return;
|
||||
case 3:
|
||||
int temp = 3 << (i * 2);
|
||||
temp ^= -1;
|
||||
dVal = dVal & temp;
|
||||
b((i + 1) * 2);
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private void b(int pos) {
|
||||
if (pos == 0) {
|
||||
Zeckendorf thiz = this;
|
||||
thiz.inc();
|
||||
return;
|
||||
}
|
||||
if (((dVal >> pos) & 1) == 0) {
|
||||
dVal += 1 << pos;
|
||||
a(pos / 2);
|
||||
if (pos > 1) a(pos / 2 - 1);
|
||||
} else {
|
||||
int temp = 1 << pos;
|
||||
temp ^= -1;
|
||||
dVal = dVal & temp;
|
||||
b(pos + 1);
|
||||
b(pos - (pos > 1 ? 2 : 1));
|
||||
}
|
||||
}
|
||||
|
||||
private void c(int pos) {
|
||||
if (((dVal >> pos) & 1) == 1) {
|
||||
int temp = 1 << pos;
|
||||
temp ^= -1;
|
||||
dVal = dVal & temp;
|
||||
return;
|
||||
}
|
||||
c(pos + 1);
|
||||
if (pos > 0) {
|
||||
b(pos - 1);
|
||||
} else {
|
||||
Zeckendorf thiz = this;
|
||||
thiz.inc();
|
||||
}
|
||||
}
|
||||
|
||||
public Zeckendorf inc() {
|
||||
dVal++;
|
||||
a(0);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void plusAssign(Zeckendorf other) {
|
||||
for (int gn = 0; gn < (other.dLen + 1) * 2; gn++) {
|
||||
if (((other.dVal >> gn) & 1) == 1) {
|
||||
b(gn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void minusAssign(Zeckendorf other) {
|
||||
for (int gn = 0; gn < (other.dLen + 1) * 2; gn++) {
|
||||
if (((other.dVal >> gn) & 1) == 1) {
|
||||
c(gn);
|
||||
}
|
||||
}
|
||||
while ((((dVal >> dLen * 2) & 3) == 0) || (dLen == 0)) {
|
||||
dLen--;
|
||||
}
|
||||
}
|
||||
|
||||
public void timesAssign(Zeckendorf other) {
|
||||
Zeckendorf na = other.copy();
|
||||
Zeckendorf nb = other.copy();
|
||||
Zeckendorf nt;
|
||||
Zeckendorf nr = new Zeckendorf();
|
||||
for (int i = 0; i < (dLen + 1) * 2; i++) {
|
||||
if (((dVal >> i) & 1) > 0) {
|
||||
nr.plusAssign(nb);
|
||||
}
|
||||
nt = nb.copy();
|
||||
nb.plusAssign(na);
|
||||
na = nt.copy();
|
||||
}
|
||||
dVal = nr.dVal;
|
||||
dLen = nr.dLen;
|
||||
}
|
||||
|
||||
private Zeckendorf copy() {
|
||||
Zeckendorf z = new Zeckendorf();
|
||||
z.dVal = dVal;
|
||||
z.dLen = dLen;
|
||||
return z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Zeckendorf other) {
|
||||
return ((Integer) dVal).compareTo(other.dVal);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (dVal == 0) {
|
||||
return "0";
|
||||
}
|
||||
|
||||
int idx = (dVal >> (dLen * 2)) & 3;
|
||||
StringBuilder stringBuilder = new StringBuilder(dig1.get(idx));
|
||||
for (int i = dLen - 1; i >= 0; i--) {
|
||||
idx = (dVal >> (i * 2)) & 3;
|
||||
stringBuilder.append(dig.get(idx));
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Addition:");
|
||||
Zeckendorf g = new Zeckendorf("10");
|
||||
g.plusAssign(new Zeckendorf("10"));
|
||||
System.out.println(g);
|
||||
g.plusAssign(new Zeckendorf("10"));
|
||||
System.out.println(g);
|
||||
g.plusAssign(new Zeckendorf("1001"));
|
||||
System.out.println(g);
|
||||
g.plusAssign(new Zeckendorf("1000"));
|
||||
System.out.println(g);
|
||||
g.plusAssign(new Zeckendorf("10101"));
|
||||
System.out.println(g);
|
||||
|
||||
System.out.println("\nSubtraction:");
|
||||
g = new Zeckendorf("1000");
|
||||
g.minusAssign(new Zeckendorf("101"));
|
||||
System.out.println(g);
|
||||
g = new Zeckendorf("10101010");
|
||||
g.minusAssign(new Zeckendorf("1010101"));
|
||||
System.out.println(g);
|
||||
|
||||
System.out.println("\nMultiplication:");
|
||||
g = new Zeckendorf("1001");
|
||||
g.timesAssign(new Zeckendorf("101"));
|
||||
System.out.println(g);
|
||||
g = new Zeckendorf("101010");
|
||||
g.plusAssign(new Zeckendorf("101"));
|
||||
System.out.println(g);
|
||||
}
|
||||
}
|
||||
156
Task/Zeckendorf-arithmetic/Kotlin/zeckendorf-arithmetic.kotlin
Normal file
156
Task/Zeckendorf-arithmetic/Kotlin/zeckendorf-arithmetic.kotlin
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
// version 1.1.51
|
||||
|
||||
class Zeckendorf(x: String = "0") : Comparable<Zeckendorf> {
|
||||
|
||||
var dVal = 0
|
||||
var dLen = 0
|
||||
|
||||
private fun a(n: Int) {
|
||||
var i = n
|
||||
while (true) {
|
||||
if (dLen < i) dLen = i
|
||||
val j = (dVal shr (i * 2)) and 3
|
||||
when (j) {
|
||||
0, 1 -> return
|
||||
|
||||
2 -> {
|
||||
if (((dVal shr ((i + 1) * 2)) and 1) != 1) return
|
||||
dVal += 1 shl (i * 2 + 1)
|
||||
return
|
||||
}
|
||||
|
||||
3 -> {
|
||||
dVal = dVal and (3 shl (i * 2)).inv()
|
||||
b((i + 1) * 2)
|
||||
}
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
private fun b(pos: Int) {
|
||||
if (pos == 0) {
|
||||
var thiz = this
|
||||
++thiz
|
||||
return
|
||||
}
|
||||
if (((dVal shr pos) and 1) == 0) {
|
||||
dVal += 1 shl pos
|
||||
a(pos / 2)
|
||||
if (pos > 1) a(pos / 2 - 1)
|
||||
}
|
||||
else {
|
||||
dVal = dVal and (1 shl pos).inv()
|
||||
b(pos + 1)
|
||||
b(pos - (if (pos > 1) 2 else 1))
|
||||
}
|
||||
}
|
||||
|
||||
private fun c(pos: Int) {
|
||||
if (((dVal shr pos) and 1) == 1) {
|
||||
dVal = dVal and (1 shl pos).inv()
|
||||
return
|
||||
}
|
||||
c(pos + 1)
|
||||
if (pos > 0) b(pos - 1) else { var thiz = this; ++thiz }
|
||||
}
|
||||
|
||||
init {
|
||||
var q = 1
|
||||
var i = x.length - 1
|
||||
dLen = i / 2
|
||||
while (i >= 0) {
|
||||
dVal += (x[i] - '0').toInt() * q
|
||||
q *= 2
|
||||
i--
|
||||
}
|
||||
}
|
||||
|
||||
operator fun inc(): Zeckendorf {
|
||||
dVal += 1
|
||||
a(0)
|
||||
return this
|
||||
}
|
||||
|
||||
operator fun plusAssign(other: Zeckendorf) {
|
||||
for (gn in 0 until (other.dLen + 1) * 2) {
|
||||
if (((other.dVal shr gn) and 1) == 1) b(gn)
|
||||
}
|
||||
}
|
||||
|
||||
operator fun minusAssign(other: Zeckendorf) {
|
||||
for (gn in 0 until (other.dLen + 1) * 2) {
|
||||
if (((other.dVal shr gn) and 1) == 1) c(gn)
|
||||
}
|
||||
while ((((dVal shr dLen * 2) and 3) == 0) || (dLen == 0)) dLen--
|
||||
}
|
||||
|
||||
operator fun timesAssign(other: Zeckendorf) {
|
||||
var na = other.copy()
|
||||
var nb = other.copy()
|
||||
var nt: Zeckendorf
|
||||
var nr = "0".Z
|
||||
for (i in 0..(dLen + 1) * 2) {
|
||||
if (((dVal shr i) and 1) > 0) nr += nb
|
||||
nt = nb.copy()
|
||||
nb += na
|
||||
na = nt.copy()
|
||||
}
|
||||
dVal = nr.dVal
|
||||
dLen = nr.dLen
|
||||
}
|
||||
|
||||
override operator fun compareTo(other: Zeckendorf) = dVal.compareTo(other.dVal)
|
||||
|
||||
override fun toString(): String {
|
||||
if (dVal == 0) return "0"
|
||||
val sb = StringBuilder(dig1[(dVal shr (dLen * 2)) and 3])
|
||||
for (i in dLen - 1 downTo 0) {
|
||||
sb.append(dig[(dVal shr (i * 2)) and 3])
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
fun copy(): Zeckendorf {
|
||||
val z = "0".Z
|
||||
z.dVal = dVal
|
||||
z.dLen = dLen
|
||||
return z
|
||||
}
|
||||
|
||||
companion object {
|
||||
val dig = listOf("00", "01", "10")
|
||||
val dig1 = listOf("", "1", "10")
|
||||
}
|
||||
}
|
||||
|
||||
val String.Z get() = Zeckendorf(this)
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
println("Addition:")
|
||||
var g = "10".Z
|
||||
g += "10".Z
|
||||
println(g)
|
||||
g += "10".Z
|
||||
println(g)
|
||||
g += "1001".Z
|
||||
println(g)
|
||||
g += "1000".Z
|
||||
println(g)
|
||||
g += "10101".Z
|
||||
println(g)
|
||||
println("\nSubtraction:")
|
||||
g = "1000".Z
|
||||
g -= "101".Z
|
||||
println(g)
|
||||
g = "10101010".Z
|
||||
g -= "1010101".Z
|
||||
println(g)
|
||||
println("\nMultiplication:")
|
||||
g = "1001".Z
|
||||
g *= "101".Z
|
||||
println(g)
|
||||
g = "101010".Z
|
||||
g += "101".Z
|
||||
println(g)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue