diff --git a/Lang/8080-Assembly/Loops-Infinite b/Lang/8080-Assembly/Loops-Infinite
new file mode 120000
index 0000000000..f6336ebca0
--- /dev/null
+++ b/Lang/8080-Assembly/Loops-Infinite
@@ -0,0 +1 @@
+../../Task/Loops-Infinite/8080-Assembly
\ No newline at end of file
diff --git a/Lang/8080-Assembly/Run-length-encoding b/Lang/8080-Assembly/Run-length-encoding
new file mode 120000
index 0000000000..bc3ed9076c
--- /dev/null
+++ b/Lang/8080-Assembly/Run-length-encoding
@@ -0,0 +1 @@
+../../Task/Run-length-encoding/8080-Assembly
\ No newline at end of file
diff --git a/Lang/8086-Assembly/00-LANG.txt b/Lang/8086-Assembly/00-LANG.txt
index 7cf10761fa..9120d12d87 100644
--- a/Lang/8086-Assembly/00-LANG.txt
+++ b/Lang/8086-Assembly/00-LANG.txt
@@ -4,13 +4,13 @@
===Segmented Memory===
The 8086 uses a segmented memory model, similar to the Super Nintendo Entertainment System. Unlike banked memory models used in the Commodore 64 and late NES games, segment addresses are held in segment registers. These segment registers are 16 bit and get left-shifted by 4 and added to the pointer register of interest to determine the memory address to look up. The 8086 has four in total, but only the DS and ES registers can be used by the programmer. (The other two work with the stack pointer and instruction pointer, and are loaded for you.) On the 8086, you can only load segment registers with the value in a data register, or with the POP command. So first you must load a segment into a data register, THEN into a segment register.
-;This is NOT valid code!
+;This is NOT valid code!
mov ds, @data ;you're trying to move the data segment location directly into DS. You can't!
;This is the proper way:
mov ax, @data ;I chose AX but I could have used BX, CX, or DX.
-mov ds, ax ;load DS with the data segment.
+mov ds, ax ;load DS with the data segment.
It's important to remember the subtle distinction between a ''segment'' and a ''segment register.'' Your program might have labeled ''segments'' such as .data and .code, but in order to properly read from/write to these sections you'll need to load their memory locations into ''segment registers.''
@@ -18,17 +18,17 @@ It's important to remember the subtle distinction between a ''segment'' and a ''
There are four data registers: AX, BX, CX, and DX. While most commands can use any of them, some only work with particular data registers. System calls in particular are very specific about which registers can be used for what. On [[MS-DOS]], the AX register is used for selecting the desired interrupt to use with the INT command.
Each data register is 16-bit, but has two eight bit halves ending in H or L, e.g. AH, AL. Instructions can be executed using the whole register or just half of it.
-mov ax, 1000h ;move 1000h into AX, or equivalently, move 10h into AH and 00h into AL.
+mov ax, 1000h ;move 1000h into AX, or equivalently, move 10h into AH and 00h into AL.
Moving a value smaller than 16 bits into ?X is the same as moving it into ?L, and moving 0 into ?H. (? represents the data register of your choice. They are all the same in this regard.)
-mov ax,0030h
+mov ax,0030h
;is the same as:
mov al, 30h
-mov ah, 0h
+mov ah, 0h
Commands that alter the contents of a single register will not affect the other half.
-mov ax,00FFh
-inc al
+mov ax,00FFh
+inc al
If we had executed INC AX, then AX would have been incremented to 0x100. Since we only incremented AL, only AL was incremented in this case, and AH '''still equals 0x00!'''
Generally speaking, the 8086's registers serve the following purposes:
@@ -42,24 +42,24 @@ When writing to or reading from consecutive sections of memory, it is helpful to
The syntax for offsetting an index register will vary depending on your assembler. Many assemblers will often accept multiple different ways of writing it, and it comes down to personal preference.
-mov si, offset MyArray
+mov si, offset MyArray
mov bx,2
mov al,[bx+si] ;loads decimal 30 into AL
MyArray:
-byte 10,20,30,40,50
+byte 10,20,30,40,50
===The Stack===
As with [[Z80 Assembly]], you can't push 8-bit registers onto the stack. For data registers, you have to push/pop both halves.
-;This is valid code.
+;This is valid code.
push ax
push bx
pop bx
pop ax
-;This is NOT valid code.
+;This is NOT valid code.
push ah
push al
push bh
@@ -69,14 +69,14 @@ push bl
pop bl
pop bh
pop al
-pop ah
+pop ah
As with all processors that use a stack, if you push one or more registers and want to restore the backed-up values correctly, you must pop them in the reverse order. You can pop them out of order on purpose to swap registers around. In fact, this is a quick way to move the segment from DS into ES, or vice-versa:
-push DS
-pop ES ;you can't do "mov es, ds" but you can do this!
+push DS
+pop ES ;you can't do "mov es, ds" but you can do this!
The proper way to use the stack to preserve registers:
-
+
call foo
mov ax,4C00h
@@ -91,7 +91,7 @@ push cx
pop cx
pop bx
pop ax
-ret
+ret
If one of the push/pop commands in the routine above were missing, the RET instruction would not properly return to where it came from. As long as you pop at the end the same number of registers you pushed at the start, the stack is "balanced" and your return instruction will return correctly. This is because RET is actually POP IP (IP being the instruction pointer, which you can think of as what "line" of code the CPU is on.) The CPU assumes the top of the stack is the correct place to return to, but has no way of actually verifying it. If the function you just wrote causes the CPU to crash or jump to a completely different part of the code, there's a good chance you might have forgotten to balance the stack properly.
@@ -107,40 +107,40 @@ One other caveat to mention: On early IBM PCs and compatibles, the 8087 was not
===Looping Constructs===
The 8086 has a lot more of these than most CPUs. The most obvious one is LOOP, which will subtract 1 from CX, then jump back to a specified label if CX is nonzero after the subtraction. If CX becomes zero after subtracting 1, then no jump will occur and the instruction pointer simply moves to the next instruction.
-mov cx,0100h ;set the loop counter's starting value. This must be outside the loop, otherwise you'll loop forever!
+mov cx,0100h ;set the loop counter's starting value. This must be outside the loop, otherwise you'll loop forever!
foo:
;; your code that you want to loop goes here
-loop foo
+loop foo
It's important not to alter CX inside the loop. It's easy to make a mistake like this if you're in a hurry:
-foobar:
+foobar:
mov cx,1000h
;your code goes here
-loop foobar
+loop foobar
It may not be obvious at first but the above loop will never end. CX decrements to 0x0FFF with the LOOP instruction but the mov cx,1000h was mistakenly placed ''inside'' the loop, resetting the loop counter back to 0x1000, which means no progress is really being made. The correct way to do this is to set the starting loop counter '''outside''' the loop, like so:
-mov cx,1000h
+mov cx,1000h
foobar:
;your code goes here
-loop foobar
+loop foobar
Sometimes you'll have to change CX during a loop, like if you want to do bit shifts with a shift amount other than 1, for example. There's a simple fix - use the stack to stash and retrieve the loop counter.
-mov cx,0100h
+mov cx,0100h
foo:
push cx
mov cl,2
ror ax,cl ;starting with the 80186 you don't need CL for bit shifting.
pop cx
-loop foo
+loop foo
By using PUSH CX and POP CX, you can temporarily use CX for something else, as long as you restore it before the LOOP instruction.
You can use other registers as loop counters as well, but not with the LOOP instruction - it's hardcoded to only work with CX. But you can do this:
-mov dx,0100h
+mov dx,0100h
baz:
;your code goes here
dec dx
@@ -148,7 +148,7 @@ jnz baz
; A minor note for advanced programmers:
; If you're expecting the flags to be in a particular state based on the loop body, tough luck!
; They'll only reflect the decrement of DX from 1 to 0 at this point in the code.
-; LOOP doesn't change the flags, which makes it more useful for loops meant to compare things.
+; LOOP doesn't change the flags, which makes it more useful for loops meant to compare things.
Another frequently used looping construct is REP. REP can be combined with certain instructions to repeat that instruction until CX equals zero. However, unlike LOOP, which can be used to repeat a block of instructions, REP can only repeat one. It doesn't work on all instructions, only the "string" instructions which operate on a block of memory. Typically these include MOVSB, LODSB, STOSB, CMPSB, and SCASB (each has a variant that ends in W instead of B, for 16-bit data.) There are also REPZ and REPNZ, which stand for "Repeat if Zero" and "Repeat if Nonzero" respectively. These two only work properly with CMPSB and SCASB, as MOVSB, LODSB, STOSB do not affect the flags. (The CPU doesn't detect whether CX equals zero using the flags, as the flags never reflect this equality to zero like you would expect.)
diff --git a/Lang/ALGOL-60/Additive-primes b/Lang/ALGOL-60/Additive-primes
new file mode 120000
index 0000000000..360a570784
--- /dev/null
+++ b/Lang/ALGOL-60/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/ALGOL-60
\ No newline at end of file
diff --git a/Lang/ALGOL-60/Largest-proper-divisor-of-n b/Lang/ALGOL-60/Largest-proper-divisor-of-n
new file mode 120000
index 0000000000..bd5f1adbca
--- /dev/null
+++ b/Lang/ALGOL-60/Largest-proper-divisor-of-n
@@ -0,0 +1 @@
+../../Task/Largest-proper-divisor-of-n/ALGOL-60
\ No newline at end of file
diff --git a/Lang/ALGOL-60/Loops-Increment-loop-index-within-loop-body b/Lang/ALGOL-60/Loops-Increment-loop-index-within-loop-body
new file mode 120000
index 0000000000..b6ef8c8c0c
--- /dev/null
+++ b/Lang/ALGOL-60/Loops-Increment-loop-index-within-loop-body
@@ -0,0 +1 @@
+../../Task/Loops-Increment-loop-index-within-loop-body/ALGOL-60
\ No newline at end of file
diff --git a/Lang/ALGOL-60/Proper-divisors b/Lang/ALGOL-60/Proper-divisors
new file mode 120000
index 0000000000..7bb12e66dd
--- /dev/null
+++ b/Lang/ALGOL-60/Proper-divisors
@@ -0,0 +1 @@
+../../Task/Proper-divisors/ALGOL-60
\ No newline at end of file
diff --git a/Lang/ALGOL-60/Sequence-of-primes-by-trial-division b/Lang/ALGOL-60/Sequence-of-primes-by-trial-division
new file mode 120000
index 0000000000..b95a2ebdcc
--- /dev/null
+++ b/Lang/ALGOL-60/Sequence-of-primes-by-trial-division
@@ -0,0 +1 @@
+../../Task/Sequence-of-primes-by-trial-division/ALGOL-60
\ No newline at end of file
diff --git a/Lang/ALGOL-68/00-LANG.txt b/Lang/ALGOL-68/00-LANG.txt
index 875b4abf89..d037dbcad0 100644
--- a/Lang/ALGOL-68/00-LANG.txt
+++ b/Lang/ALGOL-68/00-LANG.txt
@@ -68,209 +68,11 @@ A syntax chart is available [http://www.softwarepreservation.org/projects/ALGOL/
*Dec. 1968: Report on the Algorithmic Language ALGOL 68 - Offprint from Numerische Mathematik, 14, 79-218 (1969); Springer-Verlag. - Edited by: A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck and C.H.A. Koster.
*Sep 1973: Revised Report on the Algorithmic Language Algol 68 - Springer-Verlag 1976 - Edited by: A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff, C.H. Lindsey, L.G.L.T. Meertens and R.G. Fisker.
==Coding style of samples, alphabets and stropping==
-Click "Expand" for more details.
-
-
-
-Many of the code samples provided here have a leading main:( and a matching ) at the end. These are not actually required in the language, but are included so as to highlight the main routine.
-
-On some compilers, it may be necessary to include appropriate "job cards"
-or preludes in order for the programs to compile successfully. Hopefully
-not too much else is required. Examples:
-{|border="1" style="border-collapse: collapse; border: 5px double grey;" align="center"
-|| Brief Algol68
-|| Algol68 as in rosettacode
-|| Actual ELLA Algol 68RS code
-|-
-||
- print(("Hello, world!",new line))
-||
- main:(
- print(("Hello, world!",new line))
- )
-||
- PROGRAM helloworld CONTEXT VOID
- USE standard
- BEGIN
- print(("Hello, world!", new line))
- END
- FINISH
-|}
-
'''Alphabets'''
-
-Notionally, Algol 68 source is written in two alphabets. The reserved words, mode indicants (type names) and operators that are non-symbolic (.e.g. '''and''', '''or''', ...) are generally referred to as "bold words" and usually shown in a bold font in literature. Words that are identifiers (used for "variable" names, procedure names, structure member names, ...) are in a separate, non-bold font.
-The [https://www.softwarepreservation.org/projects/ALGOL/manual/a68s.txt/view Manual for CMU ALGOL 68S (on softwarepreservation.org)] refers to the non-bold words as being in timid face.
-
'''Examples of different program representations'''
-
-At the time when ALGOL 68 was defined some predominant computers had
-24 or 36 bit words, with 6 bit character sets. Hence it was desirable that
-ALGOL 68 should be able to run on machines with only uppercase.
-As multiple fonts were generally unavailable, a method of identifying the bold words was required.
-The official spec provided for different representations of the same
-program.
-Quote stropping (enclosing the bold words in single quotes)
-and Point stropping (preceeding the bold words with a dot)
-were used.
-A variant of Point stropping called RES stropping was also defined.
-In RES stropping some language-defined bold words are not preceded by a dot.
-A pragmatic comment may have been required to indicate which
-stropping convention was to be used, as in some of the examples below.
-Upper stropping (representing the bold words by upper case and
-non-bold words in lower case) was introduced by Algol 68R.
-Upper stropping is used by Algol 68RS and is one of the options for Algol 68G.
-Rutgers ALGOL 68 uses quote stropping.
-Most of the samples on Rosetta Code use Upper stropping.
-Examples (pragmatic comments to set the stropping regime not shown):
-{|border="1" style="border-collapse: collapse; border: 2px double grey;" align="left"
-|| Algol68 as typically published
- '''mode''' '''xint''' = '''int''';
- '''xint''' sum sq:=0;
- '''for''' i '''while'''
- sum sq≠70×70
- '''do'''
- sum sq+:=i↑2
- '''od'''
-|| QUOTE stropping (similar to wiki)
- 'mode' 'xint' = 'int';
- 'xint' sum sq:=0;
- 'for' i 'while'
- sum sq≠70×70
- 'do'
- sum sq+:=i↑2
- 'od'
-|| POINT stropping
- .MODE .XINT = .INT;
- .XINT SUM SQ:=0;
- .FOR I .WHILE
- SUM SQ .NE 70*70
- .DO
- SUM SQ .PLUSAB I .UP 2
- .OD
-|| RES stropping
- mode .xint = int;
- .xint sum sq:=0;
- for i while
- sum sq≠70×70
- do
- sum sq+:=i↑2
- od
-|| Upper stropping
- MODE XINT = INT;
- XINT sum sq:=0;
- FOR i WHILE
- sum sq /= 70*70
- DO
- sum sq PLUSAB i UP 2
- OD
-|}
-
-
+See [[ALGOL 68 Representation]].
== Coercion (casting) ==
-ALGOL 68 has a hierarchy of contexts which determine which kind of coercions are available at a particular point in the program.
-
-Click "Expand" for more details.
-
-
-
-These contexts are:
-{|class="wikitable"
-!rowspan=2| N
-a
-m
-e
-!rowspan=2| Context location
-!colspan=5| Coercions available in this context
-!rowspan=2| Coercion examples
-|-
-|bgcolor=aaaaff|Soft
-|bgcolor=aaeeaa|Weak
-|bgcolor=ffee99|Meek
-|bgcolor=ffcc99|Firm
-|bgcolor=ffcccc|Strong
-|-
-!S
-t
-r
-o
-n
-g
-||Right hand side of:
-* Identity-declarations, as "~" in: REAL x = ~
-* Initialisations, as "~" in: REAL x := ~
-Also:
-* Actual-parameters of calls, as "~" in:PROC: sin(~)
-* Enclosed clauses of casts, as "~" in: REAL(~)
-* Units of routine-texts
-* Statements yielding VOID
-* All parts (but one) of a balanced clause
-* One side of an identity relation, as "~" in: ~ IS ~
-|bgcolor=aaaaff rowspan=4 width="50px"| deproc- eduring
-|bgcolor=aaeeaa rowspan=3 width="50px"| all '''soft''' then weak deref- erencing
-|bgcolor=ffee99 rowspan=2 width="50px"| all '''weak''' then deref- erencing
-|bgcolor=ffcc99 rowspan=1 width="50px"| all '''meek''' then uniting
-|bgcolor=ffcccc width="50px"| all '''firm''' then widening, rowing and voiding
-|colspan=1 bgcolor=ffcccc|
-Widening occurs if there is no loss of precision. For example: An INT will be coerced to a REAL, and a REAL will be coerced to a LONG REAL. But not vice-versa. Examples:
-INT to LONG INT
-INT to REAL
-REAL to COMPL
-BITS to []BOOL
-BYTES to STRING
-A variable can also be coerced (rowed) to an array of length 1.
-
-For example:
-INT to [1]INT
-REAL to [1]REAL etc
-|-
-!F
-i
-r
-m
-||
-*Operands of formulas as "~" in:OP: ~ * ~
-*Parameters of transput calls
-|colspan=3 bgcolor=ffcc99| Example:
-UNION(INT,REAL) var := 1
-|-
-!M
-e
-e
-k
-||
-* Trimscripts (yielding INT)
-* Enquiries: e.g. as "~" in the following
-IF ~ THEN ... FI and
-FROM ~ BY ~ TO ~ WHILE ~ DO ... OD etc
-* Primaries of calls (e.g. sin in sin(x))
-|colspan=4 bgcolor=ffee99|Examples:
-REF REF BOOL to BOOL
-REF REF REF INT to INT
-|-
-!W
-e
-a
-k
-||
-* Primaries of slices, as in "~" in: ~[1:99]
-* Secondaries of selections, as "~" in: value OF ~
-|colspan=5 bgcolor=aaeeaa|Examples:
-REF BOOL to REF BOOL
-REF REF INT to REF INT
-REF REF REF REAL to REF REAL
-REF REF REF REF STRUCT to REF STRUCT
-|-
-!S
-o
-f
-t
-|| The LHS of assignments, as "~" in: ~ := ...
-|colspan=6 bgcolor=aaaaff| Example:
-* deproceduring of: PROC REAL random: e.g. random
-|}
-For more details about Primaries and Secondaries refer to [[Operator_precedence#ALGOL_68|Operator precedence]].
-
-
+ALGOL 68 has a hierarchy of contexts which determine which kind of coercions are available at a particular point in the program.
+See [[:Category:ALGOL_68_Coercions|ALGOL 68 Coercions]] for more details.
==See also==
*[[Web 68]]
@@ -284,13 +86,14 @@ For more details about Primaries and Secondaries refer to [[Operator_precedence#
* [https://en.wikipedia.org/wiki/S3_(programming_language) S3 for ICL 2900]
== Library code used in Rosetta Code samples ==
-[https://rosettacode.org/wiki/ALGOL_68/prelude Various (including the standard prelude)]
-
-[https://rosettacode.org/wiki/Category:ALGOL_68-files File related]
-[https://rosettacode.org/wiki/Category:ALGOL_68-l-system L-System related]
-[https://rosettacode.org/wiki/Category:ALGOL_68-primes Prime related]
-[https://rosettacode.org/wiki/Category:ALGOL_68-rows Row (array) related]
-[https://rosettacode.org/wiki/Category:ALGOL_68-sort Sorting related]
+* [[ALGOL_68/prelude|Various (including the standard prelude)]]
+*
+* [[:Category:ALGOL_68-bits|bit-manipulation related]]
+* [[:Category:ALGOL_68-files|File related]]
+* [[:Category:ALGOL_68-l-system|L-System related]]
+* [[:Category:ALGOL_68-primes|Prime related]]
+* [[:Category:ALGOL_68-rows|Row (array) related]]
+* [[:Category:ALGOL_68-sort|Sorting related]]
== Tools ==
[[Syntax_highlighting_using_Mediawiki_formatting#ALGOL 68|Format an upper-stropped Algol 68 source with Mediawiki markup]]
diff --git a/Lang/ALGOL-68/Elliptic-curve-arithmetic b/Lang/ALGOL-68/Elliptic-curve-arithmetic
new file mode 120000
index 0000000000..88681d69e9
--- /dev/null
+++ b/Lang/ALGOL-68/Elliptic-curve-arithmetic
@@ -0,0 +1 @@
+../../Task/Elliptic-curve-arithmetic/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Permutation-test b/Lang/ALGOL-68/Permutation-test
new file mode 120000
index 0000000000..1a8b7f20df
--- /dev/null
+++ b/Lang/ALGOL-68/Permutation-test
@@ -0,0 +1 @@
+../../Task/Permutation-test/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Primes---allocate-descendants-to-their-ancestors b/Lang/ALGOL-68/Primes---allocate-descendants-to-their-ancestors
new file mode 120000
index 0000000000..9bf6ed3e36
--- /dev/null
+++ b/Lang/ALGOL-68/Primes---allocate-descendants-to-their-ancestors
@@ -0,0 +1 @@
+../../Task/Primes---allocate-descendants-to-their-ancestors/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Pythagoras-tree b/Lang/ALGOL-68/Pythagoras-tree
new file mode 120000
index 0000000000..8c304d8b68
--- /dev/null
+++ b/Lang/ALGOL-68/Pythagoras-tree
@@ -0,0 +1 @@
+../../Task/Pythagoras-tree/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Solve-a-Numbrix-puzzle b/Lang/ALGOL-68/Solve-a-Numbrix-puzzle
new file mode 120000
index 0000000000..14e9e80e97
--- /dev/null
+++ b/Lang/ALGOL-68/Solve-a-Numbrix-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-a-Numbrix-puzzle/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Solve-the-no-connection-puzzle b/Lang/ALGOL-68/Solve-the-no-connection-puzzle
new file mode 120000
index 0000000000..0ffda5f1f9
--- /dev/null
+++ b/Lang/ALGOL-68/Solve-the-no-connection-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-the-no-connection-puzzle/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Text-processing-2 b/Lang/ALGOL-68/Text-processing-2
new file mode 120000
index 0000000000..124fe3bf6c
--- /dev/null
+++ b/Lang/ALGOL-68/Text-processing-2
@@ -0,0 +1 @@
+../../Task/Text-processing-2/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Wasteful-equidigital-and-frugal-numbers b/Lang/ALGOL-68/Wasteful-equidigital-and-frugal-numbers
new file mode 120000
index 0000000000..6de9ddaea1
--- /dev/null
+++ b/Lang/ALGOL-68/Wasteful-equidigital-and-frugal-numbers
@@ -0,0 +1 @@
+../../Task/Wasteful-equidigital-and-frugal-numbers/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-M/Additive-primes b/Lang/ALGOL-M/Additive-primes
new file mode 120000
index 0000000000..974f9484e7
--- /dev/null
+++ b/Lang/ALGOL-M/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/ALGOL-M
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/Levenshtein-distance b/Lang/ANSI-BASIC/Levenshtein-distance
new file mode 120000
index 0000000000..92b553d536
--- /dev/null
+++ b/Lang/ANSI-BASIC/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/M-bius-function b/Lang/ANSI-BASIC/M-bius-function
new file mode 120000
index 0000000000..f786d2b99e
--- /dev/null
+++ b/Lang/ANSI-BASIC/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/Magic-constant b/Lang/ANSI-BASIC/Magic-constant
new file mode 120000
index 0000000000..7d2184182c
--- /dev/null
+++ b/Lang/ANSI-BASIC/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/Map-range b/Lang/ANSI-BASIC/Map-range
new file mode 120000
index 0000000000..829dfc3a26
--- /dev/null
+++ b/Lang/ANSI-BASIC/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/APL/Loops-Infinite b/Lang/APL/Loops-Infinite
new file mode 120000
index 0000000000..0f3ec957d2
--- /dev/null
+++ b/Lang/APL/Loops-Infinite
@@ -0,0 +1 @@
+../../Task/Loops-Infinite/APL
\ No newline at end of file
diff --git a/Lang/APL/Sort-a-list-of-object-identifiers b/Lang/APL/Sort-a-list-of-object-identifiers
new file mode 120000
index 0000000000..400cb9fc60
--- /dev/null
+++ b/Lang/APL/Sort-a-list-of-object-identifiers
@@ -0,0 +1 @@
+../../Task/Sort-a-list-of-object-identifiers/APL
\ No newline at end of file
diff --git a/Lang/APL/Strip-comments-from-a-string b/Lang/APL/Strip-comments-from-a-string
new file mode 120000
index 0000000000..ff78e120aa
--- /dev/null
+++ b/Lang/APL/Strip-comments-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-comments-from-a-string/APL
\ No newline at end of file
diff --git a/Lang/APL/Tic-tac-toe b/Lang/APL/Tic-tac-toe
new file mode 120000
index 0000000000..58bb681d1c
--- /dev/null
+++ b/Lang/APL/Tic-tac-toe
@@ -0,0 +1 @@
+../../Task/Tic-tac-toe/APL
\ No newline at end of file
diff --git a/Lang/ASIC/M-bius-function b/Lang/ASIC/M-bius-function
new file mode 120000
index 0000000000..7848f34d54
--- /dev/null
+++ b/Lang/ASIC/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/ASIC
\ No newline at end of file
diff --git a/Lang/Action-/00-LANG.txt b/Lang/Action-/00-LANG.txt
index b37eb47c8f..3811c3c636 100644
--- a/Lang/Action-/00-LANG.txt
+++ b/Lang/Action-/00-LANG.txt
@@ -4,7 +4,7 @@
}}
Action! is a language written by Clinton Parker and published by Optimized Sytems Software (OSS) for the Atari 8-bit line of home computers.
It is related to ALGOL and optimized for single-pass compilation to 6502 code.
-
+A manual for the language is available at https://seriouscomputerist.atariverse.com/media/pdf/manual/OSS%20OS-A+%20-%20Manual%20(1983).pdf
==See Also==
* [[wp:Action!_(programming_language)|Action! on Wikipedia]]
* [[ALGOL 68]]
diff --git a/Lang/Ada/Cistercian-numerals b/Lang/Ada/Cistercian-numerals
new file mode 120000
index 0000000000..a03109c188
--- /dev/null
+++ b/Lang/Ada/Cistercian-numerals
@@ -0,0 +1 @@
+../../Task/Cistercian-numerals/Ada
\ No newline at end of file
diff --git a/Lang/Ada/Curzon-numbers b/Lang/Ada/Curzon-numbers
new file mode 120000
index 0000000000..4a77e1da8a
--- /dev/null
+++ b/Lang/Ada/Curzon-numbers
@@ -0,0 +1 @@
+../../Task/Curzon-numbers/Ada
\ No newline at end of file
diff --git a/Lang/AppleScript/Bin-given-limits b/Lang/AppleScript/Bin-given-limits
new file mode 120000
index 0000000000..955dc82ffb
--- /dev/null
+++ b/Lang/AppleScript/Bin-given-limits
@@ -0,0 +1 @@
+../../Task/Bin-given-limits/AppleScript
\ No newline at end of file
diff --git a/Lang/AppleScript/Nth-root b/Lang/AppleScript/Nth-root
new file mode 120000
index 0000000000..24be4fbbed
--- /dev/null
+++ b/Lang/AppleScript/Nth-root
@@ -0,0 +1 @@
+../../Task/Nth-root/AppleScript
\ No newline at end of file
diff --git a/Lang/AppleScript/Write-float-arrays-to-a-text-file b/Lang/AppleScript/Write-float-arrays-to-a-text-file
new file mode 120000
index 0000000000..d7524dd990
--- /dev/null
+++ b/Lang/AppleScript/Write-float-arrays-to-a-text-file
@@ -0,0 +1 @@
+../../Task/Write-float-arrays-to-a-text-file/AppleScript
\ No newline at end of file
diff --git a/Lang/Applesoft-BASIC/Cistercian-numerals b/Lang/Applesoft-BASIC/Cistercian-numerals
new file mode 120000
index 0000000000..2c5e6c52c1
--- /dev/null
+++ b/Lang/Applesoft-BASIC/Cistercian-numerals
@@ -0,0 +1 @@
+../../Task/Cistercian-numerals/Applesoft-BASIC
\ No newline at end of file
diff --git a/Lang/Applesoft-BASIC/Formatted-numeric-output b/Lang/Applesoft-BASIC/Formatted-numeric-output
new file mode 120000
index 0000000000..52c4ceb520
--- /dev/null
+++ b/Lang/Applesoft-BASIC/Formatted-numeric-output
@@ -0,0 +1 @@
+../../Task/Formatted-numeric-output/Applesoft-BASIC
\ No newline at end of file
diff --git a/Lang/Applesoft-BASIC/Levenshtein-distance b/Lang/Applesoft-BASIC/Levenshtein-distance
new file mode 120000
index 0000000000..890eb3e044
--- /dev/null
+++ b/Lang/Applesoft-BASIC/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/Applesoft-BASIC
\ No newline at end of file
diff --git a/Lang/Applesoft-BASIC/Multi-dimensional-array b/Lang/Applesoft-BASIC/Multi-dimensional-array
new file mode 120000
index 0000000000..c47a96b8ff
--- /dev/null
+++ b/Lang/Applesoft-BASIC/Multi-dimensional-array
@@ -0,0 +1 @@
+../../Task/Multi-dimensional-array/Applesoft-BASIC
\ No newline at end of file
diff --git a/Lang/Applesoft-BASIC/Towers-of-Hanoi b/Lang/Applesoft-BASIC/Towers-of-Hanoi
new file mode 120000
index 0000000000..7e7bc24b30
--- /dev/null
+++ b/Lang/Applesoft-BASIC/Towers-of-Hanoi
@@ -0,0 +1 @@
+../../Task/Towers-of-Hanoi/Applesoft-BASIC
\ No newline at end of file
diff --git a/Lang/Arturo/Arithmetic-derivative b/Lang/Arturo/Arithmetic-derivative
new file mode 120000
index 0000000000..d1b6630a6c
--- /dev/null
+++ b/Lang/Arturo/Arithmetic-derivative
@@ -0,0 +1 @@
+../../Task/Arithmetic-derivative/Arturo
\ No newline at end of file
diff --git a/Lang/Arturo/Dice-game-probabilities b/Lang/Arturo/Dice-game-probabilities
new file mode 120000
index 0000000000..963933dbf3
--- /dev/null
+++ b/Lang/Arturo/Dice-game-probabilities
@@ -0,0 +1 @@
+../../Task/Dice-game-probabilities/Arturo
\ No newline at end of file
diff --git a/Lang/Arturo/Element-wise-operations b/Lang/Arturo/Element-wise-operations
new file mode 120000
index 0000000000..da54867937
--- /dev/null
+++ b/Lang/Arturo/Element-wise-operations
@@ -0,0 +1 @@
+../../Task/Element-wise-operations/Arturo
\ No newline at end of file
diff --git a/Lang/Arturo/Entropy-Narcissist b/Lang/Arturo/Entropy-Narcissist
new file mode 120000
index 0000000000..a5a91d666a
--- /dev/null
+++ b/Lang/Arturo/Entropy-Narcissist
@@ -0,0 +1 @@
+../../Task/Entropy-Narcissist/Arturo
\ No newline at end of file
diff --git a/Lang/Arturo/Munching-squares b/Lang/Arturo/Munching-squares
new file mode 120000
index 0000000000..3d1757b680
--- /dev/null
+++ b/Lang/Arturo/Munching-squares
@@ -0,0 +1 @@
+../../Task/Munching-squares/Arturo
\ No newline at end of file
diff --git a/Lang/Asymptote/Evaluate-binomial-coefficients b/Lang/Asymptote/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..8408c303d7
--- /dev/null
+++ b/Lang/Asymptote/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/Asymptote
\ No newline at end of file
diff --git a/Lang/Atari-BASIC/Pi b/Lang/Atari-BASIC/Pi
new file mode 120000
index 0000000000..b081cc7024
--- /dev/null
+++ b/Lang/Atari-BASIC/Pi
@@ -0,0 +1 @@
+../../Task/Pi/Atari-BASIC
\ No newline at end of file
diff --git a/Lang/AutoHotKey-V2/00-LANG.txt b/Lang/AutoHotKey-V2/00-LANG.txt
new file mode 100644
index 0000000000..a333f928af
--- /dev/null
+++ b/Lang/AutoHotKey-V2/00-LANG.txt
@@ -0,0 +1 @@
+{{stub}}{{language|AutoHotKey V2}}
\ No newline at end of file
diff --git a/Lang/AutoHotKey-V2/00-META.yaml b/Lang/AutoHotKey-V2/00-META.yaml
new file mode 100644
index 0000000000..316ebe0ccb
--- /dev/null
+++ b/Lang/AutoHotKey-V2/00-META.yaml
@@ -0,0 +1,2 @@
+---
+from: http://rosettacode.org/wiki/Category:AutoHotKey_V2
diff --git a/Lang/AutoHotKey-V2/Hello-world-Graphical b/Lang/AutoHotKey-V2/Hello-world-Graphical
new file mode 120000
index 0000000000..89783bc714
--- /dev/null
+++ b/Lang/AutoHotKey-V2/Hello-world-Graphical
@@ -0,0 +1 @@
+../../Task/Hello-world-Graphical/AutoHotKey-V2
\ No newline at end of file
diff --git a/Lang/Autohotkey-V2/00-LANG.txt b/Lang/Autohotkey-V2/00-LANG.txt
deleted file mode 100644
index b3e33b65ab..0000000000
--- a/Lang/Autohotkey-V2/00-LANG.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-{{stub}}AutoHotkey V2 is an [[open source]] programming language for Microsoft [[Windows]].
-
-AutoHotkey v2 is a major update to the AutoHotkey language, which includes numerous new features and improvements.
-
-== Citations ==
-
-* [https://www.autohotkey.com/docs/v2/ Documentation]
-* [http://autohotkey.com/download Downloads]
-* [http://autohotkey.com/docs/scripts/ Script Showcase]
-* [http://autohotkey.com/boards/ New Community forum]
-* [http://www.autohotkey.com/forum/ Archived Community forum]
-* [http://ahkscript.org/foundation AutoHotkey Foundation LLC]
-* [[wp:AutoHotkey|AutoHotkey on Wikipedia]]
-* #ahk on [http://webchat.freenode.net/?channels=%23ahk Freenode Web interface]
-* [[:Category:AutoHotkey_Originated]]
-{{language|Ayrch}}
\ No newline at end of file
diff --git a/Lang/Autohotkey-V2/00-META.yaml b/Lang/Autohotkey-V2/00-META.yaml
deleted file mode 100644
index 651d1bc21b..0000000000
--- a/Lang/Autohotkey-V2/00-META.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
----
-from: http://rosettacode.org/wiki/Category:Autohotkey_V2
diff --git a/Lang/Autohotkey-V2/Hello-world-Graphical b/Lang/Autohotkey-V2/Hello-world-Graphical
deleted file mode 120000
index 0375a8eeb7..0000000000
--- a/Lang/Autohotkey-V2/Hello-world-Graphical
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/Hello-world-Graphical/Autohotkey-V2
\ No newline at end of file
diff --git a/Lang/BASIC/Partition-an-integer-x-into-n-primes b/Lang/BASIC/Partition-an-integer-x-into-n-primes
new file mode 120000
index 0000000000..8db316776d
--- /dev/null
+++ b/Lang/BASIC/Partition-an-integer-x-into-n-primes
@@ -0,0 +1 @@
+../../Task/Partition-an-integer-x-into-n-primes/BASIC
\ No newline at end of file
diff --git a/Lang/BASIC256/Evaluate-binomial-coefficients b/Lang/BASIC256/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..415fd5e54e
--- /dev/null
+++ b/Lang/BASIC256/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/BASIC256
\ No newline at end of file
diff --git a/Lang/BQN/Find-common-directory-path b/Lang/BQN/Find-common-directory-path
new file mode 120000
index 0000000000..d4456eaa79
--- /dev/null
+++ b/Lang/BQN/Find-common-directory-path
@@ -0,0 +1 @@
+../../Task/Find-common-directory-path/BQN
\ No newline at end of file
diff --git a/Lang/BQN/Globally-replace-text-in-several-files b/Lang/BQN/Globally-replace-text-in-several-files
new file mode 120000
index 0000000000..b13db5355b
--- /dev/null
+++ b/Lang/BQN/Globally-replace-text-in-several-files
@@ -0,0 +1 @@
+../../Task/Globally-replace-text-in-several-files/BQN
\ No newline at end of file
diff --git a/Lang/Ballerina/00-LANG.txt b/Lang/Ballerina/00-LANG.txt
index af215acfd5..f56f4083d5 100644
--- a/Lang/Ballerina/00-LANG.txt
+++ b/Lang/Ballerina/00-LANG.txt
@@ -1 +1,17 @@
-{{stub}}{{language|Ballerina}}
\ No newline at end of file
+{{language|Ballerina
+|exec=bytecode
+|strength=strong
+|safety=safe
+|express=explicit
+|checking=static
+|gc=yes
+|hopl=no
+|site=https://ballerina.io
+}}
+'''[https://en.wikipedia.org/wiki/Ballerina_(programming_language) Ballerina]''' is an open source general-purpose programming language designed and supported by [https://wso2.com/ WSO2] for cloud-era application programmers.
+
+It is under development on [https://github.com/ballerina-platform/ballerina-lang GitHub] and is fully documented [https://ballerina.io here].
+
+Ballerina was first publicly announced in 2017 and version 1.0 was released on September 10, 2019. However, a major overhaul took place in 2022 when [https://blog.ballerina.io/posts/2022-02-01-announcing-ballerina-2201.0.0-swan-lake/ Ballerina 2201.0.0 (Swan Lake)] was released.
+
+The current version (2201.12.3) has distributions available for Windows, Linux and macOS and can be downloaded [https://ballerina.io/downloads/ here].
\ No newline at end of file
diff --git a/Lang/Ballerina/A+B b/Lang/Ballerina/A+B
new file mode 120000
index 0000000000..e9aab74a73
--- /dev/null
+++ b/Lang/Ballerina/A+B
@@ -0,0 +1 @@
+../../Task/A+B/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/ABC-problem b/Lang/Ballerina/ABC-problem
new file mode 120000
index 0000000000..49ca7ac9ad
--- /dev/null
+++ b/Lang/Ballerina/ABC-problem
@@ -0,0 +1 @@
+../../Task/ABC-problem/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/AKS-test-for-primes b/Lang/Ballerina/AKS-test-for-primes
new file mode 120000
index 0000000000..9b19f08d80
--- /dev/null
+++ b/Lang/Ballerina/AKS-test-for-primes
@@ -0,0 +1 @@
+../../Task/AKS-test-for-primes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Abundant-deficient-and-perfect-number-classifications b/Lang/Ballerina/Abundant-deficient-and-perfect-number-classifications
new file mode 120000
index 0000000000..b5353658a4
--- /dev/null
+++ b/Lang/Ballerina/Abundant-deficient-and-perfect-number-classifications
@@ -0,0 +1 @@
+../../Task/Abundant-deficient-and-perfect-number-classifications/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Abundant-odd-numbers b/Lang/Ballerina/Abundant-odd-numbers
new file mode 120000
index 0000000000..0b3a97c4a1
--- /dev/null
+++ b/Lang/Ballerina/Abundant-odd-numbers
@@ -0,0 +1 @@
+../../Task/Abundant-odd-numbers/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Accumulator-factory b/Lang/Ballerina/Accumulator-factory
new file mode 120000
index 0000000000..837dbbe6a0
--- /dev/null
+++ b/Lang/Ballerina/Accumulator-factory
@@ -0,0 +1 @@
+../../Task/Accumulator-factory/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Achilles-numbers b/Lang/Ballerina/Achilles-numbers
new file mode 120000
index 0000000000..3336ab1c37
--- /dev/null
+++ b/Lang/Ballerina/Achilles-numbers
@@ -0,0 +1 @@
+../../Task/Achilles-numbers/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Ackermann-function b/Lang/Ballerina/Ackermann-function
new file mode 120000
index 0000000000..b9748d884d
--- /dev/null
+++ b/Lang/Ballerina/Ackermann-function
@@ -0,0 +1 @@
+../../Task/Ackermann-function/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Add-a-variable-to-a-class-instance-at-runtime b/Lang/Ballerina/Add-a-variable-to-a-class-instance-at-runtime
new file mode 120000
index 0000000000..12efd91bd6
--- /dev/null
+++ b/Lang/Ballerina/Add-a-variable-to-a-class-instance-at-runtime
@@ -0,0 +1 @@
+../../Task/Add-a-variable-to-a-class-instance-at-runtime/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Additive-primes b/Lang/Ballerina/Additive-primes
new file mode 120000
index 0000000000..a504210ea7
--- /dev/null
+++ b/Lang/Ballerina/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Address-of-a-variable b/Lang/Ballerina/Address-of-a-variable
new file mode 120000
index 0000000000..6428e75ce3
--- /dev/null
+++ b/Lang/Ballerina/Address-of-a-variable
@@ -0,0 +1 @@
+../../Task/Address-of-a-variable/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Almost-prime b/Lang/Ballerina/Almost-prime
new file mode 120000
index 0000000000..33d501af1e
--- /dev/null
+++ b/Lang/Ballerina/Almost-prime
@@ -0,0 +1 @@
+../../Task/Almost-prime/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Amb b/Lang/Ballerina/Amb
new file mode 120000
index 0000000000..7acc58d7c4
--- /dev/null
+++ b/Lang/Ballerina/Amb
@@ -0,0 +1 @@
+../../Task/Amb/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Angle-difference-between-two-bearings b/Lang/Ballerina/Angle-difference-between-two-bearings
new file mode 120000
index 0000000000..04ff00d986
--- /dev/null
+++ b/Lang/Ballerina/Angle-difference-between-two-bearings
@@ -0,0 +1 @@
+../../Task/Angle-difference-between-two-bearings/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Anti-primes b/Lang/Ballerina/Anti-primes
new file mode 120000
index 0000000000..9911fc0bcb
--- /dev/null
+++ b/Lang/Ballerina/Anti-primes
@@ -0,0 +1 @@
+../../Task/Anti-primes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Apply-a-callback-to-an-array b/Lang/Ballerina/Apply-a-callback-to-an-array
new file mode 120000
index 0000000000..9911480671
--- /dev/null
+++ b/Lang/Ballerina/Apply-a-callback-to-an-array
@@ -0,0 +1 @@
+../../Task/Apply-a-callback-to-an-array/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Approximate-equality b/Lang/Ballerina/Approximate-equality
new file mode 120000
index 0000000000..0ea6692d0d
--- /dev/null
+++ b/Lang/Ballerina/Approximate-equality
@@ -0,0 +1 @@
+../../Task/Approximate-equality/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Arithmetic-Complex b/Lang/Ballerina/Arithmetic-Complex
new file mode 120000
index 0000000000..f87fd15204
--- /dev/null
+++ b/Lang/Ballerina/Arithmetic-Complex
@@ -0,0 +1 @@
+../../Task/Arithmetic-Complex/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Arithmetic-Integer b/Lang/Ballerina/Arithmetic-Integer
new file mode 120000
index 0000000000..a4c8cf5206
--- /dev/null
+++ b/Lang/Ballerina/Arithmetic-Integer
@@ -0,0 +1 @@
+../../Task/Arithmetic-Integer/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Arithmetic-Rational b/Lang/Ballerina/Arithmetic-Rational
new file mode 120000
index 0000000000..422af5f88b
--- /dev/null
+++ b/Lang/Ballerina/Arithmetic-Rational
@@ -0,0 +1 @@
+../../Task/Arithmetic-Rational/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Arithmetic-numbers b/Lang/Ballerina/Arithmetic-numbers
new file mode 120000
index 0000000000..38541780a0
--- /dev/null
+++ b/Lang/Ballerina/Arithmetic-numbers
@@ -0,0 +1 @@
+../../Task/Arithmetic-numbers/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Array-concatenation b/Lang/Ballerina/Array-concatenation
new file mode 120000
index 0000000000..41c2603b74
--- /dev/null
+++ b/Lang/Ballerina/Array-concatenation
@@ -0,0 +1 @@
+../../Task/Array-concatenation/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Array-length b/Lang/Ballerina/Array-length
new file mode 120000
index 0000000000..25020148f9
--- /dev/null
+++ b/Lang/Ballerina/Array-length
@@ -0,0 +1 @@
+../../Task/Array-length/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Arrays b/Lang/Ballerina/Arrays
new file mode 120000
index 0000000000..ec5c5a266e
--- /dev/null
+++ b/Lang/Ballerina/Arrays
@@ -0,0 +1 @@
+../../Task/Arrays/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Ascending-primes b/Lang/Ballerina/Ascending-primes
new file mode 120000
index 0000000000..51444ceb96
--- /dev/null
+++ b/Lang/Ballerina/Ascending-primes
@@ -0,0 +1 @@
+../../Task/Ascending-primes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Associative-array-Creation b/Lang/Ballerina/Associative-array-Creation
new file mode 120000
index 0000000000..2639b285f3
--- /dev/null
+++ b/Lang/Ballerina/Associative-array-Creation
@@ -0,0 +1 @@
+../../Task/Associative-array-Creation/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Associative-array-Iteration b/Lang/Ballerina/Associative-array-Iteration
new file mode 120000
index 0000000000..d3e31d2374
--- /dev/null
+++ b/Lang/Ballerina/Associative-array-Iteration
@@ -0,0 +1 @@
+../../Task/Associative-array-Iteration/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Associative-array-Merging b/Lang/Ballerina/Associative-array-Merging
new file mode 120000
index 0000000000..cd38137d75
--- /dev/null
+++ b/Lang/Ballerina/Associative-array-Merging
@@ -0,0 +1 @@
+../../Task/Associative-array-Merging/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Arithmetic-mean b/Lang/Ballerina/Averages-Arithmetic-mean
new file mode 120000
index 0000000000..039d1f0de8
--- /dev/null
+++ b/Lang/Ballerina/Averages-Arithmetic-mean
@@ -0,0 +1 @@
+../../Task/Averages-Arithmetic-mean/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Mean-angle b/Lang/Ballerina/Averages-Mean-angle
new file mode 120000
index 0000000000..adf77693ce
--- /dev/null
+++ b/Lang/Ballerina/Averages-Mean-angle
@@ -0,0 +1 @@
+../../Task/Averages-Mean-angle/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Mean-time-of-day b/Lang/Ballerina/Averages-Mean-time-of-day
new file mode 120000
index 0000000000..c969ed84e4
--- /dev/null
+++ b/Lang/Ballerina/Averages-Mean-time-of-day
@@ -0,0 +1 @@
+../../Task/Averages-Mean-time-of-day/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Median b/Lang/Ballerina/Averages-Median
new file mode 120000
index 0000000000..5bbd39cecb
--- /dev/null
+++ b/Lang/Ballerina/Averages-Median
@@ -0,0 +1 @@
+../../Task/Averages-Median/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Mode b/Lang/Ballerina/Averages-Mode
new file mode 120000
index 0000000000..72d0e02dae
--- /dev/null
+++ b/Lang/Ballerina/Averages-Mode
@@ -0,0 +1 @@
+../../Task/Averages-Mode/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Pythagorean-means b/Lang/Ballerina/Averages-Pythagorean-means
new file mode 120000
index 0000000000..fd607a9ee8
--- /dev/null
+++ b/Lang/Ballerina/Averages-Pythagorean-means
@@ -0,0 +1 @@
+../../Task/Averages-Pythagorean-means/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Root-mean-square b/Lang/Ballerina/Averages-Root-mean-square
new file mode 120000
index 0000000000..48056410d9
--- /dev/null
+++ b/Lang/Ballerina/Averages-Root-mean-square
@@ -0,0 +1 @@
+../../Task/Averages-Root-mean-square/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Averages-Simple-moving-average b/Lang/Ballerina/Averages-Simple-moving-average
new file mode 120000
index 0000000000..7e2849cced
--- /dev/null
+++ b/Lang/Ballerina/Averages-Simple-moving-average
@@ -0,0 +1 @@
+../../Task/Averages-Simple-moving-average/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Balanced-brackets b/Lang/Ballerina/Balanced-brackets
new file mode 120000
index 0000000000..3d78b77dd3
--- /dev/null
+++ b/Lang/Ballerina/Balanced-brackets
@@ -0,0 +1 @@
+../../Task/Balanced-brackets/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Boolean-values b/Lang/Ballerina/Boolean-values
new file mode 120000
index 0000000000..c01657f16a
--- /dev/null
+++ b/Lang/Ballerina/Boolean-values
@@ -0,0 +1 @@
+../../Task/Boolean-values/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Caesar-cipher b/Lang/Ballerina/Caesar-cipher
new file mode 120000
index 0000000000..8e1a6603e9
--- /dev/null
+++ b/Lang/Ballerina/Caesar-cipher
@@ -0,0 +1 @@
+../../Task/Caesar-cipher/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Calculating-the-value-of-e b/Lang/Ballerina/Calculating-the-value-of-e
new file mode 120000
index 0000000000..af3085b824
--- /dev/null
+++ b/Lang/Ballerina/Calculating-the-value-of-e
@@ -0,0 +1 @@
+../../Task/Calculating-the-value-of-e/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Case-sensitivity-of-identifiers b/Lang/Ballerina/Case-sensitivity-of-identifiers
new file mode 120000
index 0000000000..42725d41da
--- /dev/null
+++ b/Lang/Ballerina/Case-sensitivity-of-identifiers
@@ -0,0 +1 @@
+../../Task/Case-sensitivity-of-identifiers/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Character-codes b/Lang/Ballerina/Character-codes
new file mode 120000
index 0000000000..6abede048f
--- /dev/null
+++ b/Lang/Ballerina/Character-codes
@@ -0,0 +1 @@
+../../Task/Character-codes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Classes b/Lang/Ballerina/Classes
new file mode 120000
index 0000000000..0c8bd2434d
--- /dev/null
+++ b/Lang/Ballerina/Classes
@@ -0,0 +1 @@
+../../Task/Classes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Count-in-octal b/Lang/Ballerina/Count-in-octal
new file mode 120000
index 0000000000..7e70a67830
--- /dev/null
+++ b/Lang/Ballerina/Count-in-octal
@@ -0,0 +1 @@
+../../Task/Count-in-octal/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Currency b/Lang/Ballerina/Currency
new file mode 120000
index 0000000000..2b278dfa20
--- /dev/null
+++ b/Lang/Ballerina/Currency
@@ -0,0 +1 @@
+../../Task/Currency/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Currying b/Lang/Ballerina/Currying
new file mode 120000
index 0000000000..7e465c7834
--- /dev/null
+++ b/Lang/Ballerina/Currying
@@ -0,0 +1 @@
+../../Task/Currying/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Dynamic-variable-names b/Lang/Ballerina/Dynamic-variable-names
new file mode 120000
index 0000000000..5c549728ae
--- /dev/null
+++ b/Lang/Ballerina/Dynamic-variable-names
@@ -0,0 +1 @@
+../../Task/Dynamic-variable-names/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Empty-string b/Lang/Ballerina/Empty-string
new file mode 120000
index 0000000000..a86a0ffc9d
--- /dev/null
+++ b/Lang/Ballerina/Empty-string
@@ -0,0 +1 @@
+../../Task/Empty-string/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Extreme-floating-point-values b/Lang/Ballerina/Extreme-floating-point-values
new file mode 120000
index 0000000000..7f91d37268
--- /dev/null
+++ b/Lang/Ballerina/Extreme-floating-point-values
@@ -0,0 +1 @@
+../../Task/Extreme-floating-point-values/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Farey-sequence b/Lang/Ballerina/Farey-sequence
new file mode 120000
index 0000000000..d542459c5f
--- /dev/null
+++ b/Lang/Ballerina/Farey-sequence
@@ -0,0 +1 @@
+../../Task/Farey-sequence/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Find-limit-of-recursion b/Lang/Ballerina/Find-limit-of-recursion
new file mode 120000
index 0000000000..0c9c45aca0
--- /dev/null
+++ b/Lang/Ballerina/Find-limit-of-recursion
@@ -0,0 +1 @@
+../../Task/Find-limit-of-recursion/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Fivenum b/Lang/Ballerina/Fivenum
new file mode 120000
index 0000000000..0df90aeb78
--- /dev/null
+++ b/Lang/Ballerina/Fivenum
@@ -0,0 +1 @@
+../../Task/Fivenum/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Floyds-triangle b/Lang/Ballerina/Floyds-triangle
new file mode 120000
index 0000000000..524ef8d9d5
--- /dev/null
+++ b/Lang/Ballerina/Floyds-triangle
@@ -0,0 +1 @@
+../../Task/Floyds-triangle/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Four-bit-adder b/Lang/Ballerina/Four-bit-adder
new file mode 120000
index 0000000000..da1ccb0292
--- /dev/null
+++ b/Lang/Ballerina/Four-bit-adder
@@ -0,0 +1 @@
+../../Task/Four-bit-adder/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Function-definition b/Lang/Ballerina/Function-definition
new file mode 120000
index 0000000000..aad5e07c0c
--- /dev/null
+++ b/Lang/Ballerina/Function-definition
@@ -0,0 +1 @@
+../../Task/Function-definition/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Gapful-numbers b/Lang/Ballerina/Gapful-numbers
new file mode 120000
index 0000000000..16bb3670f6
--- /dev/null
+++ b/Lang/Ballerina/Gapful-numbers
@@ -0,0 +1 @@
+../../Task/Gapful-numbers/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Greatest-subsequential-sum b/Lang/Ballerina/Greatest-subsequential-sum
new file mode 120000
index 0000000000..edc1a686d7
--- /dev/null
+++ b/Lang/Ballerina/Greatest-subsequential-sum
@@ -0,0 +1 @@
+../../Task/Greatest-subsequential-sum/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Hailstone-sequence b/Lang/Ballerina/Hailstone-sequence
new file mode 120000
index 0000000000..41dfb14066
--- /dev/null
+++ b/Lang/Ballerina/Hailstone-sequence
@@ -0,0 +1 @@
+../../Task/Hailstone-sequence/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Hello-world-Newline-omission b/Lang/Ballerina/Hello-world-Newline-omission
new file mode 120000
index 0000000000..1016c5553e
--- /dev/null
+++ b/Lang/Ballerina/Hello-world-Newline-omission
@@ -0,0 +1 @@
+../../Task/Hello-world-Newline-omission/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Hello-world-Standard-error b/Lang/Ballerina/Hello-world-Standard-error
new file mode 120000
index 0000000000..c4921dce1f
--- /dev/null
+++ b/Lang/Ballerina/Hello-world-Standard-error
@@ -0,0 +1 @@
+../../Task/Hello-world-Standard-error/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Levenshtein-distance b/Lang/Ballerina/Levenshtein-distance
new file mode 120000
index 0000000000..4824e03354
--- /dev/null
+++ b/Lang/Ballerina/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loop-over-multiple-arrays-simultaneously b/Lang/Ballerina/Loop-over-multiple-arrays-simultaneously
new file mode 120000
index 0000000000..9b68d094d5
--- /dev/null
+++ b/Lang/Ballerina/Loop-over-multiple-arrays-simultaneously
@@ -0,0 +1 @@
+../../Task/Loop-over-multiple-arrays-simultaneously/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Break b/Lang/Ballerina/Loops-Break
new file mode 120000
index 0000000000..6ab612b087
--- /dev/null
+++ b/Lang/Ballerina/Loops-Break
@@ -0,0 +1 @@
+../../Task/Loops-Break/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Continue b/Lang/Ballerina/Loops-Continue
new file mode 120000
index 0000000000..175be123b9
--- /dev/null
+++ b/Lang/Ballerina/Loops-Continue
@@ -0,0 +1 @@
+../../Task/Loops-Continue/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Do-while b/Lang/Ballerina/Loops-Do-while
new file mode 120000
index 0000000000..b90c6b3171
--- /dev/null
+++ b/Lang/Ballerina/Loops-Do-while
@@ -0,0 +1 @@
+../../Task/Loops-Do-while/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Downward-for b/Lang/Ballerina/Loops-Downward-for
new file mode 120000
index 0000000000..e977389f54
--- /dev/null
+++ b/Lang/Ballerina/Loops-Downward-for
@@ -0,0 +1 @@
+../../Task/Loops-Downward-for/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-For b/Lang/Ballerina/Loops-For
new file mode 120000
index 0000000000..8ad2b8fd0c
--- /dev/null
+++ b/Lang/Ballerina/Loops-For
@@ -0,0 +1 @@
+../../Task/Loops-For/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-For-with-a-specified-step b/Lang/Ballerina/Loops-For-with-a-specified-step
new file mode 120000
index 0000000000..cc892dc7f2
--- /dev/null
+++ b/Lang/Ballerina/Loops-For-with-a-specified-step
@@ -0,0 +1 @@
+../../Task/Loops-For-with-a-specified-step/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Foreach b/Lang/Ballerina/Loops-Foreach
new file mode 120000
index 0000000000..f819fadabe
--- /dev/null
+++ b/Lang/Ballerina/Loops-Foreach
@@ -0,0 +1 @@
+../../Task/Loops-Foreach/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Increment-loop-index-within-loop-body b/Lang/Ballerina/Loops-Increment-loop-index-within-loop-body
new file mode 120000
index 0000000000..1c9b81a58a
--- /dev/null
+++ b/Lang/Ballerina/Loops-Increment-loop-index-within-loop-body
@@ -0,0 +1 @@
+../../Task/Loops-Increment-loop-index-within-loop-body/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Infinite b/Lang/Ballerina/Loops-Infinite
new file mode 120000
index 0000000000..312369ce48
--- /dev/null
+++ b/Lang/Ballerina/Loops-Infinite
@@ -0,0 +1 @@
+../../Task/Loops-Infinite/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-N-plus-one-half b/Lang/Ballerina/Loops-N-plus-one-half
new file mode 120000
index 0000000000..220ecbad7f
--- /dev/null
+++ b/Lang/Ballerina/Loops-N-plus-one-half
@@ -0,0 +1 @@
+../../Task/Loops-N-plus-one-half/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Nested b/Lang/Ballerina/Loops-Nested
new file mode 120000
index 0000000000..f32c9a3c17
--- /dev/null
+++ b/Lang/Ballerina/Loops-Nested
@@ -0,0 +1 @@
+../../Task/Loops-Nested/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-With-multiple-ranges b/Lang/Ballerina/Loops-With-multiple-ranges
new file mode 120000
index 0000000000..2fad29a9f9
--- /dev/null
+++ b/Lang/Ballerina/Loops-With-multiple-ranges
@@ -0,0 +1 @@
+../../Task/Loops-With-multiple-ranges/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Loops-Wrong-ranges b/Lang/Ballerina/Loops-Wrong-ranges
new file mode 120000
index 0000000000..6c8ada2aa7
--- /dev/null
+++ b/Lang/Ballerina/Loops-Wrong-ranges
@@ -0,0 +1 @@
+../../Task/Loops-Wrong-ranges/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Stack b/Lang/Ballerina/Stack
new file mode 120000
index 0000000000..e073045735
--- /dev/null
+++ b/Lang/Ballerina/Stack
@@ -0,0 +1 @@
+../../Task/Stack/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Statistics-Basic b/Lang/Ballerina/Statistics-Basic
new file mode 120000
index 0000000000..7ef892b782
--- /dev/null
+++ b/Lang/Ballerina/Statistics-Basic
@@ -0,0 +1 @@
+../../Task/Statistics-Basic/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Towers-of-Hanoi b/Lang/Ballerina/Towers-of-Hanoi
new file mode 120000
index 0000000000..81bf7985bd
--- /dev/null
+++ b/Lang/Ballerina/Towers-of-Hanoi
@@ -0,0 +1 @@
+../../Task/Towers-of-Hanoi/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Truncatable-primes b/Lang/Ballerina/Truncatable-primes
new file mode 120000
index 0000000000..044dcb5d58
--- /dev/null
+++ b/Lang/Ballerina/Truncatable-primes
@@ -0,0 +1 @@
+../../Task/Truncatable-primes/Ballerina
\ No newline at end of file
diff --git a/Lang/Ballerina/Unicode-variable-names b/Lang/Ballerina/Unicode-variable-names
new file mode 120000
index 0000000000..7f61255815
--- /dev/null
+++ b/Lang/Ballerina/Unicode-variable-names
@@ -0,0 +1 @@
+../../Task/Unicode-variable-names/Ballerina
\ No newline at end of file
diff --git a/Lang/C++/Currency b/Lang/C++/Currency
new file mode 120000
index 0000000000..ae0e8d6190
--- /dev/null
+++ b/Lang/C++/Currency
@@ -0,0 +1 @@
+../../Task/Currency/C++
\ No newline at end of file
diff --git a/Lang/C++/Strassens-algorithm b/Lang/C++/Strassens-algorithm
new file mode 120000
index 0000000000..1423f44a39
--- /dev/null
+++ b/Lang/C++/Strassens-algorithm
@@ -0,0 +1 @@
+../../Task/Strassens-algorithm/C++
\ No newline at end of file
diff --git a/Lang/C-sharp/ADFGVX-cipher b/Lang/C-sharp/ADFGVX-cipher
new file mode 120000
index 0000000000..1bd5856497
--- /dev/null
+++ b/Lang/C-sharp/ADFGVX-cipher
@@ -0,0 +1 @@
+../../Task/ADFGVX-cipher/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/ASCII-art-diagram-converter b/Lang/C-sharp/ASCII-art-diagram-converter
new file mode 120000
index 0000000000..a3c0a49ccd
--- /dev/null
+++ b/Lang/C-sharp/ASCII-art-diagram-converter
@@ -0,0 +1 @@
+../../Task/ASCII-art-diagram-converter/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Arithmetic-derivative b/Lang/C-sharp/Arithmetic-derivative
new file mode 120000
index 0000000000..99fc50446f
--- /dev/null
+++ b/Lang/C-sharp/Arithmetic-derivative
@@ -0,0 +1 @@
+../../Task/Arithmetic-derivative/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Boyer-Moore-string-search b/Lang/C-sharp/Boyer-Moore-string-search
new file mode 120000
index 0000000000..6d8ebe0502
--- /dev/null
+++ b/Lang/C-sharp/Boyer-Moore-string-search
@@ -0,0 +1 @@
+../../Task/Boyer-Moore-string-search/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Calkin-Wilf-sequence b/Lang/C-sharp/Calkin-Wilf-sequence
new file mode 120000
index 0000000000..75d6e98750
--- /dev/null
+++ b/Lang/C-sharp/Calkin-Wilf-sequence
@@ -0,0 +1 @@
+../../Task/Calkin-Wilf-sequence/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Continued-fraction-Arithmetic-G-matrix-ng-continued-fraction-n- b/Lang/C-sharp/Continued-fraction-Arithmetic-G-matrix-ng-continued-fraction-n-
new file mode 120000
index 0000000000..2adfbd6635
--- /dev/null
+++ b/Lang/C-sharp/Continued-fraction-Arithmetic-G-matrix-ng-continued-fraction-n-
@@ -0,0 +1 @@
+../../Task/Continued-fraction-Arithmetic-G-matrix-ng-continued-fraction-n-/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Elliptic-Curve-Digital-Signature-Algorithm b/Lang/C-sharp/Elliptic-Curve-Digital-Signature-Algorithm
new file mode 120000
index 0000000000..82412a8f32
--- /dev/null
+++ b/Lang/C-sharp/Elliptic-Curve-Digital-Signature-Algorithm
@@ -0,0 +1 @@
+../../Task/Elliptic-Curve-Digital-Signature-Algorithm/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Execute-a-Markov-algorithm b/Lang/C-sharp/Execute-a-Markov-algorithm
new file mode 120000
index 0000000000..fac2e3f425
--- /dev/null
+++ b/Lang/C-sharp/Execute-a-Markov-algorithm
@@ -0,0 +1 @@
+../../Task/Execute-a-Markov-algorithm/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Extensible-prime-generator b/Lang/C-sharp/Extensible-prime-generator
new file mode 120000
index 0000000000..1e4636d3bb
--- /dev/null
+++ b/Lang/C-sharp/Extensible-prime-generator
@@ -0,0 +1 @@
+../../Task/Extensible-prime-generator/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/File-extension-is-in-extensions-list b/Lang/C-sharp/File-extension-is-in-extensions-list
new file mode 120000
index 0000000000..caec470709
--- /dev/null
+++ b/Lang/C-sharp/File-extension-is-in-extensions-list
@@ -0,0 +1 @@
+../../Task/File-extension-is-in-extensions-list/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Find-if-a-point-is-within-a-triangle b/Lang/C-sharp/Find-if-a-point-is-within-a-triangle
new file mode 120000
index 0000000000..0c9dec87d9
--- /dev/null
+++ b/Lang/C-sharp/Find-if-a-point-is-within-a-triangle
@@ -0,0 +1 @@
+../../Task/Find-if-a-point-is-within-a-triangle/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Gotchas b/Lang/C-sharp/Gotchas
new file mode 120000
index 0000000000..c20938cf21
--- /dev/null
+++ b/Lang/C-sharp/Gotchas
@@ -0,0 +1 @@
+../../Task/Gotchas/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Index-finite-lists-of-positive-integers b/Lang/C-sharp/Index-finite-lists-of-positive-integers
new file mode 120000
index 0000000000..692e611ddc
--- /dev/null
+++ b/Lang/C-sharp/Index-finite-lists-of-positive-integers
@@ -0,0 +1 @@
+../../Task/Index-finite-lists-of-positive-integers/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/K-d-tree b/Lang/C-sharp/K-d-tree
new file mode 120000
index 0000000000..9ea6355b83
--- /dev/null
+++ b/Lang/C-sharp/K-d-tree
@@ -0,0 +1 @@
+../../Task/K-d-tree/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Longest-string-challenge b/Lang/C-sharp/Longest-string-challenge
new file mode 120000
index 0000000000..bd57b65702
--- /dev/null
+++ b/Lang/C-sharp/Longest-string-challenge
@@ -0,0 +1 @@
+../../Task/Longest-string-challenge/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/P-Adic-numbers-basic b/Lang/C-sharp/P-Adic-numbers-basic
new file mode 120000
index 0000000000..564565afb6
--- /dev/null
+++ b/Lang/C-sharp/P-Adic-numbers-basic
@@ -0,0 +1 @@
+../../Task/P-Adic-numbers-basic/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Reflection-Get-source b/Lang/C-sharp/Reflection-Get-source
new file mode 120000
index 0000000000..a8b2f45e4c
--- /dev/null
+++ b/Lang/C-sharp/Reflection-Get-source
@@ -0,0 +1 @@
+../../Task/Reflection-Get-source/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Sequence:-smallest-number-with-exactly-n-divisors b/Lang/C-sharp/Sequence:-smallest-number-with-exactly-n-divisors
new file mode 120000
index 0000000000..71508d1c44
--- /dev/null
+++ b/Lang/C-sharp/Sequence:-smallest-number-with-exactly-n-divisors
@@ -0,0 +1 @@
+../../Task/Sequence:-smallest-number-with-exactly-n-divisors/C-sharp
\ No newline at end of file
diff --git a/Lang/C-sharp/Strassens-algorithm b/Lang/C-sharp/Strassens-algorithm
new file mode 120000
index 0000000000..45fd91dfa9
--- /dev/null
+++ b/Lang/C-sharp/Strassens-algorithm
@@ -0,0 +1 @@
+../../Task/Strassens-algorithm/C-sharp
\ No newline at end of file
diff --git a/Lang/C/Color-wheel b/Lang/C/Color-wheel
new file mode 120000
index 0000000000..9d6561adcd
--- /dev/null
+++ b/Lang/C/Color-wheel
@@ -0,0 +1 @@
+../../Task/Color-wheel/C
\ No newline at end of file
diff --git a/Lang/C/Magic-constant b/Lang/C/Magic-constant
new file mode 120000
index 0000000000..3d29fd6624
--- /dev/null
+++ b/Lang/C/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/C
\ No newline at end of file
diff --git a/Lang/C3/Binary-digits b/Lang/C3/Binary-digits
new file mode 120000
index 0000000000..34a04afae2
--- /dev/null
+++ b/Lang/C3/Binary-digits
@@ -0,0 +1 @@
+../../Task/Binary-digits/C3
\ No newline at end of file
diff --git a/Lang/Chipmunk-Basic/Evaluate-binomial-coefficients b/Lang/Chipmunk-Basic/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..b45aed06e2
--- /dev/null
+++ b/Lang/Chipmunk-Basic/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/Chipmunk-Basic
\ No newline at end of file
diff --git a/Lang/Crystal/Abbreviations-easy b/Lang/Crystal/Abbreviations-easy
new file mode 120000
index 0000000000..b3a87e7119
--- /dev/null
+++ b/Lang/Crystal/Abbreviations-easy
@@ -0,0 +1 @@
+../../Task/Abbreviations-easy/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Anagrams-Deranged-anagrams b/Lang/Crystal/Anagrams-Deranged-anagrams
new file mode 120000
index 0000000000..01826ee4a9
--- /dev/null
+++ b/Lang/Crystal/Anagrams-Deranged-anagrams
@@ -0,0 +1 @@
+../../Task/Anagrams-Deranged-anagrams/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Arithmetic-Complex b/Lang/Crystal/Arithmetic-Complex
new file mode 120000
index 0000000000..db70676449
--- /dev/null
+++ b/Lang/Crystal/Arithmetic-Complex
@@ -0,0 +1 @@
+../../Task/Arithmetic-Complex/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Arithmetic-geometric-mean b/Lang/Crystal/Arithmetic-geometric-mean
new file mode 120000
index 0000000000..c8754aa805
--- /dev/null
+++ b/Lang/Crystal/Arithmetic-geometric-mean
@@ -0,0 +1 @@
+../../Task/Arithmetic-geometric-mean/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Averages-Mode b/Lang/Crystal/Averages-Mode
new file mode 120000
index 0000000000..bb15fa305b
--- /dev/null
+++ b/Lang/Crystal/Averages-Mode
@@ -0,0 +1 @@
+../../Task/Averages-Mode/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Averages-Pythagorean-means b/Lang/Crystal/Averages-Pythagorean-means
new file mode 120000
index 0000000000..a97d5df819
--- /dev/null
+++ b/Lang/Crystal/Averages-Pythagorean-means
@@ -0,0 +1 @@
+../../Task/Averages-Pythagorean-means/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Bin-given-limits b/Lang/Crystal/Bin-given-limits
new file mode 120000
index 0000000000..40a049c833
--- /dev/null
+++ b/Lang/Crystal/Bin-given-limits
@@ -0,0 +1 @@
+../../Task/Bin-given-limits/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Character-codes b/Lang/Crystal/Character-codes
new file mode 120000
index 0000000000..bd4879b77c
--- /dev/null
+++ b/Lang/Crystal/Character-codes
@@ -0,0 +1 @@
+../../Task/Character-codes/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Cistercian-numerals b/Lang/Crystal/Cistercian-numerals
new file mode 120000
index 0000000000..b439a8a963
--- /dev/null
+++ b/Lang/Crystal/Cistercian-numerals
@@ -0,0 +1 @@
+../../Task/Cistercian-numerals/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Closures-Value-capture b/Lang/Crystal/Closures-Value-capture
new file mode 120000
index 0000000000..f3038be393
--- /dev/null
+++ b/Lang/Crystal/Closures-Value-capture
@@ -0,0 +1 @@
+../../Task/Closures-Value-capture/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Comma-quibbling b/Lang/Crystal/Comma-quibbling
new file mode 120000
index 0000000000..3151a9c58f
--- /dev/null
+++ b/Lang/Crystal/Comma-quibbling
@@ -0,0 +1 @@
+../../Task/Comma-quibbling/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Convert-seconds-to-compound-duration b/Lang/Crystal/Convert-seconds-to-compound-duration
new file mode 120000
index 0000000000..313254bee3
--- /dev/null
+++ b/Lang/Crystal/Convert-seconds-to-compound-duration
@@ -0,0 +1 @@
+../../Task/Convert-seconds-to-compound-duration/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Determine-if-a-string-has-all-the-same-characters b/Lang/Crystal/Determine-if-a-string-has-all-the-same-characters
new file mode 120000
index 0000000000..a0bef4d19a
--- /dev/null
+++ b/Lang/Crystal/Determine-if-a-string-has-all-the-same-characters
@@ -0,0 +1 @@
+../../Task/Determine-if-a-string-has-all-the-same-characters/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Determine-if-a-string-is-collapsible b/Lang/Crystal/Determine-if-a-string-is-collapsible
new file mode 120000
index 0000000000..7e2d57c2cb
--- /dev/null
+++ b/Lang/Crystal/Determine-if-a-string-is-collapsible
@@ -0,0 +1 @@
+../../Task/Determine-if-a-string-is-collapsible/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Dijkstras-algorithm b/Lang/Crystal/Dijkstras-algorithm
new file mode 120000
index 0000000000..829bbaa132
--- /dev/null
+++ b/Lang/Crystal/Dijkstras-algorithm
@@ -0,0 +1 @@
+../../Task/Dijkstras-algorithm/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Dutch-national-flag-problem b/Lang/Crystal/Dutch-national-flag-problem
new file mode 120000
index 0000000000..a920e0b89a
--- /dev/null
+++ b/Lang/Crystal/Dutch-national-flag-problem
@@ -0,0 +1 @@
+../../Task/Dutch-national-flag-problem/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Execute-Brain- b/Lang/Crystal/Execute-Brain-
new file mode 120000
index 0000000000..4ffee47edd
--- /dev/null
+++ b/Lang/Crystal/Execute-Brain-
@@ -0,0 +1 @@
+../../Task/Execute-Brain-/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Hello-world-Standard-error b/Lang/Crystal/Hello-world-Standard-error
new file mode 120000
index 0000000000..560e23c97c
--- /dev/null
+++ b/Lang/Crystal/Hello-world-Standard-error
@@ -0,0 +1 @@
+../../Task/Hello-world-Standard-error/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Hex-words b/Lang/Crystal/Hex-words
new file mode 120000
index 0000000000..1390f8d3e3
--- /dev/null
+++ b/Lang/Crystal/Hex-words
@@ -0,0 +1 @@
+../../Task/Hex-words/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Increment-a-numerical-string b/Lang/Crystal/Increment-a-numerical-string
new file mode 120000
index 0000000000..aeae95c765
--- /dev/null
+++ b/Lang/Crystal/Increment-a-numerical-string
@@ -0,0 +1 @@
+../../Task/Increment-a-numerical-string/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Interactive-programming-repl- b/Lang/Crystal/Interactive-programming-repl-
new file mode 120000
index 0000000000..348f845b57
--- /dev/null
+++ b/Lang/Crystal/Interactive-programming-repl-
@@ -0,0 +1 @@
+../../Task/Interactive-programming-repl-/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Loops-N-plus-one-half b/Lang/Crystal/Loops-N-plus-one-half
new file mode 120000
index 0000000000..baee612204
--- /dev/null
+++ b/Lang/Crystal/Loops-N-plus-one-half
@@ -0,0 +1 @@
+../../Task/Loops-N-plus-one-half/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Magic-8-ball b/Lang/Crystal/Magic-8-ball
new file mode 120000
index 0000000000..7694de9dbd
--- /dev/null
+++ b/Lang/Crystal/Magic-8-ball
@@ -0,0 +1 @@
+../../Task/Magic-8-ball/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Non-decimal-radices-Convert b/Lang/Crystal/Non-decimal-radices-Convert
new file mode 120000
index 0000000000..342df0f845
--- /dev/null
+++ b/Lang/Crystal/Non-decimal-radices-Convert
@@ -0,0 +1 @@
+../../Task/Non-decimal-radices-Convert/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Order-by-pair-comparisons b/Lang/Crystal/Order-by-pair-comparisons
new file mode 120000
index 0000000000..7f819e26a0
--- /dev/null
+++ b/Lang/Crystal/Order-by-pair-comparisons
@@ -0,0 +1 @@
+../../Task/Order-by-pair-comparisons/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Order-two-numerical-lists b/Lang/Crystal/Order-two-numerical-lists
new file mode 120000
index 0000000000..44bdc040e5
--- /dev/null
+++ b/Lang/Crystal/Order-two-numerical-lists
@@ -0,0 +1 @@
+../../Task/Order-two-numerical-lists/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Phrase-reversals b/Lang/Crystal/Phrase-reversals
new file mode 120000
index 0000000000..7a12cc6718
--- /dev/null
+++ b/Lang/Crystal/Phrase-reversals
@@ -0,0 +1 @@
+../../Task/Phrase-reversals/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Power-set b/Lang/Crystal/Power-set
new file mode 120000
index 0000000000..0fd70fd5b9
--- /dev/null
+++ b/Lang/Crystal/Power-set
@@ -0,0 +1 @@
+../../Task/Power-set/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Run-length-encoding b/Lang/Crystal/Run-length-encoding
new file mode 120000
index 0000000000..1a2b6b241a
--- /dev/null
+++ b/Lang/Crystal/Run-length-encoding
@@ -0,0 +1 @@
+../../Task/Run-length-encoding/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Sort-an-array-of-composite-structures b/Lang/Crystal/Sort-an-array-of-composite-structures
new file mode 120000
index 0000000000..5ea781aef9
--- /dev/null
+++ b/Lang/Crystal/Sort-an-array-of-composite-structures
@@ -0,0 +1 @@
+../../Task/Sort-an-array-of-composite-structures/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Sort-numbers-lexicographically b/Lang/Crystal/Sort-numbers-lexicographically
new file mode 120000
index 0000000000..884dc88521
--- /dev/null
+++ b/Lang/Crystal/Sort-numbers-lexicographically
@@ -0,0 +1 @@
+../../Task/Sort-numbers-lexicographically/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Sort-three-variables b/Lang/Crystal/Sort-three-variables
new file mode 120000
index 0000000000..e206daaf02
--- /dev/null
+++ b/Lang/Crystal/Sort-three-variables
@@ -0,0 +1 @@
+../../Task/Sort-three-variables/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Sorting-Algorithms-Circle-Sort b/Lang/Crystal/Sorting-Algorithms-Circle-Sort
new file mode 120000
index 0000000000..2618e0f461
--- /dev/null
+++ b/Lang/Crystal/Sorting-Algorithms-Circle-Sort
@@ -0,0 +1 @@
+../../Task/Sorting-Algorithms-Circle-Sort/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Sorting-algorithms-Bubble-sort b/Lang/Crystal/Sorting-algorithms-Bubble-sort
new file mode 120000
index 0000000000..88a150acfe
--- /dev/null
+++ b/Lang/Crystal/Sorting-algorithms-Bubble-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Bubble-sort/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Split-a-character-string-based-on-change-of-character b/Lang/Crystal/Split-a-character-string-based-on-change-of-character
new file mode 120000
index 0000000000..874feaced9
--- /dev/null
+++ b/Lang/Crystal/Split-a-character-string-based-on-change-of-character
@@ -0,0 +1 @@
+../../Task/Split-a-character-string-based-on-change-of-character/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Stack-traces b/Lang/Crystal/Stack-traces
new file mode 120000
index 0000000000..9cc8cddb52
--- /dev/null
+++ b/Lang/Crystal/Stack-traces
@@ -0,0 +1 @@
+../../Task/Stack-traces/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/String-prepend b/Lang/Crystal/String-prepend
new file mode 120000
index 0000000000..2c5c171e4c
--- /dev/null
+++ b/Lang/Crystal/String-prepend
@@ -0,0 +1 @@
+../../Task/String-prepend/Crystal
\ No newline at end of file
diff --git a/Lang/Crystal/Take-notes-on-the-command-line b/Lang/Crystal/Take-notes-on-the-command-line
new file mode 120000
index 0000000000..e978486e4d
--- /dev/null
+++ b/Lang/Crystal/Take-notes-on-the-command-line
@@ -0,0 +1 @@
+../../Task/Take-notes-on-the-command-line/Crystal
\ No newline at end of file
diff --git a/Lang/D/Find-Chess960-starting-position-identifier b/Lang/D/Find-Chess960-starting-position-identifier
new file mode 120000
index 0000000000..79e07139b9
--- /dev/null
+++ b/Lang/D/Find-Chess960-starting-position-identifier
@@ -0,0 +1 @@
+../../Task/Find-Chess960-starting-position-identifier/D
\ No newline at end of file
diff --git a/Lang/Dart/24-game-Solve b/Lang/Dart/24-game-Solve
new file mode 120000
index 0000000000..ae64875d6c
--- /dev/null
+++ b/Lang/Dart/24-game-Solve
@@ -0,0 +1 @@
+../../Task/24-game-Solve/Dart
\ No newline at end of file
diff --git a/Lang/Dart/K-d-tree b/Lang/Dart/K-d-tree
new file mode 120000
index 0000000000..4b4a8013e5
--- /dev/null
+++ b/Lang/Dart/K-d-tree
@@ -0,0 +1 @@
+../../Task/K-d-tree/Dart
\ No newline at end of file
diff --git a/Lang/Dart/Penneys-game b/Lang/Dart/Penneys-game
new file mode 120000
index 0000000000..f054d83b87
--- /dev/null
+++ b/Lang/Dart/Penneys-game
@@ -0,0 +1 @@
+../../Task/Penneys-game/Dart
\ No newline at end of file
diff --git a/Lang/Delphi/Generate-Chess960-starting-position b/Lang/Delphi/Generate-Chess960-starting-position
new file mode 120000
index 0000000000..2c3a66190d
--- /dev/null
+++ b/Lang/Delphi/Generate-Chess960-starting-position
@@ -0,0 +1 @@
+../../Task/Generate-Chess960-starting-position/Delphi
\ No newline at end of file
diff --git a/Lang/ERRE/Leonardo-numbers b/Lang/ERRE/Leonardo-numbers
new file mode 120000
index 0000000000..3e0d0050d1
--- /dev/null
+++ b/Lang/ERRE/Leonardo-numbers
@@ -0,0 +1 @@
+../../Task/Leonardo-numbers/ERRE
\ No newline at end of file
diff --git a/Lang/EasyLang/00-LANG.txt b/Lang/EasyLang/00-LANG.txt
index ba3b92e229..e09a925b83 100644
--- a/Lang/EasyLang/00-LANG.txt
+++ b/Lang/EasyLang/00-LANG.txt
@@ -11,7 +11,7 @@
''Easylang'' is a (beginners) programming language with built-in commands for graphics output. The statically typed language has a reduced syntax and semantics. Variables do not have to be declared, the data type is encoded in the variable name - as was usual in the earlier home computer BASIC. The data types are strings and numbers (floating point), arrays of strings and numbers, and arrays of arrays. Arrays are 1-based and can grow. Programs compiled into an AST tree run in the browser or in the browser IDE.
-[https://easylang.dev/ide/ A browser IDE] with different tutorials, one for beginners, makes programming and learning to program as easy as possible.
+[https://easylang.online/ide/ A browser IDE] with different tutorials, one for beginners, makes programming and learning to program as easy as possible.
The finished programs can be easily integrated into a [https://easylang.online/apps/ website].
diff --git a/Lang/EasyLang/2048 b/Lang/EasyLang/2048
new file mode 120000
index 0000000000..4a69b16207
--- /dev/null
+++ b/Lang/EasyLang/2048
@@ -0,0 +1 @@
+../../Task/2048/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Abbreviations-automatic b/Lang/EasyLang/Abbreviations-automatic
new file mode 120000
index 0000000000..10b2251691
--- /dev/null
+++ b/Lang/EasyLang/Abbreviations-automatic
@@ -0,0 +1 @@
+../../Task/Abbreviations-automatic/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Abbreviations-easy b/Lang/EasyLang/Abbreviations-easy
new file mode 120000
index 0000000000..9f43877f2b
--- /dev/null
+++ b/Lang/EasyLang/Abbreviations-easy
@@ -0,0 +1 @@
+../../Task/Abbreviations-easy/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Abbreviations-simple b/Lang/EasyLang/Abbreviations-simple
new file mode 120000
index 0000000000..53295111be
--- /dev/null
+++ b/Lang/EasyLang/Abbreviations-simple
@@ -0,0 +1 @@
+../../Task/Abbreviations-simple/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Amb b/Lang/EasyLang/Amb
new file mode 120000
index 0000000000..cee73196db
--- /dev/null
+++ b/Lang/EasyLang/Amb
@@ -0,0 +1 @@
+../../Task/Amb/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Anagrams b/Lang/EasyLang/Anagrams
new file mode 120000
index 0000000000..1a48ded8aa
--- /dev/null
+++ b/Lang/EasyLang/Anagrams
@@ -0,0 +1 @@
+../../Task/Anagrams/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Anagrams-Deranged-anagrams b/Lang/EasyLang/Anagrams-Deranged-anagrams
new file mode 120000
index 0000000000..b7af47405b
--- /dev/null
+++ b/Lang/EasyLang/Anagrams-Deranged-anagrams
@@ -0,0 +1 @@
+../../Task/Anagrams-Deranged-anagrams/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Babylonian-spiral b/Lang/EasyLang/Babylonian-spiral
new file mode 120000
index 0000000000..a141d2cd6b
--- /dev/null
+++ b/Lang/EasyLang/Babylonian-spiral
@@ -0,0 +1 @@
+../../Task/Babylonian-spiral/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Boyer-Moore-string-search b/Lang/EasyLang/Boyer-Moore-string-search
new file mode 120000
index 0000000000..189112146a
--- /dev/null
+++ b/Lang/EasyLang/Boyer-Moore-string-search
@@ -0,0 +1 @@
+../../Task/Boyer-Moore-string-search/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Element-wise-operations b/Lang/EasyLang/Element-wise-operations
new file mode 120000
index 0000000000..79d10fbb82
--- /dev/null
+++ b/Lang/EasyLang/Element-wise-operations
@@ -0,0 +1 @@
+../../Task/Element-wise-operations/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Factorions b/Lang/EasyLang/Factorions
new file mode 120000
index 0000000000..52bf4a578c
--- /dev/null
+++ b/Lang/EasyLang/Factorions
@@ -0,0 +1 @@
+../../Task/Factorions/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Mad-Libs b/Lang/EasyLang/Mad-Libs
new file mode 120000
index 0000000000..80e4f5b2e7
--- /dev/null
+++ b/Lang/EasyLang/Mad-Libs
@@ -0,0 +1 @@
+../../Task/Mad-Libs/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Permutation-test b/Lang/EasyLang/Permutation-test
new file mode 120000
index 0000000000..d3b1950f7a
--- /dev/null
+++ b/Lang/EasyLang/Permutation-test
@@ -0,0 +1 @@
+../../Task/Permutation-test/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Prime-numbers-whose-neighboring-pairs-are-tetraprimes b/Lang/EasyLang/Prime-numbers-whose-neighboring-pairs-are-tetraprimes
new file mode 120000
index 0000000000..deadbe682f
--- /dev/null
+++ b/Lang/EasyLang/Prime-numbers-whose-neighboring-pairs-are-tetraprimes
@@ -0,0 +1 @@
+../../Task/Prime-numbers-whose-neighboring-pairs-are-tetraprimes/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Primes---allocate-descendants-to-their-ancestors b/Lang/EasyLang/Primes---allocate-descendants-to-their-ancestors
new file mode 120000
index 0000000000..c5cfa0147b
--- /dev/null
+++ b/Lang/EasyLang/Primes---allocate-descendants-to-their-ancestors
@@ -0,0 +1 @@
+../../Task/Primes---allocate-descendants-to-their-ancestors/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Solve-a-Numbrix-puzzle b/Lang/EasyLang/Solve-a-Numbrix-puzzle
new file mode 120000
index 0000000000..9dc56df255
--- /dev/null
+++ b/Lang/EasyLang/Solve-a-Numbrix-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-a-Numbrix-puzzle/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Solve-the-no-connection-puzzle b/Lang/EasyLang/Solve-the-no-connection-puzzle
new file mode 120000
index 0000000000..759be373e6
--- /dev/null
+++ b/Lang/EasyLang/Solve-the-no-connection-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-the-no-connection-puzzle/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Sorting-algorithms-Patience-sort b/Lang/EasyLang/Sorting-algorithms-Patience-sort
new file mode 120000
index 0000000000..6123828d8e
--- /dev/null
+++ b/Lang/EasyLang/Sorting-algorithms-Patience-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Patience-sort/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Unprimeable-numbers b/Lang/EasyLang/Unprimeable-numbers
new file mode 120000
index 0000000000..ae808307c7
--- /dev/null
+++ b/Lang/EasyLang/Unprimeable-numbers
@@ -0,0 +1 @@
+../../Task/Unprimeable-numbers/EasyLang
\ No newline at end of file
diff --git a/Lang/EasyLang/Wasteful-equidigital-and-frugal-numbers b/Lang/EasyLang/Wasteful-equidigital-and-frugal-numbers
new file mode 120000
index 0000000000..2c61d301f5
--- /dev/null
+++ b/Lang/EasyLang/Wasteful-equidigital-and-frugal-numbers
@@ -0,0 +1 @@
+../../Task/Wasteful-equidigital-and-frugal-numbers/EasyLang
\ No newline at end of file
diff --git a/Lang/Elena/00-LANG.txt b/Lang/Elena/00-LANG.txt
index 671257e3ee..c3a21bf2d4 100644
--- a/Lang/Elena/00-LANG.txt
+++ b/Lang/Elena/00-LANG.txt
@@ -1,5 +1,5 @@
{{language|Elena
-|site=http://elenalang.sourceforge.net
+|site=https://elena-lang.github.io/
|exec=bytecode
|strength=strong
|safety=safe
diff --git a/Lang/Elena/Comma-quibbling b/Lang/Elena/Comma-quibbling
new file mode 120000
index 0000000000..f92aff5654
--- /dev/null
+++ b/Lang/Elena/Comma-quibbling
@@ -0,0 +1 @@
+../../Task/Comma-quibbling/Elena
\ No newline at end of file
diff --git a/Lang/Elena/Concurrent-computing b/Lang/Elena/Concurrent-computing
new file mode 120000
index 0000000000..d22278e519
--- /dev/null
+++ b/Lang/Elena/Concurrent-computing
@@ -0,0 +1 @@
+../../Task/Concurrent-computing/Elena
\ No newline at end of file
diff --git a/Lang/Elena/HTTP b/Lang/Elena/HTTP
new file mode 120000
index 0000000000..c94b6f99cd
--- /dev/null
+++ b/Lang/Elena/HTTP
@@ -0,0 +1 @@
+../../Task/HTTP/Elena
\ No newline at end of file
diff --git a/Lang/Elena/HTTPS b/Lang/Elena/HTTPS
new file mode 120000
index 0000000000..879dfcb045
--- /dev/null
+++ b/Lang/Elena/HTTPS
@@ -0,0 +1 @@
+../../Task/HTTPS/Elena
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Color-wheel b/Lang/Emacs-Lisp/Color-wheel
new file mode 120000
index 0000000000..90b9cec116
--- /dev/null
+++ b/Lang/Emacs-Lisp/Color-wheel
@@ -0,0 +1 @@
+../../Task/Color-wheel/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Keyboard-input-Flush-the-keyboard-buffer b/Lang/Emacs-Lisp/Keyboard-input-Flush-the-keyboard-buffer
new file mode 120000
index 0000000000..db888b4ffd
--- /dev/null
+++ b/Lang/Emacs-Lisp/Keyboard-input-Flush-the-keyboard-buffer
@@ -0,0 +1 @@
+../../Task/Keyboard-input-Flush-the-keyboard-buffer/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Keyboard-input-Keypress-check b/Lang/Emacs-Lisp/Keyboard-input-Keypress-check
new file mode 120000
index 0000000000..1bf55a234e
--- /dev/null
+++ b/Lang/Emacs-Lisp/Keyboard-input-Keypress-check
@@ -0,0 +1 @@
+../../Task/Keyboard-input-Keypress-check/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Keyboard-input-Obtain-a-Y-or-N-response b/Lang/Emacs-Lisp/Keyboard-input-Obtain-a-Y-or-N-response
new file mode 120000
index 0000000000..d6205cc54b
--- /dev/null
+++ b/Lang/Emacs-Lisp/Keyboard-input-Obtain-a-Y-or-N-response
@@ -0,0 +1 @@
+../../Task/Keyboard-input-Obtain-a-Y-or-N-response/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Split-a-character-string-based-on-change-of-character b/Lang/Emacs-Lisp/Split-a-character-string-based-on-change-of-character
new file mode 120000
index 0000000000..7bff70bc55
--- /dev/null
+++ b/Lang/Emacs-Lisp/Split-a-character-string-based-on-change-of-character
@@ -0,0 +1 @@
+../../Task/Split-a-character-string-based-on-change-of-character/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Strip-comments-from-a-string b/Lang/Emacs-Lisp/Strip-comments-from-a-string
new file mode 120000
index 0000000000..e8fcd5a3c3
--- /dev/null
+++ b/Lang/Emacs-Lisp/Strip-comments-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-comments-from-a-string/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Emacs-Lisp/Word-frequency b/Lang/Emacs-Lisp/Word-frequency
new file mode 120000
index 0000000000..74fd09e7f4
--- /dev/null
+++ b/Lang/Emacs-Lisp/Word-frequency
@@ -0,0 +1 @@
+../../Task/Word-frequency/Emacs-Lisp
\ No newline at end of file
diff --git a/Lang/Erlang/Parse-an-IP-Address b/Lang/Erlang/Parse-an-IP-Address
new file mode 120000
index 0000000000..3e48d0f0b1
--- /dev/null
+++ b/Lang/Erlang/Parse-an-IP-Address
@@ -0,0 +1 @@
+../../Task/Parse-an-IP-Address/Erlang
\ No newline at end of file
diff --git a/Lang/Excel/Arrays b/Lang/Excel/Arrays
new file mode 120000
index 0000000000..bad8c856a9
--- /dev/null
+++ b/Lang/Excel/Arrays
@@ -0,0 +1 @@
+../../Task/Arrays/Excel
\ No newline at end of file
diff --git a/Lang/Excel/Conditional-structures b/Lang/Excel/Conditional-structures
new file mode 120000
index 0000000000..f4ffdbd4b9
--- /dev/null
+++ b/Lang/Excel/Conditional-structures
@@ -0,0 +1 @@
+../../Task/Conditional-structures/Excel
\ No newline at end of file
diff --git a/Lang/Excel/FizzBuzz b/Lang/Excel/FizzBuzz
new file mode 120000
index 0000000000..15df08a856
--- /dev/null
+++ b/Lang/Excel/FizzBuzz
@@ -0,0 +1 @@
+../../Task/FizzBuzz/Excel
\ No newline at end of file
diff --git a/Lang/Excel/Function-definition b/Lang/Excel/Function-definition
new file mode 120000
index 0000000000..e6ecf64bef
--- /dev/null
+++ b/Lang/Excel/Function-definition
@@ -0,0 +1 @@
+../../Task/Function-definition/Excel
\ No newline at end of file
diff --git a/Lang/Excel/Loops-For b/Lang/Excel/Loops-For
new file mode 120000
index 0000000000..876b47b179
--- /dev/null
+++ b/Lang/Excel/Loops-For
@@ -0,0 +1 @@
+../../Task/Loops-For/Excel
\ No newline at end of file
diff --git a/Lang/Excel/Repeat-a-string b/Lang/Excel/Repeat-a-string
new file mode 120000
index 0000000000..2c684073cb
--- /dev/null
+++ b/Lang/Excel/Repeat-a-string
@@ -0,0 +1 @@
+../../Task/Repeat-a-string/Excel
\ No newline at end of file
diff --git a/Lang/Excel/Reverse-a-string b/Lang/Excel/Reverse-a-string
new file mode 120000
index 0000000000..2a3cf97cfe
--- /dev/null
+++ b/Lang/Excel/Reverse-a-string
@@ -0,0 +1 @@
+../../Task/Reverse-a-string/Excel
\ No newline at end of file
diff --git a/Lang/Excel/Tokenize-a-string b/Lang/Excel/Tokenize-a-string
new file mode 120000
index 0000000000..9d5af3b4b4
--- /dev/null
+++ b/Lang/Excel/Tokenize-a-string
@@ -0,0 +1 @@
+../../Task/Tokenize-a-string/Excel
\ No newline at end of file
diff --git a/Lang/F-Sharp/Mad-Libs b/Lang/F-Sharp/Mad-Libs
new file mode 120000
index 0000000000..69a30ced53
--- /dev/null
+++ b/Lang/F-Sharp/Mad-Libs
@@ -0,0 +1 @@
+../../Task/Mad-Libs/F-Sharp
\ No newline at end of file
diff --git a/Lang/Factor/Tic-tac-toe b/Lang/Factor/Tic-tac-toe
new file mode 120000
index 0000000000..183c5fb3e0
--- /dev/null
+++ b/Lang/Factor/Tic-tac-toe
@@ -0,0 +1 @@
+../../Task/Tic-tac-toe/Factor
\ No newline at end of file
diff --git a/Lang/Forth/Almost-prime b/Lang/Forth/Almost-prime
new file mode 120000
index 0000000000..bbe907fa90
--- /dev/null
+++ b/Lang/Forth/Almost-prime
@@ -0,0 +1 @@
+../../Task/Almost-prime/Forth
\ No newline at end of file
diff --git a/Lang/Fortran/Apply-a-digital-filter-direct-form-II-transposed- b/Lang/Fortran/Apply-a-digital-filter-direct-form-II-transposed-
new file mode 120000
index 0000000000..dd0e66389d
--- /dev/null
+++ b/Lang/Fortran/Apply-a-digital-filter-direct-form-II-transposed-
@@ -0,0 +1 @@
+../../Task/Apply-a-digital-filter-direct-form-II-transposed-/Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/B-zier-curves-Intersections b/Lang/Fortran/B-zier-curves-Intersections
new file mode 120000
index 0000000000..59ae9a9e9a
--- /dev/null
+++ b/Lang/Fortran/B-zier-curves-Intersections
@@ -0,0 +1 @@
+../../Task/B-zier-curves-Intersections/Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/Eulers-constant-0.5772... b/Lang/Fortran/Eulers-constant-0.5772...
new file mode 120000
index 0000000000..e2642e24fb
--- /dev/null
+++ b/Lang/Fortran/Eulers-constant-0.5772...
@@ -0,0 +1 @@
+../../Task/Eulers-constant-0.5772.../Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/First-perfect-square-in-base-n-with-n-unique-digits b/Lang/Fortran/First-perfect-square-in-base-n-with-n-unique-digits
new file mode 120000
index 0000000000..6f8a8ab270
--- /dev/null
+++ b/Lang/Fortran/First-perfect-square-in-base-n-with-n-unique-digits
@@ -0,0 +1 @@
+../../Task/First-perfect-square-in-base-n-with-n-unique-digits/Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/Harmonic-series b/Lang/Fortran/Harmonic-series
new file mode 120000
index 0000000000..6a6cd246a2
--- /dev/null
+++ b/Lang/Fortran/Harmonic-series
@@ -0,0 +1 @@
+../../Task/Harmonic-series/Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/Knuths-algorithm-S b/Lang/Fortran/Knuths-algorithm-S
new file mode 120000
index 0000000000..fe5b21ade9
--- /dev/null
+++ b/Lang/Fortran/Knuths-algorithm-S
@@ -0,0 +1 @@
+../../Task/Knuths-algorithm-S/Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/Thieles-interpolation-formula b/Lang/Fortran/Thieles-interpolation-formula
new file mode 120000
index 0000000000..f8f82960bc
--- /dev/null
+++ b/Lang/Fortran/Thieles-interpolation-formula
@@ -0,0 +1 @@
+../../Task/Thieles-interpolation-formula/Fortran
\ No newline at end of file
diff --git a/Lang/Fortran/Vogels-approximation-method b/Lang/Fortran/Vogels-approximation-method
new file mode 120000
index 0000000000..3098233175
--- /dev/null
+++ b/Lang/Fortran/Vogels-approximation-method
@@ -0,0 +1 @@
+../../Task/Vogels-approximation-method/Fortran
\ No newline at end of file
diff --git a/Lang/Free-Pascal-Lazarus/DNS-query b/Lang/Free-Pascal-Lazarus/DNS-query
new file mode 120000
index 0000000000..f7c79b4afe
--- /dev/null
+++ b/Lang/Free-Pascal-Lazarus/DNS-query
@@ -0,0 +1 @@
+../../Task/DNS-query/Free-Pascal-Lazarus
\ No newline at end of file
diff --git a/Lang/Free-Pascal-Lazarus/Levenshtein-distance b/Lang/Free-Pascal-Lazarus/Levenshtein-distance
new file mode 120000
index 0000000000..eebdca8158
--- /dev/null
+++ b/Lang/Free-Pascal-Lazarus/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/Free-Pascal-Lazarus
\ No newline at end of file
diff --git a/Lang/Free-Pascal-Lazarus/Map-range b/Lang/Free-Pascal-Lazarus/Map-range
new file mode 120000
index 0000000000..65b07f3cc6
--- /dev/null
+++ b/Lang/Free-Pascal-Lazarus/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/Free-Pascal-Lazarus
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Bioinformatics-Global-alignment b/Lang/FreeBASIC/Bioinformatics-Global-alignment
new file mode 120000
index 0000000000..93fb335c5b
--- /dev/null
+++ b/Lang/FreeBASIC/Bioinformatics-Global-alignment
@@ -0,0 +1 @@
+../../Task/Bioinformatics-Global-alignment/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Cistercian-numerals b/Lang/FreeBASIC/Cistercian-numerals
new file mode 120000
index 0000000000..ceb56b6604
--- /dev/null
+++ b/Lang/FreeBASIC/Cistercian-numerals
@@ -0,0 +1 @@
+../../Task/Cistercian-numerals/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Compiler-syntax-analyzer b/Lang/FreeBASIC/Compiler-syntax-analyzer
new file mode 120000
index 0000000000..a7d7204b01
--- /dev/null
+++ b/Lang/FreeBASIC/Compiler-syntax-analyzer
@@ -0,0 +1 @@
+../../Task/Compiler-syntax-analyzer/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Deconvolution-2D+ b/Lang/FreeBASIC/Deconvolution-2D+
new file mode 120000
index 0000000000..2a10e72230
--- /dev/null
+++ b/Lang/FreeBASIC/Deconvolution-2D+
@@ -0,0 +1 @@
+../../Task/Deconvolution-2D+/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Distribution-of-0-digits-in-factorial-series b/Lang/FreeBASIC/Distribution-of-0-digits-in-factorial-series
new file mode 120000
index 0000000000..caef600e25
--- /dev/null
+++ b/Lang/FreeBASIC/Distribution-of-0-digits-in-factorial-series
@@ -0,0 +1 @@
+../../Task/Distribution-of-0-digits-in-factorial-series/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Elliptic-curve-arithmetic b/Lang/FreeBASIC/Elliptic-curve-arithmetic
new file mode 120000
index 0000000000..ab0b3f0aed
--- /dev/null
+++ b/Lang/FreeBASIC/Elliptic-curve-arithmetic
@@ -0,0 +1 @@
+../../Task/Elliptic-curve-arithmetic/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Fermat-numbers b/Lang/FreeBASIC/Fermat-numbers
new file mode 120000
index 0000000000..b6ff867057
--- /dev/null
+++ b/Lang/FreeBASIC/Fermat-numbers
@@ -0,0 +1 @@
+../../Task/Fermat-numbers/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Graph-colouring b/Lang/FreeBASIC/Graph-colouring
new file mode 120000
index 0000000000..2b6f6e444d
--- /dev/null
+++ b/Lang/FreeBASIC/Graph-colouring
@@ -0,0 +1 @@
+../../Task/Graph-colouring/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Juggler-sequence b/Lang/FreeBASIC/Juggler-sequence
new file mode 120000
index 0000000000..5aaf9a794f
--- /dev/null
+++ b/Lang/FreeBASIC/Juggler-sequence
@@ -0,0 +1 @@
+../../Task/Juggler-sequence/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Knuths-algorithm-S b/Lang/FreeBASIC/Knuths-algorithm-S
new file mode 120000
index 0000000000..720a4a3a7e
--- /dev/null
+++ b/Lang/FreeBASIC/Knuths-algorithm-S
@@ -0,0 +1 @@
+../../Task/Knuths-algorithm-S/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Knuths-power-tree b/Lang/FreeBASIC/Knuths-power-tree
new file mode 120000
index 0000000000..b6075609dd
--- /dev/null
+++ b/Lang/FreeBASIC/Knuths-power-tree
@@ -0,0 +1 @@
+../../Task/Knuths-power-tree/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Last-letter-first-letter b/Lang/FreeBASIC/Last-letter-first-letter
new file mode 120000
index 0000000000..436ebfb8b9
--- /dev/null
+++ b/Lang/FreeBASIC/Last-letter-first-letter
@@ -0,0 +1 @@
+../../Task/Last-letter-first-letter/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Natural-sorting b/Lang/FreeBASIC/Natural-sorting
new file mode 120000
index 0000000000..00267c2e93
--- /dev/null
+++ b/Lang/FreeBASIC/Natural-sorting
@@ -0,0 +1 @@
+../../Task/Natural-sorting/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Rosetta-Code-Fix-code-tags b/Lang/FreeBASIC/Rosetta-Code-Fix-code-tags
new file mode 120000
index 0000000000..53b438e29f
--- /dev/null
+++ b/Lang/FreeBASIC/Rosetta-Code-Fix-code-tags
@@ -0,0 +1 @@
+../../Task/Rosetta-Code-Fix-code-tags/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Rosetta-Code-Rank-languages-by-popularity b/Lang/FreeBASIC/Rosetta-Code-Rank-languages-by-popularity
new file mode 120000
index 0000000000..71d538269e
--- /dev/null
+++ b/Lang/FreeBASIC/Rosetta-Code-Rank-languages-by-popularity
@@ -0,0 +1 @@
+../../Task/Rosetta-Code-Rank-languages-by-popularity/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/SQL-based-authentication b/Lang/FreeBASIC/SQL-based-authentication
new file mode 120000
index 0000000000..19b09b4fc4
--- /dev/null
+++ b/Lang/FreeBASIC/SQL-based-authentication
@@ -0,0 +1 @@
+../../Task/SQL-based-authentication/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Simulate-input-Keyboard b/Lang/FreeBASIC/Simulate-input-Keyboard
new file mode 120000
index 0000000000..504f3b18d3
--- /dev/null
+++ b/Lang/FreeBASIC/Simulate-input-Keyboard
@@ -0,0 +1 @@
+../../Task/Simulate-input-Keyboard/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Sorting-algorithms-Strand-sort b/Lang/FreeBASIC/Sorting-algorithms-Strand-sort
new file mode 120000
index 0000000000..5305f3c6f7
--- /dev/null
+++ b/Lang/FreeBASIC/Sorting-algorithms-Strand-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Strand-sort/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Text-processing-2 b/Lang/FreeBASIC/Text-processing-2
new file mode 120000
index 0000000000..03a524d892
--- /dev/null
+++ b/Lang/FreeBASIC/Text-processing-2
@@ -0,0 +1 @@
+../../Task/Text-processing-2/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Ukkonen-s-suffix-tree-construction b/Lang/FreeBASIC/Ukkonen-s-suffix-tree-construction
new file mode 120000
index 0000000000..6686d05c91
--- /dev/null
+++ b/Lang/FreeBASIC/Ukkonen-s-suffix-tree-construction
@@ -0,0 +1 @@
+../../Task/Ukkonen-s-suffix-tree-construction/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Word-ladder b/Lang/FreeBASIC/Word-ladder
new file mode 120000
index 0000000000..1390108efe
--- /dev/null
+++ b/Lang/FreeBASIC/Word-ladder
@@ -0,0 +1 @@
+../../Task/Word-ladder/FreeBASIC
\ No newline at end of file
diff --git a/Lang/GW-BASIC/Levenshtein-distance b/Lang/GW-BASIC/Levenshtein-distance
new file mode 120000
index 0000000000..4605e15436
--- /dev/null
+++ b/Lang/GW-BASIC/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/GW-BASIC
\ No newline at end of file
diff --git a/Lang/GW-BASIC/Magic-constant b/Lang/GW-BASIC/Magic-constant
new file mode 120000
index 0000000000..4dbe3ee401
--- /dev/null
+++ b/Lang/GW-BASIC/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/GW-BASIC
\ No newline at end of file
diff --git a/Lang/GW-BASIC/Map-range b/Lang/GW-BASIC/Map-range
new file mode 120000
index 0000000000..487538bdd0
--- /dev/null
+++ b/Lang/GW-BASIC/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/GW-BASIC
\ No newline at end of file
diff --git a/Lang/Gambas/Evaluate-binomial-coefficients b/Lang/Gambas/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..d84c9e286a
--- /dev/null
+++ b/Lang/Gambas/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/Gambas
\ No newline at end of file
diff --git a/Lang/Gambas/Magic-constant b/Lang/Gambas/Magic-constant
new file mode 120000
index 0000000000..3e63290c94
--- /dev/null
+++ b/Lang/Gambas/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/Gambas
\ No newline at end of file
diff --git a/Lang/Go/Boyer-Moore-string-search b/Lang/Go/Boyer-Moore-string-search
new file mode 120000
index 0000000000..0b971fdf3b
--- /dev/null
+++ b/Lang/Go/Boyer-Moore-string-search
@@ -0,0 +1 @@
+../../Task/Boyer-Moore-string-search/Go
\ No newline at end of file
diff --git a/Lang/Go/Goldbachs-comet b/Lang/Go/Goldbachs-comet
new file mode 120000
index 0000000000..e80a90c082
--- /dev/null
+++ b/Lang/Go/Goldbachs-comet
@@ -0,0 +1 @@
+../../Task/Goldbachs-comet/Go
\ No newline at end of file
diff --git a/Lang/Go/P-Adic-square-roots b/Lang/Go/P-Adic-square-roots
new file mode 120000
index 0000000000..064157bec0
--- /dev/null
+++ b/Lang/Go/P-Adic-square-roots
@@ -0,0 +1 @@
+../../Task/P-Adic-square-roots/Go
\ No newline at end of file
diff --git a/Lang/Haskell/Pathological-floating-point-problems b/Lang/Haskell/Pathological-floating-point-problems
new file mode 120000
index 0000000000..f17bacf62a
--- /dev/null
+++ b/Lang/Haskell/Pathological-floating-point-problems
@@ -0,0 +1 @@
+../../Task/Pathological-floating-point-problems/Haskell
\ No newline at end of file
diff --git a/Lang/Icon/Loops-Increment-loop-index-within-loop-body b/Lang/Icon/Loops-Increment-loop-index-within-loop-body
new file mode 120000
index 0000000000..19c94ce3da
--- /dev/null
+++ b/Lang/Icon/Loops-Increment-loop-index-within-loop-body
@@ -0,0 +1 @@
+../../Task/Loops-Increment-loop-index-within-loop-body/Icon
\ No newline at end of file
diff --git a/Lang/Java/Strassens-algorithm b/Lang/Java/Strassens-algorithm
new file mode 120000
index 0000000000..1c8b3f279b
--- /dev/null
+++ b/Lang/Java/Strassens-algorithm
@@ -0,0 +1 @@
+../../Task/Strassens-algorithm/Java
\ No newline at end of file
diff --git a/Lang/JavaScript/15-puzzle-solver b/Lang/JavaScript/15-puzzle-solver
new file mode 120000
index 0000000000..34b980cd29
--- /dev/null
+++ b/Lang/JavaScript/15-puzzle-solver
@@ -0,0 +1 @@
+../../Task/15-puzzle-solver/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/ADFGVX-cipher b/Lang/JavaScript/ADFGVX-cipher
new file mode 120000
index 0000000000..eeef4038b2
--- /dev/null
+++ b/Lang/JavaScript/ADFGVX-cipher
@@ -0,0 +1 @@
+../../Task/ADFGVX-cipher/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Average-loop-length b/Lang/JavaScript/Average-loop-length
new file mode 120000
index 0000000000..c1bd894dc5
--- /dev/null
+++ b/Lang/JavaScript/Average-loop-length
@@ -0,0 +1 @@
+../../Task/Average-loop-length/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Bifid-cipher b/Lang/JavaScript/Bifid-cipher
new file mode 120000
index 0000000000..837e122e66
--- /dev/null
+++ b/Lang/JavaScript/Bifid-cipher
@@ -0,0 +1 @@
+../../Task/Bifid-cipher/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Bitcoin-address-validation b/Lang/JavaScript/Bitcoin-address-validation
new file mode 120000
index 0000000000..d09d433cd8
--- /dev/null
+++ b/Lang/JavaScript/Bitcoin-address-validation
@@ -0,0 +1 @@
+../../Task/Bitcoin-address-validation/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Boyer-Moore-string-search b/Lang/JavaScript/Boyer-Moore-string-search
new file mode 120000
index 0000000000..b25016942d
--- /dev/null
+++ b/Lang/JavaScript/Boyer-Moore-string-search
@@ -0,0 +1 @@
+../../Task/Boyer-Moore-string-search/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Burrows-Wheeler-transform b/Lang/JavaScript/Burrows-Wheeler-transform
new file mode 120000
index 0000000000..79a79f877d
--- /dev/null
+++ b/Lang/JavaScript/Burrows-Wheeler-transform
@@ -0,0 +1 @@
+../../Task/Burrows-Wheeler-transform/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Camel-case-and-snake-case b/Lang/JavaScript/Camel-case-and-snake-case
new file mode 120000
index 0000000000..0e52d396b8
--- /dev/null
+++ b/Lang/JavaScript/Camel-case-and-snake-case
@@ -0,0 +1 @@
+../../Task/Camel-case-and-snake-case/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Colorful-numbers b/Lang/JavaScript/Colorful-numbers
new file mode 120000
index 0000000000..861658de92
--- /dev/null
+++ b/Lang/JavaScript/Colorful-numbers
@@ -0,0 +1 @@
+../../Task/Colorful-numbers/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Commatizing-numbers b/Lang/JavaScript/Commatizing-numbers
new file mode 120000
index 0000000000..dac4a7f279
--- /dev/null
+++ b/Lang/JavaScript/Commatizing-numbers
@@ -0,0 +1 @@
+../../Task/Commatizing-numbers/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Compiler-code-generator b/Lang/JavaScript/Compiler-code-generator
new file mode 120000
index 0000000000..7b6f8e25b0
--- /dev/null
+++ b/Lang/JavaScript/Compiler-code-generator
@@ -0,0 +1 @@
+../../Task/Compiler-code-generator/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Create-a-file-on-magnetic-tape b/Lang/JavaScript/Create-a-file-on-magnetic-tape
new file mode 120000
index 0000000000..0f15206dcf
--- /dev/null
+++ b/Lang/JavaScript/Create-a-file-on-magnetic-tape
@@ -0,0 +1 @@
+../../Task/Create-a-file-on-magnetic-tape/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Cyclotomic-polynomial b/Lang/JavaScript/Cyclotomic-polynomial
new file mode 120000
index 0000000000..1407b6559c
--- /dev/null
+++ b/Lang/JavaScript/Cyclotomic-polynomial
@@ -0,0 +1 @@
+../../Task/Cyclotomic-polynomial/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/De-Bruijn-sequences b/Lang/JavaScript/De-Bruijn-sequences
new file mode 120000
index 0000000000..d753d9f9d0
--- /dev/null
+++ b/Lang/JavaScript/De-Bruijn-sequences
@@ -0,0 +1 @@
+../../Task/De-Bruijn-sequences/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Distribution-of-0-digits-in-factorial-series b/Lang/JavaScript/Distribution-of-0-digits-in-factorial-series
new file mode 120000
index 0000000000..3fd7f0feb5
--- /dev/null
+++ b/Lang/JavaScript/Distribution-of-0-digits-in-factorial-series
@@ -0,0 +1 @@
+../../Task/Distribution-of-0-digits-in-factorial-series/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Elliptic-Curve-Digital-Signature-Algorithm b/Lang/JavaScript/Elliptic-Curve-Digital-Signature-Algorithm
new file mode 120000
index 0000000000..b9a9906259
--- /dev/null
+++ b/Lang/JavaScript/Elliptic-Curve-Digital-Signature-Algorithm
@@ -0,0 +1 @@
+../../Task/Elliptic-Curve-Digital-Signature-Algorithm/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Elliptic-curve-arithmetic b/Lang/JavaScript/Elliptic-curve-arithmetic
new file mode 120000
index 0000000000..41de6c075f
--- /dev/null
+++ b/Lang/JavaScript/Elliptic-curve-arithmetic
@@ -0,0 +1 @@
+../../Task/Elliptic-curve-arithmetic/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Gauss-Jordan-matrix-inversion b/Lang/JavaScript/Gauss-Jordan-matrix-inversion
new file mode 120000
index 0000000000..77acac5de4
--- /dev/null
+++ b/Lang/JavaScript/Gauss-Jordan-matrix-inversion
@@ -0,0 +1 @@
+../../Task/Gauss-Jordan-matrix-inversion/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Graph-colouring b/Lang/JavaScript/Graph-colouring
new file mode 120000
index 0000000000..8c22e6e014
--- /dev/null
+++ b/Lang/JavaScript/Graph-colouring
@@ -0,0 +1 @@
+../../Task/Graph-colouring/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Greedy-algorithm-for-Egyptian-fractions b/Lang/JavaScript/Greedy-algorithm-for-Egyptian-fractions
new file mode 120000
index 0000000000..4b7a0299ee
--- /dev/null
+++ b/Lang/JavaScript/Greedy-algorithm-for-Egyptian-fractions
@@ -0,0 +1 @@
+../../Task/Greedy-algorithm-for-Egyptian-fractions/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Isqrt-integer-square-root-of-X b/Lang/JavaScript/Isqrt-integer-square-root-of-X
new file mode 120000
index 0000000000..7c262657f5
--- /dev/null
+++ b/Lang/JavaScript/Isqrt-integer-square-root-of-X
@@ -0,0 +1 @@
+../../Task/Isqrt-integer-square-root-of-X/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Jacobi-symbol b/Lang/JavaScript/Jacobi-symbol
new file mode 120000
index 0000000000..7ca750b7ca
--- /dev/null
+++ b/Lang/JavaScript/Jacobi-symbol
@@ -0,0 +1 @@
+../../Task/Jacobi-symbol/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/K-d-tree b/Lang/JavaScript/K-d-tree
new file mode 120000
index 0000000000..f551f8aa55
--- /dev/null
+++ b/Lang/JavaScript/K-d-tree
@@ -0,0 +1 @@
+../../Task/K-d-tree/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Knuths-algorithm-S b/Lang/JavaScript/Knuths-algorithm-S
new file mode 120000
index 0000000000..78ce9e9420
--- /dev/null
+++ b/Lang/JavaScript/Knuths-algorithm-S
@@ -0,0 +1 @@
+../../Task/Knuths-algorithm-S/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Knuths-power-tree b/Lang/JavaScript/Knuths-power-tree
new file mode 120000
index 0000000000..65f212b8ef
--- /dev/null
+++ b/Lang/JavaScript/Knuths-power-tree
@@ -0,0 +1 @@
+../../Task/Knuths-power-tree/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/M-bius-function b/Lang/JavaScript/M-bius-function
new file mode 120000
index 0000000000..8b88e437b9
--- /dev/null
+++ b/Lang/JavaScript/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/MD5-Implementation b/Lang/JavaScript/MD5-Implementation
new file mode 120000
index 0000000000..96da37623c
--- /dev/null
+++ b/Lang/JavaScript/MD5-Implementation
@@ -0,0 +1 @@
+../../Task/MD5-Implementation/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/P-Adic-numbers-basic b/Lang/JavaScript/P-Adic-numbers-basic
new file mode 120000
index 0000000000..8430626fe6
--- /dev/null
+++ b/Lang/JavaScript/P-Adic-numbers-basic
@@ -0,0 +1 @@
+../../Task/P-Adic-numbers-basic/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/P-Adic-square-roots b/Lang/JavaScript/P-Adic-square-roots
new file mode 120000
index 0000000000..dc1614d80a
--- /dev/null
+++ b/Lang/JavaScript/P-Adic-square-roots
@@ -0,0 +1 @@
+../../Task/P-Adic-square-roots/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Perlin-noise b/Lang/JavaScript/Perlin-noise
new file mode 120000
index 0000000000..d4cfceb70d
--- /dev/null
+++ b/Lang/JavaScript/Perlin-noise
@@ -0,0 +1 @@
+../../Task/Perlin-noise/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Playfair-cipher b/Lang/JavaScript/Playfair-cipher
new file mode 120000
index 0000000000..e94d50f327
--- /dev/null
+++ b/Lang/JavaScript/Playfair-cipher
@@ -0,0 +1 @@
+../../Task/Playfair-cipher/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/SHA-1 b/Lang/JavaScript/SHA-1
new file mode 120000
index 0000000000..2773e9c63c
--- /dev/null
+++ b/Lang/JavaScript/SHA-1
@@ -0,0 +1 @@
+../../Task/SHA-1/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Set-puzzle b/Lang/JavaScript/Set-puzzle
new file mode 120000
index 0000000000..22b0bad552
--- /dev/null
+++ b/Lang/JavaScript/Set-puzzle
@@ -0,0 +1 @@
+../../Task/Set-puzzle/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Solve-a-Hidato-puzzle b/Lang/JavaScript/Solve-a-Hidato-puzzle
new file mode 120000
index 0000000000..3e3c25cd7c
--- /dev/null
+++ b/Lang/JavaScript/Solve-a-Hidato-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-a-Hidato-puzzle/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Solve-a-Numbrix-puzzle b/Lang/JavaScript/Solve-a-Numbrix-puzzle
new file mode 120000
index 0000000000..43202401f9
--- /dev/null
+++ b/Lang/JavaScript/Solve-a-Numbrix-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-a-Numbrix-puzzle/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Sorting-algorithms-Radix-sort b/Lang/JavaScript/Sorting-algorithms-Radix-sort
new file mode 120000
index 0000000000..0d4b9cb23d
--- /dev/null
+++ b/Lang/JavaScript/Sorting-algorithms-Radix-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Radix-sort/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Spelling-of-ordinal-numbers b/Lang/JavaScript/Spelling-of-ordinal-numbers
new file mode 120000
index 0000000000..5ed638cc81
--- /dev/null
+++ b/Lang/JavaScript/Spelling-of-ordinal-numbers
@@ -0,0 +1 @@
+../../Task/Spelling-of-ordinal-numbers/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/State-name-puzzle b/Lang/JavaScript/State-name-puzzle
new file mode 120000
index 0000000000..12f667dc4c
--- /dev/null
+++ b/Lang/JavaScript/State-name-puzzle
@@ -0,0 +1 @@
+../../Task/State-name-puzzle/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Strassens-algorithm b/Lang/JavaScript/Strassens-algorithm
new file mode 120000
index 0000000000..f4d0497694
--- /dev/null
+++ b/Lang/JavaScript/Strassens-algorithm
@@ -0,0 +1 @@
+../../Task/Strassens-algorithm/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Substitution-cipher b/Lang/JavaScript/Substitution-cipher
new file mode 120000
index 0000000000..e8fd969b4a
--- /dev/null
+++ b/Lang/JavaScript/Substitution-cipher
@@ -0,0 +1 @@
+../../Task/Substitution-cipher/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Tonelli-Shanks-algorithm b/Lang/JavaScript/Tonelli-Shanks-algorithm
new file mode 120000
index 0000000000..f646a271d1
--- /dev/null
+++ b/Lang/JavaScript/Tonelli-Shanks-algorithm
@@ -0,0 +1 @@
+../../Task/Tonelli-Shanks-algorithm/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Ukkonen-s-suffix-tree-construction b/Lang/JavaScript/Ukkonen-s-suffix-tree-construction
new file mode 120000
index 0000000000..7a4d0832f5
--- /dev/null
+++ b/Lang/JavaScript/Ukkonen-s-suffix-tree-construction
@@ -0,0 +1 @@
+../../Task/Ukkonen-s-suffix-tree-construction/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Verhoeff-algorithm b/Lang/JavaScript/Verhoeff-algorithm
new file mode 120000
index 0000000000..cd27def09b
--- /dev/null
+++ b/Lang/JavaScript/Verhoeff-algorithm
@@ -0,0 +1 @@
+../../Task/Verhoeff-algorithm/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Vigen-re-cipher-Cryptanalysis b/Lang/JavaScript/Vigen-re-cipher-Cryptanalysis
new file mode 120000
index 0000000000..53c004e91c
--- /dev/null
+++ b/Lang/JavaScript/Vigen-re-cipher-Cryptanalysis
@@ -0,0 +1 @@
+../../Task/Vigen-re-cipher-Cryptanalysis/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Vogels-approximation-method b/Lang/JavaScript/Vogels-approximation-method
new file mode 120000
index 0000000000..72693f1daa
--- /dev/null
+++ b/Lang/JavaScript/Vogels-approximation-method
@@ -0,0 +1 @@
+../../Task/Vogels-approximation-method/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Wordiff b/Lang/JavaScript/Wordiff
new file mode 120000
index 0000000000..18ec352da6
--- /dev/null
+++ b/Lang/JavaScript/Wordiff
@@ -0,0 +1 @@
+../../Task/Wordiff/JavaScript
\ No newline at end of file
diff --git a/Lang/JavaScript/Zebra-puzzle b/Lang/JavaScript/Zebra-puzzle
new file mode 120000
index 0000000000..5c531004b3
--- /dev/null
+++ b/Lang/JavaScript/Zebra-puzzle
@@ -0,0 +1 @@
+../../Task/Zebra-puzzle/JavaScript
\ No newline at end of file
diff --git a/Lang/K/Compare-length-of-two-strings b/Lang/K/Compare-length-of-two-strings
new file mode 120000
index 0000000000..9854a6e09b
--- /dev/null
+++ b/Lang/K/Compare-length-of-two-strings
@@ -0,0 +1 @@
+../../Task/Compare-length-of-two-strings/K
\ No newline at end of file
diff --git a/Lang/K/Euler-method b/Lang/K/Euler-method
new file mode 120000
index 0000000000..c1f821dc7c
--- /dev/null
+++ b/Lang/K/Euler-method
@@ -0,0 +1 @@
+../../Task/Euler-method/K
\ No newline at end of file
diff --git a/Lang/K/M-bius-function b/Lang/K/M-bius-function
new file mode 120000
index 0000000000..e4dca86d37
--- /dev/null
+++ b/Lang/K/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/K
\ No newline at end of file
diff --git a/Lang/K/Substring b/Lang/K/Substring
new file mode 120000
index 0000000000..002d50df4f
--- /dev/null
+++ b/Lang/K/Substring
@@ -0,0 +1 @@
+../../Task/Substring/K
\ No newline at end of file
diff --git a/Lang/K/UTF-8-encode-and-decode b/Lang/K/UTF-8-encode-and-decode
new file mode 120000
index 0000000000..f38c9e1894
--- /dev/null
+++ b/Lang/K/UTF-8-encode-and-decode
@@ -0,0 +1 @@
+../../Task/UTF-8-encode-and-decode/K
\ No newline at end of file
diff --git a/Lang/K/Write-float-arrays-to-a-text-file b/Lang/K/Write-float-arrays-to-a-text-file
new file mode 120000
index 0000000000..2af99671ba
--- /dev/null
+++ b/Lang/K/Write-float-arrays-to-a-text-file
@@ -0,0 +1 @@
+../../Task/Write-float-arrays-to-a-text-file/K
\ No newline at end of file
diff --git a/Lang/Logo/Merge-and-aggregate-datasets b/Lang/Logo/Merge-and-aggregate-datasets
new file mode 120000
index 0000000000..f9a42bcf33
--- /dev/null
+++ b/Lang/Logo/Merge-and-aggregate-datasets
@@ -0,0 +1 @@
+../../Task/Merge-and-aggregate-datasets/Logo
\ No newline at end of file
diff --git a/Lang/Lua/Check-input-device-is-a-terminal b/Lang/Lua/Check-input-device-is-a-terminal
new file mode 120000
index 0000000000..fdc01bb562
--- /dev/null
+++ b/Lang/Lua/Check-input-device-is-a-terminal
@@ -0,0 +1 @@
+../../Task/Check-input-device-is-a-terminal/Lua
\ No newline at end of file
diff --git a/Lang/Lua/Parse-an-IP-Address b/Lang/Lua/Parse-an-IP-Address
new file mode 120000
index 0000000000..aa0f24a93c
--- /dev/null
+++ b/Lang/Lua/Parse-an-IP-Address
@@ -0,0 +1 @@
+../../Task/Parse-an-IP-Address/Lua
\ No newline at end of file
diff --git a/Lang/Lua/Ramer-Douglas-Peucker-line-simplification b/Lang/Lua/Ramer-Douglas-Peucker-line-simplification
new file mode 120000
index 0000000000..516d951928
--- /dev/null
+++ b/Lang/Lua/Ramer-Douglas-Peucker-line-simplification
@@ -0,0 +1 @@
+../../Task/Ramer-Douglas-Peucker-line-simplification/Lua
\ No newline at end of file
diff --git a/Lang/Lua/Update-a-configuration-file b/Lang/Lua/Update-a-configuration-file
new file mode 120000
index 0000000000..75ad1d2a09
--- /dev/null
+++ b/Lang/Lua/Update-a-configuration-file
@@ -0,0 +1 @@
+../../Task/Update-a-configuration-file/Lua
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/00-LANG.txt b/Lang/M2000-Interpreter/00-LANG.txt
index feda8eeb04..5e1cdf3a46 100644
--- a/Lang/M2000-Interpreter/00-LANG.txt
+++ b/Lang/M2000-Interpreter/00-LANG.txt
@@ -9,7 +9,7 @@
|gc=allowed
|hopl=no
}}
-M2000 is an interpreter running on its own Environment written in Visual Basic 6, as an open source project and can be found in GitHub[https://github.com/M2000Interpreter/Version9]. Current version is 12, revision 13. See [[M2000 Interpreter Implementation]]
+M2000 is an interpreter running on its own Environment written in Visual Basic 6, as an open source project and can be found in GitHub[https://github.com/M2000Interpreter/Version9]. Current version is 14, revision 4. See [[M2000 Interpreter Implementation]]
{{language programming paradigm|Imperative}}
{{language programming paradigm|Object-oriented}}
{{Language programming paradigm|Event-driven}}
@@ -21,12 +21,68 @@ M2000 has two set of vocabularies, one with English identifiers and one with Gre
M2000 start as an experimental interpreted language, using a Module in Module idea (like a Procedure in Procedure) where each inner Module is closed for modification, but open for expansion, by replacing code at run time. Source code executed as is, without second interpretation of a simple form, although block of code arranged for execution in a manner of consuming code (code which executed deleted, code in a loop kept as a copy for next iteration).
+We can use BASIC type statement's. Although there are some differences. Like the FOR NEXT:
+
+SET SWITCHES "+FOR"
+// WHY ? BECAUSE WHEN STEP IS POSITIVE (+1 HERE)
+// WE GET ITERATION IF START VALUE IS LESS OR EQUAL THE LAST VALUE
+FOR I=10 TO 0
+ PRINT "NEVER PRINT - IS LIKE BASIC"
+NEXT
+SET SWITCHES "+DIM"
+// WHY ? BECAUSE DIM MAKE AN ARRAY FROM 0 TO TOP VALUE (10)
+DIM A(10)=1
+PRINT LEN(A())=11, A(0), A(10), "BASIC"
+
+SET SWITCHES "-FOR" ' THE DEFAULT
+// WHY ? BECAUSE EVERY TIME ITERATE FROM START VALUE TO END VALUE
+FOR I=10 TO 0
+ PRINT "ALWAYS PRINT - IS NOT LIKE BASIC"
+NEXT
+
+SET SWITCHES "-DIM"
+// WHY ? BECAUSE DIM MAKE AN ARRAY N (10) ITEMS
+DIM A(10)=1
+PRINT LEN(A())=10, A(0), A(9), "M2000"
+DIM B(0 TO 10)=1 ' WE CAN DEFINE MIN AND MAX INDEX (CAN BE NEGATIVE)
+PRINT LEN(B())=11, B(0), B(10), "M2000"
+
+
Module's may be Global, or local to other modules. We can define global modules in a module, and all these definitions deleted at the end of module execution. Because we have to execute the definition of a module, we can select definition, or load definition before we call the module. Also modules can be part of object's of type Group. A module can't call itself unless we use Call module_name. The standard call is by using only the name of module. So from a module we can call local modules or global, but we can't call parent module (if isn't global). In a group we can call anything like a module plus the modules of the groups.
+We can use labels and line numbers (each number is just a label). After a line number we can place statement. Static subs/functions have same scope as the module scope. Here SomethingElse() is like Module as a program, with own scope.
+
+
+MODULE alfa {
+ FUNCTION SomethingElse(A, ZZ) {
+ =A/ZZ ' WE CAN'T READ Z HERE
+ }
+ 000 READ X
+ 001 Z=10
+ 005 GOSUB alfa
+ 010 COMPUTE(&X)
+ 020 PRINT @MUL10(X), SomethingElse(@MUL10(X), Z)
+ 030 IF X<20 THEN 10
+ 040 GOSUB alfa
+ 050 END
+ 060 SUB COMPUTE(&A)
+ 070 A++
+ 080 Z++ // SIDE EFFECT
+ 090 END SUB
+ 100 FUNCTION MUL10(A)
+ 110 =A*Z
+ 120 END FUNCTION
+alfa:
+ 130 PRINT "-------------------------"
+ 140 RETURN
+}
+alfa 14
+
+
We can change a inner module at the calling of a module, see the example: We call inner Beta in two stages. At the second stage we change inner Theta with Theta2. This is the decoration of Beta with Theta as Theta2. This is a temporary decoration because Beta after execution erase any new identifier including Theta. So each time we call Beta, statement Module Theta make this module unless a decoration stop it.
====English Vocabulary====
-Module Beta {
+Module Beta {
Module Theta (x){
Print "This is Theta, we get x=";x
}
diff --git a/Lang/M2000-Interpreter/ADFGVX-cipher b/Lang/M2000-Interpreter/ADFGVX-cipher
new file mode 120000
index 0000000000..58053e0f2d
--- /dev/null
+++ b/Lang/M2000-Interpreter/ADFGVX-cipher
@@ -0,0 +1 @@
+../../Task/ADFGVX-cipher/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Apply-a-digital-filter-direct-form-II-transposed- b/Lang/M2000-Interpreter/Apply-a-digital-filter-direct-form-II-transposed-
new file mode 120000
index 0000000000..0994290aa3
--- /dev/null
+++ b/Lang/M2000-Interpreter/Apply-a-digital-filter-direct-form-II-transposed-
@@ -0,0 +1 @@
+../../Task/Apply-a-digital-filter-direct-form-II-transposed-/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Cartesian-product-of-two-or-more-lists b/Lang/M2000-Interpreter/Cartesian-product-of-two-or-more-lists
new file mode 120000
index 0000000000..afa95add18
--- /dev/null
+++ b/Lang/M2000-Interpreter/Cartesian-product-of-two-or-more-lists
@@ -0,0 +1 @@
+../../Task/Cartesian-product-of-two-or-more-lists/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Compare-length-of-two-strings b/Lang/M2000-Interpreter/Compare-length-of-two-strings
new file mode 120000
index 0000000000..1726357b73
--- /dev/null
+++ b/Lang/M2000-Interpreter/Compare-length-of-two-strings
@@ -0,0 +1 @@
+../../Task/Compare-length-of-two-strings/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/File-extension-is-in-extensions-list b/Lang/M2000-Interpreter/File-extension-is-in-extensions-list
new file mode 120000
index 0000000000..6d12e57411
--- /dev/null
+++ b/Lang/M2000-Interpreter/File-extension-is-in-extensions-list
@@ -0,0 +1 @@
+../../Task/File-extension-is-in-extensions-list/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Greatest-subsequential-sum b/Lang/M2000-Interpreter/Greatest-subsequential-sum
new file mode 120000
index 0000000000..5470dd7511
--- /dev/null
+++ b/Lang/M2000-Interpreter/Greatest-subsequential-sum
@@ -0,0 +1 @@
+../../Task/Greatest-subsequential-sum/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Power-set b/Lang/M2000-Interpreter/Power-set
new file mode 120000
index 0000000000..c99b047826
--- /dev/null
+++ b/Lang/M2000-Interpreter/Power-set
@@ -0,0 +1 @@
+../../Task/Power-set/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Simple-turtle-graphics b/Lang/M2000-Interpreter/Simple-turtle-graphics
new file mode 120000
index 0000000000..8bb4a18e49
--- /dev/null
+++ b/Lang/M2000-Interpreter/Simple-turtle-graphics
@@ -0,0 +1 @@
+../../Task/Simple-turtle-graphics/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Sorting-algorithms-Strand-sort b/Lang/M2000-Interpreter/Sorting-algorithms-Strand-sort
new file mode 120000
index 0000000000..94b7b8369f
--- /dev/null
+++ b/Lang/M2000-Interpreter/Sorting-algorithms-Strand-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Strand-sort/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Strip-a-set-of-characters-from-a-string b/Lang/M2000-Interpreter/Strip-a-set-of-characters-from-a-string
new file mode 120000
index 0000000000..ca8f98d606
--- /dev/null
+++ b/Lang/M2000-Interpreter/Strip-a-set-of-characters-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-a-set-of-characters-from-a-string/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/MACRO-11/Run-length-encoding b/Lang/MACRO-11/Run-length-encoding
new file mode 120000
index 0000000000..3f700314e0
--- /dev/null
+++ b/Lang/MACRO-11/Run-length-encoding
@@ -0,0 +1 @@
+../../Task/Run-length-encoding/MACRO-11
\ No newline at end of file
diff --git a/Lang/MAD/Look-and-say-sequence b/Lang/MAD/Look-and-say-sequence
new file mode 120000
index 0000000000..dbca6a6456
--- /dev/null
+++ b/Lang/MAD/Look-and-say-sequence
@@ -0,0 +1 @@
+../../Task/Look-and-say-sequence/MAD
\ No newline at end of file
diff --git a/Lang/MSX-Basic/Evaluate-binomial-coefficients b/Lang/MSX-Basic/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..806e2bfad2
--- /dev/null
+++ b/Lang/MSX-Basic/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/MSX-Basic
\ No newline at end of file
diff --git a/Lang/MUMPS/00-LANG.txt b/Lang/MUMPS/00-LANG.txt
index cfb6ac9800..491ec139a6 100644
--- a/Lang/MUMPS/00-LANG.txt
+++ b/Lang/MUMPS/00-LANG.txt
@@ -1,14 +1,21 @@
{{language
-|untyped=yes}}
+|untyped=yes
+|gc
+|parampass|
+}}
+
{{language programming paradigm|procedural}}
-Visit the Google group comp.lang.mumps for discussions about this language.
+Visit the Google group/ Usenet newsgroupcomp.lang.mumps for discussions about this language.
Visit [[wp:MUMPS|Wikipedia]] for a general description.
See http://71.174.62.16/Demo/AnnoStd for details about the language.
-Standard MUMPS has one data types (strings) and some dialects (Cache, MSM) add a second data type (objects). A variable can be unsubscripted or not, and the subscripted variables form a
-sparse n-tree. MUMPS doesn't have traditional arrays, but has an array syntax that manipulates trees as if they were arrays, using indexing to access nodes of the tree. You can create a tree that can have unlimited levels of branching, with keys and values associated with each node in the tree. Similarly, while the language doesn't have lists, you can mimic lists by creating strings with a consistent character (or string) as a delimiter separating the entries.
-The Cache dialect also supports explicit List operations and data structures.
+
Standard MUMPS has one data type (strings) and some dialects (Cache, MSM, IRIS) add a second data type (objects). A variable can be unsubscripted or not, and the subscripted variables form a
+sparse n-tree, or associative arrays or sparse multidimensional hierarchical key-value pair with keys as strings and values as strings.
+
+MUMPS doesn't have traditional arrays, but has an array syntax that manipulates trees as if they were arrays, using indexing to access nodes of the tree. You can create a tree that can have unlimited levels of branching, with keys and values associated with each node in the tree. Similarly, while the language doesn't have lists, you can mimic lists by creating strings with a consistent character (or string) as a delimiter separating the entries.
+
+The Cache and IRIS dialects also support explicit List operations and data structures as values.
\ No newline at end of file
diff --git a/Lang/Maple/Pythagoras-tree b/Lang/Maple/Pythagoras-tree
new file mode 120000
index 0000000000..0342fe2180
--- /dev/null
+++ b/Lang/Maple/Pythagoras-tree
@@ -0,0 +1 @@
+../../Task/Pythagoras-tree/Maple
\ No newline at end of file
diff --git a/Lang/Mathematica/00-LANG.txt b/Lang/Mathematica/00-LANG.txt
index 5daf1eef81..15e81dd703 100644
--- a/Lang/Mathematica/00-LANG.txt
+++ b/Lang/Mathematica/00-LANG.txt
@@ -11,4 +11,4 @@ It is used in many scientific, engineering, mathematical and computing fields, a
[[Category:Mathematical programming languages]]
==Todo==
-[[Reports:Tasks_not_implemented_in_Mathematica]]
\ No newline at end of file
+[[Tasks not implemented in Mathematica]]
\ No newline at end of file
diff --git a/Lang/Mathematica/15-puzzle-solver b/Lang/Mathematica/15-puzzle-solver
new file mode 120000
index 0000000000..c802cd3973
--- /dev/null
+++ b/Lang/Mathematica/15-puzzle-solver
@@ -0,0 +1 @@
+../../Task/15-puzzle-solver/Mathematica
\ No newline at end of file
diff --git a/Lang/Mathematica/B-zier-curves-Intersections b/Lang/Mathematica/B-zier-curves-Intersections
new file mode 120000
index 0000000000..85dc8fb4ae
--- /dev/null
+++ b/Lang/Mathematica/B-zier-curves-Intersections
@@ -0,0 +1 @@
+../../Task/B-zier-curves-Intersections/Mathematica
\ No newline at end of file
diff --git a/Lang/Mathematica/Sisyphus-sequence b/Lang/Mathematica/Sisyphus-sequence
new file mode 120000
index 0000000000..82e0aee9dd
--- /dev/null
+++ b/Lang/Mathematica/Sisyphus-sequence
@@ -0,0 +1 @@
+../../Task/Sisyphus-sequence/Mathematica
\ No newline at end of file
diff --git a/Lang/Mathematica/Sphenic-numbers b/Lang/Mathematica/Sphenic-numbers
new file mode 120000
index 0000000000..c276d09072
--- /dev/null
+++ b/Lang/Mathematica/Sphenic-numbers
@@ -0,0 +1 @@
+../../Task/Sphenic-numbers/Mathematica
\ No newline at end of file
diff --git a/Lang/Mathematica/Wagstaff-primes b/Lang/Mathematica/Wagstaff-primes
new file mode 120000
index 0000000000..7e781a92a6
--- /dev/null
+++ b/Lang/Mathematica/Wagstaff-primes
@@ -0,0 +1 @@
+../../Task/Wagstaff-primes/Mathematica
\ No newline at end of file
diff --git a/Lang/Minimal-BASIC/Evaluate-binomial-coefficients b/Lang/Minimal-BASIC/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..6ad0769264
--- /dev/null
+++ b/Lang/Minimal-BASIC/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/Minimal-BASIC
\ No newline at end of file
diff --git a/Lang/Miranda/Loops-Infinite b/Lang/Miranda/Loops-Infinite
new file mode 120000
index 0000000000..8845df4b78
--- /dev/null
+++ b/Lang/Miranda/Loops-Infinite
@@ -0,0 +1 @@
+../../Task/Loops-Infinite/Miranda
\ No newline at end of file
diff --git a/Lang/Miranda/Run-length-encoding b/Lang/Miranda/Run-length-encoding
new file mode 120000
index 0000000000..e0fd07015b
--- /dev/null
+++ b/Lang/Miranda/Run-length-encoding
@@ -0,0 +1 @@
+../../Task/Run-length-encoding/Miranda
\ No newline at end of file
diff --git a/Lang/Modula-2/M-bius-function b/Lang/Modula-2/M-bius-function
new file mode 120000
index 0000000000..e2d4a4a9b1
--- /dev/null
+++ b/Lang/Modula-2/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/Modula-2
\ No newline at end of file
diff --git a/Lang/Modula-2/Magic-constant b/Lang/Modula-2/Magic-constant
new file mode 120000
index 0000000000..d6cf44baf4
--- /dev/null
+++ b/Lang/Modula-2/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/Modula-2
\ No newline at end of file
diff --git a/Lang/Modula-2/Map-range b/Lang/Modula-2/Map-range
new file mode 120000
index 0000000000..d2da488e09
--- /dev/null
+++ b/Lang/Modula-2/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/Modula-2
\ No newline at end of file
diff --git a/Lang/Modula-2/Ramer-Douglas-Peucker-line-simplification b/Lang/Modula-2/Ramer-Douglas-Peucker-line-simplification
new file mode 120000
index 0000000000..ff583aca48
--- /dev/null
+++ b/Lang/Modula-2/Ramer-Douglas-Peucker-line-simplification
@@ -0,0 +1 @@
+../../Task/Ramer-Douglas-Peucker-line-simplification/Modula-2
\ No newline at end of file
diff --git a/Lang/Nascom-BASIC/Levenshtein-distance b/Lang/Nascom-BASIC/Levenshtein-distance
new file mode 120000
index 0000000000..c821e59923
--- /dev/null
+++ b/Lang/Nascom-BASIC/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/Nascom-BASIC
\ No newline at end of file
diff --git a/Lang/Nu/CSV-data-manipulation b/Lang/Nu/CSV-data-manipulation
new file mode 120000
index 0000000000..212f9d037c
--- /dev/null
+++ b/Lang/Nu/CSV-data-manipulation
@@ -0,0 +1 @@
+../../Task/CSV-data-manipulation/Nu
\ No newline at end of file
diff --git a/Lang/Nu/Department-numbers b/Lang/Nu/Department-numbers
new file mode 120000
index 0000000000..bb0cfc31a5
--- /dev/null
+++ b/Lang/Nu/Department-numbers
@@ -0,0 +1 @@
+../../Task/Department-numbers/Nu
\ No newline at end of file
diff --git a/Lang/Nu/Determine-if-a-string-has-all-the-same-characters b/Lang/Nu/Determine-if-a-string-has-all-the-same-characters
new file mode 120000
index 0000000000..1b0a4160eb
--- /dev/null
+++ b/Lang/Nu/Determine-if-a-string-has-all-the-same-characters
@@ -0,0 +1 @@
+../../Task/Determine-if-a-string-has-all-the-same-characters/Nu
\ No newline at end of file
diff --git a/Lang/Nu/File-extension-is-in-extensions-list b/Lang/Nu/File-extension-is-in-extensions-list
new file mode 120000
index 0000000000..ee608b6863
--- /dev/null
+++ b/Lang/Nu/File-extension-is-in-extensions-list
@@ -0,0 +1 @@
+../../Task/File-extension-is-in-extensions-list/Nu
\ No newline at end of file
diff --git a/Lang/Nu/File-size-distribution b/Lang/Nu/File-size-distribution
new file mode 120000
index 0000000000..2ee98ba338
--- /dev/null
+++ b/Lang/Nu/File-size-distribution
@@ -0,0 +1 @@
+../../Task/File-size-distribution/Nu
\ No newline at end of file
diff --git a/Lang/Nu/I-before-E-except-after-C b/Lang/Nu/I-before-E-except-after-C
new file mode 120000
index 0000000000..3f6ace8c86
--- /dev/null
+++ b/Lang/Nu/I-before-E-except-after-C
@@ -0,0 +1 @@
+../../Task/I-before-E-except-after-C/Nu
\ No newline at end of file
diff --git a/Lang/Nu/Word-frequency b/Lang/Nu/Word-frequency
new file mode 120000
index 0000000000..b6ff2592c2
--- /dev/null
+++ b/Lang/Nu/Word-frequency
@@ -0,0 +1 @@
+../../Task/Word-frequency/Nu
\ No newline at end of file
diff --git a/Lang/OCaml/Anti-primes b/Lang/OCaml/Anti-primes
new file mode 120000
index 0000000000..5c78fd8505
--- /dev/null
+++ b/Lang/OCaml/Anti-primes
@@ -0,0 +1 @@
+../../Task/Anti-primes/OCaml
\ No newline at end of file
diff --git a/Lang/OCaml/Attractive-numbers b/Lang/OCaml/Attractive-numbers
new file mode 120000
index 0000000000..7813955dbc
--- /dev/null
+++ b/Lang/OCaml/Attractive-numbers
@@ -0,0 +1 @@
+../../Task/Attractive-numbers/OCaml
\ No newline at end of file
diff --git a/Lang/OCaml/Cuban-primes b/Lang/OCaml/Cuban-primes
new file mode 120000
index 0000000000..d69918cc8d
--- /dev/null
+++ b/Lang/OCaml/Cuban-primes
@@ -0,0 +1 @@
+../../Task/Cuban-primes/OCaml
\ No newline at end of file
diff --git a/Lang/OOC/00-LANG.txt b/Lang/OOC/00-LANG.txt
index 6ab39964dc..65c190709f 100644
--- a/Lang/OOC/00-LANG.txt
+++ b/Lang/OOC/00-LANG.txt
@@ -1,2 +1,2 @@
{{stub}}{{language
-|site=http://ooc-lang.org}}
\ No newline at end of file
+|site=https://ooc-lang.github.io/}}
\ No newline at end of file
diff --git a/Lang/OPL/00-LANG.txt b/Lang/OPL/00-LANG.txt
index 8357c2d27a..5d7f1fba8f 100644
--- a/Lang/OPL/00-LANG.txt
+++ b/Lang/OPL/00-LANG.txt
@@ -1,3 +1,11 @@
{{stub}}
{{language
-|site=http://opl-dev.sourceforge.net/}}
\ No newline at end of file
+|site=http://opl-dev.sourceforge.net/}}
+
+'''OPL (Open Programming Language'''; formerly '''Organiser Programming Language)''' is a high-level programming language designed primarily for use on mobile devices, particularly those running the Psion Series 3 and Series 5 operating systems. Developed in the early 1990s, '''OPL''' was created to provide a simple yet powerful environment for application development on handheld devices, allowing users to create software that could leverage the unique features of these portable platforms.
+
+OPL is known for its ease of use, making it accessible to both novice and experienced programmers. The language features a syntax that is similar to [[BASIC]], which helps in rapid application development. It supports structured programming concepts, including variables, control structures, and functions, enabling developers to write clear and maintainable code.
+
+One of the key strengths of OPL is its ability to interact seamlessly with the underlying operating system, allowing developers to access device-specific features such as file management, user interface elements, and hardware capabilities. This makes OPL particularly suitable for creating productivity applications, games, and utilities tailored for mobile users.
+
+Despite its niche status, OPL has garnered a dedicated community of enthusiasts and developers who continue to explore its capabilities and create innovative applications. As mobile computing continues to evolve, OPL remains a notable example of early efforts to bring programming to handheld devices, showcasing the potential of portable technology in software development.
\ No newline at end of file
diff --git a/Lang/OPL/100-doors b/Lang/OPL/100-doors
new file mode 120000
index 0000000000..a3b7e045e6
--- /dev/null
+++ b/Lang/OPL/100-doors
@@ -0,0 +1 @@
+../../Task/100-doors/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Arithmetic-Integer b/Lang/OPL/Arithmetic-Integer
new file mode 120000
index 0000000000..dfcb743d43
--- /dev/null
+++ b/Lang/OPL/Arithmetic-Integer
@@ -0,0 +1 @@
+../../Task/Arithmetic-Integer/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Arrays b/Lang/OPL/Arrays
new file mode 120000
index 0000000000..f57347887c
--- /dev/null
+++ b/Lang/OPL/Arrays
@@ -0,0 +1 @@
+../../Task/Arrays/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Character-codes b/Lang/OPL/Character-codes
new file mode 120000
index 0000000000..2dac3156b8
--- /dev/null
+++ b/Lang/OPL/Character-codes
@@ -0,0 +1 @@
+../../Task/Character-codes/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Comments b/Lang/OPL/Comments
new file mode 120000
index 0000000000..8aec78d8aa
--- /dev/null
+++ b/Lang/OPL/Comments
@@ -0,0 +1 @@
+../../Task/Comments/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Compare-length-of-two-strings b/Lang/OPL/Compare-length-of-two-strings
new file mode 120000
index 0000000000..c36f1e31fc
--- /dev/null
+++ b/Lang/OPL/Compare-length-of-two-strings
@@ -0,0 +1 @@
+../../Task/Compare-length-of-two-strings/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Copy-a-string b/Lang/OPL/Copy-a-string
new file mode 120000
index 0000000000..76609905e5
--- /dev/null
+++ b/Lang/OPL/Copy-a-string
@@ -0,0 +1 @@
+../../Task/Copy-a-string/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Draw-a-clock b/Lang/OPL/Draw-a-clock
new file mode 120000
index 0000000000..438c8aadf3
--- /dev/null
+++ b/Lang/OPL/Draw-a-clock
@@ -0,0 +1 @@
+../../Task/Draw-a-clock/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Draw-a-pixel b/Lang/OPL/Draw-a-pixel
new file mode 120000
index 0000000000..d5c6ecea21
--- /dev/null
+++ b/Lang/OPL/Draw-a-pixel
@@ -0,0 +1 @@
+../../Task/Draw-a-pixel/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Hello-world-Text b/Lang/OPL/Hello-world-Text
new file mode 120000
index 0000000000..a870057a16
--- /dev/null
+++ b/Lang/OPL/Hello-world-Text
@@ -0,0 +1 @@
+../../Task/Hello-world-Text/OPL
\ No newline at end of file
diff --git a/Lang/OPL/Program-termination b/Lang/OPL/Program-termination
new file mode 120000
index 0000000000..8287761646
--- /dev/null
+++ b/Lang/OPL/Program-termination
@@ -0,0 +1 @@
+../../Task/Program-termination/OPL
\ No newline at end of file
diff --git a/Lang/OPL/String-prepend b/Lang/OPL/String-prepend
new file mode 120000
index 0000000000..78cb69646e
--- /dev/null
+++ b/Lang/OPL/String-prepend
@@ -0,0 +1 @@
+../../Task/String-prepend/OPL
\ No newline at end of file
diff --git a/Lang/OPL/User-input-Text b/Lang/OPL/User-input-Text
new file mode 120000
index 0000000000..ad39694040
--- /dev/null
+++ b/Lang/OPL/User-input-Text
@@ -0,0 +1 @@
+../../Task/User-input-Text/OPL
\ No newline at end of file
diff --git a/Lang/Objeck/Copy-stdin-to-stdout b/Lang/Objeck/Copy-stdin-to-stdout
new file mode 120000
index 0000000000..b358bbac43
--- /dev/null
+++ b/Lang/Objeck/Copy-stdin-to-stdout
@@ -0,0 +1 @@
+../../Task/Copy-stdin-to-stdout/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Distributed-programming b/Lang/Objeck/Distributed-programming
new file mode 120000
index 0000000000..728f38ee28
--- /dev/null
+++ b/Lang/Objeck/Distributed-programming
@@ -0,0 +1 @@
+../../Task/Distributed-programming/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Floyds-triangle b/Lang/Objeck/Floyds-triangle
new file mode 120000
index 0000000000..743553b677
--- /dev/null
+++ b/Lang/Objeck/Floyds-triangle
@@ -0,0 +1 @@
+../../Task/Floyds-triangle/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Generate-lower-case-ASCII-alphabet b/Lang/Objeck/Generate-lower-case-ASCII-alphabet
new file mode 120000
index 0000000000..92f0212a12
--- /dev/null
+++ b/Lang/Objeck/Generate-lower-case-ASCII-alphabet
@@ -0,0 +1 @@
+../../Task/Generate-lower-case-ASCII-alphabet/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Hello-world-Standard-error b/Lang/Objeck/Hello-world-Standard-error
new file mode 120000
index 0000000000..49d3f16aa6
--- /dev/null
+++ b/Lang/Objeck/Hello-world-Standard-error
@@ -0,0 +1 @@
+../../Task/Hello-world-Standard-error/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Knuth-shuffle b/Lang/Objeck/Knuth-shuffle
new file mode 120000
index 0000000000..a7bb43880d
--- /dev/null
+++ b/Lang/Objeck/Knuth-shuffle
@@ -0,0 +1 @@
+../../Task/Knuth-shuffle/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Mad-Libs b/Lang/Objeck/Mad-Libs
new file mode 120000
index 0000000000..39f19ea059
--- /dev/null
+++ b/Lang/Objeck/Mad-Libs
@@ -0,0 +1 @@
+../../Task/Mad-Libs/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Multiplication-tables b/Lang/Objeck/Multiplication-tables
new file mode 120000
index 0000000000..3bad27bce2
--- /dev/null
+++ b/Lang/Objeck/Multiplication-tables
@@ -0,0 +1 @@
+../../Task/Multiplication-tables/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Roman-numerals-Decode b/Lang/Objeck/Roman-numerals-Decode
new file mode 120000
index 0000000000..bd8b56a721
--- /dev/null
+++ b/Lang/Objeck/Roman-numerals-Decode
@@ -0,0 +1 @@
+../../Task/Roman-numerals-Decode/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Rosetta-Code-Find-unimplemented-tasks b/Lang/Objeck/Rosetta-Code-Find-unimplemented-tasks
new file mode 120000
index 0000000000..7e77326aa1
--- /dev/null
+++ b/Lang/Objeck/Rosetta-Code-Find-unimplemented-tasks
@@ -0,0 +1 @@
+../../Task/Rosetta-Code-Find-unimplemented-tasks/Objeck
\ No newline at end of file
diff --git a/Lang/Objeck/Strip-a-set-of-characters-from-a-string b/Lang/Objeck/Strip-a-set-of-characters-from-a-string
new file mode 120000
index 0000000000..f651f9d55d
--- /dev/null
+++ b/Lang/Objeck/Strip-a-set-of-characters-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-a-set-of-characters-from-a-string/Objeck
\ No newline at end of file
diff --git a/Lang/Odin/Euler-method b/Lang/Odin/Euler-method
new file mode 120000
index 0000000000..2085f38551
--- /dev/null
+++ b/Lang/Odin/Euler-method
@@ -0,0 +1 @@
+../../Task/Euler-method/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Execute-Brain- b/Lang/Odin/Execute-Brain-
new file mode 120000
index 0000000000..748dbb9c99
--- /dev/null
+++ b/Lang/Odin/Execute-Brain-
@@ -0,0 +1 @@
+../../Task/Execute-Brain-/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Fractran b/Lang/Odin/Fractran
new file mode 120000
index 0000000000..5bd1840a6a
--- /dev/null
+++ b/Lang/Odin/Fractran
@@ -0,0 +1 @@
+../../Task/Fractran/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Hailstone-sequence b/Lang/Odin/Hailstone-sequence
new file mode 120000
index 0000000000..678ea867f0
--- /dev/null
+++ b/Lang/Odin/Hailstone-sequence
@@ -0,0 +1 @@
+../../Task/Hailstone-sequence/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Hello-world-Graphical b/Lang/Odin/Hello-world-Graphical
new file mode 120000
index 0000000000..00108512b1
--- /dev/null
+++ b/Lang/Odin/Hello-world-Graphical
@@ -0,0 +1 @@
+../../Task/Hello-world-Graphical/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Primality-by-trial-division b/Lang/Odin/Primality-by-trial-division
new file mode 120000
index 0000000000..8e356363dd
--- /dev/null
+++ b/Lang/Odin/Primality-by-trial-division
@@ -0,0 +1 @@
+../../Task/Primality-by-trial-division/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Runge-Kutta-method b/Lang/Odin/Runge-Kutta-method
new file mode 120000
index 0000000000..1b9162c995
--- /dev/null
+++ b/Lang/Odin/Runge-Kutta-method
@@ -0,0 +1 @@
+../../Task/Runge-Kutta-method/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Strip-a-set-of-characters-from-a-string b/Lang/Odin/Strip-a-set-of-characters-from-a-string
new file mode 120000
index 0000000000..b76ef81d13
--- /dev/null
+++ b/Lang/Odin/Strip-a-set-of-characters-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-a-set-of-characters-from-a-string/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Unicode-variable-names b/Lang/Odin/Unicode-variable-names
new file mode 120000
index 0000000000..f070da9637
--- /dev/null
+++ b/Lang/Odin/Unicode-variable-names
@@ -0,0 +1 @@
+../../Task/Unicode-variable-names/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Write-entire-file b/Lang/Odin/Write-entire-file
new file mode 120000
index 0000000000..53b4243bae
--- /dev/null
+++ b/Lang/Odin/Write-entire-file
@@ -0,0 +1 @@
+../../Task/Write-entire-file/Odin
\ No newline at end of file
diff --git a/Lang/Ol/Runge-Kutta-method b/Lang/Ol/Runge-Kutta-method
new file mode 120000
index 0000000000..55f8d1bf18
--- /dev/null
+++ b/Lang/Ol/Runge-Kutta-method
@@ -0,0 +1 @@
+../../Task/Runge-Kutta-method/Ol
\ No newline at end of file
diff --git a/Lang/OxygenBasic/Evaluate-binomial-coefficients b/Lang/OxygenBasic/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..2fc6117dc9
--- /dev/null
+++ b/Lang/OxygenBasic/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/OxygenBasic
\ No newline at end of file
diff --git a/Lang/PARI-GP/Attractive-numbers b/Lang/PARI-GP/Attractive-numbers
new file mode 120000
index 0000000000..9c5ab01706
--- /dev/null
+++ b/Lang/PARI-GP/Attractive-numbers
@@ -0,0 +1 @@
+../../Task/Attractive-numbers/PARI-GP
\ No newline at end of file
diff --git a/Lang/PARI-GP/Disarium-numbers b/Lang/PARI-GP/Disarium-numbers
new file mode 120000
index 0000000000..e21e95674b
--- /dev/null
+++ b/Lang/PARI-GP/Disarium-numbers
@@ -0,0 +1 @@
+../../Task/Disarium-numbers/PARI-GP
\ No newline at end of file
diff --git a/Lang/PARI-GP/Prime-numbers-whose-neighboring-pairs-are-tetraprimes b/Lang/PARI-GP/Prime-numbers-whose-neighboring-pairs-are-tetraprimes
new file mode 120000
index 0000000000..497a956889
--- /dev/null
+++ b/Lang/PARI-GP/Prime-numbers-whose-neighboring-pairs-are-tetraprimes
@@ -0,0 +1 @@
+../../Task/Prime-numbers-whose-neighboring-pairs-are-tetraprimes/PARI-GP
\ No newline at end of file
diff --git a/Lang/PHP/M-bius-function b/Lang/PHP/M-bius-function
new file mode 120000
index 0000000000..6f4e3a47bb
--- /dev/null
+++ b/Lang/PHP/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/PHP
\ No newline at end of file
diff --git a/Lang/PHP/Magic-constant b/Lang/PHP/Magic-constant
new file mode 120000
index 0000000000..b67d20fb19
--- /dev/null
+++ b/Lang/PHP/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/PHP
\ No newline at end of file
diff --git a/Lang/PHP/Map-range b/Lang/PHP/Map-range
new file mode 120000
index 0000000000..07d5696e85
--- /dev/null
+++ b/Lang/PHP/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/PHP
\ No newline at end of file
diff --git a/Lang/PL-I-80/Additive-primes b/Lang/PL-I-80/Additive-primes
new file mode 120000
index 0000000000..a065cd3d8e
--- /dev/null
+++ b/Lang/PL-I-80/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/PL-I-80
\ No newline at end of file
diff --git a/Lang/Pascal/Date-manipulation b/Lang/Pascal/Date-manipulation
new file mode 120000
index 0000000000..9edece533b
--- /dev/null
+++ b/Lang/Pascal/Date-manipulation
@@ -0,0 +1 @@
+../../Task/Date-manipulation/Pascal
\ No newline at end of file
diff --git a/Lang/Pascal/FizzBuzz b/Lang/Pascal/FizzBuzz
deleted file mode 120000
index 786dae3647..0000000000
--- a/Lang/Pascal/FizzBuzz
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/FizzBuzz/Pascal
\ No newline at end of file
diff --git a/Lang/Pascal/Levenshtein-distance b/Lang/Pascal/Levenshtein-distance
deleted file mode 120000
index aa9f13dc0f..0000000000
--- a/Lang/Pascal/Levenshtein-distance
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/Levenshtein-distance/Pascal
\ No newline at end of file
diff --git a/Lang/Pascal/Map-range b/Lang/Pascal/Map-range
deleted file mode 120000
index 71c05c40ec..0000000000
--- a/Lang/Pascal/Map-range
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/Map-range/Pascal
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Additive-primes b/Lang/PascalABC.NET/Additive-primes
new file mode 120000
index 0000000000..0022732e2e
--- /dev/null
+++ b/Lang/PascalABC.NET/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Amicable-pairs b/Lang/PascalABC.NET/Amicable-pairs
new file mode 120000
index 0000000000..e8f5a09925
--- /dev/null
+++ b/Lang/PascalABC.NET/Amicable-pairs
@@ -0,0 +1 @@
+../../Task/Amicable-pairs/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Pancake-numbers b/Lang/PascalABC.NET/Pancake-numbers
new file mode 120000
index 0000000000..b4faf1b68d
--- /dev/null
+++ b/Lang/PascalABC.NET/Pancake-numbers
@@ -0,0 +1 @@
+../../Task/Pancake-numbers/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Pangram-checker b/Lang/PascalABC.NET/Pangram-checker
new file mode 120000
index 0000000000..114e870600
--- /dev/null
+++ b/Lang/PascalABC.NET/Pangram-checker
@@ -0,0 +1 @@
+../../Task/Pangram-checker/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Paraffins b/Lang/PascalABC.NET/Paraffins
new file mode 120000
index 0000000000..bafd6e0939
--- /dev/null
+++ b/Lang/PascalABC.NET/Paraffins
@@ -0,0 +1 @@
+../../Task/Paraffins/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Parallel-calculations b/Lang/PascalABC.NET/Parallel-calculations
new file mode 120000
index 0000000000..e88e92c1df
--- /dev/null
+++ b/Lang/PascalABC.NET/Parallel-calculations
@@ -0,0 +1 @@
+../../Task/Parallel-calculations/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Parsing-RPN-calculator-algorithm b/Lang/PascalABC.NET/Parsing-RPN-calculator-algorithm
new file mode 120000
index 0000000000..c4ae7949cd
--- /dev/null
+++ b/Lang/PascalABC.NET/Parsing-RPN-calculator-algorithm
@@ -0,0 +1 @@
+../../Task/Parsing-RPN-calculator-algorithm/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Partition-an-integer-x-into-n-primes b/Lang/PascalABC.NET/Partition-an-integer-x-into-n-primes
new file mode 120000
index 0000000000..eb7a5e97f7
--- /dev/null
+++ b/Lang/PascalABC.NET/Partition-an-integer-x-into-n-primes
@@ -0,0 +1 @@
+../../Task/Partition-an-integer-x-into-n-primes/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Pascal-matrix-generation b/Lang/PascalABC.NET/Pascal-matrix-generation
new file mode 120000
index 0000000000..c8097eca88
--- /dev/null
+++ b/Lang/PascalABC.NET/Pascal-matrix-generation
@@ -0,0 +1 @@
+../../Task/Pascal-matrix-generation/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Pascals-triangle-Puzzle b/Lang/PascalABC.NET/Pascals-triangle-Puzzle
new file mode 120000
index 0000000000..8106a5db3a
--- /dev/null
+++ b/Lang/PascalABC.NET/Pascals-triangle-Puzzle
@@ -0,0 +1 @@
+../../Task/Pascals-triangle-Puzzle/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Pathological-floating-point-problems b/Lang/PascalABC.NET/Pathological-floating-point-problems
new file mode 120000
index 0000000000..7eaa34e4a8
--- /dev/null
+++ b/Lang/PascalABC.NET/Pathological-floating-point-problems
@@ -0,0 +1 @@
+../../Task/Pathological-floating-point-problems/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Pells-equation b/Lang/PascalABC.NET/Pells-equation
new file mode 120000
index 0000000000..1729f4ebb8
--- /dev/null
+++ b/Lang/PascalABC.NET/Pells-equation
@@ -0,0 +1 @@
+../../Task/Pells-equation/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Perfect-shuffle b/Lang/PascalABC.NET/Perfect-shuffle
new file mode 120000
index 0000000000..5ea5d5cf28
--- /dev/null
+++ b/Lang/PascalABC.NET/Perfect-shuffle
@@ -0,0 +1 @@
+../../Task/Perfect-shuffle/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Perfect-totient-numbers b/Lang/PascalABC.NET/Perfect-totient-numbers
new file mode 120000
index 0000000000..8aae312612
--- /dev/null
+++ b/Lang/PascalABC.NET/Perfect-totient-numbers
@@ -0,0 +1 @@
+../../Task/Perfect-totient-numbers/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/PascalABC.NET/Permutation-test b/Lang/PascalABC.NET/Permutation-test
new file mode 120000
index 0000000000..38efc59733
--- /dev/null
+++ b/Lang/PascalABC.NET/Permutation-test
@@ -0,0 +1 @@
+../../Task/Permutation-test/PascalABC.NET
\ No newline at end of file
diff --git a/Lang/Perl/Execute-Computer-Zero b/Lang/Perl/Execute-Computer-Zero
new file mode 120000
index 0000000000..f5f02da865
--- /dev/null
+++ b/Lang/Perl/Execute-Computer-Zero
@@ -0,0 +1 @@
+../../Task/Execute-Computer-Zero/Perl
\ No newline at end of file
diff --git a/Lang/Prolog/Evaluate-binomial-coefficients b/Lang/Prolog/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..15602e690b
--- /dev/null
+++ b/Lang/Prolog/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/Prolog
\ No newline at end of file
diff --git a/Lang/Python/Im-a-software-engineer-get-me-out-of-here b/Lang/Python/Im-a-software-engineer-get-me-out-of-here
new file mode 120000
index 0000000000..d238ff00d2
--- /dev/null
+++ b/Lang/Python/Im-a-software-engineer-get-me-out-of-here
@@ -0,0 +1 @@
+../../Task/Im-a-software-engineer-get-me-out-of-here/Python
\ No newline at end of file
diff --git a/Lang/Python/Prime-numbers-whose-neighboring-pairs-are-tetraprimes b/Lang/Python/Prime-numbers-whose-neighboring-pairs-are-tetraprimes
new file mode 120000
index 0000000000..9997b73880
--- /dev/null
+++ b/Lang/Python/Prime-numbers-whose-neighboring-pairs-are-tetraprimes
@@ -0,0 +1 @@
+../../Task/Prime-numbers-whose-neighboring-pairs-are-tetraprimes/Python
\ No newline at end of file
diff --git a/Lang/Python/Square-form-factorization b/Lang/Python/Square-form-factorization
new file mode 120000
index 0000000000..38da301a59
--- /dev/null
+++ b/Lang/Python/Square-form-factorization
@@ -0,0 +1 @@
+../../Task/Square-form-factorization/Python
\ No newline at end of file
diff --git a/Lang/Python/Wasteful-equidigital-and-frugal-numbers b/Lang/Python/Wasteful-equidigital-and-frugal-numbers
new file mode 120000
index 0000000000..c89de12312
--- /dev/null
+++ b/Lang/Python/Wasteful-equidigital-and-frugal-numbers
@@ -0,0 +1 @@
+../../Task/Wasteful-equidigital-and-frugal-numbers/Python
\ No newline at end of file
diff --git a/Lang/Q/Euler-method b/Lang/Q/Euler-method
new file mode 120000
index 0000000000..093ad80e13
--- /dev/null
+++ b/Lang/Q/Euler-method
@@ -0,0 +1 @@
+../../Task/Euler-method/Q
\ No newline at end of file
diff --git a/Lang/QBasic/Evaluate-binomial-coefficients b/Lang/QBasic/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..86b00c5e75
--- /dev/null
+++ b/Lang/QBasic/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/QBasic
\ No newline at end of file
diff --git a/Lang/QBasic/Map-range b/Lang/QBasic/Map-range
new file mode 120000
index 0000000000..be9705365d
--- /dev/null
+++ b/Lang/QBasic/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/QBasic
\ No newline at end of file
diff --git a/Lang/Quackery/00-LANG.txt b/Lang/Quackery/00-LANG.txt
index c6437e7156..7eab14d4c5 100644
--- a/Lang/Quackery/00-LANG.txt
+++ b/Lang/Quackery/00-LANG.txt
@@ -29,4 +29,26 @@ Conceptually, the Quackery engine is a stack based processor which does not have
Quackery is not intended to be a super-fast enterprise-level language; it is intended as an exploration of a novel architecture, and a fun programming project straight out of a textbook. (The textbook is included in the download.)
-Why not try your hand at one of the [[Tasks not implemented in Quackery]].
\ No newline at end of file
+Why not try your hand at one of the [[Tasks not implemented in Quackery]].
+
+== Selected Quackery Examples ==
+
+Rosetta Code has hundreds of Quackery examples. Here’s a curated set that showcases some of Quackery's strengths:
+
+* [[99 bottles of beer#Quackery|99 bottles of beer]] Shows simple, readable control flow and output.
+* [[Gosper's hack#Quackery|Gosper's hack]] A nifty one-liner.
+* [[Temperature conversion#Quackery|Temperature conversion]] Co-operative brevity.
+* [[Balanced brackets#Quackery|Balanced brackets]] Demonstrates natural stack use for classic problems.
+* [[Loops/Increment loop index within loop body#Quackery|Increment loop index within loop body]] You want a loop that's indexed ''and'' indefinite? Here's how.
+* [[Quine#Quackery|Quine]] Illustrates code-as-data and quotation handling.
+* [[Bacon cipher#Quackery|Bacon cipher]] Highlights clear text manipulation with minimal code.
+* [[Permutations#Quackery|Permutations]] Uses recursion and stack shuffling expressively.
+* [[Sorting algorithms/Insertion sort#Quackery|Insertion sort]] Demonstrates some built-in higher-order functions.
+* [[Higher-order functions#Quackery|Higher-order functions]] Defining and using fold, map, and filter.
+* [[Conway's Game of Life#Quackery|Conway's Game of Life]] Handles structured simulation with clarity.
+* [[Execute Brain****#Quackery|Brainf*** interpreter]] Demonstrates interpreter-building and extensibility.
+* [[Dinesman's multiple-dwelling problem#Quackery|Dinesman's multiple-dwelling problem]] Crafting a Domain Specific Language.
+
+== The Task that Nearly Broke the Author ==
+
+* [[Zeckendorf arithmetic#Quackery|Zeckendorf arithmetic]] Forget everything you thought you knew about arithmetic…
\ No newline at end of file
diff --git a/Lang/Quackery/Dice-game-probabilities b/Lang/Quackery/Dice-game-probabilities
new file mode 120000
index 0000000000..87d28dc799
--- /dev/null
+++ b/Lang/Quackery/Dice-game-probabilities
@@ -0,0 +1 @@
+../../Task/Dice-game-probabilities/Quackery
\ No newline at end of file
diff --git a/Lang/Quackery/Sum-of-elements-below-main-diagonal-of-matrix b/Lang/Quackery/Sum-of-elements-below-main-diagonal-of-matrix
new file mode 120000
index 0000000000..1f9736ed88
--- /dev/null
+++ b/Lang/Quackery/Sum-of-elements-below-main-diagonal-of-matrix
@@ -0,0 +1 @@
+../../Task/Sum-of-elements-below-main-diagonal-of-matrix/Quackery
\ No newline at end of file
diff --git a/Lang/Quackery/Two-bullet-roulette b/Lang/Quackery/Two-bullet-roulette
new file mode 120000
index 0000000000..24f00326c1
--- /dev/null
+++ b/Lang/Quackery/Two-bullet-roulette
@@ -0,0 +1 @@
+../../Task/Two-bullet-roulette/Quackery
\ No newline at end of file
diff --git a/Lang/R/Camel-case-and-snake-case b/Lang/R/Camel-case-and-snake-case
new file mode 120000
index 0000000000..e76dd2d66a
--- /dev/null
+++ b/Lang/R/Camel-case-and-snake-case
@@ -0,0 +1 @@
+../../Task/Camel-case-and-snake-case/R
\ No newline at end of file
diff --git a/Lang/R/Determine-sentence-type b/Lang/R/Determine-sentence-type
new file mode 120000
index 0000000000..b5e3ac4763
--- /dev/null
+++ b/Lang/R/Determine-sentence-type
@@ -0,0 +1 @@
+../../Task/Determine-sentence-type/R
\ No newline at end of file
diff --git a/Lang/R/Disarium-numbers b/Lang/R/Disarium-numbers
new file mode 120000
index 0000000000..233dce846c
--- /dev/null
+++ b/Lang/R/Disarium-numbers
@@ -0,0 +1 @@
+../../Task/Disarium-numbers/R
\ No newline at end of file
diff --git a/Lang/R/Display-a-linear-combination b/Lang/R/Display-a-linear-combination
new file mode 120000
index 0000000000..c292ce3aec
--- /dev/null
+++ b/Lang/R/Display-a-linear-combination
@@ -0,0 +1 @@
+../../Task/Display-a-linear-combination/R
\ No newline at end of file
diff --git a/Lang/R/Draw-a-cuboid b/Lang/R/Draw-a-cuboid
new file mode 120000
index 0000000000..b0d15ca88e
--- /dev/null
+++ b/Lang/R/Draw-a-cuboid
@@ -0,0 +1 @@
+../../Task/Draw-a-cuboid/R
\ No newline at end of file
diff --git a/Lang/R/Dutch-national-flag-problem b/Lang/R/Dutch-national-flag-problem
new file mode 120000
index 0000000000..422342365f
--- /dev/null
+++ b/Lang/R/Dutch-national-flag-problem
@@ -0,0 +1 @@
+../../Task/Dutch-national-flag-problem/R
\ No newline at end of file
diff --git a/Lang/R/Factorions b/Lang/R/Factorions
new file mode 120000
index 0000000000..351fcd0d06
--- /dev/null
+++ b/Lang/R/Factorions
@@ -0,0 +1 @@
+../../Task/Factorions/R
\ No newline at end of file
diff --git a/Lang/R/Find-palindromic-numbers-in-both-binary-and-ternary-bases b/Lang/R/Find-palindromic-numbers-in-both-binary-and-ternary-bases
new file mode 120000
index 0000000000..1adf6989fe
--- /dev/null
+++ b/Lang/R/Find-palindromic-numbers-in-both-binary-and-ternary-bases
@@ -0,0 +1 @@
+../../Task/Find-palindromic-numbers-in-both-binary-and-ternary-bases/R
\ No newline at end of file
diff --git a/Lang/R/Halt-and-catch-fire b/Lang/R/Halt-and-catch-fire
new file mode 120000
index 0000000000..f754df332d
--- /dev/null
+++ b/Lang/R/Halt-and-catch-fire
@@ -0,0 +1 @@
+../../Task/Halt-and-catch-fire/R
\ No newline at end of file
diff --git a/Lang/R/Hex-words b/Lang/R/Hex-words
new file mode 120000
index 0000000000..f38acbfb8b
--- /dev/null
+++ b/Lang/R/Hex-words
@@ -0,0 +1 @@
+../../Task/Hex-words/R
\ No newline at end of file
diff --git a/Lang/R/Kernighans-large-earthquake-problem b/Lang/R/Kernighans-large-earthquake-problem
new file mode 120000
index 0000000000..e4a703f050
--- /dev/null
+++ b/Lang/R/Kernighans-large-earthquake-problem
@@ -0,0 +1 @@
+../../Task/Kernighans-large-earthquake-problem/R
\ No newline at end of file
diff --git a/Lang/R/Munchausen-numbers b/Lang/R/Munchausen-numbers
new file mode 120000
index 0000000000..aa4d45945f
--- /dev/null
+++ b/Lang/R/Munchausen-numbers
@@ -0,0 +1 @@
+../../Task/Munchausen-numbers/R
\ No newline at end of file
diff --git a/Lang/R/Old-Russian-measure-of-length b/Lang/R/Old-Russian-measure-of-length
new file mode 120000
index 0000000000..10e03acc09
--- /dev/null
+++ b/Lang/R/Old-Russian-measure-of-length
@@ -0,0 +1 @@
+../../Task/Old-Russian-measure-of-length/R
\ No newline at end of file
diff --git a/Lang/R/Semordnilap b/Lang/R/Semordnilap
new file mode 120000
index 0000000000..8ef388caef
--- /dev/null
+++ b/Lang/R/Semordnilap
@@ -0,0 +1 @@
+../../Task/Semordnilap/R
\ No newline at end of file
diff --git a/Lang/R/Sort-numbers-lexicographically b/Lang/R/Sort-numbers-lexicographically
new file mode 120000
index 0000000000..77a76317d2
--- /dev/null
+++ b/Lang/R/Sort-numbers-lexicographically
@@ -0,0 +1 @@
+../../Task/Sort-numbers-lexicographically/R
\ No newline at end of file
diff --git a/Lang/R/Strip-a-set-of-characters-from-a-string b/Lang/R/Strip-a-set-of-characters-from-a-string
new file mode 120000
index 0000000000..b83d60c994
--- /dev/null
+++ b/Lang/R/Strip-a-set-of-characters-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-a-set-of-characters-from-a-string/R
\ No newline at end of file
diff --git a/Lang/REXX/00-LANG.txt b/Lang/REXX/00-LANG.txt
index a1abf9f554..fd028fe2bc 100644
--- a/Lang/REXX/00-LANG.txt
+++ b/Lang/REXX/00-LANG.txt
@@ -28,12 +28,17 @@ The '''REXX''' language was influenced by the computer programming languages: &n
Using Classic REXX closely resembles pseudo code and many languages like Basic or Julia. Experienced programmers should have no problem reading REXX code and translating it to other languages.
Some items that might differ from what you are familiar with.
-* No data types, no declarations, everything is string.
+* Caseless, fully free format.
+* Code blocks delimited by do...end, no brackets (){}.
+* Usual control structures present: do...by...to, do while/until, select, leave, iterate.
+* No data types, no declarations, everything is string. String functions such as Left() or Substr() may be applied on numbers.
+* All arithmetic is decimal based, not binary. So stuff like bit shifting or multiply/divide by 2 using exponent add/subtract does not apply.
* Exponentiation is designated by '**' thus x^2 = x**2.
* Integer division is designated by '%' thus 13%3 = 4.
* Modulo division (remainder) is designated by '//' thus 13//3 = 1 ('13 mod 3').
* Arrays (here called 'stems') are designated by something like 'stem.a.b. etc' (stem = name array; a, b etc any value; 'associative arrays').
* Precision is unlimited (default 9 digits), but you have to specify it yourself ('numeric digits nn').
+* Parameter passing always by value. Stems cannot be passed, but must be made available with 'expose'.
Versions of REXX:
* '''[[wp:ARexx|ARexx]]''' is a classic REXX implementation (with extensions) for the AmigaOS, given in bundle since AmigaOS 2. (Regina REXX has specific support for the extended functions that were introduced in ARexx.) ARexx was written in 1987 by William S. Hawes.
@@ -45,7 +50,7 @@ Some items that might differ from what you are familiar with.
* '''[[CRX REXX]]''' (Compact REXX) is a classic REXX first written by Dr. Brian Marks.
-* '''[[CTC REXX]]''' is a classic REXX that is bundled with PC/SPF and written by Command Technology Corporation, a license is required to use this product. This version of REXX can only be used under PC/SPF and it's panels. PC/SPF resembles the IBM program product SPF (which has other names and versions). The last version was published in 1996. CTC doesn't exist anymore.
+* '''[[REXX/2]]''' is a classic REXX that is bundled with PC/SPF and written by Command Technology Corporation, a license is required to use this product. This version of REXX can only be used under PC/SPF and it's panels. PC/SPF resembles the IBM program product SPF (which has other names and versions). The last version was published in 1996. Company CTC doesn't exist anymore.
* '''[[KEXX]]''' is a subset of REXX that is bundled with KEDIT and written by Keven J. Kearney of Mansfield Software Group, Inc., a license is required to use this product. KEXX only executes under the KEDIT licensed product. KEDIT is an XEDIT clone (an editor from IBM for VM/CMS program products).
@@ -121,16 +126,7 @@ Some items that might differ from what you are familiar with.
* [http://www.rexxla.org The Rexx Language Association - www.rexxla.org]
* [http://regina-rexx.sourceforge.net/index.html Regina Rexx Interpreter]
* [http://www.kedit.com/ Mansfield Software Group, Inc. (KEDIT)]
-* [http://www.quercus-sys.com/ Personal REXX, Quercus Systems]
-* [http://www.commandtechnology.com/ CTC Command Technology]
* [http://www.rexxla.org/ CRX Open Source (right column side)]
-* [http://www.kilowattsoftware.com/r4Page.htm R4, Kilowatt Software]
-* [http://www.kilowattsoftware.com/rooPage.htm ROO, Kilowatt Software]
-* [http://publib.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/HCSE2C00/CCONTENTS?SHELF=hcsh2ab0&DN=SC24-6221-00&DT=20090724140455 z/VM V6R1 REXX/VM Reference]
-* [http://publib.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/HCSB3C00/CCONTENTS?SHELF=hcsh2ab0&DN=SC24-6222-00&DT=20090724131829 z/VM V6R1 REXX/VM User's Guide]
-* [http://www.rexxinfo.org/html/rexxinfo1.html#Rexx-Manuals {many references to REXX manuals}]
-
-
== Rosetta Code tasks not implemented in REXX ==
[[Reports:Tasks_not_implemented_in_REXX]]
\ No newline at end of file
diff --git a/Lang/REXX/Magic-constant b/Lang/REXX/Magic-constant
new file mode 120000
index 0000000000..13d81a62dd
--- /dev/null
+++ b/Lang/REXX/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/REXX
\ No newline at end of file
diff --git a/Lang/REXX/Primes---allocate-descendants-to-their-ancestors b/Lang/REXX/Primes---allocate-descendants-to-their-ancestors
new file mode 120000
index 0000000000..e6293c9090
--- /dev/null
+++ b/Lang/REXX/Primes---allocate-descendants-to-their-ancestors
@@ -0,0 +1 @@
+../../Task/Primes---allocate-descendants-to-their-ancestors/REXX
\ No newline at end of file
diff --git a/Lang/REXX/Ramanujan-primes-twins b/Lang/REXX/Ramanujan-primes-twins
new file mode 120000
index 0000000000..09da3d7f76
--- /dev/null
+++ b/Lang/REXX/Ramanujan-primes-twins
@@ -0,0 +1 @@
+../../Task/Ramanujan-primes-twins/REXX
\ No newline at end of file
diff --git a/Lang/REXX/Sequence-of-primorial-primes b/Lang/REXX/Sequence-of-primorial-primes
new file mode 120000
index 0000000000..cd4ebe8c73
--- /dev/null
+++ b/Lang/REXX/Sequence-of-primorial-primes
@@ -0,0 +1 @@
+../../Task/Sequence-of-primorial-primes/REXX
\ No newline at end of file
diff --git a/Lang/REXX/Sieve-of-Pritchard b/Lang/REXX/Sieve-of-Pritchard
new file mode 120000
index 0000000000..601b18d906
--- /dev/null
+++ b/Lang/REXX/Sieve-of-Pritchard
@@ -0,0 +1 @@
+../../Task/Sieve-of-Pritchard/REXX
\ No newline at end of file
diff --git a/Lang/Raku/Simple-turtle-graphics b/Lang/Raku/Simple-turtle-graphics
new file mode 120000
index 0000000000..496cec69f4
--- /dev/null
+++ b/Lang/Raku/Simple-turtle-graphics
@@ -0,0 +1 @@
+../../Task/Simple-turtle-graphics/Raku
\ No newline at end of file
diff --git a/Lang/RapidQ/Levenshtein-distance b/Lang/RapidQ/Levenshtein-distance
new file mode 120000
index 0000000000..43ee94415c
--- /dev/null
+++ b/Lang/RapidQ/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/RapidQ
\ No newline at end of file
diff --git a/Lang/RapidQ/M-bius-function b/Lang/RapidQ/M-bius-function
new file mode 120000
index 0000000000..72bc6192fb
--- /dev/null
+++ b/Lang/RapidQ/M-bius-function
@@ -0,0 +1 @@
+../../Task/M-bius-function/RapidQ
\ No newline at end of file
diff --git a/Lang/RapidQ/Map-range b/Lang/RapidQ/Map-range
new file mode 120000
index 0000000000..a3da155381
--- /dev/null
+++ b/Lang/RapidQ/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/RapidQ
\ No newline at end of file
diff --git a/Lang/Refal/Loops-Infinite b/Lang/Refal/Loops-Infinite
new file mode 120000
index 0000000000..536c01c9bd
--- /dev/null
+++ b/Lang/Refal/Loops-Infinite
@@ -0,0 +1 @@
+../../Task/Loops-Infinite/Refal
\ No newline at end of file
diff --git a/Lang/Refal/Power-set b/Lang/Refal/Power-set
new file mode 120000
index 0000000000..f50da086ad
--- /dev/null
+++ b/Lang/Refal/Power-set
@@ -0,0 +1 @@
+../../Task/Power-set/Refal
\ No newline at end of file
diff --git a/Lang/Refal/Run-length-encoding b/Lang/Refal/Run-length-encoding
new file mode 120000
index 0000000000..afeb7091c3
--- /dev/null
+++ b/Lang/Refal/Run-length-encoding
@@ -0,0 +1 @@
+../../Task/Run-length-encoding/Refal
\ No newline at end of file
diff --git a/Lang/Refal/Strip-comments-from-a-string b/Lang/Refal/Strip-comments-from-a-string
new file mode 120000
index 0000000000..6f86213c31
--- /dev/null
+++ b/Lang/Refal/Strip-comments-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-comments-from-a-string/Refal
\ No newline at end of file
diff --git a/Lang/Rust/Ascending-primes b/Lang/Rust/Ascending-primes
new file mode 120000
index 0000000000..84fdafe351
--- /dev/null
+++ b/Lang/Rust/Ascending-primes
@@ -0,0 +1 @@
+../../Task/Ascending-primes/Rust
\ No newline at end of file
diff --git a/Lang/Rust/B-zier-curves-Intersections b/Lang/Rust/B-zier-curves-Intersections
new file mode 120000
index 0000000000..732ede6e4e
--- /dev/null
+++ b/Lang/Rust/B-zier-curves-Intersections
@@ -0,0 +1 @@
+../../Task/B-zier-curves-Intersections/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Bifid-cipher b/Lang/Rust/Bifid-cipher
new file mode 120000
index 0000000000..8ddce2026b
--- /dev/null
+++ b/Lang/Rust/Bifid-cipher
@@ -0,0 +1 @@
+../../Task/Bifid-cipher/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Bioinformatics-Global-alignment b/Lang/Rust/Bioinformatics-Global-alignment
new file mode 120000
index 0000000000..3bbbc3b358
--- /dev/null
+++ b/Lang/Rust/Bioinformatics-Global-alignment
@@ -0,0 +1 @@
+../../Task/Bioinformatics-Global-alignment/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Blum-integer b/Lang/Rust/Blum-integer
new file mode 120000
index 0000000000..7a0e8a69ae
--- /dev/null
+++ b/Lang/Rust/Blum-integer
@@ -0,0 +1 @@
+../../Task/Blum-integer/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Boyer-Moore-string-search b/Lang/Rust/Boyer-Moore-string-search
new file mode 120000
index 0000000000..b70383335b
--- /dev/null
+++ b/Lang/Rust/Boyer-Moore-string-search
@@ -0,0 +1 @@
+../../Task/Boyer-Moore-string-search/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Calendar---for-REAL-programmers b/Lang/Rust/Calendar---for-REAL-programmers
new file mode 120000
index 0000000000..5bd1cebf14
--- /dev/null
+++ b/Lang/Rust/Calendar---for-REAL-programmers
@@ -0,0 +1 @@
+../../Task/Calendar---for-REAL-programmers/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Compare-sorting-algorithms-performance b/Lang/Rust/Compare-sorting-algorithms-performance
new file mode 120000
index 0000000000..7676ca3dd8
--- /dev/null
+++ b/Lang/Rust/Compare-sorting-algorithms-performance
@@ -0,0 +1 @@
+../../Task/Compare-sorting-algorithms-performance/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Compiler-AST-interpreter b/Lang/Rust/Compiler-AST-interpreter
new file mode 120000
index 0000000000..2028e35209
--- /dev/null
+++ b/Lang/Rust/Compiler-AST-interpreter
@@ -0,0 +1 @@
+../../Task/Compiler-AST-interpreter/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Compiler-code-generator b/Lang/Rust/Compiler-code-generator
new file mode 120000
index 0000000000..fa460708f3
--- /dev/null
+++ b/Lang/Rust/Compiler-code-generator
@@ -0,0 +1 @@
+../../Task/Compiler-code-generator/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Compiler-lexical-analyzer b/Lang/Rust/Compiler-lexical-analyzer
new file mode 120000
index 0000000000..b603fdc69a
--- /dev/null
+++ b/Lang/Rust/Compiler-lexical-analyzer
@@ -0,0 +1 @@
+../../Task/Compiler-lexical-analyzer/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Compiler-syntax-analyzer b/Lang/Rust/Compiler-syntax-analyzer
new file mode 120000
index 0000000000..4fa6fc40a8
--- /dev/null
+++ b/Lang/Rust/Compiler-syntax-analyzer
@@ -0,0 +1 @@
+../../Task/Compiler-syntax-analyzer/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Cyclotomic-polynomial b/Lang/Rust/Cyclotomic-polynomial
new file mode 120000
index 0000000000..8ff16fabbb
--- /dev/null
+++ b/Lang/Rust/Cyclotomic-polynomial
@@ -0,0 +1 @@
+../../Task/Cyclotomic-polynomial/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Descending-primes b/Lang/Rust/Descending-primes
new file mode 120000
index 0000000000..fc953fbf4e
--- /dev/null
+++ b/Lang/Rust/Descending-primes
@@ -0,0 +1 @@
+../../Task/Descending-primes/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Doubly-linked-list-Definition b/Lang/Rust/Doubly-linked-list-Definition
new file mode 120000
index 0000000000..9eb9054258
--- /dev/null
+++ b/Lang/Rust/Doubly-linked-list-Definition
@@ -0,0 +1 @@
+../../Task/Doubly-linked-list-Definition/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Doubly-linked-list-Traversal b/Lang/Rust/Doubly-linked-list-Traversal
new file mode 120000
index 0000000000..b44bd60c3c
--- /dev/null
+++ b/Lang/Rust/Doubly-linked-list-Traversal
@@ -0,0 +1 @@
+../../Task/Doubly-linked-list-Traversal/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Elliptic-Curve-Digital-Signature-Algorithm b/Lang/Rust/Elliptic-Curve-Digital-Signature-Algorithm
new file mode 120000
index 0000000000..f6d4ecb90e
--- /dev/null
+++ b/Lang/Rust/Elliptic-Curve-Digital-Signature-Algorithm
@@ -0,0 +1 @@
+../../Task/Elliptic-Curve-Digital-Signature-Algorithm/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Faulhabers-formula b/Lang/Rust/Faulhabers-formula
new file mode 120000
index 0000000000..f7691b3566
--- /dev/null
+++ b/Lang/Rust/Faulhabers-formula
@@ -0,0 +1 @@
+../../Task/Faulhabers-formula/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Graph-colouring b/Lang/Rust/Graph-colouring
new file mode 120000
index 0000000000..acb44a12b7
--- /dev/null
+++ b/Lang/Rust/Graph-colouring
@@ -0,0 +1 @@
+../../Task/Graph-colouring/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Hex-words b/Lang/Rust/Hex-words
new file mode 120000
index 0000000000..9322882ab9
--- /dev/null
+++ b/Lang/Rust/Hex-words
@@ -0,0 +1 @@
+../../Task/Hex-words/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Kosaraju b/Lang/Rust/Kosaraju
new file mode 120000
index 0000000000..69a0c5ef3e
--- /dev/null
+++ b/Lang/Rust/Kosaraju
@@ -0,0 +1 @@
+../../Task/Kosaraju/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Latin-Squares-in-reduced-form b/Lang/Rust/Latin-Squares-in-reduced-form
new file mode 120000
index 0000000000..17d284a00f
--- /dev/null
+++ b/Lang/Rust/Latin-Squares-in-reduced-form
@@ -0,0 +1 @@
+../../Task/Latin-Squares-in-reduced-form/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Median-filter b/Lang/Rust/Median-filter
new file mode 120000
index 0000000000..1cdae0e790
--- /dev/null
+++ b/Lang/Rust/Median-filter
@@ -0,0 +1 @@
+../../Task/Median-filter/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Natural-sorting b/Lang/Rust/Natural-sorting
new file mode 120000
index 0000000000..77b1a7de05
--- /dev/null
+++ b/Lang/Rust/Natural-sorting
@@ -0,0 +1 @@
+../../Task/Natural-sorting/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Nonogram-solver b/Lang/Rust/Nonogram-solver
new file mode 120000
index 0000000000..670a3f0f6a
--- /dev/null
+++ b/Lang/Rust/Nonogram-solver
@@ -0,0 +1 @@
+../../Task/Nonogram-solver/Rust
\ No newline at end of file
diff --git a/Lang/Rust/OpenWebNet-password b/Lang/Rust/OpenWebNet-password
new file mode 120000
index 0000000000..24be1f8b4a
--- /dev/null
+++ b/Lang/Rust/OpenWebNet-password
@@ -0,0 +1 @@
+../../Task/OpenWebNet-password/Rust
\ No newline at end of file
diff --git a/Lang/Rust/P-Adic-numbers-basic b/Lang/Rust/P-Adic-numbers-basic
new file mode 120000
index 0000000000..2ccd34b2fd
--- /dev/null
+++ b/Lang/Rust/P-Adic-numbers-basic
@@ -0,0 +1 @@
+../../Task/P-Adic-numbers-basic/Rust
\ No newline at end of file
diff --git a/Lang/Rust/P-Adic-square-roots b/Lang/Rust/P-Adic-square-roots
new file mode 120000
index 0000000000..ed4fb995e0
--- /dev/null
+++ b/Lang/Rust/P-Adic-square-roots
@@ -0,0 +1 @@
+../../Task/P-Adic-square-roots/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Playfair-cipher b/Lang/Rust/Playfair-cipher
new file mode 120000
index 0000000000..f3e93df373
--- /dev/null
+++ b/Lang/Rust/Playfair-cipher
@@ -0,0 +1 @@
+../../Task/Playfair-cipher/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Polynomial-regression b/Lang/Rust/Polynomial-regression
new file mode 120000
index 0000000000..cdb9cdc8ff
--- /dev/null
+++ b/Lang/Rust/Polynomial-regression
@@ -0,0 +1 @@
+../../Task/Polynomial-regression/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Pseudo-random-numbers-Combined-recursive-generator-MRG32k3a b/Lang/Rust/Pseudo-random-numbers-Combined-recursive-generator-MRG32k3a
new file mode 120000
index 0000000000..a557952f5e
--- /dev/null
+++ b/Lang/Rust/Pseudo-random-numbers-Combined-recursive-generator-MRG32k3a
@@ -0,0 +1 @@
+../../Task/Pseudo-random-numbers-Combined-recursive-generator-MRG32k3a/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Pseudo-random-numbers-Middle-square-method b/Lang/Rust/Pseudo-random-numbers-Middle-square-method
new file mode 120000
index 0000000000..07d7dfdf71
--- /dev/null
+++ b/Lang/Rust/Pseudo-random-numbers-Middle-square-method
@@ -0,0 +1 @@
+../../Task/Pseudo-random-numbers-Middle-square-method/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Pseudo-random-numbers-Splitmix64 b/Lang/Rust/Pseudo-random-numbers-Splitmix64
new file mode 120000
index 0000000000..af868efefa
--- /dev/null
+++ b/Lang/Rust/Pseudo-random-numbers-Splitmix64
@@ -0,0 +1 @@
+../../Task/Pseudo-random-numbers-Splitmix64/Rust
\ No newline at end of file
diff --git a/Lang/Rust/QR-decomposition b/Lang/Rust/QR-decomposition
new file mode 120000
index 0000000000..b6ec08cee6
--- /dev/null
+++ b/Lang/Rust/QR-decomposition
@@ -0,0 +1 @@
+../../Task/QR-decomposition/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Rendezvous b/Lang/Rust/Rendezvous
new file mode 120000
index 0000000000..2ae4407138
--- /dev/null
+++ b/Lang/Rust/Rendezvous
@@ -0,0 +1 @@
+../../Task/Rendezvous/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Resistor-mesh b/Lang/Rust/Resistor-mesh
new file mode 120000
index 0000000000..245eca7f06
--- /dev/null
+++ b/Lang/Rust/Resistor-mesh
@@ -0,0 +1 @@
+../../Task/Resistor-mesh/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Shoelace-formula-for-polygonal-area b/Lang/Rust/Shoelace-formula-for-polygonal-area
new file mode 120000
index 0000000000..4ce5ca075a
--- /dev/null
+++ b/Lang/Rust/Shoelace-formula-for-polygonal-area
@@ -0,0 +1 @@
+../../Task/Shoelace-formula-for-polygonal-area/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Solve-a-Holy-Knights-tour b/Lang/Rust/Solve-a-Holy-Knights-tour
new file mode 120000
index 0000000000..7d376bff89
--- /dev/null
+++ b/Lang/Rust/Solve-a-Holy-Knights-tour
@@ -0,0 +1 @@
+../../Task/Solve-a-Holy-Knights-tour/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Solve-a-Hopido-puzzle b/Lang/Rust/Solve-a-Hopido-puzzle
new file mode 120000
index 0000000000..13eae5b688
--- /dev/null
+++ b/Lang/Rust/Solve-a-Hopido-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-a-Hopido-puzzle/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Solve-a-Numbrix-puzzle b/Lang/Rust/Solve-a-Numbrix-puzzle
new file mode 120000
index 0000000000..6da0fac9a0
--- /dev/null
+++ b/Lang/Rust/Solve-a-Numbrix-puzzle
@@ -0,0 +1 @@
+../../Task/Solve-a-Numbrix-puzzle/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Sorting-algorithms-Bead-sort b/Lang/Rust/Sorting-algorithms-Bead-sort
new file mode 120000
index 0000000000..1096740d47
--- /dev/null
+++ b/Lang/Rust/Sorting-algorithms-Bead-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Bead-sort/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Sorting-algorithms-Patience-sort b/Lang/Rust/Sorting-algorithms-Patience-sort
new file mode 120000
index 0000000000..98bfba78ce
--- /dev/null
+++ b/Lang/Rust/Sorting-algorithms-Patience-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Patience-sort/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Sorting-algorithms-Strand-sort b/Lang/Rust/Sorting-algorithms-Strand-sort
new file mode 120000
index 0000000000..c01a273a80
--- /dev/null
+++ b/Lang/Rust/Sorting-algorithms-Strand-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Strand-sort/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Steffensens-method b/Lang/Rust/Steffensens-method
new file mode 120000
index 0000000000..4aa426ad52
--- /dev/null
+++ b/Lang/Rust/Steffensens-method
@@ -0,0 +1 @@
+../../Task/Steffensens-method/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Strassens-algorithm b/Lang/Rust/Strassens-algorithm
new file mode 120000
index 0000000000..059089e819
--- /dev/null
+++ b/Lang/Rust/Strassens-algorithm
@@ -0,0 +1 @@
+../../Task/Strassens-algorithm/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Stream-merge b/Lang/Rust/Stream-merge
new file mode 120000
index 0000000000..101f42c85a
--- /dev/null
+++ b/Lang/Rust/Stream-merge
@@ -0,0 +1 @@
+../../Task/Stream-merge/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Sudan-function b/Lang/Rust/Sudan-function
new file mode 120000
index 0000000000..29cdeee99f
--- /dev/null
+++ b/Lang/Rust/Sudan-function
@@ -0,0 +1 @@
+../../Task/Sudan-function/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Tonelli-Shanks-algorithm b/Lang/Rust/Tonelli-Shanks-algorithm
new file mode 120000
index 0000000000..b90bd71718
--- /dev/null
+++ b/Lang/Rust/Tonelli-Shanks-algorithm
@@ -0,0 +1 @@
+../../Task/Tonelli-Shanks-algorithm/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Ukkonen-s-suffix-tree-construction b/Lang/Rust/Ukkonen-s-suffix-tree-construction
new file mode 120000
index 0000000000..684e412fed
--- /dev/null
+++ b/Lang/Rust/Ukkonen-s-suffix-tree-construction
@@ -0,0 +1 @@
+../../Task/Ukkonen-s-suffix-tree-construction/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Verhoeff-algorithm b/Lang/Rust/Verhoeff-algorithm
new file mode 120000
index 0000000000..fd5322e5ec
--- /dev/null
+++ b/Lang/Rust/Verhoeff-algorithm
@@ -0,0 +1 @@
+../../Task/Verhoeff-algorithm/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Xiaolin-Wus-line-algorithm b/Lang/Rust/Xiaolin-Wus-line-algorithm
new file mode 120000
index 0000000000..68352a1cb5
--- /dev/null
+++ b/Lang/Rust/Xiaolin-Wus-line-algorithm
@@ -0,0 +1 @@
+../../Task/Xiaolin-Wus-line-algorithm/Rust
\ No newline at end of file
diff --git a/Lang/S-BASIC/Additive-primes b/Lang/S-BASIC/Additive-primes
new file mode 120000
index 0000000000..b90d39a158
--- /dev/null
+++ b/Lang/S-BASIC/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/S-BASIC
\ No newline at end of file
diff --git a/Lang/S-BASIC/Character-codes b/Lang/S-BASIC/Character-codes
new file mode 120000
index 0000000000..f408189f94
--- /dev/null
+++ b/Lang/S-BASIC/Character-codes
@@ -0,0 +1 @@
+../../Task/Character-codes/S-BASIC
\ No newline at end of file
diff --git a/Lang/S-BASIC/Loops-Increment-loop-index-within-loop-body b/Lang/S-BASIC/Loops-Increment-loop-index-within-loop-body
new file mode 120000
index 0000000000..0b105df636
--- /dev/null
+++ b/Lang/S-BASIC/Loops-Increment-loop-index-within-loop-body
@@ -0,0 +1 @@
+../../Task/Loops-Increment-loop-index-within-loop-body/S-BASIC
\ No newline at end of file
diff --git a/Lang/S-BASIC/Sum-of-a-series b/Lang/S-BASIC/Sum-of-a-series
new file mode 120000
index 0000000000..1396d4d958
--- /dev/null
+++ b/Lang/S-BASIC/Sum-of-a-series
@@ -0,0 +1 @@
+../../Task/Sum-of-a-series/S-BASIC
\ No newline at end of file
diff --git a/Lang/SETL/Gray-code b/Lang/SETL/Gray-code
new file mode 120000
index 0000000000..a07e0b4e7b
--- /dev/null
+++ b/Lang/SETL/Gray-code
@@ -0,0 +1 @@
+../../Task/Gray-code/SETL
\ No newline at end of file
diff --git a/Lang/SETL/Loops-Do-while b/Lang/SETL/Loops-Do-while
new file mode 120000
index 0000000000..8e0329f189
--- /dev/null
+++ b/Lang/SETL/Loops-Do-while
@@ -0,0 +1 @@
+../../Task/Loops-Do-while/SETL
\ No newline at end of file
diff --git a/Lang/SETL/Loops-Increment-loop-index-within-loop-body b/Lang/SETL/Loops-Increment-loop-index-within-loop-body
new file mode 120000
index 0000000000..21b3e5953d
--- /dev/null
+++ b/Lang/SETL/Loops-Increment-loop-index-within-loop-body
@@ -0,0 +1 @@
+../../Task/Loops-Increment-loop-index-within-loop-body/SETL
\ No newline at end of file
diff --git a/Lang/SETL/Loops-Infinite b/Lang/SETL/Loops-Infinite
new file mode 120000
index 0000000000..582c03e313
--- /dev/null
+++ b/Lang/SETL/Loops-Infinite
@@ -0,0 +1 @@
+../../Task/Loops-Infinite/SETL
\ No newline at end of file
diff --git a/Lang/SETL/Radical-of-an-integer b/Lang/SETL/Radical-of-an-integer
new file mode 120000
index 0000000000..7020a7b45c
--- /dev/null
+++ b/Lang/SETL/Radical-of-an-integer
@@ -0,0 +1 @@
+../../Task/Radical-of-an-integer/SETL
\ No newline at end of file
diff --git a/Lang/SETL/Strip-comments-from-a-string b/Lang/SETL/Strip-comments-from-a-string
new file mode 120000
index 0000000000..6397b858bf
--- /dev/null
+++ b/Lang/SETL/Strip-comments-from-a-string
@@ -0,0 +1 @@
+../../Task/Strip-comments-from-a-string/SETL
\ No newline at end of file
diff --git a/Lang/SQL/Factorial b/Lang/SQL/Factorial
new file mode 120000
index 0000000000..c6f45973cd
--- /dev/null
+++ b/Lang/SQL/Factorial
@@ -0,0 +1 @@
+../../Task/Factorial/SQL
\ No newline at end of file
diff --git a/Lang/Scala/Boyer-Moore-string-search b/Lang/Scala/Boyer-Moore-string-search
new file mode 120000
index 0000000000..58b64a7997
--- /dev/null
+++ b/Lang/Scala/Boyer-Moore-string-search
@@ -0,0 +1 @@
+../../Task/Boyer-Moore-string-search/Scala
\ No newline at end of file
diff --git a/Lang/Scheme/Circular-primes b/Lang/Scheme/Circular-primes
new file mode 120000
index 0000000000..9f4430f520
--- /dev/null
+++ b/Lang/Scheme/Circular-primes
@@ -0,0 +1 @@
+../../Task/Circular-primes/Scheme
\ No newline at end of file
diff --git a/Lang/Scheme/Compare-length-of-two-strings b/Lang/Scheme/Compare-length-of-two-strings
new file mode 120000
index 0000000000..d6e6006fa7
--- /dev/null
+++ b/Lang/Scheme/Compare-length-of-two-strings
@@ -0,0 +1 @@
+../../Task/Compare-length-of-two-strings/Scheme
\ No newline at end of file
diff --git a/Lang/Scheme/Runge-Kutta-method b/Lang/Scheme/Runge-Kutta-method
new file mode 120000
index 0000000000..55b6f782a6
--- /dev/null
+++ b/Lang/Scheme/Runge-Kutta-method
@@ -0,0 +1 @@
+../../Task/Runge-Kutta-method/Scheme
\ No newline at end of file
diff --git a/Lang/Scheme/Unicode-variable-names b/Lang/Scheme/Unicode-variable-names
new file mode 120000
index 0000000000..e5f49b3fae
--- /dev/null
+++ b/Lang/Scheme/Unicode-variable-names
@@ -0,0 +1 @@
+../../Task/Unicode-variable-names/Scheme
\ No newline at end of file
diff --git a/Lang/Standard-ML/Box-the-compass b/Lang/Standard-ML/Box-the-compass
new file mode 120000
index 0000000000..bdb5283192
--- /dev/null
+++ b/Lang/Standard-ML/Box-the-compass
@@ -0,0 +1 @@
+../../Task/Box-the-compass/Standard-ML
\ No newline at end of file
diff --git a/Lang/Tcl/Unicode-strings b/Lang/Tcl/Unicode-strings
new file mode 120000
index 0000000000..5d3bbc0431
--- /dev/null
+++ b/Lang/Tcl/Unicode-strings
@@ -0,0 +1 @@
+../../Task/Unicode-strings/Tcl
\ No newline at end of file
diff --git a/Lang/Tiny-BASIC/Magic-constant b/Lang/Tiny-BASIC/Magic-constant
new file mode 120000
index 0000000000..e64a075712
--- /dev/null
+++ b/Lang/Tiny-BASIC/Magic-constant
@@ -0,0 +1 @@
+../../Task/Magic-constant/Tiny-BASIC
\ No newline at end of file
diff --git a/Lang/True-BASIC/Evaluate-binomial-coefficients b/Lang/True-BASIC/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..8a2a036883
--- /dev/null
+++ b/Lang/True-BASIC/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/True-BASIC
\ No newline at end of file
diff --git a/Lang/TypeScript/Additive-primes b/Lang/TypeScript/Additive-primes
new file mode 120000
index 0000000000..698823ecab
--- /dev/null
+++ b/Lang/TypeScript/Additive-primes
@@ -0,0 +1 @@
+../../Task/Additive-primes/TypeScript
\ No newline at end of file
diff --git a/Lang/TypeScript/Arithmetic-numbers b/Lang/TypeScript/Arithmetic-numbers
new file mode 120000
index 0000000000..0a37af8cff
--- /dev/null
+++ b/Lang/TypeScript/Arithmetic-numbers
@@ -0,0 +1 @@
+../../Task/Arithmetic-numbers/TypeScript
\ No newline at end of file
diff --git a/Lang/TypeScript/Map-range b/Lang/TypeScript/Map-range
new file mode 120000
index 0000000000..50eeda25cd
--- /dev/null
+++ b/Lang/TypeScript/Map-range
@@ -0,0 +1 @@
+../../Task/Map-range/TypeScript
\ No newline at end of file
diff --git a/Lang/TypeScript/Sum-of-a-series b/Lang/TypeScript/Sum-of-a-series
new file mode 120000
index 0000000000..810faf05f3
--- /dev/null
+++ b/Lang/TypeScript/Sum-of-a-series
@@ -0,0 +1 @@
+../../Task/Sum-of-a-series/TypeScript
\ No newline at end of file
diff --git a/Lang/UNIX-Shell/Color-of-a-screen-pixel b/Lang/UNIX-Shell/Color-of-a-screen-pixel
new file mode 120000
index 0000000000..8344bcd2f2
--- /dev/null
+++ b/Lang/UNIX-Shell/Color-of-a-screen-pixel
@@ -0,0 +1 @@
+../../Task/Color-of-a-screen-pixel/UNIX-Shell
\ No newline at end of file
diff --git a/Lang/UNIX-Shell/Color-quantization b/Lang/UNIX-Shell/Color-quantization
new file mode 120000
index 0000000000..6c518f1af5
--- /dev/null
+++ b/Lang/UNIX-Shell/Color-quantization
@@ -0,0 +1 @@
+../../Task/Color-quantization/UNIX-Shell
\ No newline at end of file
diff --git a/Lang/Uiua/Create-a-two-dimensional-array-at-runtime b/Lang/Uiua/Create-a-two-dimensional-array-at-runtime
new file mode 120000
index 0000000000..4ef285f54f
--- /dev/null
+++ b/Lang/Uiua/Create-a-two-dimensional-array-at-runtime
@@ -0,0 +1 @@
+../../Task/Create-a-two-dimensional-array-at-runtime/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Damm-algorithm b/Lang/Uiua/Damm-algorithm
new file mode 120000
index 0000000000..af8244172d
--- /dev/null
+++ b/Lang/Uiua/Damm-algorithm
@@ -0,0 +1 @@
+../../Task/Damm-algorithm/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Ethiopian-multiplication b/Lang/Uiua/Ethiopian-multiplication
new file mode 120000
index 0000000000..4091de8f8e
--- /dev/null
+++ b/Lang/Uiua/Ethiopian-multiplication
@@ -0,0 +1 @@
+../../Task/Ethiopian-multiplication/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Matrix-transposition b/Lang/Uiua/Matrix-transposition
new file mode 120000
index 0000000000..877ca2d6ea
--- /dev/null
+++ b/Lang/Uiua/Matrix-transposition
@@ -0,0 +1 @@
+../../Task/Matrix-transposition/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Munching-squares b/Lang/Uiua/Munching-squares
new file mode 120000
index 0000000000..65b5e765bd
--- /dev/null
+++ b/Lang/Uiua/Munching-squares
@@ -0,0 +1 @@
+../../Task/Munching-squares/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Pangram-checker b/Lang/Uiua/Pangram-checker
new file mode 120000
index 0000000000..f48b39bf42
--- /dev/null
+++ b/Lang/Uiua/Pangram-checker
@@ -0,0 +1 @@
+../../Task/Pangram-checker/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Spiral-matrix b/Lang/Uiua/Spiral-matrix
new file mode 120000
index 0000000000..58fe68a534
--- /dev/null
+++ b/Lang/Uiua/Spiral-matrix
@@ -0,0 +1 @@
+../../Task/Spiral-matrix/Uiua
\ No newline at end of file
diff --git a/Lang/Uiua/Zig-zag-matrix b/Lang/Uiua/Zig-zag-matrix
new file mode 120000
index 0000000000..3d79e2a814
--- /dev/null
+++ b/Lang/Uiua/Zig-zag-matrix
@@ -0,0 +1 @@
+../../Task/Zig-zag-matrix/Uiua
\ No newline at end of file
diff --git a/Lang/Uxntal/00-LANG.txt b/Lang/Uxntal/00-LANG.txt
index d0204e9b73..29f2256564 100644
--- a/Lang/Uxntal/00-LANG.txt
+++ b/Lang/Uxntal/00-LANG.txt
@@ -1,5 +1,7 @@
{{language|Uxntal}}
+''For unimplemented tasks see: [https://rosettacode.org/wiki/Tasks_not_implemented_in_Uxntal Uxntal Unimplemened]''
+
'''Uxntal''' is the assembly language for the Uxn virtual machine. The VM has 64KiB of addressable memory, two 256-byte stacks (data and return), and a 256-byte block of I/O ports, divided into 16 devices with 16 ports each. The Uxntal assembler features sub-labels, simple lambdas, user-defined macros, and shorthands for common immediate operations.
== Uxn VM ==
@@ -12,10 +14,23 @@ The 256 opcodes are divided into 8 special instructions, and 31 regular instruct
== Syntax ==
+
+In concatenative programming, there are no precedence rules, the calculations are merely performed in the sequence in which they are presented. The order with which elements come off a stack is known as last in, first out. '''''— [https://wiki.xxiivv.com/site/uxntal_syntax.html Uxntal Syntax]'''''
+
+
Instructions are written in uppercase, followed by any combination of the three flags 2kr. Hex values are written with lowercase a-f.
Code can be placed at specific addresses with the | rune, which is especially important for assembling the reset vector at address 0x100 (|0100) and for defining devices and zero-page variables. Padding can be inserted with the $ rune.
Labels are created with @ and &. The difference is that @ creates a label with the given name, while & creates a sub-label by prefixing the most recent @label and a slash.
-For further details on Uxntal syntax, see the [https://wiki.xxiivv.com/site/uxntal_syntax.html syntax page] on the XXIIVV wiki.
\ No newline at end of file
+For further details on Uxntal syntax, see the [https://wiki.xxiivv.com/site/uxntal_syntax.html syntax page] on the XXIIVV wiki.
+
+[[Category:Assembler_language]]
+[[Category:Assembly]]
+[[Category:Esoteric_Languages]]
+[[Category:Execution_method/Compiled/Bytecode]]
+[[Category:Programming_paradigm/Object-oriented]]
+[[Category:Programming_paradigm/Concatenative]]
+[[Category:Typing/Unsafe]]
+[[Category:Typing/Untyped]]
\ No newline at end of file
diff --git a/Lang/Uxntal/Array-length b/Lang/Uxntal/Array-length
new file mode 120000
index 0000000000..438c43e439
--- /dev/null
+++ b/Lang/Uxntal/Array-length
@@ -0,0 +1 @@
+../../Task/Array-length/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Bioinformatics-base-count b/Lang/Uxntal/Bioinformatics-base-count
new file mode 120000
index 0000000000..f9af105afe
--- /dev/null
+++ b/Lang/Uxntal/Bioinformatics-base-count
@@ -0,0 +1 @@
+../../Task/Bioinformatics-base-count/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Comments b/Lang/Uxntal/Comments
new file mode 120000
index 0000000000..b23db936ba
--- /dev/null
+++ b/Lang/Uxntal/Comments
@@ -0,0 +1 @@
+../../Task/Comments/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Conditional-structures b/Lang/Uxntal/Conditional-structures
new file mode 120000
index 0000000000..75d2f67746
--- /dev/null
+++ b/Lang/Uxntal/Conditional-structures
@@ -0,0 +1 @@
+../../Task/Conditional-structures/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Copy-a-string b/Lang/Uxntal/Copy-a-string
new file mode 120000
index 0000000000..00610fac74
--- /dev/null
+++ b/Lang/Uxntal/Copy-a-string
@@ -0,0 +1 @@
+../../Task/Copy-a-string/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Draw-a-pixel b/Lang/Uxntal/Draw-a-pixel
deleted file mode 120000
index 68f5f2e311..0000000000
--- a/Lang/Uxntal/Draw-a-pixel
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/Draw-a-pixel/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Fibonacci-sequence b/Lang/Uxntal/Fibonacci-sequence
new file mode 120000
index 0000000000..7795c4564a
--- /dev/null
+++ b/Lang/Uxntal/Fibonacci-sequence
@@ -0,0 +1 @@
+../../Task/Fibonacci-sequence/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Flow-control-structures b/Lang/Uxntal/Flow-control-structures
new file mode 120000
index 0000000000..db95ed817d
--- /dev/null
+++ b/Lang/Uxntal/Flow-control-structures
@@ -0,0 +1 @@
+../../Task/Flow-control-structures/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Hello-world-Graphical b/Lang/Uxntal/Hello-world-Graphical
new file mode 120000
index 0000000000..2a5fadb101
--- /dev/null
+++ b/Lang/Uxntal/Hello-world-Graphical
@@ -0,0 +1 @@
+../../Task/Hello-world-Graphical/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Hello-world-Standard-error b/Lang/Uxntal/Hello-world-Standard-error
new file mode 120000
index 0000000000..be0ab3efa0
--- /dev/null
+++ b/Lang/Uxntal/Hello-world-Standard-error
@@ -0,0 +1 @@
+../../Task/Hello-world-Standard-error/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Hello-world-Text b/Lang/Uxntal/Hello-world-Text
deleted file mode 120000
index 9024a6cde4..0000000000
--- a/Lang/Uxntal/Hello-world-Text
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/Hello-world-Text/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Integer-sequence b/Lang/Uxntal/Integer-sequence
new file mode 120000
index 0000000000..6d76150081
--- /dev/null
+++ b/Lang/Uxntal/Integer-sequence
@@ -0,0 +1 @@
+../../Task/Integer-sequence/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-Break b/Lang/Uxntal/Loops-Break
new file mode 120000
index 0000000000..5d6d57196c
--- /dev/null
+++ b/Lang/Uxntal/Loops-Break
@@ -0,0 +1 @@
+../../Task/Loops-Break/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-Continue b/Lang/Uxntal/Loops-Continue
new file mode 120000
index 0000000000..88d5768874
--- /dev/null
+++ b/Lang/Uxntal/Loops-Continue
@@ -0,0 +1 @@
+../../Task/Loops-Continue/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-Do-while b/Lang/Uxntal/Loops-Do-while
new file mode 120000
index 0000000000..a3d655278d
--- /dev/null
+++ b/Lang/Uxntal/Loops-Do-while
@@ -0,0 +1 @@
+../../Task/Loops-Do-while/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-For-with-a-specified-step b/Lang/Uxntal/Loops-For-with-a-specified-step
new file mode 120000
index 0000000000..4f79f37c9f
--- /dev/null
+++ b/Lang/Uxntal/Loops-For-with-a-specified-step
@@ -0,0 +1 @@
+../../Task/Loops-For-with-a-specified-step/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-Foreach b/Lang/Uxntal/Loops-Foreach
new file mode 120000
index 0000000000..f8f61da6a7
--- /dev/null
+++ b/Lang/Uxntal/Loops-Foreach
@@ -0,0 +1 @@
+../../Task/Loops-Foreach/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-N-plus-one-half b/Lang/Uxntal/Loops-N-plus-one-half
new file mode 120000
index 0000000000..f7ee606c95
--- /dev/null
+++ b/Lang/Uxntal/Loops-N-plus-one-half
@@ -0,0 +1 @@
+../../Task/Loops-N-plus-one-half/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Loops-While b/Lang/Uxntal/Loops-While
new file mode 120000
index 0000000000..f8307c2951
--- /dev/null
+++ b/Lang/Uxntal/Loops-While
@@ -0,0 +1 @@
+../../Task/Loops-While/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/Stack-traces b/Lang/Uxntal/Stack-traces
new file mode 120000
index 0000000000..0b9cf24839
--- /dev/null
+++ b/Lang/Uxntal/Stack-traces
@@ -0,0 +1 @@
+../../Task/Stack-traces/Uxntal
\ No newline at end of file
diff --git a/Lang/Uxntal/String-length b/Lang/Uxntal/String-length
new file mode 120000
index 0000000000..8dd88d3b90
--- /dev/null
+++ b/Lang/Uxntal/String-length
@@ -0,0 +1 @@
+../../Task/String-length/Uxntal
\ No newline at end of file
diff --git a/Lang/V-(Vlang)/Quine b/Lang/V-(Vlang)/Quine
new file mode 120000
index 0000000000..a258f08a53
--- /dev/null
+++ b/Lang/V-(Vlang)/Quine
@@ -0,0 +1 @@
+../../Task/Quine/V-(Vlang)
\ No newline at end of file
diff --git a/Lang/Wisp/Knuth-shuffle b/Lang/Wisp/Knuth-shuffle
new file mode 120000
index 0000000000..14993ebaba
--- /dev/null
+++ b/Lang/Wisp/Knuth-shuffle
@@ -0,0 +1 @@
+../../Task/Knuth-shuffle/Wisp
\ No newline at end of file
diff --git a/Lang/X86-64-Assembly/Terminal-control-Clear-the-screen b/Lang/X86-64-Assembly/Terminal-control-Clear-the-screen
new file mode 120000
index 0000000000..8974ae4cd4
--- /dev/null
+++ b/Lang/X86-64-Assembly/Terminal-control-Clear-the-screen
@@ -0,0 +1 @@
+../../Task/Terminal-control-Clear-the-screen/X86-64-Assembly
\ No newline at end of file
diff --git a/Lang/XBasic/Levenshtein-distance b/Lang/XBasic/Levenshtein-distance
new file mode 120000
index 0000000000..57fd900b58
--- /dev/null
+++ b/Lang/XBasic/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/XBasic
\ No newline at end of file
diff --git a/Lang/XPL0/Bin-given-limits b/Lang/XPL0/Bin-given-limits
new file mode 120000
index 0000000000..d093bfd306
--- /dev/null
+++ b/Lang/XPL0/Bin-given-limits
@@ -0,0 +1 @@
+../../Task/Bin-given-limits/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Create-an-object-at-a-given-address b/Lang/XPL0/Create-an-object-at-a-given-address
new file mode 120000
index 0000000000..10ca5e5926
--- /dev/null
+++ b/Lang/XPL0/Create-an-object-at-a-given-address
@@ -0,0 +1 @@
+../../Task/Create-an-object-at-a-given-address/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Floyd-Warshall-algorithm b/Lang/XPL0/Floyd-Warshall-algorithm
new file mode 120000
index 0000000000..ffd21f6111
--- /dev/null
+++ b/Lang/XPL0/Floyd-Warshall-algorithm
@@ -0,0 +1 @@
+../../Task/Floyd-Warshall-algorithm/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Largest-int-from-concatenated-ints b/Lang/XPL0/Largest-int-from-concatenated-ints
new file mode 120000
index 0000000000..c906e77c82
--- /dev/null
+++ b/Lang/XPL0/Largest-int-from-concatenated-ints
@@ -0,0 +1 @@
+../../Task/Largest-int-from-concatenated-ints/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Last-letter-first-letter b/Lang/XPL0/Last-letter-first-letter
new file mode 120000
index 0000000000..f77624cd59
--- /dev/null
+++ b/Lang/XPL0/Last-letter-first-letter
@@ -0,0 +1 @@
+../../Task/Last-letter-first-letter/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Levenshtein-distance b/Lang/XPL0/Levenshtein-distance
new file mode 120000
index 0000000000..0172b975ff
--- /dev/null
+++ b/Lang/XPL0/Levenshtein-distance
@@ -0,0 +1 @@
+../../Task/Levenshtein-distance/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Polynomial-regression b/Lang/XPL0/Polynomial-regression
new file mode 120000
index 0000000000..01f5c8d75a
--- /dev/null
+++ b/Lang/XPL0/Polynomial-regression
@@ -0,0 +1 @@
+../../Task/Polynomial-regression/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Read-a-configuration-file b/Lang/XPL0/Read-a-configuration-file
new file mode 120000
index 0000000000..338d315c72
--- /dev/null
+++ b/Lang/XPL0/Read-a-configuration-file
@@ -0,0 +1 @@
+../../Task/Read-a-configuration-file/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Sort-three-variables b/Lang/XPL0/Sort-three-variables
new file mode 120000
index 0000000000..6a041ebc3e
--- /dev/null
+++ b/Lang/XPL0/Sort-three-variables
@@ -0,0 +1 @@
+../../Task/Sort-three-variables/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Text-processing-1 b/Lang/XPL0/Text-processing-1
new file mode 120000
index 0000000000..395543f260
--- /dev/null
+++ b/Lang/XPL0/Text-processing-1
@@ -0,0 +1 @@
+../../Task/Text-processing-1/XPL0
\ No newline at end of file
diff --git a/Lang/XPL0/Text-processing-2 b/Lang/XPL0/Text-processing-2
new file mode 120000
index 0000000000..8d2b9925ef
--- /dev/null
+++ b/Lang/XPL0/Text-processing-2
@@ -0,0 +1 @@
+../../Task/Text-processing-2/XPL0
\ No newline at end of file
diff --git a/Lang/Yabasic/Evaluate-binomial-coefficients b/Lang/Yabasic/Evaluate-binomial-coefficients
new file mode 120000
index 0000000000..2d010b1897
--- /dev/null
+++ b/Lang/Yabasic/Evaluate-binomial-coefficients
@@ -0,0 +1 @@
+../../Task/Evaluate-binomial-coefficients/Yabasic
\ No newline at end of file
diff --git a/Lang/ZED/00-LANG.txt b/Lang/ZED/00-LANG.txt
index 467ecdad02..5b0358bc17 100644
--- a/Lang/ZED/00-LANG.txt
+++ b/Lang/ZED/00-LANG.txt
@@ -12,6 +12,9 @@ Development of ZEDc is also happening on GitHub: https://github.com/zelah/ZEDc
ZED can be seen compiling itself here: http://ideone.com/ARpMCM
+(begin (define (ZED* ZEDnumber1 ZEDnumber2) (cond (#t (* ZEDnumber1 ZEDnumber2)) (else err))) (define (ZED+ ZEDnumber1 ZEDnumber2) (cond (#t (+ ZEDnumber1 ZEDnumber2)) (else err))) (define (ZED- ZEDnumber1 ZEDnumber2) (cond (#t (- ZEDnumber1 ZEDnumber2)) (else err))) (define (ZED/ ZEDnumber1 ZEDnumber2) (cond (#t (/ ZEDnumber1 ZEDnumber2)) (else err))) (define (ZED= value1 value2) (cond (#t (eqv? value1 value2)) (else err))) (define (ZEDadd-between! item list collect) (cond ((null? list) collect) ((null? (cdr list)) (cons (car list) collect)) (#t (ZEDadd-between! item (cdr list) (cons item (cons (car list) collect)))) (else err))) (define (ZEDadd-between item list) (cond (#t (reverse (ZEDadd-between! item list (quote ())))) (else err))) (define (ZEDadd-between-ra list item) (cond (#t (reverse (ZEDadd-between! item list (quote ())))) (else err))) (define (ZEDalpha) (cond (#t (ZEDwrite-all (ZEDrd (quote ()) append (ZEDrd (quote ()) append (ZEDnewlines (ZEDby-four (ZEDfunction-sort (ZEDsentences (ZEDleading-newline (ZEDspace-newline (ZEDtab-replace (ZEDnewline-space-tab-repeats (ZEDnewline-space (ZEDfilter ZEDnot-return? (ZEDreplace-trailing-white-space (ZEDread-all)))))))))))))))) (else err))) (define (ZEDapplication? expression) (cond (#t (and (not (null? expression)) (pair? (car expression)) (null? (cdar expression)))) (else err))) (define (ZEDarity arity-hash function) (cond (#t (cdr (assoc function arity-hash))) (else err))) (define (ZEDarity-hash! clause) (cond (#t (cons (ZEDclause-name clause) (ZEDclause-arity clause))) (else err))) (define (ZEDarity-hash program) (cond (#t (append (map ZEDarity-hash! program) (append (list (cons (quote ZED1) 1) (cons (quote ZED!) 1) (cons (quote ZED001) 1) (cons (quote or) 2) (cons (quote and) 2) (cons (quote begin) 2) (cons (quote ZEDc) 2) (cons (quote quote) 1)) (list (cons (quote ZED002) 2) (cons (quote ZED003) 3) (cons (quote ZED004) 4) (cons (quote ZED005) 5) (cons (quote ZED006) 6) (cons (quote ZED007) 7) (cons (quote ZED008) 8) (cons (quote ZED009) 9) (cons (quote ZED010) 10) (cons (quote ZED011) 11) (cons (quote ZED012) 12) (cons (quote ZED013) 13) (cons (quote ZED014) 14) (cons (quote ZED015) 15) (cons (quote ZED016) 16) (cons (quote ZED017) 17) (cons (quote ZED018) 18) (cons (quote ZED019) 19) (cons (quote ZED020) 20) (cons (quote ZED021) 21) (cons (quote ZED022) 22) (cons (quote ZED023) 23) (cons (quote ZED024) 24) (cons (quote ZED025) 25) (cons (quote ZED026) 26) (cons (quote ZED027) 27) (cons (quote ZED028) 28) (cons (quote ZED029) 29) (cons (quote ZED030) 30) (cons (quote ZED031) 31) (cons (quote ZED032) 32) (cons (quote ZED033) 33) (cons (quote ZED034) 34) (cons (quote ZED035) 35) (cons (quote ZED036) 36) (cons (quote ZED037) 37) (cons (quote ZED038) 38) (cons (quote ZED039) 39) (cons (quote ZED040) 40) (cons (quote ZED041) 41) (cons (quote ZED042) 42) (cons (quote ZED043) 43) (cons (quote ZED044) 44) (cons (quote ZED045) 45) (cons (quote ZED046) 46) (cons (quote ZED047) 47) (cons (quote ZED048) 48) (cons (quote ZED049) 49) (cons (quote ZED050) 50) (cons (quote ZED051) 51) (cons (quote ZED052) 52) (cons (quote ZED053) 53) (cons (quote ZED054) 54) (cons (quote ZED055) 55) (cons (quote ZED056) 56) (cons (quote ZED057) 57) (cons (quote ZED058) 58) (cons (quote ZED059) 59) (cons (quote ZED060) 60) (cons (quote ZED061) 61) (cons (quote ZED062) 62) (cons (quote ZED063) 63) (cons (quote ZED064) 64) (cons (quote ZED065) 65) (cons (quote ZED066) 66) (cons (quote ZED067) 67) (cons (quote ZED068) 68) (cons (quote ZED069) 69) (cons (quote ZED070) 70) (cons (quote ZED071) 71) (cons (quote ZED072) 72) (cons (quote ZED073) 73) (cons (quote ZED074) 74) (cons (quote ZED075) 75) (cons (quote ZED076) 76) (cons (quote ZED077) 77) (cons (quote ZED078) 78) (cons (quote ZED079) 79) (cons (quote ZED080) 80) (cons (quote ZED081) 81) (cons (quote ZED082) 82) (cons (quote ZED083) 83) (cons (quote ZED084) 84) (cons (quote ZED085) 85) (cons (quote ZED086) 86) (cons (quote ZED087) 87) (cons (quote ZED088) 88) (cons (quote ZED089) 89) (cons (quote ZED090) 90) (cons (quote ZED091) 91) (cons (quote ZED092) 92) (cons (quote ZED093) 93) (cons (quote ZED094) 94) (cons (quote ZED095) 95) (cons (quote ZED096) 96) (cons (quote ZED097) 97) (cons (quote ZED098) 98) (cons (quote ZED099) 99))))) (else err))) (define (ZEDby-four! sentences collect) (cond ((null? sentences) collect) (#t (ZEDby-four! (cddddr sentences) (cons (list (car sentences) (cadr sentences) (caddr sentences) (cadddr sentences)) collect))) (else err))) (define (ZEDby-four sentences) (cond (#t (reverse (ZEDby-four! sentences (quote ())))) (else err))) (define (ZEDby-three! sentences collect) (cond ((null? sentences) collect) (#t (ZEDby-three! (cdddr sentences) (cons (list (car sentences) (cadr sentences) (caddr sentences)) collect))) (else err))) (define (ZEDby-three sentences) (cond (#t (reverse (ZEDby-three! sentences (quote ())))) (else err))) (define (ZEDcharacter-less? character1 character2) (cond (#t (< (char->integer character1) (char->integer character2))) (else err))) (define (ZEDclause-arguments clause) (cond (#t (cadr clause)) (else err))) (define (ZEDclause-arguments-agree clause1 clause2) (cond ((equal? (ZEDclause-arguments clause1) (ZEDclause-arguments clause2)) (ZEDclause-arguments clause1)) (else err))) (define (ZEDclause-arity clause) (cond (#t (length (ZEDclause-arguments clause))) (else err))) (define (ZEDclause-body clause) (cond (#t (cddr clause)) (else err))) (define (ZEDclause-less? clause1 clause2) (cond (#t (ZEDsentence-less? (car clause1) (car clause2))) (else err))) (define (ZEDclause-name clause) (cond (#t (car clause)) (else err))) (define (ZEDclause-name-agree clause1 clause2) (cond ((eq? (ZEDclause-name clause1) (ZEDclause-name clause2)) (ZEDclause-name clause1)) (else err))) (define (ZEDcombine-all! program collect) (cond ((null? program) collect) ((null? (cdr program)) (cons (car program) collect)) ((eq? (ZEDclause-name (car program)) (ZEDclause-name (cadr program))) (ZEDcombine-all! (ZEDcombine-head-clauses program) collect)) (#t (ZEDcombine-all! (cdr program) (cons (car program) collect))) (else err))) (define (ZEDcombine-all program) (cond (#t (reverse (ZEDcombine-all! program (quote ())))) (else err))) (define (ZEDcombine-clauses clause1 clause2) (cond (#t (cons (ZEDclause-name-agree clause1 clause2) (cons (ZEDclause-arguments-agree clause1 clause2) (append (ZEDclause-body clause1) (ZEDclause-body clause2))))) (else err))) (define (ZEDcombine-head-clauses program) (cond (#t (cons (ZEDcombine-clauses (car program) (cadr program)) (cddr program))) (else err))) (define (ZEDcombine-program-clauses program) (cond (#t (ZEDcombine-all (ZEDready-program program))) (else err))) (define (ZEDcomp!) (cond (#t (ZEDcomp!a (ZEDcombine-program-clauses (ZEDby-three (ZEDread-sentences (ZEDdiscard-comments (ZEDfunction-sort (ZEDsentences (ZEDleading-newline (ZEDspace-newline (ZEDtab-replace (ZEDnewline-space-tab-repeats (ZEDnewline-space (ZEDfilter ZEDnot-return? (ZEDreplace-trailing-white-space (ZEDread-all)))))))))))))))) (else err))) (define (ZEDcomp!a combined) (cond (#t (ZEDcomp!aa (ZEDprogramize combined (ZEDarity-hash combined)))) (else err))) (define (ZEDcomp!aa programized) (cond (#t (write programized)) (else err))) (define (ZEDcomp) (cond (#t (ZEDcomp!)) (else err))) (define (ZEDcondefy! expressions collect) (cond ((null? expressions) collect) (#t (ZEDcondefy! (cddr expressions) (cons (append (car expressions) (cadr expressions)) collect))) (else err))) (define (ZEDcondefy expressions) (cond (#t (reverse (ZEDcondefy! expressions (quote ())))) (else err))) (define (ZEDcons ZEDvalue1 ZEDvalue2) (cond (#t (cons ZEDvalue1 ZEDvalue2)) (else err))) (define (ZEDcount ZEDnumber) (cond (#t (cons (delay ZEDnumber) (delay (ZEDcount (ZED+ ZEDnumber 1))))) (else err))) (define (ZEDcount-by ZEDstep ZEDnumber) (cond (#t (cons (delay ZEDnumber) (delay (ZEDcount-by ZEDstep (ZED+ ZEDnumber ZEDstep))))) (else err))) (define (ZEDdelay-wrap expression) (cond (#t (list (quote delay) expression)) (else err))) (define (ZEDdigit? character) (cond (#t (or (eqv? #\0 character) (eqv? #\1 character) (eqv? #\2 character) (eqv? #\3 character) (eqv? #\4 character) (eqv? #\5 character) (eqv? #\6 character) (eqv? #\7 character) (eqv? #\8 character) (eqv? #\9 character))) (else err))) (define (ZEDdiscard-comments! program collect) (cond ((null? program) collect) (#t (ZEDdiscard-comments! (cddddr program) (cons (cadddr program) (cons (caddr program) (cons (car program) collect))))) (else err))) (define (ZEDdiscard-comments program) (cond (#t (reverse (ZEDdiscard-comments! program (quote ())))) (else err))) (define (ZEDdr! value) (cond ((pair? value) (ZEDmp ZEDdr! (ZEDfirst 64 value))) (#t value) (else err))) (define (ZEDdr value) (cond (#t (begin (display (ZEDpr (ZEDdr! value))) (newline) (newline) value)) (else err))) (define (ZEDdrr value) (cond (#t (begin (display (ZEDpr value)) (newline) (newline) value)) (else err))) (define (ZEDfalse? noun-list) (cond (#t (equal? noun-list (list ## #\f #\a #\l #\s #\e))) (else err))) (define (ZEDfi function list) (cond ((null? list) (quote ())) ((function (if (promise? (car list)) (force (car list)) (car list))) (cons (delay (if (promise? (car list)) (force (car list)) (car list))) (delay (ZEDfi function (if (promise? (cdr list)) (force (cdr list)) (cdr list)))))) (#t (ZEDfi function (if (promise? (cdr list)) (force (cdr list)) (cdr list)))) (else err))) (define (ZEDfilter! predicate list collect) (cond ((null? list) collect) ((predicate (car list)) (ZEDfilter! predicate (cdr list) (cons (car list) collect))) (#t (ZEDfilter! predicate (cdr list) collect)) (else err))) (define (ZEDfilter predicate list) (cond (#t (reverse (ZEDfilter! predicate list (quote ())))) (else err))) (define (ZEDfirst! integer list collect) (cond ((or (zero? integer) (null? list)) (reverse collect)) ((not (pair? list)) (reverse (cons list collect))) ((> integer 0) (ZEDfirst! (- integer 1) (if (promise? (cdr list)) (force (cdr list)) (cdr list)) (cons (if (promise? (car list)) (force (car list)) (car list)) collect))) (else err))) (define (ZEDfirst integer list) (cond ((not (pair? list)) list) (#t (ZEDfirst! integer list (quote ()))) (else err))) (define (ZEDflatten! ZEDlist ZEDsub-list-found? ZEDcollect) (cond ((and (ZEDnull? ZEDlist) (ZEDnot ZEDsub-list-found?)) (ZEDreverse ZEDcollect)) ((ZEDnull? ZEDlist) (ZEDflatten! (ZEDreverse ZEDcollect) #f (quote ()))) ((ZEDnot (ZEDpair? ZEDlist)) (ZEDflatten! (quote ()) ZEDsub-list-found? (ZEDcons ZEDlist ZEDcollect))) ((ZEDpair? (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist))) (ZEDflatten! (if (promise? (cdr ZEDlist)) (force (cdr ZEDlist)) (cdr ZEDlist)) #t (ZEDcons (if (promise? (cdr (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)))) (force (cdr (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)))) (cdr (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)))) (ZEDcons (if (promise? (car (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)))) (force (car (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)))) (car (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)))) ZEDcollect)))) ((ZEDnull? (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist))) (ZEDflatten! (if (promise? (cdr ZEDlist)) (force (cdr ZEDlist)) (cdr ZEDlist)) ZEDsub-list-found? ZEDcollect)) (#t (ZEDflatten! (if (promise? (cdr ZEDlist)) (force (cdr ZEDlist)) (cdr ZEDlist)) ZEDsub-list-found? (ZEDcons (if (promise? (car ZEDlist)) (force (car ZEDlist)) (car ZEDlist)) ZEDcollect))) (else err))) (define (ZEDflatten ZEDlist) (cond (#t (ZEDflatten! ZEDlist #f (quote ()))) (else err))) (define (ZEDfor-each ZEDeffect ZEDlist) (cond (#t (for-each ZEDeffect ZEDlist)) (else err))) (define (ZEDfunction expression) (cond (#t (caar expression)) (else err))) (define (ZEDfunction-sort sentences) (cond (#t (ZEDrd (quote ()) append (ZEDsort ZEDclause-less? (ZEDby-four sentences)))) (else err))) (define (ZEDfunctionize clause arity-hash) (cond (#t (list (quote define) (cons (ZEDclause-name clause) (ZEDclause-arguments clause)) (cons (quote cond) (append (ZEDcondefy (ZEDmap-with ZEDschemefy (ZEDclause-body clause) arity-hash)) (list (list (quote else) (quote err))))))) (else err))) (define (ZEDgather-count?! candidate) (cond (#t (and (= 6 (length candidate)) (eqv? #\Z (car candidate)) (eqv? #\E (cadr candidate)) (eqv? #\D (caddr candidate)) (eqv? #\0 (cadddr candidate)) (ZEDdigit? (car (cddddr candidate))) (ZEDdigit? (cadr (cddddr candidate))))) (else err))) (define (ZEDgather-count? symbol) (cond (#t (ZEDgather-count?! (string->list (symbol->string symbol)))) (else err))) (define (ZEDgather-noun sentence) (cond ((null? sentence) (quote ())) ((eqv? #\space (car sentence)) (quote ())) (#t (cons (car sentence) (ZEDgather-noun (cdr sentence)))) (else err))) (define (ZEDgather-verb sentence) (cond ((eqv? #) (car sentence)) (quote ())) (#t (cons (car sentence) (ZEDgather-verb (cdr sentence)))) (else err))) (define (ZEDgr garbage value) (cond (#t (begin (ZEDdr garbage) value)) (else err))) (define (ZEDgrr garbage value) (cond (#t (begin (ZEDdrr garbage) value)) (else err))) (define (ZEDleading-newline program) (cond ((null? program) (quote ())) ((eqv? #\newline (car program)) (cdr program)) (#t program) (else err))) (define (ZEDliteral? literal-list) (cond (#t (eqv? #" (car literal-list))) (else err))) (define (ZEDmake-ZED ZED-list) (cond ((equal? ZED-list (list #\e #\r #\r)) "'err") ((equal? ZED-list (list #\n #\i #\l)) "'()") ((equal? ZED-list (list #\a #\n #\d)) "and") ((equal? ZED-list (list #\o #\r)) "or") ((equal? ZED-list (list #\q #\u #\o #\t #\e)) "quote") ((equal? ZED-list (list #\s #\e)) "begin") (#t (list->string (append (list #\Z #\E #\D) ZED-list))) (else err))) (define (ZEDmake-character noun-list) (cond (#t (list->string (cons ## (cons #
+(cdr noun-list))))) (else err))) (define (ZEDmake-exact exact-list) (cond (#t (list->string (append (list ## #\e) exact-list))) (else err))) (define (ZEDmake-literal literal-list) (cond (#t (list->string (cdr (reverse (cdr (reverse literal-list)))))) (else err))) (define (ZEDmake-number-character noun-list) (cond (#t (list->string (list ## #
+(integer->char (string->number (list->string (cddr noun-list))))))) (else err))) (define (ZEDmap-with! function list extra collect) (cond ((null? list) collect) (#t (ZEDmap-with! function (cdr list) extra (cons (function (car list) extra) collect))) (else err))) (define (ZEDmap-with function list extra) (cond (#t (reverse (ZEDmap-with! function list extra (quote ())))) (else err))) (define (ZEDmerge! comparator list1 list2 collect) (cond ((null? list2) (append (reverse collect) list1)) ((null? list1) (append (reverse collect) list2)) ((comparator (car list2) (car list1)) (ZEDmerge! comparator list1 (cdr list2) (cons (car list2) collect))) (#t (ZEDmerge! comparator (cdr list1) list2 (cons (car list1) collect))) (else err))) (define (ZEDmerge comparator list1 list2) (cond (#t (ZEDmerge! comparator list1 list2 (quote ()))) (else err))) (define (ZEDmp function list) (cond ((null? list) (quote ())) ((pair? list) (cons (delay (function (if (promise? (car list)) (force (car list)) (car list)))) (delay (ZEDmp function (if (promise? (cdr list)) (force (cdr list)) (cdr list)))))) (#t (function list)) (else err))) (define (ZEDnewline-space! program) (cond (#t (cons #\newline (ZEDnewline-space!a program))) (else err))) (define (ZEDnewline-space!a program) (cond (#t (ZEDnewline-space!aa program (reverse (ZEDnewline-space!ab program (quote ()))))) (else err))) (define (ZEDnewline-space!aa program transformed) (cond ((equal? program transformed) program) (#t (ZEDnewline-space!a transformed)) (else err))) (define (ZEDnewline-space!ab program collect) (cond ((null? program) collect) ((null? (cdr program)) (cons (car program) collect)) ((and (eqv? #\newline (car program)) (or (eqv? #\space (cadr program)) (eqv? #\ht (cadr program)))) (ZEDnewline-space!ab (cdr program) collect)) (#t (ZEDnewline-space!ab (cdr program) (cons (car program) collect))) (else err))) (define (ZEDnewline-space program) (cond (#t (ZEDnewline-space! program)) (else err))) (define (ZEDnewline-space-tab-repeats! program collect) (cond ((or (null? program) (null? (cdr program))) (append program collect)) ((and (eqv? #\newline (car program)) (eqv? #\newline (cadr program))) (ZEDnewline-space-tab-repeats! (cdr program) collect)) ((and (or (eqv? #\space (car program)) (eqv? #\ht (car program))) (or (eqv? #\space (cadr program)) (eqv? #\ht (cadr program)))) (ZEDnewline-space-tab-repeats! (cdr program) collect)) (#t (ZEDnewline-space-tab-repeats! (cdr program) (cons (car program) collect))) (else err))) (define (ZEDnewline-space-tab-repeats program) (cond (#t (reverse (ZEDnewline-space-tab-repeats! program (quote ())))) (else err))) (define (ZEDnewlines clauses) (cond (#t (ZEDadd-between-ra (ZEDmap-with ZEDadd-between-ra clauses (list #\newline)) (list (list #\newline #\newline)))) (else err))) (define (ZEDnormal-character? noun-list) (cond (#t (eqv? (car noun-list) ##)) (else err))) (define (ZEDnot ZEDvalue) (cond (#t (not ZEDvalue)) (else err))) (define (ZEDnot-return? character) (cond (#t (not (eqv? #\cr character))) (else err))) (define (ZEDnoun! noun-list number?) (cond (number? (ZEDmake-exact noun-list)) ((ZEDliteral? noun-list) (ZEDmake-literal noun-list)) ((ZEDtrue? noun-list) "#t") ((ZEDfalse? noun-list) "#f") ((ZEDnumber-character? noun-list) (ZEDmake-number-character noun-list)) ((ZEDnormal-character? noun-list) (ZEDmake-character noun-list)) (#t (ZEDmake-ZED noun-list)) (else err))) (define (ZEDnoun noun-list) (cond (#t (ZEDnoun! noun-list (string->number (list->string noun-list)))) (else err))) (define (ZEDnull? ZEDvalue) (cond (#t (null? ZEDvalue)) (else err))) (define (ZEDnumber-character? noun-list) (cond (#t (and (eqv? (car noun-list) ##) (eqv? (cadr noun-list) #\0) (not (null? (cddr noun-list))))) (else err))) (define (ZEDpair? ZEDvalue) (cond (#t (pair? ZEDvalue)) (else err))) (define (ZEDpop stack) (cond (#t (cdr stack)) (else err))) (define (ZEDpr! value output-string) (cond (#t (begin (display (ZEDpr!a value (quote ())) output-string) (ZEDpr!b output-string (get-output-string output-string)))) (else err))) (define (ZEDpr!a value collect) (cond ((char? value) (ZEDpr!aa (list->string (list ## value)) collect)) ((string? value) (ZEDpr!aa (string-append """ value """) collect)) ((symbol? value) (ZEDpr!aa (symbol->string value) collect)) ((number? value) (ZEDpr!aa (number->string value) collect)) ((and (boolean? value) value) (ZEDpr!aa "#true" collect)) ((boolean? value) (ZEDpr!aa "#false" collect)) ((null? value) (reverse collect)) (#t (ZEDpr!a (if (promise? (cdr value)) (force (cdr value)) (cdr value)) (cons (ZEDpr!a (if (promise? (car value)) (force (car value)) (car value)) (quote ())) collect))) (else err))) (define (ZEDpr!aa string collect) (cond ((null? collect) string) (#t (reverse (cons string (cons "." collect)))) (else err))) (define (ZEDpr!b output-string value) (cond (#t (begin (close-output-port output-string) value)) (else err))) (define (ZEDpr value) (cond (#t (ZEDpr! value (open-output-string))) (else err))) (define (ZEDprogramize program arity-hash) (cond (#t (cons (quote begin) (ZEDmap-with ZEDfunctionize program arity-hash))) (else err))) (define (ZEDpush object stack) (cond (#t (cons object stack)) (else err))) (define (ZEDrd! function list) (cond ((null? (if (promise? (cdr list)) (force (cdr list)) (cdr list))) (if (promise? (car list)) (force (car list)) (car list))) (#t (ZEDrd! function (cons (function (if (promise? (car (if (promise? (cdr list)) (force (cdr list)) (cdr list)))) (force (car (if (promise? (cdr list)) (force (cdr list)) (cdr list)))) (car (if (promise? (cdr list)) (force (cdr list)) (cdr list)))) (if (promise? (car list)) (force (car list)) (car list))) (if (promise? (cdr (if (promise? (cdr list)) (force (cdr list)) (cdr list)))) (force (cdr (if (promise? (cdr list)) (force (cdr list)) (cdr list)))) (cdr (if (promise? (cdr list)) (force (cdr list)) (cdr list))))))) (else err))) (define (ZEDrd final function list) (cond (#t (ZEDrd! function (cons final (reverse list)))) (else err))) (define (ZEDread-all! collect) (cond (#t (ZEDread-all!a (read-char) collect)) (else err))) (define (ZEDread-all!a character collect) (cond ((eof-object? character) collect) (#t (ZEDread-all! (cons character collect))) (else err))) (define (ZEDread-all) (cond (#t (reverse (ZEDread-all! (quote ())))) (else err))) (define (ZEDread-sentence!a sentence collect) (cond ((null? sentence) collect) ((eqv? #\space (car sentence)) (ZEDread-sentence!a (cdr sentence) collect)) ((eqv? #( (car sentence)) (ZEDread-sentence!aa sentence (ZEDgather-verb (cdr sentence)) collect)) (#t (ZEDread-sentence!ab sentence (ZEDgather-noun sentence) collect)) (else err))) (define (ZEDread-sentence!aa sentence gather-verb collect) (cond (#t (ZEDread-sentence!a (ZEDtails (+ 2 (length gather-verb)) sentence) (cons (ZEDverb gather-verb) collect))) (else err))) (define (ZEDread-sentence!ab sentence gather-noun collect) (cond (#t (ZEDread-sentence!a (ZEDtails (length gather-noun) sentence) (cons (ZEDnoun gather-noun) collect))) (else err))) (define (ZEDread-sentence!b list output-string) (cond (#t (begin (display list output-string) (ZEDread-sentence!ba output-string (get-output-string output-string)))) (else err))) (define (ZEDread-sentence!ba output-string get-output-string) (cond (#t (begin (close-output-port output-string) (ZEDread-sentence!baa (open-input-string get-output-string)))) (else err))) (define (ZEDread-sentence!baa input-string) (cond (#t (ZEDread-sentence!baaa input-string (read input-string))) (else err))) (define (ZEDread-sentence!baaa input-string answer) (cond (#t (begin (close-input-port input-string) answer)) (else err))) (define (ZEDread-sentence sentence) (cond (#t (ZEDread-sentence!b (reverse (ZEDread-sentence!a sentence (quote ()))) (open-output-string))) (else err))) (define (ZEDread-sentences sentences) (cond (#t (map ZEDread-sentence sentences)) (else err))) (define (ZEDready-clause clause) (cond (#t (cons (caaar clause) (cons (cdar clause) (cdr clause)))) (else err))) (define (ZEDready-program program) (cond (#t (map ZEDready-clause program)) (else err))) (define (ZEDreplace-trailing-white-space! program) (cond ((null? program) (quote ())) ((or (eqv? (car program) #\space) (eqv? (car program) #\ht) (eqv? (car program) #\cr) (eqv? (car program) #\newline)) (ZEDreplace-trailing-white-space! (cdr program))) (#t (cons #\newline program)) (else err))) (define (ZEDreplace-trailing-white-space program) (cond (#t (reverse (ZEDreplace-trailing-white-space! (reverse program)))) (else err))) (define (ZEDreverse ZEDlist) (cond (#t (reverse ZEDlist)) (else err))) (define (ZEDschemefy! expression arity-hash stack) (cond ((null? expression) (ZEDtop stack)) ((ZEDapplication? expression) (ZEDschemefy!a expression arity-hash stack (ZEDfunction expression))) (#t (ZEDschemefy! (cdr expression) arity-hash (ZEDpush (car expression) stack))) (else err))) (define (ZEDschemefy!a expression arity-hash stack function) (cond (#t (ZEDschemefy!aa expression arity-hash stack function (ZEDarity arity-hash function))) (else err))) (define (ZEDschemefy!aa expression arity-hash stack function arity) (cond ((ZEDgather-count? function) (ZEDschemefy! (cdr expression) arity-hash (ZEDpush (ZEDfirst arity stack) (ZEDtails arity stack)))) ((eq? function (quote ZED1)) (ZEDschemefy! (cdr expression) arity-hash (ZEDpush (list (quote if) (list (quote promise?) (cons (quote car) (ZEDfirst arity stack))) (list (quote force) (cons (quote car) (ZEDfirst arity stack))) (cons (quote car) (ZEDfirst arity stack))) (ZEDtails arity stack)))) ((eq? function (quote ZED!)) (ZEDschemefy! (cdr expression) arity-hash (ZEDpush (list (quote if) (list (quote promise?) (cons (quote cdr) (ZEDfirst arity stack))) (list (quote force) (cons (quote cdr) (ZEDfirst arity stack))) (cons (quote cdr) (ZEDfirst arity stack))) (ZEDtails arity stack)))) ((eq? function (quote ZEDc)) (ZEDschemefy! (cdr expression) arity-hash (ZEDpush (cons (quote cons) (map ZEDdelay-wrap (ZEDfirst arity stack))) (ZEDtails arity stack)))) (#t (ZEDschemefy! (cdr expression) arity-hash (ZEDpush (cons function (ZEDfirst arity stack)) (ZEDtails arity stack)))) (else err))) (define (ZEDschemefy expression arity-hash) (cond (#t (list (ZEDschemefy! (reverse expression) arity-hash (ZEDstack)))) (else err))) (define (ZEDsentence-less? sentence1 sentence2) (cond ((null? sentence2) #f) ((null? sentence1) #t) ((ZEDcharacter-less? (car sentence1) (car sentence2)) #t) ((ZEDcharacter-less? (car sentence2) (car sentence1)) #f) (#t (ZEDsentence-less? (cdr sentence1) (cdr sentence2))) (else err))) (define (ZEDsentences! program collect1 collect2) (cond ((null? program) collect2) ((eqv? #\newline (car program)) (ZEDsentences! (cdr program) (quote ()) (cons (reverse collect1) collect2))) (#t (ZEDsentences! (cdr program) (cons (car program) collect1) collect2)) (else err))) (define (ZEDsentences program) (cond (#t (reverse (ZEDsentences! program (quote ()) (quote ())))) (else err))) (define (ZEDsort!a jumble) (cond (#t (map list jumble)) (else err))) (define (ZEDsort!b comparator jumble) (cond ((null? jumble) (quote ())) ((null? (cdr jumble)) jumble) (#t (ZEDsort!b comparator (cons (ZEDmerge comparator (car jumble) (cadr jumble)) (ZEDsort!b comparator (cddr jumble))))) (else err))) (define (ZEDsort comparator jumble) (cond (#t (car (ZEDsort!b comparator (ZEDsort!a jumble)))) (else err))) (define (ZEDspace-newline! program collect) (cond ((or (null? program) (null? (cdr program))) (append program collect)) ((and (eqv? #\space (car program)) (eqv? #\newline (cadr program))) (ZEDspace-newline! (cdr program) collect)) (#t (ZEDspace-newline! (cdr program) (cons (car program) collect))) (else err))) (define (ZEDspace-newline program) (cond (#t (reverse (ZEDspace-newline! program (quote ())))) (else err))) (define (ZEDstack) (cond (#t (quote ())) (else err))) (define (ZEDtab-replace! program collect) (cond ((null? program) collect) ((eqv? #\ht (car program)) (ZEDtab-replace! (cdr program) (cons #\space collect))) (#t (ZEDtab-replace! (cdr program) (cons (car program) collect))) (else err))) (define (ZEDtab-replace program) (cond (#t (reverse (ZEDtab-replace! program (quote ())))) (else err))) (define (ZEDtails number list) (cond ((null? list) (quote ())) ((zero? number) list) ((> number 0) (ZEDtails (- number 1) (cdr list))) (else err))) (define (ZEDtop stack) (cond (#t (car stack)) (else err))) (define (ZEDtrue? noun-list) (cond (#t (equal? noun-list (list ## #\t #\r #\u #\e))) (else err))) (define (ZEDverb verb-list) (cond ((ZEDliteral? verb-list) (list (ZEDmake-literal verb-list))) (#t (list (ZEDmake-ZED verb-list))) (else err))) (define (ZEDwrite-all program) (cond ((null? program) (quote err)) (#t (ZEDwrite-all (begin (write-char (car program)) (cdr program)))) (else err))) (define (ZEDzed->scheme! value collect) (cond ((null? value) (reverse collect)) (#t (ZEDzed->scheme! (if (promise? (cdr value)) (force (cdr value)) (cdr value)) (cons (ZEDzed->scheme (if (promise? (car value)) (force (car value)) (car value))) collect))) (else err))) (define (ZEDzed->scheme value) (cond ((not (pair? value)) value) (#t (ZEDzed->scheme! value (quote ()))) (else err)))) (ZEDcomp)
Language author on RC: [[User:Zelah|Zelah]] ([[User_talk:Zelah|talk]] | [[Special:Contributions/Zelah|contribs]])
.
\ No newline at end of file
diff --git a/Lang/Zig/15-puzzle-solver b/Lang/Zig/15-puzzle-solver
new file mode 120000
index 0000000000..31e2e98f6a
--- /dev/null
+++ b/Lang/Zig/15-puzzle-solver
@@ -0,0 +1 @@
+../../Task/15-puzzle-solver/Zig
\ No newline at end of file
diff --git a/Lang/Zig/2048 b/Lang/Zig/2048
new file mode 120000
index 0000000000..d2ac81be16
--- /dev/null
+++ b/Lang/Zig/2048
@@ -0,0 +1 @@
+../../Task/2048/Zig
\ No newline at end of file
diff --git a/Lang/Zig/24-game b/Lang/Zig/24-game
new file mode 120000
index 0000000000..7b40225753
--- /dev/null
+++ b/Lang/Zig/24-game
@@ -0,0 +1 @@
+../../Task/24-game/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Anti-primes b/Lang/Zig/Anti-primes
new file mode 120000
index 0000000000..bde3882591
--- /dev/null
+++ b/Lang/Zig/Anti-primes
@@ -0,0 +1 @@
+../../Task/Anti-primes/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Canonicalize-CIDR b/Lang/Zig/Canonicalize-CIDR
new file mode 120000
index 0000000000..792c271f68
--- /dev/null
+++ b/Lang/Zig/Canonicalize-CIDR
@@ -0,0 +1 @@
+../../Task/Canonicalize-CIDR/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Convex-hull b/Lang/Zig/Convex-hull
new file mode 120000
index 0000000000..bb63712423
--- /dev/null
+++ b/Lang/Zig/Convex-hull
@@ -0,0 +1 @@
+../../Task/Convex-hull/Zig
\ No newline at end of file
diff --git a/Lang/Zig/De-Bruijn-sequences b/Lang/Zig/De-Bruijn-sequences
new file mode 120000
index 0000000000..1e82ee12c7
--- /dev/null
+++ b/Lang/Zig/De-Bruijn-sequences
@@ -0,0 +1 @@
+../../Task/De-Bruijn-sequences/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Dijkstras-algorithm b/Lang/Zig/Dijkstras-algorithm
new file mode 120000
index 0000000000..e85779f749
--- /dev/null
+++ b/Lang/Zig/Dijkstras-algorithm
@@ -0,0 +1 @@
+../../Task/Dijkstras-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Execute-a-Markov-algorithm b/Lang/Zig/Execute-a-Markov-algorithm
new file mode 120000
index 0000000000..5b70cd7b50
--- /dev/null
+++ b/Lang/Zig/Execute-a-Markov-algorithm
@@ -0,0 +1 @@
+../../Task/Execute-a-Markov-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Fibonacci-sequence b/Lang/Zig/Fibonacci-sequence
new file mode 120000
index 0000000000..8c7ee19f72
--- /dev/null
+++ b/Lang/Zig/Fibonacci-sequence
@@ -0,0 +1 @@
+../../Task/Fibonacci-sequence/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Find-the-missing-permutation b/Lang/Zig/Find-the-missing-permutation
new file mode 120000
index 0000000000..720e08365d
--- /dev/null
+++ b/Lang/Zig/Find-the-missing-permutation
@@ -0,0 +1 @@
+../../Task/Find-the-missing-permutation/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Floyd-Warshall-algorithm b/Lang/Zig/Floyd-Warshall-algorithm
new file mode 120000
index 0000000000..e20cfd03e2
--- /dev/null
+++ b/Lang/Zig/Floyd-Warshall-algorithm
@@ -0,0 +1 @@
+../../Task/Floyd-Warshall-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Latin-Squares-in-reduced-form b/Lang/Zig/Latin-Squares-in-reduced-form
new file mode 120000
index 0000000000..4ae8de3ec8
--- /dev/null
+++ b/Lang/Zig/Latin-Squares-in-reduced-form
@@ -0,0 +1 @@
+../../Task/Latin-Squares-in-reduced-form/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Move-to-front-algorithm b/Lang/Zig/Move-to-front-algorithm
new file mode 120000
index 0000000000..820f21fe3e
--- /dev/null
+++ b/Lang/Zig/Move-to-front-algorithm
@@ -0,0 +1 @@
+../../Task/Move-to-front-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Natural-sorting b/Lang/Zig/Natural-sorting
new file mode 120000
index 0000000000..ce3fd8d2e1
--- /dev/null
+++ b/Lang/Zig/Natural-sorting
@@ -0,0 +1 @@
+../../Task/Natural-sorting/Zig
\ No newline at end of file
diff --git a/Lang/Zig/P-Adic-numbers-basic b/Lang/Zig/P-Adic-numbers-basic
new file mode 120000
index 0000000000..7be77909db
--- /dev/null
+++ b/Lang/Zig/P-Adic-numbers-basic
@@ -0,0 +1 @@
+../../Task/P-Adic-numbers-basic/Zig
\ No newline at end of file
diff --git a/Lang/Zig/P-Adic-square-roots b/Lang/Zig/P-Adic-square-roots
new file mode 120000
index 0000000000..bf2f9425e2
--- /dev/null
+++ b/Lang/Zig/P-Adic-square-roots
@@ -0,0 +1 @@
+../../Task/P-Adic-square-roots/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Parsing-RPN-calculator-algorithm b/Lang/Zig/Parsing-RPN-calculator-algorithm
new file mode 120000
index 0000000000..64d52e74e9
--- /dev/null
+++ b/Lang/Zig/Parsing-RPN-calculator-algorithm
@@ -0,0 +1 @@
+../../Task/Parsing-RPN-calculator-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Parsing-Shunting-yard-algorithm b/Lang/Zig/Parsing-Shunting-yard-algorithm
new file mode 120000
index 0000000000..36cb3a3892
--- /dev/null
+++ b/Lang/Zig/Parsing-Shunting-yard-algorithm
@@ -0,0 +1 @@
+../../Task/Parsing-Shunting-yard-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Quickselect-algorithm b/Lang/Zig/Quickselect-algorithm
new file mode 120000
index 0000000000..7dbb81ef78
--- /dev/null
+++ b/Lang/Zig/Quickselect-algorithm
@@ -0,0 +1 @@
+../../Task/Quickselect-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Quine b/Lang/Zig/Quine
new file mode 120000
index 0000000000..20f1f12898
--- /dev/null
+++ b/Lang/Zig/Quine
@@ -0,0 +1 @@
+../../Task/Quine/Zig
\ No newline at end of file
diff --git a/Lang/Zig/SHA-1 b/Lang/Zig/SHA-1
new file mode 120000
index 0000000000..374af24054
--- /dev/null
+++ b/Lang/Zig/SHA-1
@@ -0,0 +1 @@
+../../Task/SHA-1/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Solve-a-Holy-Knights-tour b/Lang/Zig/Solve-a-Holy-Knights-tour
new file mode 120000
index 0000000000..b0fe3fcb9a
--- /dev/null
+++ b/Lang/Zig/Solve-a-Holy-Knights-tour
@@ -0,0 +1 @@
+../../Task/Solve-a-Holy-Knights-tour/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Sorting-algorithms-Patience-sort b/Lang/Zig/Sorting-algorithms-Patience-sort
new file mode 120000
index 0000000000..a696e81abf
--- /dev/null
+++ b/Lang/Zig/Sorting-algorithms-Patience-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Patience-sort/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Sorting-algorithms-Strand-sort b/Lang/Zig/Sorting-algorithms-Strand-sort
new file mode 120000
index 0000000000..67361c524c
--- /dev/null
+++ b/Lang/Zig/Sorting-algorithms-Strand-sort
@@ -0,0 +1 @@
+../../Task/Sorting-algorithms-Strand-sort/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Strassens-algorithm b/Lang/Zig/Strassens-algorithm
new file mode 120000
index 0000000000..f02a6cb05a
--- /dev/null
+++ b/Lang/Zig/Strassens-algorithm
@@ -0,0 +1 @@
+../../Task/Strassens-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Sutherland-Hodgman-polygon-clipping b/Lang/Zig/Sutherland-Hodgman-polygon-clipping
new file mode 120000
index 0000000000..2e08ab9fc7
--- /dev/null
+++ b/Lang/Zig/Sutherland-Hodgman-polygon-clipping
@@ -0,0 +1 @@
+../../Task/Sutherland-Hodgman-polygon-clipping/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Thue-Morse b/Lang/Zig/Thue-Morse
new file mode 120000
index 0000000000..514eeceeed
--- /dev/null
+++ b/Lang/Zig/Thue-Morse
@@ -0,0 +1 @@
+../../Task/Thue-Morse/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Tonelli-Shanks-algorithm b/Lang/Zig/Tonelli-Shanks-algorithm
new file mode 120000
index 0000000000..364e6278fd
--- /dev/null
+++ b/Lang/Zig/Tonelli-Shanks-algorithm
@@ -0,0 +1 @@
+../../Task/Tonelli-Shanks-algorithm/Zig
\ No newline at end of file
diff --git a/Lang/Zig/Y-combinator b/Lang/Zig/Y-combinator
new file mode 120000
index 0000000000..1478dbbdb7
--- /dev/null
+++ b/Lang/Zig/Y-combinator
@@ -0,0 +1 @@
+../../Task/Y-combinator/Zig
\ No newline at end of file
diff --git a/Task/100-doors/BQN/100-doors-4.bqn b/Task/100-doors/BQN/100-doors-4.bqn
new file mode 100644
index 0000000000..cfab61e191
--- /dev/null
+++ b/Task/100-doors/BQN/100-doors-4.bqn
@@ -0,0 +1,3 @@
+F ← {1+ / 2| +˝ 0= |⌜˜ 1+↕𝕩}
+F 100
+# ⟨ 1 4 9 16 25 36 49 64 81 100 ⟩
diff --git a/Task/100-doors/BQN/100-doors-5.bqn b/Task/100-doors/BQN/100-doors-5.bqn
new file mode 100644
index 0000000000..b78e4f3de6
--- /dev/null
+++ b/Task/100-doors/BQN/100-doors-5.bqn
@@ -0,0 +1,3 @@
+F ← {ט1+↕⌊√𝕩}
+F 100
+# ⟨ 1 4 9 16 25 36 49 64 81 100 ⟩
diff --git a/Task/100-doors/EasyLang/100-doors.easy b/Task/100-doors/EasyLang/100-doors.easy
index c34fdbedc2..ba261e6f52 100644
--- a/Task/100-doors/EasyLang/100-doors.easy
+++ b/Task/100-doors/EasyLang/100-doors.easy
@@ -7,7 +7,5 @@ for p = 1 to 100
.
.
for i = 1 to 100
- if d[i] = 1
- print i
- .
+ if d[i] = 1 : write i & " "
.
diff --git a/Task/100-doors/Elena/100-doors.elena b/Task/100-doors/Elena/100-doors.elena
index 6e1a619ede..dd7db1e5c7 100644
--- a/Task/100-doors/Elena/100-doors.elena
+++ b/Task/100-doors/Elena/100-doors.elena
@@ -14,8 +14,8 @@ public program()
for(int i := 0; i < 100; i++)
{
- console.printLine("Door #",i + 1," :",Doors[i].iif("Open","Closed"))
+ Console.printLine("Door #",i + 1," :",Doors[i].iif("Open","Closed"))
};
- console.readChar()
+ Console.readChar()
}
diff --git a/Task/100-doors/Excel/100-doors-4.excel b/Task/100-doors/Excel/100-doors-4.excel
new file mode 100644
index 0000000000..619e31a91c
--- /dev/null
+++ b/Task/100-doors/Excel/100-doors-4.excel
@@ -0,0 +1 @@
+=LET(i, SEQUENCE(100), root, SQRT(i), "Door " & i & ": " & IF(root = INT(root), "open", "close"))
diff --git a/Task/100-doors/OPL/100-doors.opl b/Task/100-doors/OPL/100-doors.opl
new file mode 100644
index 0000000000..e5026a3076
--- /dev/null
+++ b/Task/100-doors/OPL/100-doors.opl
@@ -0,0 +1,32 @@
+REM Author.....: Eva Broccoli
+REM Date.......: 23 May 2025
+REM Description: OPL solution for "100 doors" task on https://rosettacode.org
+REM Tested with: Psion Series 3a & Series 5
+REM Contact....: eva.klassen@kittymail.com
+
+PROC main:
+ LOCAL door%(100),i%,j%
+ i%=1
+ j%=1
+ WHILE j%<101
+ WHILE i%<101
+ IF door%(i%)=0
+ door%(i%)=1
+ ELSE
+ door%(i%)=0
+ ENDIF
+ i%=i%+j%
+ ENDWH
+ j%=j%+1
+ i%=0+j%
+ ENDWH
+ PRINT "Open doors:",
+ i%=1
+ WHILE i%<101
+ IF door%(i%)=1
+ PRINT i%,
+ ENDIF
+ i%=i%+1
+ ENDWH
+ GET
+ENDP
diff --git a/Task/100-doors/Quackery/100-doors-1.quackery b/Task/100-doors/Quackery/100-doors-1.quackery
new file mode 100644
index 0000000000..e3d105d0cd
--- /dev/null
+++ b/Task/100-doors/Quackery/100-doors-1.quackery
@@ -0,0 +1,17 @@
+ [ bit ^ ] is toggle ( f n --> f )
+
+ [ 0
+ 100 times
+ [ i^ 1+ swap
+ 101 times
+ [ i^ toggle over step ]
+ nip ] ] is toggledoors ( --> f )
+
+ [ 100 times
+ [ 1 >> dup 1 &
+ if [ i^ 1+ echo sp ] ]
+ drop ] is echodoors ( f --> )
+
+ toggledoors
+ say " These doors are open: " echodoors cr
+ say " The rest are closed." cr
diff --git a/Task/100-doors/Quackery/100-doors-2.quackery b/Task/100-doors/Quackery/100-doors-2.quackery
new file mode 100644
index 0000000000..85074cd60f
--- /dev/null
+++ b/Task/100-doors/Quackery/100-doors-2.quackery
@@ -0,0 +1 @@
+ 10 times [ i^ 1+ 2 ** echo sp ]
diff --git a/Task/100-doors/Quackery/100-doors.quackery b/Task/100-doors/Quackery/100-doors.quackery
deleted file mode 100644
index 5577d1c6c4..0000000000
--- a/Task/100-doors/Quackery/100-doors.quackery
+++ /dev/null
@@ -1,22 +0,0 @@
-/O> [ bit ^ ] is toggle ( f n --> f )
-...
-... [ 0
-... 100 times
-... [ i^ 1+ swap
-... 101 times
-... [ i^ toggle over step ]
-... nip ] ] is toggledoors ( --> f )
-...
-... [ 100 times
-... [ 1 >> dup 1 &
-... if [ i^ 1+ echo sp ] ]
-... drop ] is echodoors ( f --> )
-...
-... toggledoors
-... say " These doors are open: " echodoors cr
-... say " The rest are closed." cr
-...
- These doors are open: 1 4 9 16 25 36 49 64 81 100
- The rest are closed.
-
-Stack empty.
diff --git a/Task/100-doors/Tcl/100-doors-1.tcl b/Task/100-doors/Tcl/100-doors-1.tcl
index 43badf3380..71a614db6d 100644
--- a/Task/100-doors/Tcl/100-doors-1.tcl
+++ b/Task/100-doors/Tcl/100-doors-1.tcl
@@ -1,11 +1,85 @@
-package require Tcl 8.5
-set n 100
-set doors [concat - [lrepeat $n 0]]
-for {set step 1} {$step <= $n} {incr step} {
- for {set i $step} {$i <= $n} {incr i $step} {
- lset doors $i [expr { ! [lindex $doors $i]}]
+#!/usr/bin/env tclsh
+
+# 100 doors
+
+proc seq { m n } {
+ set r {}
+ for {set i $m} {$i <= $n} {incr i} {
+ lappend r $i
+ }
+ return $r
+}
+
+proc toggle {val a b} {
+ # expr has ternary operators
+ return [expr {
+ ${val} == ${a}? ${b} :
+ ${val} == ${b}? ${a} :
+ [error "bad value: ${val}"]
+ }]
+}
+
+proc multiples {n max} {
+ set ret {}
+ set x $n
+
+ # maximum multiple
+ set mid [expr $max / 2]
+
+ if {$x>=$mid && $x<$max} { return $x }
+
+ # calculate multiples
+ if {[expr $x <= $mid]} {
+ for {set i 1} {$i <= $max } {incr i} {
+
+ set x [expr $i * $n]
+
+ if {$x > $max} { break }
+
+ lappend ret $x
+ }
+ }
+
+ return $ret
+}
+
+# states
+array set state {
+ open "open"
+ closed "closed"
+ unknown "?"
+}
+
+# ==============================
+# start program
+
+# 100 doors
+variable MAX 100
+
+variable mid [expr int($MAX / 2)]
+
+variable Seq_100 [seq 1 $MAX]
+
+# initialize doors closed
+foreach n $Seq_100 {
+ set door($n) $state(closed)
+}
+
+# do for 1 .. 100
+foreach m $Seq_100 {
+
+ set mults [multiples $m $MAX]
+
+ foreach d $mults {
+ set door($d) [toggle $door($d) $state(open) $state(closed)]
}
}
-for {set i 1} {$i <= $n} {incr i} {
- puts [format "door %d is %s" $i [expr {[lindex $doors $i] ? "open" : "closed"}]]
+
+# output
+foreach n $Seq_100 {
+ if { $door($n) eq $state(open) } {
+ puts stdout "$n: $door($n)"
+ }
}
+
+# end
diff --git a/Task/100-doors/Tcl/100-doors-2.tcl b/Task/100-doors/Tcl/100-doors-2.tcl
index df7078d750..43badf3380 100644
--- a/Task/100-doors/Tcl/100-doors-2.tcl
+++ b/Task/100-doors/Tcl/100-doors-2.tcl
@@ -1,8 +1,11 @@
package require Tcl 8.5
-set doors [lrepeat [expr {$n + 1}] closed]
-for {set i 1} {$i <= sqrt($n)} {incr i} {
- lset doors [expr {$i ** 2}] open
+set n 100
+set doors [concat - [lrepeat $n 0]]
+for {set step 1} {$step <= $n} {incr step} {
+ for {set i $step} {$i <= $n} {incr i $step} {
+ lset doors $i [expr { ! [lindex $doors $i]}]
+ }
}
for {set i 1} {$i <= $n} {incr i} {
- puts [format "door %d is %s" $i [lindex $doors $i]]
+ puts [format "door %d is %s" $i [expr {[lindex $doors $i] ? "open" : "closed"}]]
}
diff --git a/Task/100-doors/Tcl/100-doors-3.tcl b/Task/100-doors/Tcl/100-doors-3.tcl
index 8e3db5488e..df7078d750 100644
--- a/Task/100-doors/Tcl/100-doors-3.tcl
+++ b/Task/100-doors/Tcl/100-doors-3.tcl
@@ -1,46 +1,8 @@
package require Tcl 8.5
-package require Tk
-
-array set door_status {}
-
-# create the gui
-set doors [list x]
-for {set i 0} {$i < 10} {incr i} {
- for {set j 0} {$j < 10} {incr j} {
- set k [expr {1 + $j + 10*$i}]
- lappend doors [radiobutton .d_$k -text $k -variable door_status($k) \
- -indicatoron no -offrelief flat -width 3 -value open]
- grid [lindex $doors $k] -column $j -row $i
- }
+set doors [lrepeat [expr {$n + 1}] closed]
+for {set i 1} {$i <= sqrt($n)} {incr i} {
+ lset doors [expr {$i ** 2}] open
}
-
-# create the controls
-button .start -command go -text Start
-label .i_label -text " door:"
-entry .i -textvariable i -width 4
-label .step_label -text " step:"
-entry .step -textvariable step -width 4
-grid .start - .i_label - .i - .step_label - .step - -row $i
-grid configure .start -sticky ew
-grid configure .i_label .step_label -sticky e
-grid configure .i .step -sticky w
-
-proc go {} {
- global doors door_status i step
-
- # initialize the door_status (all closed)
- for {set d 1} {$d <= 100} {incr d} {
- set door_status($d) closed
- }
-
- # now, begin opening and closing
- for {set step 1} {$step <= 100} {incr step} {
- for {set i 1} {$i <= 100} {incr i} {
- if {$i % $step == 0} {
- [lindex $doors $i] [expr {$door_status($i) eq "open" ? "deselect" : "select"}]
- update
- after 50
- }
- }
- }
+for {set i 1} {$i <= $n} {incr i} {
+ puts [format "door %d is %s" $i [lindex $doors $i]]
}
diff --git a/Task/100-doors/Tcl/100-doors-4.tcl b/Task/100-doors/Tcl/100-doors-4.tcl
new file mode 100644
index 0000000000..8e3db5488e
--- /dev/null
+++ b/Task/100-doors/Tcl/100-doors-4.tcl
@@ -0,0 +1,46 @@
+package require Tcl 8.5
+package require Tk
+
+array set door_status {}
+
+# create the gui
+set doors [list x]
+for {set i 0} {$i < 10} {incr i} {
+ for {set j 0} {$j < 10} {incr j} {
+ set k [expr {1 + $j + 10*$i}]
+ lappend doors [radiobutton .d_$k -text $k -variable door_status($k) \
+ -indicatoron no -offrelief flat -width 3 -value open]
+ grid [lindex $doors $k] -column $j -row $i
+ }
+}
+
+# create the controls
+button .start -command go -text Start
+label .i_label -text " door:"
+entry .i -textvariable i -width 4
+label .step_label -text " step:"
+entry .step -textvariable step -width 4
+grid .start - .i_label - .i - .step_label - .step - -row $i
+grid configure .start -sticky ew
+grid configure .i_label .step_label -sticky e
+grid configure .i .step -sticky w
+
+proc go {} {
+ global doors door_status i step
+
+ # initialize the door_status (all closed)
+ for {set d 1} {$d <= 100} {incr d} {
+ set door_status($d) closed
+ }
+
+ # now, begin opening and closing
+ for {set step 1} {$step <= 100} {incr step} {
+ for {set i 1} {$i <= 100} {incr i} {
+ if {$i % $step == 0} {
+ [lindex $doors $i] [expr {$door_status($i) eq "open" ? "deselect" : "select"}]
+ update
+ after 50
+ }
+ }
+ }
+}
diff --git a/Task/100-prisoners/EasyLang/100-prisoners.easy b/Task/100-prisoners/EasyLang/100-prisoners.easy
index 3435445f04..3acb599a3c 100644
--- a/Task/100-prisoners/EasyLang/100-prisoners.easy
+++ b/Task/100-prisoners/EasyLang/100-prisoners.easy
@@ -1,60 +1,51 @@
-for i = 1 to 100
- drawer[] &= i
- sampler[] &= i
+global drawer[] sampler[] .
+proc init .
+ for i = 1 to 100
+ drawer[] &= i
+ sampler[] &= i
+ .
.
-subr shuffle_drawer
+init
+proc shuffle_drawer .
for i = len drawer[] downto 2
r = random i
swap drawer[r] drawer[i]
.
.
-subr play_random
+func play_random .
shuffle_drawer
for prisoner = 1 to 100
- found = 0
for i = 1 to 50
- r = random (100 - i)
+ r = random (100 - i + 1)
card = drawer[sampler[r]]
- swap sampler[r] sampler[100 - i - 1]
- if card = prisoner
- found = 1
- break 1
- .
- .
- if found = 0
- break 1
+ swap sampler[r] sampler[100 - i + 1]
+ if card = prisoner : break 1
.
+ if i > 50 : return 0
.
+ return 1
.
-subr play_optimal
+func play_optimal .
shuffle_drawer
for prisoner = 1 to 100
reveal = prisoner
- found = 0
for i = 1 to 50
card = drawer[reveal]
- if card = prisoner
- found = 1
- break 1
- .
+ if card = prisoner : break 1
reveal = card
.
- if found = 0
- break 1
- .
+ if i > 50 : return 0
.
+ return 1
.
-n = 10000
-win = 0
-for _ = 1 to n
- play_random
- win += found
+n = 100000
+for i to n
+ win += play_random
.
print "random: " & 100.0 * win / n & "%"
#
win = 0
-for _ = 1 to n
- play_optimal
- win += found
+for i to n
+ win += play_optimal
.
print "optimal: " & 100.0 * win / n & "%"
diff --git a/Task/15-puzzle-game/EasyLang/15-puzzle-game.easy b/Task/15-puzzle-game/EasyLang/15-puzzle-game.easy
index 2b4fba7059..cce8901658 100644
--- a/Task/15-puzzle-game/EasyLang/15-puzzle-game.easy
+++ b/Task/15-puzzle-game/EasyLang/15-puzzle-game.easy
@@ -1,47 +1,38 @@
sysconf topleft
-background 432
-textsize 13
+gbackground 432
+gtextsize 13
len f[] 16
-proc draw . .
- clear
+proc draw .
+ gclear
for i = 1 to 16
- h = f[i]
- if h < 16
+ v = f[i]
+ if v < 16
x = (i - 1) mod 4 * 24 + 3
y = (i - 1) div 4 * 24 + 3
- color 210
- move x y
- rect 22 22
- move x + 4 y + 6
- if h < 10
- move x + 6 y + 6
- .
- color 885
- text h
+ gcolor 210
+ grect x y 22 22
+ if v < 10 : x += 2
+ gcolor 885
+ gtext x + 4 y + 6 v
.
.
.
-global done .
-proc smiley . .
+proc smiley .
s = 3.5
x = 86
y = 86
- move x y
- color 983
- circle 2.8 * s
- color 000
- move x - s y - s
- circle s / 3
- move x + 3.5 y - 3.5
- circle s / 3
- linewidth s / 3
- curve [ x - s y + s x y + 2 * s x + s y + s ]
+ gcolor 983
+ gcircle x y 2.8 * s
+ gcolor 000
+ gcircle (x - s) (y - s) (s / 3)
+ gcircle x + 3.5 y - 3.5 s / 3
+ glinewidth s / 3
+ gcurve [ x - s y + s x y + 2 * s x + s y + s ]
.
-proc init . .
+global done .
+proc init .
done = 0
- for i = 1 to 16
- f[i] = i
- .
+ for i = 1 to 16 : f[i] = i
# shuffle
for i = 15 downto 2
r = random i
@@ -49,20 +40,14 @@ proc init . .
.
# make it solvable
inv = 0
- for i = 1 to 15
- for j = 1 to i - 1
- if f[j] > f[i]
- inv += 1
- .
- .
+ for i = 1 to 15 : for j = 1 to i - 1
+ if f[j] > f[i] : inv += 1
.
- if inv mod 2 <> 0
- swap f[1] f[2]
- .
- textsize 12
+ if inv mod 2 <> 0 : swap f[1] f[2]
+ gtextsize 12
draw
.
-proc move_tile . .
+proc move_tile .
c = mouse_x div 25
r = mouse_y div 25
i = r * 4 + c + 1
@@ -77,9 +62,7 @@ proc move_tile . .
.
draw
for i = 1 to 15
- if f[i] > f[i + 1]
- return
- .
+ if f[i] > f[i + 1] : return
.
done = 1
timer 0.5
@@ -87,7 +70,7 @@ proc move_tile . .
on mouse_down
if done = 0
move_tile
- elif done = 3
+ elif done = 3 and mouse_x > 75 and mouse_y > 75
init
.
.
diff --git a/Task/15-puzzle-solver/C-sharp/15-puzzle-solver.cs b/Task/15-puzzle-solver/C-sharp/15-puzzle-solver.cs
index 16d2c2a882..591dbc1385 100644
--- a/Task/15-puzzle-solver/C-sharp/15-puzzle-solver.cs
+++ b/Task/15-puzzle-solver/C-sharp/15-puzzle-solver.cs
@@ -1,1466 +1,97 @@
-using System;
-using System.IO;
-using System.IO.Compression;
-using System.Runtime.InteropServices;
-using System.Text;
+// Translated from C++ by Nigel Galloway
-public static class Program
+new FifteenSolver(8, 0xFE169B4C0A73D852).Solve();
+
+class FifteenSolver
{
- public static void Main(string[] args)
+ readonly int[] RowIndex = [3, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3];
+ readonly int[] ColIndex = [3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2];
+ int n = 0, maxCost = 0;
+ readonly int[] Hole = new int[100];
+ readonly char[] Move = new char[100];
+ readonly int[] Cost = new int[100];
+ readonly ulong[] State = new ulong[100];
+
+ bool Scan()
{
- byte[] t = new byte[]
+ if (Cost[n] < maxCost)
+ return Explore();
+
+ if (State[n] == 0x123456789ABCDEF0)
{
- 15, 14, 1, 6,
- 9, 11, 4, 12,
- 0, 10, 7, 3,
- 13, 8, 5, 2,
- };
+ Console.WriteLine($"Solution found in {n} moves :");
- Ultimate.SolvePuzzle15(t);
- }
-}
+ for (var g = 1; g <= n; ++g)
+ Console.Write(Move[g]);
-public static class NativeLibraryHelper
-{
- [DllImport("kernel32.dll")]
- public static extern IntPtr LoadLibrary(string DllToLoad);
-
- [DllImport("kernel32.dll")]
- public static extern IntPtr GetProcAddress(IntPtr DllHandle, string ProcedureName);
-
- [DllImport("kernel32.dll")]
- public static extern bool FreeLibrary(IntPtr DllHandle);
-
- public static T GetMethod(IntPtr DllHandle, string MethodName) where T : class
- {
- T Method = null;
-
- IntPtr MethodHandle = NativeLibraryHelper.GetProcAddress(DllHandle, MethodName);
- if (MethodHandle != IntPtr.Zero)
- {
- Method = (T)((Object)Marshal.GetDelegateForFunctionPointer(MethodHandle, typeof(T)));
- }
-
- return Method;
- }
-}
-
-public static class Ultimate
-{
- [UnmanagedFunctionPointer(CallingConvention.StdCall)]
- [return: MarshalAs(UnmanagedType.LPWStr)]
- private delegate string GetSolverName();
-
- [UnmanagedFunctionPointer(CallingConvention.StdCall)]
- [return: MarshalAs(UnmanagedType.LPWStr)]
- private delegate string CallSolver([In] [Out] byte[] Array, int Len);
-
- public static void SolvePuzzle15(byte[] t)
- {
- string LibPath = "Solver.dll";
-
- byte[] ZipedData = Convert.FromBase64String(Data.ToString());
- byte[] UnzipedData = DecompressGZipArhive(new MemoryStream(ZipedData));
- File.WriteAllBytes(LibPath, UnzipedData);
-
- IntPtr DllHandle = NativeLibraryHelper.LoadLibrary(LibPath);
-
- GetSolverName GetSolverName = NativeLibraryHelper.GetMethod(DllHandle, "GetSolverName");
- Console.WriteLine("Hi! My name is {0}.", GetSolverName());
- Console.WriteLine();
-
- Console.WriteLine("And I try solve puzzle15 with board:");
- for (int i = 0; i < t.Length; i += 4) Console.WriteLine("{0} {1} {2} {3}", t[i], t[i + 1], t[i + 2], t[i + 3]);
- Console.WriteLine();
-
- CallSolver SolveThis = NativeLibraryHelper.GetMethod(DllHandle, "SolvePuzzle15");
-
- DateTime StartTime = DateTime.Now;
- string Path = SolveThis(t, t.Length);
-
- if (!String.IsNullOrEmpty(Path))
- {
- Path = Path.Trim();
- Console.WriteLine("Ready! Solution path is : {0}", Path);
- Console.WriteLine("Moves {0} and Time: {1}", Path.Length, (DateTime.Now - StartTime).ToString());
Console.WriteLine();
- Console.WriteLine("Bye bye :)");
- }
- else
- {
- Console.WriteLine("Sorry! I do know a solution :(");
+ return true;
}
- NativeLibraryHelper.FreeLibrary(DllHandle);
- File.Delete(LibPath);
+ if (Cost[n] == maxCost)
+ return Explore();
- Console.ReadKey();
+ return false;
}
- private static byte[] DecompressGZipArhive(Stream FStream)
+ bool Explore()
{
- if (FStream == null) return new byte[0];
-
- FStream.Seek(0, SeekOrigin.Begin);
- MemoryStream OutStream = new MemoryStream();
-
- using (GZipStream DecompressedStream = new GZipStream(FStream, CompressionMode.Decompress))
- {
- byte[] Buffer = new byte[1024];
- int CountReadingBytes = 0;
-
- while ((CountReadingBytes = DecompressedStream.Read(Buffer, 0, Buffer.Length)) > 0)
- {
- OutStream.Write(Buffer, 0, CountReadingBytes);
- }
- }
- return OutStream.ToArray();
+ if (Move[n] != 'u' && Hole[n] / 4 < 3) { Down(); ++n; if (Scan()) return true; --n; }
+ if (Move[n] != 'd' && Hole[n] / 4 > 0) { Up(); ++n; if (Scan()) return true; --n; }
+ if (Move[n] != 'l' && Hole[n] % 4 < 3) { Right(); ++n; if (Scan()) return true; --n; }
+ if (Move[n] != 'r' && Hole[n] % 4 > 0) { Left(); ++n; if (Scan()) return true; --n; }
+ return false;
}
- // no way make normal long string literal
- private delegate StringBuilder AppendDelegate(string v);
- private static StringBuilder Data = new StringBuilder(100000);
- static Ultimate()
+ void Down()
{
- AppendDelegate a = Data.Append;
- a("H4sICB6/w2MCAFBhc2NhbFNvbHZlci54ODYtNjQuZGxsAOxaZ3QbRRC+kyVHFg7nBAdCaDYYiKg21ab6ggR7cKL3HgJHDcWRqK");
- a("5RDDof4on26I/OAx79QTDVkmwcOTTboTgxxYQm+yimOcYU8c2eZORLaP/xi253dmdnZmdnZmd3EzgxJhQIguDEL5MRhHbB+qsV");
- a("/vmvGb/1t3hxfeHZojfL20X1zfKjzzl3UdnFdRedXTd/YdmC+RdeeFGw7IyzyupCF5ade2GZ77CjyhZedOZZO02f7qnI0jjcLw");
- a("hnXl00he6osNOW6zkKNozf7hC6thGE448RhJINBXzww1cUsnWHJTfBztzgIWcO4PPi3Tn8/AqKKS1POYVzqLzHKRw+RZgC4avd");
- a("8uC4Uzh9tvCf/8653ynMLvjr/p2CZ10eRIk5WwLdSZObilMmCKfvdOb84HzUoRfIDJy5JLNjCl4tyOxUR4jg6xGhE/QXo0ythV");
- a("e708UcD3O05irsgfIdlHa8MxYtQpWvhVDpXLc9EN8Djjya6m76xIBHLD0o7fKda/HdfTrXOQwJZfE68M7KzoOvUZbeHJR2+erO");
- a("uuCiBQLWhq8RcFBuuhbePOH/vyl/ma3PuNE5BT7RBh9pgw+2wfNs8F42eBcbvJ0N3tIGz7HBM22wxwY7bPDEDVPh723wiA1ebY");
- a("NX2eB+G7zcBidt8Is2+Bkb/KgNvs8G326Db7DBbTZ4sQ2+0gbX2eDzbPAZNvhEG3ykDT7YBs+zwXvZ4F1s8HY2eEsbPMcGz7TB");
- a("HhvssMET19vW3waP2ODVNniVDe63wcttcNIGv2iDn7HBj9rg+2zw7Tb4BhvcZoMX2+ArbXCdDT7PBp9hg0+0wUfa4INt8DwbvJ");
- a("cN3sUGb2eDt7TBc2zwTBvsscEOGzwRs62/DR6xwatt8Cob3G+Dl/8DnLTBL/4D/IwNftQG32eDb7fBN9jgNhu82AZfOQVuc213");
- a("h0OIuHZD3tEJmEXPrBhgeqrb1YIMRGS6a9XGTkGfVbqTU1B112Yo0qlMJsOi0/tucwhp9S1s8zRoLkbz8a6Nl4NUjv4xTH+Tuo");
- a("dYdFYZOlg0MJ5+/qrsoLJTcoh5+J9TT5zpp6SZHhpl+us+vZst84/zjEKNulb2ZMnEThOEqvjZ0WMzrf31e8ntGfzJ4bioGoFx");
- a("ZUHKLy0tLQosSCmJTxwv7IPBqrdHWbE6oK9Q9ZWsKIFZ+mqSTW/GGEA9KbdT2pVe7ytRQMtweh7N0oAQBoSIniVA1KnzgQSbVw");
- a("okymh6llVJp+9keVOzzWdI1ntzE0E5mi3TKIjlck7yl9+J7THjnOyFmkMAMMpJlx8sAPCnWWs8NA16TuzgFJjeyYU9i4TVByDv");
- a("0J+yCrn1TD/Ukr9K+X8s/NXcTH+MhbusrrPYve5sF8FgMDRlCDOcFfkNqh5n3j5pyfWoLypiYkpavBCZphIed0vXLkDjWHJacM");
- a("+xpBgsbnPOUDKpiIOFk+JY0hGUNAMt4bRD06nNMZZ0BqdbTU7e4gzoCSUx7ApVW5WC4KwYAwLjvW4l0xMaVcJD0wKt8cZSaYtm");
- a("kgdMwCGTBKfQD51Ky8+UNdcVMVRKIOGuGFjGDN+MIdU4egYMbN6Qqh+ZBilqHKXGcTSOonE8tALEtzDD7aAgSFsswRflbOcMab");
- a("ZvRi1rSRJDsPmKtYwQ8fZawKBfqxrqjDiRSqlS58FxfI5MUVsvtQ1QWy+1DWSoNSsJtQ5RaxptWUGobRQfiPKw0pImHkrLOBVS");
- a("+GwsuPTE6PBKmIsqJknf9fNJ13uQrtdjmeU5dXNVs/CII0/dXNVoc06qO6fqfXOqLkW3m7QN3UDhf2p6jqZpOW1osTxGdn2PZj");
- a("J1u4EK1/dsmlEJVDsbqi3J6tutGqUz0OZW9Zmhd0nbww2YF1d4dj2h2+Z8tVv6Tubpe4Tru5roV5LGqkljldQ2l9rKqG0utZVx");
- a("fWclodbZ1FqCNksQanLjMzP0qF3b52W1/R603WnznwkYep1AyEMZKl4Qs38B6cnEWGJasGosgRXxRUQWTuA3Io4lHMFizadTg4");
- a("NWZizhBAKHnbQqDHEivHp/lkgXhra3gGkACoLTYyrHcjPo4UfW2t/I6WYSWIbQT51sX9L+or3zVgjItaoux/FL4deL3wAGoxjC");
- a("L43fKH7joffNW6QtfBY+dIAB+KToQ7ZKYzgwRJ80fcgwMe5tUssJmUm1aLJ0YUrRU5p0eg8LfzIKGakanAfCJZp0cY+gSRdhsD");
- a("ehSUH83o+vGNqarh5WpM1Z0hY0/iKnm5Bz/Yh2Hlaz/LLPWTiV6ZRejrOoTxxlNclLv+nM5zc/x49zCR5BNHK85LG4GDpak0JT");
- a("OfYNm+U5XXGTq7X4M1IxsNfNvy9NEoyTBF91alLTck265Ds3Pv34mIBs82Jiv7+q39yE9Gubn5wYKSHcviFfUa+sJ/vSvvLerY");
- a("/BGdvi2bf2nFnfeL4FKmsGgptghqo3yenPk5Y6xXl7OR0hxMd4aLQq3ommYgfzpviw8L7n3oQjdNA1mikyHZki6aZ4Pjn0K7y/");
- a("cJQBoYDZMNDvnewXqV+0+YOeepH2YXbDqJRwZDhTe7+IMtsft/dfM0PvzW9j1/QB0aODUBaewfIxpCfSBOTBozbYUpc9vxhd2T");
- a("CuGf7xrenSy9oyp/ZLT5wyjn6rK1/+jZl+LgLW/BJVPxfB7JIyVb9iLtMvqWX6FQzrVOFmulxJ+yTK6h+kpksOx+eK03/wSU3y");
- a("xfTVKaJR5fpYtnLbPdnKvU9lK4/Es5Wne7OVF4b4dG4bRbHyhR/xxdoK4Qkx3C8gRBgbMwNyGZDLgFwG5DIglwG5DMhlzK/8Qb");
- a("qIRLmIi3IRRMGXi0IViGJVIIpVgShWBaJYFYhiVbKiXE+iDK5e+QgJk5lfTWo67thcBsmi++5cQRlK9wseGsceZMbhs5k+61y0");
- a("olqC6oVWtQzVRRw3kTbfzKUqp54GgkfxZEtPhcc3qDsknN7i0s3DaTFYFU4fHqwIp8uD24bT2wS3DKc3Cm5tbo/4IT2fcIUpDu");
- a("md5haAtZfOEswNtZj2kksw16eyQDALUeqvI5dwPb4LuLbGgx5j+rxyp5DpNSmz2h9VTZ9t5XEnTbEfanqYRdWKMn9V/MVKyhh/");
- a("/jmT4S3pb7/NZAxfRS0feHznZP7VvG/F9eQ0c9INv2Uymu7SAKavR113nY8q5ExvINhSNJu9aoarEqia7h83XHugpvt/Hfz0jp");
- a("ULx6UnjvnVMtMcP9naitKnQbJ8mvb+wyZy/fZ88Rd7R+4P8VW67k4eLGnv20K67lIAsvR8XNYRzj4pkYsS/vIeFeufGCpTixCb");
- a("EwwAkgeGwOlNsr4hZImmlN3fJ7fBmtRlPyh6v9K3WgmvHleiTo/pAQ9VL6JgTN0/wvExOkdKB6nVjPDWA94UOnlCHxWo6kdyBD");
- a("mfAAQKNFx+wQ1A8SaU8CfTlL7hgDel9H2iiD1mtU96fmPp+TmKdzCgrwq0DgY3D7T2NxSzZXGKasNdGNcu4jP8Yk4HSQfxVWp6");
- a("LusM6J1K36dK+NPxQLR4vUkILMyAPmBuS/MhP80jv57cTscxs8Si5abJEq33AWcJiK8rNa/XFSl9Q6DqNvdVliVgORlzN9qvIK");
- a("+I35yAdyCgJwMw5VkkcFFWYHNDLq0p5cv5elV80qiPyvnr66qeqG2rqpWWdrOa3saC2sh7VFejtSLTV6VLf8xkaiO7Zj0Tw3Pj");
- a("jztWPlo+hnspJ9Kt6m/7pKXb4LezsqBLWfAmlpsozgKE0icdtho1WIKsv4v8UQfv79Ee2tYfSZ8tI36KLHqYmDXRrenDoqUF6R");
- a("t/gPqbAPEREzRi77wRh6w9Yj5G+CM4Dx2F/kNz/emD0WzWrKOjCh1/L4MEjLMPiDp3iBRYsUE+RT751NP+1EYuXklLN5aWOryd");
- a("odlQgxhYEIf6efqXVsfh9J1aTB+wRZd8/2OtPcFSxBeGrZT/NaUfGIPUjqq43SuxzlTQiBKKawznX61lHxkZxI+d1vrQiF64Vi");
- a("B6oqjqg0BtmNldsCMLd4rkmWsG4KJmgaIjzf+E6W9pPI9QcRxtf/MN64+tWc0SIwVMf5+Fu0V2/vse8m9vL5hVRgoV/WfWmgm9");
- a("yfRRZBkwFtW7iom9qjeO08ImDJMXEzFzpkW3rTBSwDmHvxFZzXd136reQTkyh2SsJE1m5X1K0fsC0SNEHNaZ/inTP+KM1y0Tyc");
- a("Py5GH58gxYYmzGxYDezQ1ycsiRAmVSkB/qvgl4V/gjGxPzw0kQu39gYitg3QGqrKKNyvEdHbm/Qw+l5gyRBPcNBTL3N2XFkFqU");
- a("jJQW5PmLPZ7rgXFNn36y4aAtdGEu0QA5nDrI4hrdcjuVWswXESbH/ylNn6onIQ1cvqEwUBW34rHYWEgnDFhKPyyvSKnpa3Ch05");
- a("zNIW9foCbRUJytYzCnrUYPhrkfnjN3ueUTKlSxJ73F6FrbgLQ0EU7PD4/PWeTm1TLTEUlxD7FQfJFJOuFxsb7Sp8fJImPYtcE2");
- a("jmVFzJXU6KzwtQ7hoLZiz4GRYhEL6QR20yotlmO0zv3q7sxa8nSLJe0zUK5Ff6t10e+c1F+kpGW15ddMlPmBM50Yt1PP+c8DFU");
- a("OIuDkboAiHmKXo42QGd/yKo+HSQlYz0HAQSjIObzJH+9qKMhGUr4HcanQJBxT9uxep08oYXplAD+JNGbekifRCwLEYcSxDwjBp");
- a("h/9Bnpf+hTxrfv8reXa0yfPhz/9GHpgzMxxwgzJjl4BRoiRGymSjmukVFbLe6YOM0pODBOk/+Mv7FenJVQSUI2OYAJDkwFh5hk");
- a("lPrmGJb8rKx2TaXJtV8T1ZX8W/SUX8nsiXx1VxgCXMsvJBJg4QHxBUxV6mi1LHkW5Z6qh1i73heK2my27/kp7gpswQaeDWRDC0");
- a("PkEi4uO5blHQ+FqX2OaUiz9Mf0/qcO3XhuSsY9ZFcNKzfVFniSbXpOpdWtWgeYgqdfQoUkccWQRrr7nu02r8W19ZM4zLk/1Vcb");
- a("mGwCV1JNn58ZkBYKlinGEAspOgS2vpBPeWX6qERpf2UpUQQ08nu41nyWzNz+TZ1NB+tmb9KWvSLDHhUBJpEE7yIPytQ0OE2xnJ");
- a("rnp+fDauVlt1h3Cw4XQwvfBgw+fAEeRAN1VKUCkZvkjkuQocmw475/dhxPSjMMK6TMNq88sYqs2lWgnVKsFBuk4XBIj6rYi8eh");
- a("mzWHm4TkBa6ji6olLs1cBBa6mvQC4c3OtPtE9BX41CoujR2CefFsm+qtNvkt0iRa6GoFTWkqDDz4ILH9mLka5HuGTFkGJ9oJS4");
- a("OcpjQIGeltH+hi1L05fxk1uW2UP6X8u055+UmyyZSqbKVLMumcytWr60GLxNDPyWtjwWiofLhBP9853oOwF9bU7HEpwimPQqtp");
- a("lC6Dpm30jy4z/cqfd3cuC7yjJUvDKXF89VolD1B6t58XgtL55jvHjlcBSarL+t6e9rkrfXp7/ODH8l01vPQQeq1aheTDgtmQGh");
- a("0al1DAia3JIRm5umaXIHkoeNNX9rpqFQ81dlzOnUlYH9UZegr4JuCq7B4cIoRmKCKY1dDcBnnLkYl4a7f01ADfKCw76zSECMN8");
- a("1tZawGrg5RvOPtRdNroPmbQ2gAzVdodM2w5pPUYaYvbP5emtF6OWRra23Ct6JZutkfl55vbQSQSDu3zkwT6FyD8xjHymU9ksDK");
- a("4dn+CH6IL+jH2UdraRiHsbTew++2GkZRvZm2Af+tAgy23qctg+mKAhVziWp9Ra3mw7eaRf23Zm39ZlKZry2AO1quMrpAfxYngi");
- a("VxqXUrp8AHVws5Gnw4w/dMTuqCisp/IHWbC8eDwQKMhKyZaZasXHObQ7V3tOLoNiB1FC+mr2+xQ0yF407ob1lMWurHTRC/HvEm");
- a("EUD4/EJVXIC5WKJmDJ3CV+p4PY/vdwXguwAfxKfJMSf//ZhXaMzOWVnhLJswA7p+Mff/YlhRLylfe2k9wdwW0x7FamKZ4Imv9I");
- a("ZcfN9o3x8fBgtAVtviHxcFBg5sxVmjiGGuDCiH47tpXiycgd++nZn6zbTWeNNs4gPSQwzNKNPaMv8AzimHSR3HjMvtnVnx3nLQ");
- a("GiZY9JgUomf6NOxOEBSIoZl2AmapGvWngEmPJUP+yp70fOxd3Zg5SRRIszUr8S40pKwYBs6tSK6J/jfrccvrgvBoAek0bCvqxg");
- a("pA3HRunPySldPhLGciIwWdU3B52qOWr0RGau7N80lEbYZ3JiYux3lSc3E1pDBW0VcoK0zp+UCXL3Ly9FsxjJX3YRh01QUz3ffT");
- a("TMNGQH2LDgcI+6d0qTUrG104ZYcep2Y1eoJIYnThCNi0AZqlmxNWfibrKfN0LebXl+NVydzfpyfAXhZTct9IHntZf92vd/v0lf");
- a("KKb3yR73BSPKVrXkTd7Faf3ucrT4CIJYidV6PLj3vPR7UYiuC2aO3mgRerQ2e4plloCMcdpDrq6/a5bkOOp+0d6mrYnFQu+jg9");
- a("9ELXpGh/EVRK+Tc56WF5bqkZpH042qRTgccAbIcsCq68bhcrdFneGuL5sebbe2FXw2Z8rf1Sx5v5jN9wc8axtb34bzgjmaSe6n");
- a("Uzf0GkZzArdBtW6Das0G1YoduwQrdhhW6Dh24rvbfyWdhrcQUEjUsd/bK3V0bte2k7/E5wNYQdwvdM2iGuQfGNG0odvejBlfLO");
- a("iSsdwWlYWNrHgU9k3J1554l78L4Ik25AShjCJf9ZA6q+EEYaSjOcM3iamMS031KNhZUI7GdVa7K0tAEhcyxE4Xzc9FA0j4uox0");
- a("meF8jEvAkI+RmBsrcLAf0TCuifQLLPsL/4xaEACaKvTLMfaGt6VRR419ZZjxwFh24WLS5QsENkU+xTvwamX/yC7GAs6MOn0UNo");
- a("3c6C7U13trYjNpJuys/MrbQYuHdLHe+LtCb8mIFLiffntZVuh8MVT0xgUE2rmIHJG5i8gckbmLyByRuYPNf6uvZfrBDtv5fzoq");
- a("EZWotAazFoDT4aukfVGx62NHdMXIUDRd4GOdLcwmpSXy0+AQYLOhwu0K4ZpxyPqffI0p3LaHdcs1KL5YyxB4bYS9HGwNvux24e");
- a("bp7Savzt9dNAw99uuqh4CtPsgvqtf5osxqGDX0WcAVHGSRe0CjzeepOIrwR5E7jD1GpWaZK6SmsdpL1cHIhhTYhXHAeC9FPfQd");
- a("tYFurdNrsqKX7BYxwTx8o44LsrsivTZQJX/ChWuyQTXD+H0+107GgW50FlGq0M5vp1YylWqxDnbfS+Rb0Rp2cKaiVHzU5jBjre");
- a("gwToKNnJ6sA2Z1ZoMen5JAg5C8+OskofRhPSvEixQEj4JIlEzbuNhfi+09RPaoLT8N2GZuX961nxq9lvRvis4DN5kvk5bT9NNE");
- a("8sTDQP2p7jIB63Sx3+p7yc2dw8ZoRHzErymLVYzLQYYuhT4WFRa+2pr9ReymTono4n/cgXpaU+V+/Z0cPzJluanWzNyqaV2Fwt");
- a("mzRgkwZs0oBNGrBJAzZpwCZzBm235zLLng+38snjrXzydCufPMfKJy+28snLeQHylnm3B/Quf+RNnkzCNGHLtZrRkLPte7r9cS");
- a("RXDwuYJjRxD6XW3XDbBjc2bORI5kEI+tUNMrZOQI2zVCBVw/6eIrNPf/wxTV7gvpDdEaqpgzvDLgU8MoO4CBxSsNuiEloPOeoY");
- a("MlNYyJba3qdUN5bCR0LVlgjVSI1k/X3Tje9HlMxiZMN0OkLxY4E/YhZCtAjfwSNwtHsa3KjdQz2I79UUTyi5OiYG6B7Qi5FD+S");
- a("O87VaY4mvAeE9MUnZLk01Cpnsws42wqBFCF1Oo3SqmyE/FJKgks7ES8qQoakvXliJrwXCpY7k3BUOF6Q4g3KoDNMcCTVzFMEjR");
- a("yU3bVX11uuibP910B5tBt5NB88npyaynzklnbRom/HVwg6wxtpMJa1bcRP7X5n8Y55FTzLk5k6ObsUQON1JckvWvTu6i33CfHm");
- a("vqN6uAD7ZPwSUduSEkB4Y41jnkbXwzjTuuS2wFOoDYWe9Y8CXE9om/Q26+HlDUki/RkRsBx7QiAxQegcK3+wtNHBPJEpxJBAtC");
- a("ES1mTVYztwPtfBej0MSnW+rOk71lYYwzwYNXU59ZnX2HmDpvGkk8EdT+YuTbKG+FmNv+lZi3ZsU8/wvuA/Ajsc2PNbdc1LBc1L");
- a("Bc1LBc1LBc1LBcFBHA7u15+/1Q7v9HkRu3nVKpIX31GyWaX3fjMaantm03z5LBkFLb/LszdIACU2Th4QJsDispv9yFGprrPb+7");
- a("67aVUQ0PY3GHeajtCa6HJHHlvOZ95hQFR6gh5KxdWhQDIZe0+F7Kt6x662LUlwxKS66kNj/dWINqj2aoHuTon4g4mJ2OnspBc4");
- a("b1rt4yIgoQbXnbph5CpGyTxECy2eBcMhj8COLuYh5g7qRl38lJIJpKs9Mj8nIfj2dRiYyh4QTlKW5zQ+iVODf1dzvQskzADNpF");
- a("So/s/29rbf3FoL8Udv5e6HAAO/8Qdv60mtUnLn+QqPvaQpX0/1iW3773Io+/qsdf9bX+tqkpdAu98yHnLlz86tBMZc1qVexnfa");
- a("twxbgZPV+dmyR85k3obystE3ysm8bq75o7qHrfnyPZmk9wWMiOlJGN66lz44Qve5PA5jETmziStk5KFXnIvFsgxSBeLxkLzqRk");
- a("K1QMu+12FqL1ZSv9km6OR3gq20kHc35pRcNBya8PcyInciJi1yTmIO2qhFmQxZT1nzlmZRaT+qFRZFdQlwF1GVCXAXXZNPyX9s");
- a("kwPdgolipE9w/9Zo0svZIIufj9dnmcHy3Ojffh6I27umLMMJl9lp+17+UOwbd38eI6XGJQMhDzw1Qk1CeKhAa0vVgEe4TRrzDV");
- a("nN2QnZE57uDTl/PXgjWr8U6gr9AHzo970OZN0rUdft8zcTRSKsr6SlPKNvXj3aLbyTXZ3/SsDC3aLSm335LfYooRmFAM07wVJn");
- a("QPTOhhmNBT2F3brWm/H9BfU/UAaawSx9LPrJjw4gYUGI5cDQp0QZPJhFwdG/MrWISScLVQL/Ga4aZDqr83+4ZHVatdwE7H9ASd");
- a("WGMydIenmz/fRRTYFebb7qEh0pO9uOhXojLu4ZMR36xP1/2E0kfnzed8OrGLG6F4oPXrYGG4m/ZlVBv2D3e7WDjjbijscPNX6g");
- a("XdzDuOGwuq1IxL6hraA0r035Ff+bwTei/FQ/NMJDe8cpLh7xW7zVl8fUCVhREL0YlT46eVKMPjrvo0fwVVvWlQ9elpGmf4Uzh7");
- a("boIiPO5sXI8jULsWA4EUyebz/u6nS8pb0VM1eLY/epkD5Hw1ow1FkAQWXSfGlAXdzfWuT3av28aqra5ZtL6y4D16JGmGPkRzOt");
- a("ohyepKfsiPhX8RQ4dkUStDsrlBdn/w6aNcXhkTQB3dn9YER1CTlqI5HEfj96TgrADu3DwnVYSKWjPUuAHdA3kI8A7J4rKYT/8i");
- a("pgLHgJEgF/jtczwPfgelS9GX8ywi5MSV8zTQPjt6/C+tg/WlZ0eP+D17qW/4ByhhNees1bYjW0BJkd5J5W0yNwllDQgmKftMEB");
- a("Zln0hV1QV/ed+8NrZDWtqX5eDHWJzTSrXYn22VaJPDy0RMtH4Yj6nHiT4ILtf01h8k6+/JeG6j/UDmClqYEvkyh0r+HL8TpwmW");
- a("PdBu29GuT7Oc3Wj314w2vRaDPeE1J7Tln2N2tOQoyZejDG3YG75hBrzUgJca8FIDXmrASw14qQEvXWt/kOl0L3Q7BLlb8DTX4K");
- a("IJT530buix4ouCzQeyzQjULK/fyA9uB+LVb4YcnigKfoZvWfCj4Ae8uQ2tzRPb120uN49sHyzF1xGaqcWwUxEJcxrslyogpdYs");
- a("l64lG5YxDsOaJyqkxRHAzSMVwS2aR8TgdvSpah7xBKubR+YG12seKZNaNb4XQ8wSojN8HEDQBOzgDA7mfW5e30+LWXwad1PwqG");
- a("oZCckdnjg+OC08cXnQEZoDTAdRw1zXnzrf7FgPyde8z4zK4AjpZK33f7j961bIC1R9VjWGZ1j+kkSX7RXpB3Dfreh+cJ2m7I3i");
- a("2rtFLi9o+oXmfabhnlMx/ALDwkrXhdHHcgd+dFZKrRejSVnmB0yXnHwsaKkgb/1Hh6p+tua75vqKMk9oI2kpOLIXcm/n2GaHX+");
- a("NP5UmCh18gPwffgNBWLC3pkZY8R1yGK6XFJ/FK0aUbNg+7645oHnZdWtY8vEndQVTbzqylMWBaLIWHK+VIytwVMky2Ib/akxo3");
- a("12L5bcdRmwf6PArtT5XE8NzGxUZofguP7b69oKFFdJZOUfbgRTr0fZ1LrUkt8kCJwzy3ilEvE99Swn4BayEpe4N6dG9MJacQRf");
- a("8RU68Qgi5lzQdajNdDMtdGcC+GkFa/G8PVZXB9/i3F1xGcY5Yp0qtdit5lbkS2KHXw+npUX0BVDZchQzH+MJ/7bw78PRzWTx7g");
- a("wVNyQFL7AlKgt2rQ+q+tSdE8JPf/sMXatl1qq7uDOwF3QA6b8+XwL3MWOXco47790WRLYW3zN2gDaqgUvHOEGJ7mlZpVTc/j01");
- a("jCDaHlC/oy76hZGPCmVD2OZ/W8fCP3Jq7SSdaYqSK5EhPpk/vwgGm5ed77efSIja33zq9PIkuDooSgnxk+Mie8IAIvB5QIOUAz");
- a("ZmXSBYKml1jgslqHiLGozuYN3dwmeTXvFfkoS7hwjRCEVCKLHp9my8CA2F7lFuo3oTHRQ/7g7DrAm6qi8EvTphMTaauIiqhVW2");
- a("dxEmtHsMX3NEHcuP0cce/E2aVFbXxG87n93Ip7T9xSCi24KM4qqJWqvBpHnBQpjf859+UtUxx+n80b995z7rnnnHvWfRRoHR+n");
- a("0/BiiimgNvdIHstWIeLM/8PCEfS6KCU1F6GpnNKOxRgGbGd9D4xauWaXyFbYPxF7K5U7WlNSawkKYFLaNuiHsQh0kO0as87Hft");
- a("7hvU31Yw4LxUVKe23T7Ocd7nHa1wIDEYZcYjkFoVlPQyR4zFMmSRI0dQqmKAObhXu4VhqhEIoNaC9tRu9xDRrkhlRlGEnuRsry");
- a("4Vm6/Lw/3eIARwBTcZqtFk6w6a/AoYHD9DqZJdBhCPnBqHwXqGrhWthnhai+y1nphiySPw+zpCy8g0uKoq5QOx2nYfCQZDysbv");
- a("r5twAOA3Y5VaB40H8wWQxFqJ1UJknUNUZBgMh47l2m7WTre6/e9wusj9n3Z60qa99fe619T6K+aEE5OMYXRki4ydv4bbjJ/1uU");
- a("omcLIihWXd3knfuOEktRav/AUSqocoHohGspXlLM8B10HzpV6FfgIZ6j9fP0/AD9eWwYXSK5stoA0iM0kUJLcavEFio19dHTZf");
- a("9owHtjz77xsu0wACxV7SCkWshv2TqI4PtkRfWCg+kYy7g/V7tR6Yaen055X9thBGCWkUqLN7k4KI9XIAIAcON30Vi0dFPLZ6hl");
- a("zR7RwyyAvisyetvgXG+Fs3ANsflRYnhRL0RtzqI2UxajwRw0SB5iGfYGDJulx15Gj/PQYwysNzSwDqERBoQ/+2FT9TxtdLwk6S");
- a("r22MAxzmoy53mjlDZjoi5/TRNNscuaXz5H+CcJiOCtMge0T3oY/gl8kyiCTi2wzEMQyUP6grCowerv/P08EgwzOmk0HlI1AMyf");
- a("A+ZD+7hFvgX5BYrsgtOKIRnaIKnFpn7KLBfr+p8sQOWET2T/IYuaizEWarP26pMimnJCr1zTtKi1VB/2KBo2lcN8hdhjfxjGGw");
- a("lYKbN5eUIrXmjl85ZB5vOj+xvmumgolYKJJfO1PNQA6aJZzj1pT9OWLLD2DQzq8gWjdH+XGl3kf897zYmcSns30PGDC/YO4b0Q");
- a("Ay/EwITxfClShzsDzF2+DBhDDk+3wfh8BWBA+H6NeBqq00lPotH/Y9tjwAVxde8V10lCa2Lez2MBoZsa/Wuag/Bczk4bdHPA35");
- a("rvQoBf1sVLvy9cRexxGpqkmCkewVCAk2zrBhydrHlUx6OGUoaKROsB6MimfhlP0+Wh393S0MUQZ30ZC7Cm0X70z2jmxtgoVm2A");
- a("nA/v7JPxANQ20KAXNb5oPi0y+ujzaBxrHqCc6FIQnUB4yCrqKCi+gARtILYqWYAxCP+3+Xc0WqxPogHvRfsccKKhb6a8r4YW+X");
- a("9u3h4e3llWeCHAA6fNUHPnhah9CO3hwaASoW2AhiQxfsfD7hHufcF4xUS1BainmxUd9QY73rvOJ8VWYVVwgB+M7+2Cr0aqeRQK");
- a("XHEtZ7x/MugP6f6YpHuyV+J779xD+gNPuzQf7nkbXbkqneYtatIIb1EQNkgph/ghpSqkVIWUqpBSx3blPH9Yt4FdDZj779MQ/j");
- a("4Ifz+EfwDCr0H4UzA4sblB3BcY5ykxC1D6YyDk1OpXLPNe24MmaP4NuGOAokuWfe/8Lq5HWZgsBL+rO3z9pZtafk+b3UXj0Auv");
- a("bHK8t73989ze/32kQN+ydgQm2MdpjSqR3SXq9nnoF6Hyfhr1+l6iFe2Lx2nJauxJTIG9QAEKwVoZhIvhPsVWt0BYBMf9olsEb4");
- a("4yubGyoIsaHQC5NZBbD+7Y7aX3UA8NLorm9XiQqBIWlwnBjyB+EGUzh7qAnbaqJ53unGTWejrtC4sJBvR7w5RU3wDz1nRabjOP");
- a("dEiv0CG1t30BdKmEGvYY+IwosgGCHyHkVjeV1VIqWSYr6HIARQvv3E+I154vyRwfsO8hgJ+pzW7oNKGX6dDLtMfetMLelGBjVA");
- a("DlOhTtDjfR1505cxoCKRs6q024e2XgTiaojnpwk93AWHnt9SKOUS7zjqq7Y9ppS2ge3ebyVxFI5EKCVs4z9O2aN2x8dMbnOt+p");
- a("G+h8ctpCrsvNbLG3F1tsafsO65QXdG8B0lEN8pKCvAyLCSBBRsbg1U3VsM+rMrPYSoFf6xJT0R58j+cAVysdLVHiR1W4knn8Y8");
- a("7qoBwxqxmELRmWlEW1yNOWYl4LxLy2unG5myUPAMTUtOsXZOb1Ec2ru0j3N4C2CrRVoK0CbdUoJc6iL85Cpp73jJNwYSqOsc9f");
- a("f+A4r2yeU74fI2BqPNotYthhKLlXhtaCa7YGcvTGeFCOB0GIqaGXafdC1JEk6sBhPkTcBwISm5WjTauP36uAs/FiJi3L707GKW");
- a("eR2Xfym3By/F9EC6ekh+aL86kwmfPIDltP7u1l9/9R8Ry+Tl+BCKfb9NTtr9nWoWSZm3XRnIIsOu3s12y8OPAZ67RvonthvQBY");
- a("zNS6e8D9kauohJMCrhU00c2grAiXXRfR1HoRe9EfnD/KD6CVx2Jdp34R0tYIKlJQdEOOodQhDkBCkcfF6h7yTBx+xGOv2ua7Ce");
- a("ZArgdp2tgsbegNwMA1uZmu6FF8pU1gE5eKjX8M4i0AxveZQBXksv+D5s0gBJO9116ZOanRJaMglo6ALB2WEQM8V/jd5SHdq0bs");
- a("H8N5EslZhOYxKUITjwmQejA53Q1aODZNw72p4RFtZR28JujdvzfonYEg/XrcWjuri2VEuxLj8PAYmrq6hnvENGIXDScLqMWJaP");
- a("EP+pLUnnrOMLXu+UkshlocjE93kT+Uy5AuHEYjgeM+Gq3aOJ4A+rgtStH4z4wHqBtRSIDPs7uYtpEi7bI0czp40zwckoW/g7He");
- a("UOyd0JQfUAbswlK35CIHnrBxmX+guRCuyzY4MNo63voGYXtEdmgn2SUY+0r7CZlneGxE2S2Rt6wLxr6jnaUS29F+OOUCmoViJ6");
- a("Fyb7oGDmniCW4PSgRj243Fk058EQZkURDgAUhwRoguWsSBLIhCBm3kzk/hh5/oD9uGbd2rekPx49Iz4mfkpJN7ZuKTC1yBq5uk");
- a("Pd3RCqvUYSqE7udQmqRUcGDzWzpzhvYLXUH/ypZeXIMyznngTKVC5xZmKJwUEbYzIl3NtWg/Ix7MSZtKyz+/eSsFUUqBB5gysG");
- a("dhNB+6rFuP7aJF20pc0zlNZ/0+pFscl5qSttJAruWjHzi+5ZEgwNhl8JIkhmt/tGNW0YKluH6Zptf6nUVJzOF6fppHFn/waVFv");
- a("LOC+oPFPH6kjFbljFFfIvW6h5lEQJ44DxCXmR8BGXgzVhKg6nq/VfsBGhxy/id7SvrbxKn6im7w75JKcCTAqgxGKekx7CNwcVL");
- a("cER0byQipK4xT/b95r6Dg2eNZ77aW4YG1GB+xZZ782Qvw3gCgg0iot48Sl0Ai9xvPm3ehUj35bpSsMDkWX1UGGMxGB9iFyy/sV");
- a("CPgLSagDMuqr/hTWj3b/n9kUhPP7H9+b2+i/zi8vUWIfBi2fNLEZ3lQWcY6Lp9+W/4aL9yoFZ4lt9q3/1xbgfz75XjRR6wCY4g");
- a("RCjaYwAP/J3hcX1YpaUqF95DK3M2GDIF+g3f2Cvp/V8n7mw3fgkjuTXn5QNO9x+Ndni/Y9Yu/YbeADtll+JxOFcCCG2CSH59K6");
- a("pRyLVEwm2Bnq5yCYGkR+S0RPdv3O6YFgvSxxlg8RfcNCUQe09nDrflpe7KF7iEvugvZCcQTjJXtYwd2wUoCjIFfvEMc7oQLpSy");
- a("ta/3e6O7YZ+HXdiW7TPyBzGvKjc0t0mHqWGsoBXEYFXtqZ0D+mX5Cd/yn8oosfRsPmQgNWYEDcZazYj4RERHwAosR4T7r8FRA/");
- a("4WRR8lI8YTWgJfMRmZnxvlviVHp3dv/xmCGTf8f+/k449rHBrE2wgScBCcQSengIFZYFUZGE8zoMl/TSVTlYj7bG2DkaU/aKbB");
- a("/Tce4XAlRjJw551CDqcAPBy+yv/h7v7MulLPZa8lmb/XLUUje1+T0cS6FMzWJfdz9rs9V2RTuqdSwmgy2SB0M16QahMb1oKWAK");
- a("e6dQn0KyWGg47QswiH3LMPIP2gp8f4i9Ve3ld0hX59QD/b/HmzOZsvbadnIJIpvEPpuyWHvhBd3woc1qH+3BNK1tso4YeymWaq");
- a("ZHmE11exvpik2FfbN0MDYhk4/IpZe4zE3maSdiBDMXUW2eZ8xQmmgc2SbRXrv6QEKjCByr1QOLZIncsV0u3U0BMMGXZibC5H8x");
- a("gB8NmeVUZUReOqRtyntGj/AY8bQBTzU6Q6xgGmgK4XtrLjVxniTOzp9vfPvP/KmLUZfBoj1uSbjrGfhCR/h74LL3ZNTB7EHSJ1");
- a("1g47yqJegQPwSBgru/whXV9ws1kfpJ1wsnZ+deJ/+aHr7Mwd52YI/UHMltQRM2txFl6fdke9WDD9eGY8MoXTb5eMunbfx543ts");
- a("h/8EFysU+4qyG5D5dPnaAfjn63IInPpFYPIt65ZVwES3qlCvcQgpkXfXCOmx5zRuecomUwUClxXYKy1B7WkriIKrkUyGfkmXnw");
- a("7MoFOd+si0p01sZunKrAbtMaAlFrDjK2zPCDWozcSuQ5iWCqUHFiKUr6ZNJ+E0r8fKd3lnNwt/D+bE7FMpv1tbMJMYvlIRdnF+");
- a("k9qAhSHjltY8SGoCMqhoW4ywDDbgKbXzqAeCl9iopG/kjsHhpYSh9jzEqIBaXjtiUf8O/MJMDhFlCYsRw7FqvbVTXv1vRfMQdN");
- a("g1oQjONrEm29FAwz8vAtMRp2cIAU16kx0KizthrofwFtm2GpR0T9FHW/2RnBnxwE0mWi2fAVpF95A7dszF7sy6aJYH7pb2Wx06");
- a("+bsvKMVjXUXR1GtZ6XV4codOQ38ar5jH6xYOnFUiA45HZKT5h1vzsNLJ8r+/Q8Es4DIPfKZd+RytDQHcnoefpGPhRu0v413BeJ");
- a("fRMEtXxi4aSQivbxRGnZ1zeDW0K+eN9b2LdnhpHq6/6mYzvmO1O0LZwN/ecku8xRa/bdtizf3g/Wft+8EvU9e5HxiqfqJQ9QfV");
- a("Gqp+mu7KzvI5UtQiK33xW/asdI41K830GGM/+E/56cG5Zn56w9r/l59+c66DzOvWnw1fGfpTOAekPOtM5WnEMFY+atOdsxZn1Z");
- a("2HL8+iO7Pryw1cY+jLO//Ipi9PftSmL/sXZdOX4z+36csPlmXRlw79ZZqTIPo06BKhs4SHa+qbi7B1ZNtOs41n1WM+7O0OLWgO");
- a("uqVt0LHHGy8KCYq5kOAL1s009py1jl3emW+328BEJJ+u9m+jKF2O0P3RUl0vz6aHP4gaJxtPKLG1aAeSIPAJfR89QPavotTzfv");
- a("Gy7QmR7XJE3nkTeHf0wRh3KeyQUIxmqtU/hUGp8sp4F0ICF29IcW1BL9kBramJ7pEZbrkrS2sYS789yQ4Awif6NjWIB8l6wU69");
- a("MBszA9yOAWwNX0HDbPDvw3NBPjMz7LSPdgQ7/uf8T8iS/oGPDKGyJn1aAxQZeuFXIVF2Pm97yCZnqYVuiXw9dEC+hZyrdPmJ/W");
- a("6RjzG1twgQuuiLBHly/FhXAnLBc/yFA7yvPAHKoUpQrvqMaBAvOYb8nzlP67ZXcXpdORvH/riTvj8KCbEGVhxb4zdznVujPf7X");
- a("l9EGqzgO8Qfrwxp9i5T/pM7uIVLrhq9wEK5ssdH398BbqmA5ePxERD7P2wC1bZO9V96CTiAKnngvV43vLuRNtcVD3Ymhs/X9c9");
- a("lqIyTqtjryrQHrA7F7plrzENNKlto8URRTgRDgUeygILsIlDY9DvISO46sNiKlbnnpt7J7l3CvR0xLxErRph9txLbxD/YmIjns");
- a("FUwLJzJ0iexuCaN6eS69iKHqYkPi/spjIpJKkM7iBjVKbASMaVeN2et1UkGQpgDhRIrv51ZQi6GhPDA23dFah6YsC035Q+nt1Z");
- a("1j7+yX89BmhCsOGmmiR1UUTL+6YuPGzsH2wfZoTaB9BCWEdDxyeXhabJNzFRSq0o0S+zJZnvUxfUVm6DEM2Ng5QN9aKac8More");
- a("lg5eNjgKqJ39FBzs7Kbhtf3im4AwScQG374gX3wsJqHEL0qjvtp1Xh0+VqXnsxUsG9piKSMVBVdvMqmh84uG9m/bcfSiPZofvm");
- a("ywQYoUhGJ9nDsP+j+5cAl+A6/T1hLkPJTLe7kLKBGoyC78109/vbPbMLi4ynPpV5d/Iq5yvFcuxNXQIpeEseqJlq/jMsE4hKep");
- a("m0wCYDp+uqxr0COfsEyJfZ55ddQkF97VSzJeBguTeKN0rG3zXtViDAX8Mt+hsI3nFeOVZB3PhIVBba9znOCQRM6XpAu2xMUoqH");
- a("D+RFxI/YB3+WpAp9df4uaq76UMQuHEEJ78DZ98AXP8OvApyYbPutF1/x1dSXLhQ6mEWNonXVAgkErur1z2A72R40ekg/5fL9gh");
- a("GEvKXcki+bJumo3Be/T4skE6X09vlksSBk2OD7m6wYGUy83MEaJxgTcU+yk8PbY9d8R80Sro/+WCwpD/U+9Va8isQB5bjpVVDD");
- a("2Zgz66XBzMcjGxsXNF+4r26DYsF+N0tv9QwQm8YssNy8Cxpgys732xb+mKy1Yw//cx/8+nYTRsg24qvkdBsYX/ZfD/6jH4/2Di");
- a("/4mdn6F7+5/t0aJw7LPwZSvs/L/Uxv+oWf8TXN2FwQEK/M9//fhr8D9d5Yn3aHmLuAL/X0H832nyf4vg/4N5GUsm4mAT8f/irq");
- a("+wyIuV2LuZV8GJLrzjFV4cLBzCG8H/tTb+30nwv208rxivJOt4JiwManud4wQ3Nv+/bOX/x638f7f0d3zyBczx68CnJBs+60bX");
- a("7UB3TP73ElMlC238mw/+pcfgW2bZ49BF4TwcYtsq/qfv+GQtoHPaS+v9+i/jSYaBJAw4z+/pNEcQovRMRATE9srD9iIHYi9CQT");
- a("JUYdNfZJCElY3kUDyvGIFHsnsygag1fW7ky7Hv0Z6+ETqmeciISKtwfLrzN90W2skZh7LUP7fX9tXRpjb7QbZK8j5AgQ3hM04d");
- a("1w8HMd0HXzQJgOXv4w547HJ2joTAY/NJ3PoBs/WjeuuuJKE3B3faVSdyo3az0RW2IdvEkJPFkFViyAPN1ofZhjyAhtwVQ2pP3W");
- a("+4yN9JuF9SZXORTf98g7TTcbS//2N07Pd5n3JMMm/Fu266e0zcnfEe3639ie/eE++8Kb5bJO7WF3f7oqU5KhmXebIaGO7WDx7Y");
- a("ATr5qSUFnhoWPCWi2udlZM4txy9C5qoeuRTtwfvssYKeSuJ9etlaR0Zg+GF2vndGwRFO34Dz47vmwO8qkyIbyuo+BfyRRnU6wh");
- a("0+8kWmbiZMx3N2MAK4gmuAjRrVy0Mc+PYB32Ga3M6AGz88BWQJsXEOxHaoJBmll62FZLD98BARXkVXsx7Dnqsmu+8W0El37paP");
- a("sl9oD8KMXb96K0h4D0j4MFyYp+HCoHY1Oi/In7kIDXChdhOyayENB1KoVLFlgnbkvQbGiwnjS7dhesPDAOXghbiQ8szhs3Qqvj");
- a("uuTpU7LgEZC3FXFlQrk25KrHN1pQ9HNFAfGz/e11T9R6YWMnosvaQr6AJQlnKGXAIzZzuu9UvpBVvfgLPpFF0l9sf8juFxEfzx");
- a("4ZSN+O5NXPbRMEFVCoIkhVRCH3jRNZSA/GaGF3W3RLFHqfK6kGBlaiE7NLgh4hsbpHXQHLvZ15gsBsngU6bjQ4VcPqLDQcCIW6");
- a("szCxhIja9lffGgoUBkSHuS+WLq1fAiMPsmKskRCM8khAG8gCqRCu4h/dtYkYJL1zqJGqC/D57bBKqJQsaVC55W3EexACJCjRw/");
- a("Jg3XsnlnubeHZIbWA/ocepRpbBkhB3l7bREKWpHjbFuGdhkqzIGZwvajgTJUrD4P7+xDXWQxjPia8VH7lj6pddOg/6S+1g21GX");
- a("fbmeGsrUiuDKJdMSn7gK0zCO2pVj4QfQSOJhnFGlbND8anuQjzNzbG+IInqL51W1gQTwGulcxYRIDI8cZvxotMSw9a8qagBhgP");
- a("ATIeMMAF0VtHB+Bgq4gmROdL7hWspjhYzU97BzE52I1ahzDgNB/OxDjQV6r6qIqBOLFtoq6bBHOBnRKgZ7+r9XDCWrCeS4QJmq");
- a("cba0n2mlhPFM0C0MfW9WQgcZmA9UNNpQnMBKwl1pfqfTk0s5PRgRg8lsO3dJpbsLANdqCA1g96QYVeUKEXVOgFFXpBhV5ANe86");
- a("ziMv0urvZHbwvjhu66k5ErhCO3pLY8dxxC/hP0+g7QsWaBH6aM/xJ4ciuUgU5lQbn2G160/xRUbqWgE9TL1auFe0XFtwh8GJy4");
- a("gTv96C66MM1Zk9P1eOYdh/ltKQQKHKwwkjZOGItwJiFzcFjXQE/x6vK6KQpOpBowSDWM8KIpywxuwc+xlWIgaOgm0dLaclohI9");
- a("QEwfeAoxC8t0S0qKzAJsHCIg3qBfrKL+oh4/wxKJFUZCfwKZ6JSoykW8KaWVtr6deVxCUy+g/Mh6WCZ66gygO+f3R+t6bDW504");
- a("mEUf/nxXPMWzyfeU7CmKCDfl7MhvMxOuxsFkXyAP37uOrhM5uQlorvjU8FYu4dF02GzkaIJaTKPsW1FPEn+CckP/MqAxBXOlCO");
- a("U3IX+7DXBNWAL6RKtNdgL+vifA5ezZSij3Tb49FqqQgPTd8qkwwQWXByLCfjLeSf9tcLma8nIWI/U4qM0yOmB2IBxPz3l9X9Gg");
- a("jKdO3d8aJgD4ztV90nI/CAU7o7BV6j1dLPPyxwoeQWH++GIdvoLoEMe/T79MHu3Eb/yrblVDfFMSNrhMbJv9r8XK5n0L6rMPPH");
- a("2eO/Qyea/95HUD2/MoTlqg+oHtT3n5J+M83zwEmD2DBhoahBTy7N77xeUdo1TjxHMNhTktwq4F974QfMi5f6eFvf24fVpC8nC7");
- a("0VvQvnKhFcskdW/zE+PXQqo9hg4LdPBj9Bu4SFbkpNs6ckOgl3Aq9G4Kt/ZFWLz0H4sRL4oergwrfXhefNqDt3IpnlvBoXaMEB");
- a("D7TD+7ryerTgAF9Q3WKomXyVkIpPndH2cIQSjxYhWtskQY/GuqHB5Tct+hv0hWpGEL9I26hHEBYIecRg8V19yVrSDWQJFFFE0f");
- a("tiQxEZof41OI+tgDMxiSIFPJGZhSgz9F7RzDG4P4KxVPZzTiiakNotIoYdcCrdZvvesdowQVBxn/sNc1+8V5UJ2vELGW3vjbZv");
- a("ZJPKq0pukNBFD8MbdBaSl0ex46/wBx27q81KvezxxnlMbzl2cEWlmsOfSdXJvfNQm/BX1dbJIeQj1lPibQUBNZ/aTE3mAxxdoO");
- a("3UkxHZAfXr3mC+oW3zhB5iFLyrrinLj26u3wfVM/JhoEJuCEQlguzBmJbuS/oT2DoXKR2tNB9FnW5SvAeM6b3iEgzLPVhE9S0h");
- a("0Z6p4miwroB9fjC757F5Lj4TLMdurKjEr70E8e17afgbuQVN+x7hz2Des2jeGwbgtETW55nPrqhGIyJEsggE0O9V8YMvGRAZ9m");
- a("cyhC10wAmjfKH1noYFCT6stBNkjkBOFcgZZGkIE11eGpsuRwBOppcMJGiUDHX+ou1a4KKssvgMMDoIOOODQtMaFQ1MDCoNQmpG");
- a("wQaFwtXssWvauo6WbRrMoG2K4mAxflJTmWuvrX202267ZZkJPQVKqLby0cOsLSWrD2czMsO3s/9z7jffnRlG2Mdv/RVzz73nnv");
- a("s6332ce+45G6h32CwcIsM7KFIf+OJAjlOpsjtJbwPn3Y6+ROE46zulEAFRtlOWjT01nfvflscdxZgf5xmHrV0C9owJisGBY9Yo");
- a("gGZUhez/o7OVRAdeSvXDypGAGOAgR/xGIzGnvJ+Q56sWiH3E08QMFlHsZK6HYR7a8SqTbZjqx5LPjFL8sdTUIJKgC+jPDRzl06");
- a("LS2n8txpIbYMRX17t9NXeMgNEmiipnPuc4LE/G7RwNTqOeUEqgPYrvIVDmVGYiPT4sXU8EkUA25e+abRDT7YJOdQJbwWJN9DVE");
- a("bP1ovnZJ2TEWTjbWnuaTM7r3PMcLxsAMTQlpJPP1m8U+TVGY7RM4at8Aal+HUmSDyZFyHPPPC7xfVLPffS6i0I+0s47HztriVP");
- a("Bfb7HVQt0g8+yqktNd/ZBHq8es6HoM6a4eFxV7lxuYu4sMIQ4jGymR1UsOr153dZPyk5lnkq/EXq9XRqzXZcVKrxKshHjPsmyG");
- a("tqYYxHq9cGtGad0vesEKxYR0rjeEdbLe50VEmxH9FvXJJydpyDw5fqzlK7Z0s0a6k3jHY1m9BGXGXtZj17/mjPW/Lnb9aYVL01");
- a("a4tLAWDItMkG34ETsypIs2bPp32lBxxjZEjlfejgiHTFgaI9+bSe1yPosoZlYWV1+APimHNIXVX+BZja4zjjKi/L/wELgTIMk3");
- a("1cfZDSt15uB0clKiXrRe8kys/ThrjXz7IOzZbMMkfh7AZPU0QDLd0i+k+cQ78jnoH19HLA2Gnvf3LZPMhNYyKZl+hLRWhZS3h3");
- a("1/1/0FzqjqF+tkk6LSvUvNGGYhBFuQKl31iP6afJhKxA0zqeZwvSLSIQ0thNBTczT055fjQ46G/ogg2EGWqeMPlPh3SPxKxgcz");
- a("FezKJCW2kYSC3YfTVqjYh4hDvTmYugWJDZ/wfnMAqgr0wgyge5JF5O6BOMfAcljKFYhVbxkgWyP7WzHd/5ZegyMv6TU4jKBTSU");
- a("P3ghrrro1G/sC13jvTDB4Tlkiwdidyz5C5G2TuFzn3dMzwVrA9VJuScTSxqS1w2q3Zn5gwiGSWpvvOjxPdH8kXsn8Ot+r0r5f0");
- a("ZxL9FkYEznaJM1LiDJc4stkx5Ml0h//599EMwekkVEujtp++N2Y6OzwqmJPBirV0RE69BuHI82RXfHsY/rh/A98Whp/aLb6j/m");
- a("QQ/1Jfb4g3xOLvYOrm6JSo9Loe0mf1kL68h/R5XdJjv3feJe9vusqv6e5GXtwQ/jN7dOX0YKqxQXsG/JS4RpGqvDH615LR+IPl");
- a("hlbu3CfqZeW0dHoNQ4n4AcIKiRBqb33s9sTOf2WX/Ju39DAePaQv7yF9dQ/pv+whfSTSD1lukEetqHRTD/l/fLH79He7pEfLFz");
- a("CeI+Ngoz9eShei0velc7pRpjP9abgHcBjFxrQ5Ap5rN5P8RZ6ra8m7Cs7hfJJaY5iQaFmVjDlvTJ9K2xijOwP/Z+P/GfjfOibO");
- a("nTvG5DaPibesVlEOW8pr/5rXgtfTKLxH2zeDrlpJHAipwrawuHIt7nmO42MlBLaoHHnnGQjZ8WUG9yDIQYWp8hedxpC+UByScX");
- a("iaaEZuvs2wPNhr5eWQFC0g/VXSBJlNAaiA9Kc/Q+lPBv25OFDsp3sPyMIpT4D1sRleauaI0aiHgK0MD9bhNIb7ABavaukRU5e9");
- a("eWz/YM66KWjURDRqAizDzR/i9LbYHN6TxmXpMLDpJ/sLdKVFtwm8ibViCQhuB5IV1gJWRG1mo8bTntwcud+LKtHYCNEbaQu5C0");
- a("nX9SEYw0OfkUwAVz/0tBAii2WZxUKwrb0v5HuKo/BTs42qhF0616c07/CK/XKjFlt/cwaYJo6Y5mUDM835Y3Da+hPCYBiE3Vfg");
- a("/wFgnEvBOEnEOA+I85cm6OVtagn8oWgHehufDwC0L5R6K+CRyWgc9DcgpIEWN/NIL41HyiSPkLAGtGaF05qDVY6uDfkMQUzgTk");
- a("U0xQStPLbAST4WqQYq9ZVl8/ibSHRfguaUURMPA0/7Lm4luBUwmjlnjEkLx+Os+bFoA+uXvYA2tUh4wS7AWyTsfBfwnwSMNtwR");
- a("3obk00hTRNp//M2Al4WIn3d3yaBHUSw/Rzn9wsu5BLdwgVGiT65TER7MYU5Xe7chIlHo0x0J6cp1ww+9RYddzDyADvpOdNh0/L");
- a("+Q4F2iw2ZTh70sOuz89p3avJCkHt2ENjeH9dffAW8SMKUv3Qn497H76zO6R7v7v+afrHBatpOSfy7lScKdrTEQ3yUEhov6bthH");
- a("jghFuOQbhDXeMhyRvBXjPC9lHCGPVOKxxPVQvxTixRW9V7KC/FjtKTTe47a8KeRJ/M7Xp+K7fYOnEpzJbqKnozDTsj/KqJ3812");
- a("P5cVT+J8f+u/Ib//fy47n9/2X5t5/6N8r3pTy8Md6QQ07boNhxD8LOua2FSuGak+RhpP3cwpzGm9+a5+t9KzmKMLbiBZUvYU3B");
- a("InTMsr+3mN6Gl7DFCEui9aHzNJlC3Q6pTD5IKiX3JfiawE5jARQpCX7f2942uHXaU932xUbzQ3D3RgsWuasKrnAkwqWJWpjThH");
- a("ogx8lnoXN88braS3qhro2ICFCEb2BtQZsBddhQTz/h5b2DdL281wD8Z+Wt1cpzY/C4vDtD5d0WR+UpqbdQASk2bC592717yTnV");
- a("SCJavY9pthHNxB072nNaLzYt2gwk04/Y7bWYHj9PnHBi7m+UoTVI9pqW469RMS3ZEG/IN+UMjTN4zNUnbkfG8hFKyk2IVUsw/x");
- a("1JnYmgYirbQOT7AO1lGgR/9Qn80PuIJUDK+bTFdAGRE/0DB2p1pmefQbaBG3zbG9WknO2+psa23tVtK2eOeSynybejcZ+F2rDt");
- a("u5wdvtZGtX9Oq9xHxTqfs7093zb1MvpphDMcm7NeN8E5rNGZ+D2dyVPo7PKQ88gJCPRJWAIwYgrAusyPUXqXKMZiBfoVEk4sVU");
- a("hMCraOA2pM/RXF9NlL+pnv9j/rZ77bEHRV5+K4dJ5li9W3i1/FqNkrQneymIymm7hfIi9kpT6LenEtkJWhP3sa9JV8Vte9IKfT");
- a("L/QYOlhw7Z0Qz+cxhoLQc/RVmPEaYQnrMXgLDIPYcXYw9WhanLSZE2v/u810GCjGbaZ/0I+6VErnNP5ARXb9BQ+QMlH+QjMqsJ");
- a("vP/o1tqMQyKwRSVhmFeztrmp9f8yzZETWE8jz9hwa93449pPdbJ4LVS83PY7H2jARWVYOu07ULSVKn611A6uIJfOy+XpI6d71O");
- a("6pz1ktQoYF0sSR19MJzUIUDqSJDyAytF0lr1hE5rxRORtL6p12n9DEmS1kxA6if5glZjvU5r2+91Ws0IhtN6RNJ6AkmS1sOA1D");
- a("rQijhnT2dzDrvxgQUKcD/I7ZflHPyjXk4AQWY7jN2fzoojIcej+KF/GCva4RbcS7Dn1ZUF488mThlO7Ze16a/VpjmQ6awbmgwo");
- a("YANGYIte2pzH9dJmIQhUEJ1CRC01r3A5n2MCO3BlHEKHoKi3Es+46AFsLlBETJWdd5wf6yizCqjCqb2AIe5k1q7VHURSekGBMN");
- a("U1bwKTB+qnqRpqMHU7coXh9tNw84DLr2xNzwIXWRaAy9Xfx3HR6yYjip9Etwk0tQ9+8fZkOlYv9TRmYbSpE32JNi2mCw7THgDa");
- a("ZdIUvkwK2RkH5feQhtsjYUkvAxGvigg25jctldv2Fy2qJaHJIOZG3CPhrWHKfUhQxwAJQ1WNMP3De/PB2lVRBhnbOIM8/Wuq7L");
- a("RpwIx5PvalPHg/aG+X33Us+e07oscHK+hxCqEz0EGT0EHiJq76ri4iXDlfhbYO6K3rUomb+rLZgEMkCHEiwuUb6hhIXT1uNP8U");
- a("fElDrJge3ayz0/eSeYmP+YBgBRUxmhfP4L6CFPHYAAwfPbboMqfp5wVt91si3G0hRE3LUC1spZDiFMRhrC8Pyt1zjPkdi8yyO+");
- a("Sczf5g5YQdiQ/funOoYlM5A3uuO6p5hzuqrudXLxRpugBIQuHJtBf9gvZkUrYZpyPtBse2p8IedDqghKj6QX93S9F+g67uZVat");
- a("Y6H8XvRB+1KOY3d1u1EFlRX0BlAVvMtV8LFIp/i6D0A2mPrrAfThrAbA0iv09od5hIKan8wNqdMU+b1F+42ob3H/OINyzX7n3C");
- a("YnvPv2Wrn8A4Mno/o4rfQrbFxuftHuyrPUYVhHEOyoTGq/DaWo/cjmSXQbEYrtbwSMdB6qhTuMYOrZA4TP+u+W6EpNu4gjLdGd");
- a("Fq0PiqedK3HheQ3N/5v0mS33N+HKxBcBAp/PncTKxJ+hvcA2Sew+SJezcgIgteVSejkBtM+f19G+fCyc6D8AQXURBBVB8AWJ2Y");
- a("A0SXATILXyUka6VyKtiyB3DyCaJydyHXMFyZsktisCew4X3gHMvgLzUok5IQJzvKB7t6C7V9QiUWL3jcA2E/bcFmDOvIwxv3hO");
- a("x9z/aDjm54BA9wpBt1bQfU5iv4h02QUbAakPjGektRLpvgiSiiC5384kxwmSN0rsuREkZxFJO0g2fEmM0hn9DrurfE8dvohl8D");
- a("RqO9WRAOTeJSb+odvC8E094mP/GUwdz3NffAhTyh+zkNCt/LOH9K8GdJ/+YQ/pr/aQvryH9HlnSr82tF9/34n191l9sl/3N32y");
- a("vw9BZ93GreL6xamQ7q89je3WzbQ1mBD9g/NJbdM+m8jH7l+cRyT5cZL8RUTeJKhDF3sKqP8E1OEU02lTytJ805OVMptvulWxW3");
- a("3xLZMSiKp+yzdQ/KSJnyHixyZ+0uknetCh92ODt4FbRZIjlwSK1W17YYmVDhjevXuLja3QgC1RijPYhWc77DYmv+XyC5FQv2IY");
- a("AVWmmfGGw1rqm2LleKseb0W8GfHmAI4nTtgYS4QYsjhva0VjbPvrtPtZGKR5v4qIhPeub2JaIAmSE4S8wrdtVZqOkgYUK1C4/C");
- a("qbYVmi9+l1QDICJm1O6Iq0wdbVA9sRpx4ItzkRXj401/hV5l6jO8V7l5/yO70jTgcmKAzkm/amxBkqrAIH1npNhr5xhsoU7Mao");
- a("3hfTw9l+LBuaZIayoUZBltTlPrUVfcVtIJv8E9MwzFBUK7NxH9r0eBsNP+LTAhY+sHBnrHqKWmLvuj8Cz0zLoDENeoaL8fRRHi");
- a("dEV/sSPBbQFuG9sDgY+DLiPQLuwp97QrM8MsyvtepvYjRwd4l2HQkkIX9lWqDN5c8ha1QxpigSFkPLkzin1NdIznW8xzLKF5TU");
- a("DQRPNBd7v0zwmK+qGwILrUl+LaI08Z1S3w3I1b9EYxf07znsWhe0SEHbRM0tbpnIjMxK9lPSeLuVCKDEN81GOuVggO3NsC7X3f");
- a("04lGfE+IqL6tc7WfaiRaNPSPlgJsJtCaRxOtWaAHOTxg66kWUOQhnMdv0l29nAdjbQIL7T+dGms6wF9MygHxozyQ4R80H2p+g3");
- a("qkOC51wttJcFtMpECsd5zMxfm4z+WvkgO1q+8Bzv9iZRBrNnBNiUDhyZ21C6oGHVxrSdt2Y/SDuKVJ/Y+nzMF6VQECOr//D4dj");
- a("k53RBzhdKbexJy8fNPwwSEGeI23G/7Lg+UFcOTrDlQ7GIcmkHg4ykvsCSnNO9g+ZhS34WEmch3GL5eAQ4U0yNl7zP8wdDDnPlk");
- a("XD4F/HGSKJOZA7/ObVEKkrH1UXGmAifgAVEuGxdy4HRnhTmS4pY3xJvnbxWv+KRT+sQZys/m4wMsDmjKakfRQai0n9wMrT4iHk");
- a("n9gnf49RsB4d0PQvUcSvHWEyGolr7PeClj/oSF/E/9OJyNPOojZg6nU/i8RBy8Cp5CkHVROSEJUFj56p2icDZ0t4h9l8zKgFoT");
- a("zYeQV0bOh9BzQsi0ACSAkiZQouZDxfsEUwGm92UKGtxJWmSJb4EVLlKsBg4/TVF+1Ohmqmo6msDtv8IoX97nOk3sdwza1ro5rk");
- a("43nIwqpCCozjkiq07aniiG4hmx/TbdaUi+aYs5zrAEHJryDAJqpp7NXYJV8WHEcRZ/oCCUYT1lGI4MdZThaKee4RxkuCOUIZAi");
- a("bgp3i3RU3zNGxGzTc3gGryzY8msMgLs3bOA+hsY1vEN1f+EQMNDVof7oqd+ov3gAvbxSs8jfiLHRluz8PpXgbIIxBtwKUDKw/i");
- a("EtQijFZmDyncWNX5sYoSSzA4ZJKzUdmnTUx1Gfi+DUugkZ4H7ha0XqZUGFz/u2kdTj6cFp4tsoqZSmqhlE6RBMa5b3u6ouObvE");
- a("58Tn5UB9WwOwP5D8A0WUku0viqU5YMIPXi8vltUv008tczNbmKx+GcOHfwm86omxNOKH9Yo4j4HDgeupPUH8K65bnou6iu7wHs");
- a("ilWRPVxM0RPc/QFqjrzDQRVTfRfIhWcUfwIxJnGl9ImRlw2FC3OBCTt4g93wdgrGmeajxoAl98/6S+2f5Ikw210A6rYDugEiX9");
- a("CFn2GMnKdfCqV+r7qjjzTXxGeKdwdbG31GD0PssTEtp3BU1K/cUDl/6Co2qEMdr25awjJ2Q4hHXrCb58QLlsBfum0rpb01vh9s");
- a("JmSTOQxWtzMZDRAQlHnHWikxIsaXGsGxUaYTT47nCmShNMlebMn2KuBA9SBOtVwuGRjWSbPd6XhOZGLNrVJ+jbrUxbWfDcOpqG");
- a("Vp+DT0Cw3HNszk0xNfxB77ff/E702zbqt3EbANECsgF7TiwETuUuGkL2IxUYH3rnlH+ddclw6lmqqbU4f0a6taI/eoQS3IP8DX");
- a("2EDIkmMTgg4xfBq99a0kqLwjk4mwh7+6OOh3pR85+JN/BQJNS0CS1QAgxffimaFl8RLRff/oiI2jOB88h8y0yacrwl6Vbc263n");
- a("vjZOTGMrIE50s9NcSSsvETFLBhSdK+3f0wNl02tG/lBOQ0JnWDIYd4XnO0fS5hldRj114ynmkgAu8U+3ViQh/VJe2jkV98ucGr");
- a("4MR+1X6lI+IwnttUnEDTMzWGh9P61BxAEiZhWDOJcT4m1AlLQizhtA8RNKElA04Tdo1QtaaQSCFoFAnE+Iw5O6nhai9ovx9OHo");
- a("u4wMkvtXf8PNz2uFwRfvbcSeR4FkYrcYLZPE1OqbbhbmV7Drc/qGNDozG3YjnrdQK87nn+VJgieHwiE62zGbcRhMlqTZ/v4YHd");
- a("d1+xnbvp9Shd3PN9iu32h29yVKB3iBPRn4KZ8NvDdZT/GrQpOYjhzadISKTdP3mACm2GiuNKtrO/kUrW3SkmGzJtnTWx2F2iE9");
- a("82VqR0zrLLHrV1dB5s8xNZC+oBnfVOAa/jZM436rf4ODHw+fuwYCwvxA5VA2pRdqQfqiddNVmn5OcePeYCvpBJcK+Mz1kfwWGC");
- a("bk85uIoTCc4AcvB0Wfx4MSVkKxAfpEZzKZX08027M7A6PQDnDSUBI/bTALSbUfEwXiEinuDcTZXzTaa6X+4pnqw0wpTn71sj4D");
- a("RH3qo+oj+V1Lw1kGZT5IUiurVo8Noh7VFDfBHEs/CuzJ9pIS/erU07EtIcnzDoawCQsdzKHytw0bR81iEkDQHPv8r24WVv9oiA");
- a("dRlTZTlXRruS0uPpd0KbPLfheWIoqy9wt196Wox1Hek1+KgFaD6uM0M1nuTjMCqJtyPh/98hotd5OKBRT+24OkSHOc52TCtiK6");
- a("Igk0278Wcfzt1GEurLsOluu/ROYTSwbAXBUCuyv6EIVXNb0LU/VvdHGG61FdnAE5F82GVMeSusVqcX6l2bLax3lgmqwEH+SxQ6");
- a("xMnVKsHcPA6qCX90UF7nHuEnKQ4yWZB6JXQmdoJcQ+EbWq6Ie5ncj9ik358xsCkb0k8zuncWlE3kQ9L1pQWBtDpTy2fJb44lxp");
- a("fZcUNi6AOCGkkLRCmsFCRXawsaZ4fhqnvTm8nF9beG6gjE2nuJ5wcWuLQ6cPDBmKdNqced9XmEEhEE8zVN77TsuVx1QvU9tGHW");
- a("wRjyNw1aA+dhPmR4Dsj4vfpiqRlvUFv7mqCxofpjpWjQDj1yKoxpswBNWmvyBspC+1giLHmrSx3PyoPv88jAS+V6PhHLoOkOb/");
- a("RKUJeggMJwL/w5NGRHs3REqYZPktJgeXD9QbJOkrIkjnRZFunMukfyVJ03qIO3wd43FgyOKkfAXN3fkQFbeiDCW3IMhN9COgvh");
- a("PPtfjgESnffihCvg0IPjzULw/yVVpF0Chk+gsR0O0RNnfhD1i67HccjpEL3gFvjDAaEPo7QoMQov6cJ4ub8lB4owsBobojuLpV");
- a("Q1GBA6S2MC9eTFWzsBGi36/w6yft8YzQPkupModm/xRtStwIa+sB3HCPOu30naZ3VXs0xmzBaZf/UVH1GyjOck8V91aqgsMQZf");
- a("7hW52/Lib9+g0UPTkNXWBGkN9Bm4KMu9iKfhBHIUCmA4iEb5zqrNnAM1IJM0UJ65rRmiHUmo/B4OSXGnAywfMBg4Zk1Jjybfh8");
- a("VwtO8Sj8zccntmDqkwj41bN3IOlQFg9k0sP6rPNErT7rPFYrbpO5abl2+m2m+4+HdOQHJLK/lpqVpmbfiMIY70WJt1DiLSC8C9");
- a("KQvl6m58v0XEEH7wvQSKZzm8QbUanj2RD0pXWZ2iX/osXNoMV89zICdJf0gOiJT09q/LgLAYr/6Rf8lSTIkho88j0BguLYhaxL");
- a("USvWr1i8IVJfG65V8d+OFpxiRBXo2SZdRb6ENZpuL3qHPuvcZv3+EF5ES5RrclnUQs89g6m3gxHk7VakvN3z6x70qXtIn9dD+q");
- a("we0ot6SM/qIT21h/RT62OmR9gT3mTEIExar41rPgK1zX58FunY1o0E1DBCXB0AK5WxkoKpKYyFca7dLb+WGOU/ub4Hffge0j09");
- a("pM/qIb2oh/SsHtJTe0g/9WD36V/1kP7ugz3py7P/dV7Slel4InQJMsDHbjIv5wdi2IdWht5xF7TD8qHotGxwTif0KUj0W9gMka");
- a("WZ7dPnHVlxoIsdbpkfJY4Vdo4UM+q3jndJgCBmM5MNyLmTzNoevuH6YFCvyvsRBCPq0776jPW568z1kfMtP4EpWUfyS96NDt1I");
- a("4aePyjVWvKdTUrYgwWc2pj6L39j2xdXDZcEgT4FTjxoN1blE25PU0AYM9Y4vhJwhBymo20tloYXHM15J/RlINtgJreknenwfkd");
- a("EuprpjRygfbacWAQV9iCn+wbKY1nil/tYbR/RqDFHPJtJK6kbE+eKwKF3L9qdPS38RXfW/avT8bitAD9dB/Xwa8vD6DrjFQMmS");
- a("QJS+ibrvatL/A3KuyNwIGCNNDRymvnGa2zZUJP1RJDWQ/EltpxHAfvI5RJJaYkK+HES9fvs79fqNof1YJ9O5EVlYtkSPtaqnaf");
- a("IdToOUJXtaLP0awFuFdyftnTEYkRYDBKwUyKb17359tZm6SF9tnAiSaaYkEpFlqznMORic2jZNKZriM9Q/z9SKtaP+PfuDkU6d");
- a("3i1U5mHR8eSqo9BbLaZXOozc5Q1p7E+CSvHlsp+bReLbudbaUnRSjGLRSW5EoQ8dh2v5VGSDsWmq3WXMf804gCexPdl9zFNK0U");
- a("mHr5dvdw/uTri/eHQnobWk344e72J/BkvoQJRyxvdnw95SE3pIP3x1t+niEesXV/PxordaWRoM0htamSOa3iVXdUMPp5x42GQB");
- a("2mOy2Mj867qvj1rTXbo6uTQqtau/QU13qKVot8GqqwftheYQlIlaiv4prDPXle6GPuYPRoOjvhciwNOPlqDlvdRrWqTuzhnkoW");
- a("zrufo0Twkp6v6rmAtw8g2kOnwd2TsbDAlgqn+IaJwSxd1QMPXpe+MN9Na8DyD4d4v2MRPln+O3PdpTjDKniPuUXHXJVcKWPOuj");
- a("8X0dvVHNRskG92BEMu2f/05oPwHjfNbqE4/37uxiA7Gb94JVq/6r+n1cyvU7B1XBWYwpzfitXps8rb4r76H69hGNqEFkT/WT/P");
- a("FibP6Q7697SF//P6a7Snt47x/mM7SwlvzNNbARuap/8D1ThNVw8pEKH04BC6LIwuXIzCpytL3Pbg46YLEByvUkg3Ec2W03d1oe");
- a("bKpuI/DIHmKvFSUsFaJLPZ816mVXV32SJHX2FHFaPPsf4ZNQ7PexWB2yS2QrY6XbZHr0+q49nk+CCa9fTeWn/MOz6FzqHpC1in");
- a("7SskgS6R4UOB98+VocG7Hy53QGbCwwhx2L1/ipxntOTJqwEJUoYODGfM+M7gOf5ezEPHrrVFmnsPEq7n48Z07tPn1U9+kvsfOV");
- a("+6ZIpKj8lV2SosYH7xmUeIJZr1kE2b4mu7EyrUcMoGePMeQX0D4BrRHQDwKqEZDpOENVAvq1SFspoEEi7RYBXSCgWwVUICCXgK");
- a("4W0BwB3SSgGwQ0/QRDMwT0lYCuEtC1JxlyCuhmAU0U0J0CmiCgOgGNF9DjAsoW0HM/MjRaQLs6GUoX0GaRdq6Azj7CUJqA7hBU");
- a("+gvohICSBTT0FEO9BHShgAwCcgjo+BqGfi+gwwLaLKCDAmoRkCqgTwTUJqCAgD4T0CkBfcRQyuuQTqh9DoFXir7Xtr+3+vSd0j");
- a("CXvlM6F0EIHGajlci2HQ8f1IrJfLFAuJCvpv6d4r7gOFMuaIQ+Z2wnSXmowL2GDwwNvcSZkRTNJD+GbOe+fgfqs2ay5M0u/vke");
- a("6eG9+NuR78UPAj/cOO+NVEDmZOmB9jHdA602uWv12UnoqRcSep+I+nC68PmhdhTJlCh9caSYt2K2lMmx37+vi9ke6CM/Ifw7qv");
- a("yzuYN/3tMbpxYVspd6IiKUxw//msS62O1Suu70USkSjvd4Kqruz88DWgstr8PnegNtU9RSVBRyZniEFO/rQaUEmZgm1JdJs0S9");
- a("HpWE9jKFdbtnD16rLY9jeHkU9VS4njHs/aLnBwaM0C8+1Z2/mO1ifaKFofM6cdQIiXgcvpPwGW1ZW8nWroP4J94VD4Brd5eSMN");
- a("EFN5sVM0ZS1Sy/N2V8YzRUTLbXdHrGCSN7nix2SLGjTWjgt35IDbpS81kgnnwmTJV+EzS6LQkTf2agR8oPYJ4/0521Mz+l/Wsj");
- a("VKwQ6KBAIgJHEJAmns6g39oU5M2veHeqzpjEtrGS1YUT6bmV+gGOfGd+n9UKAoW+bXr/lJD6PbaBbJ9vIlPqpw4TlNaAUvs1QM");
- a("p3p2dY7pmKEO2+2XnJ5w5eCy/L/lSdiwoUbMQesjw96zn8VA7KunA0oLNgSqoyJav3+wj3QXiJyb/J6CI5UIIPBEnbX4japP3F");
- a("1sh6qQtEjQaq9zqoRt5jv3Sb1R+m8R5Q5g9bH5E9XWRHwNEQJ7bKDmoPCBfwFvgs1SEqn6LmMln1t6AYbscw0j/jU9qT3Vz0W2");
- a("Ht+74OKAUZoU8wHUg4MhZsxIOhZcOy6Mc9Ee1clupV41aw/WUnvQYa6/KL9/Om4hp9ivy8XJ8iPy1nCa7L0H7MSFt9BU2y1x4n");
- a("jstVzwLjk37ufiOpJ2NvAPH779ogfB5pheAdulIz1qTeD7h2e3qHOxnm8G2QSx8H45qFSf3AJchwO2fIRoZsTuBdyjlIuI4T7E");
- a("iwGzx9ChVTC8rhvYl3b/yyAuojtgdGf0YEssjGznNo5ktsReBcF8HPa7A90JfhTRq8lfrJSrJsUZypXtyKoFGu6jzSx1gIWJlq");
- a("rj5GJC1rTwKsbqewm/QlLGsDiECgajD+uEe2f8bZUzZ/ST2R1P4uT9USflWDnxSwqBm1JfT+GaxhTxNTHE6gYs5z0kCHz320sy");
- a("NOIfazc2VVt50vt6q/NhjpjlXztTIIulqDUZSbx3klRkkr0a8hJALhGLrXM0DdeTlzWf7VjER8UpKPMXaniAJ2QcYfmieuE7NE");
- a("l/1u8ASzwVNtzAbd67MXsmWp6dmU70+0Z5iLI86kDKemHh3KLOmz/Z1CZLOFsm0/IbLlT7K5R6Bcf7W0n7NY2s9ZzIw7DySjaE");
- a("feb9NHQuO6bEwW/QiesuIjcQ+g/TF9TbBl+JrRit8c/Brxm0nfyyBZ7DNS+PI0guJ7WS2KnL4UMxLmsKLst9TJaDBwXuclZ1IZ");
- a("KsZjXH0nM64nhfZfIs0eKAbQqQEo7emVeml2WVoBgvxg1DOYembycT4Q9kXKyyKrE2Mnd/IxxoMu8UDaoO65kgfxy708iBorsK");
- a("6IkfXrluFDAcFsWf9cxfQjsEPf4UC21xcY53e1eJcC2diH+qlOoTBEPQ9b4wziYXg2OBzfo46X0sVHm/Q/DdbVHZ6pqCG5FuOl");
- a("Wix5mx+kDr1zqbMOJgIa7GITBrqVoKu9f7MhyFzbzfn7dPm/ba8ndNB+Z5n0J4tPR+wa/hhlsSf2e4O9VfpQen6pD2U5gjyUun");
- a("0N5kyefW5ERBZ9v1W9wZien7j8YBmCPb1JGDLdzt91vmn8F0bMTwgUUMCCQCEFejFSmRxTfA78m0G/fDak+V9W6/Nb5fyPIPh5");
- a("Pu4WY38/vo/0ZWa4WGYm0TJzFi0z/YT9hGDEOrNvuV5OpSynAkHx3bDvCjxJjq6nS/Eui8cPu3fWfeo9kB8MIopsNbiUcaYbsE");
- a("V3+TYRIjc6FwUulgWaZIFxCIq31r1Fx8jvJGq8smX+Nxfq+ZsQFJ/eWcK+hVjSXsKwQF51Wm5zuo7/Mjn+kl75Qn3854nx18bY");
- a("PT00P6Qj8+9l5lyZedxC7r2bDQGSOq+QOAMlTj8EeSQDsBsi2EZWMbb/figX+iBuXUC6zjaoZQbyhcpaNsFwUTClLnkUfNSpv8");
- a("EqBPWOUuM/S4wLbYK2wLQyZibe3n1YnHdq2dau+Ul94kZaxYx32rrKVqLl98xwTGSpRrolcAX1v6TL5tznfuyoJ+5RH4BIIvO0");
- a("c24LXhXErJnv47wjqFd0/o+0/NOLabHpdBorbFLcH27fbKnTwHL9YJmca5sjxrvjV/pwrL5ZH45VN+vjfW/0934DIsRqdCG+Jc");
- a("9VLj+8dGOypHIfuCNOXKcXs+bVnSj+J9wuZ2CK0P+RxZ0lixuAoOAQ4qJZEufQAh3nuwWxvvXY73Wx/kkaz0gaTy/Qm7WODbuG");
- a("2vRzvU2XUptmuvyWF892zoWX+Kbl/eASwLcns4nUdfqjWdze3ny4QQz50dHa9uQdepmXyTIvRVC2rVrinCVxBsi2yXE803pw8N");
- a("bu/BVi3JdjaD0q7kc6urgqJP2MpfK92nz5Xm2+3jOjjaTfo1wZ6pvOUN9YalqElVvL6jYEXBGOD33NcKjf13cocw9dkBxgv78w");
- a("oHsP7T1Jm/apVTwVRvpCrBgfPj9+NYPmx/wtND+6L8ep+W6EdPcO891iTQvJCXqDZ+jYXAqK7KmQyt2J3Rd0qTgXqsaIny8AIo");
- a("YSyZuQDF7WxuvHJXpPrJFil7td4eO1Q+K4JM5clxwvWlp/Knze4ytF3yvoe2WeXGblfgFYYSxaKUknSdJmV2jmHu3X3v0fczTw");
- a("pkLz7/wMC3wPcSK+tODJsBfsgm9il9dLlvfIPL28DfN6Ku+9yPLujVme/P4Ka6mwhyr1wsbKwi6Yp3PZBtpaVmlrCAIbQ2vIbJ");
- a("nz8C/0nN8jKNaHnwMnX+JslzjvIihG7nKXH977qizz66YH6SP96XEe99DDq/wy67LeiA/OtPs5Tsyt9toJcJAx2Wbs5j6eOxMz");
- a("GvhqrAnSt9tZIpmPHQEqUPOD2DpXnxZfzgJq40GeVszeg3QOvN5P8k6BZmfTn8FU6h+Xj7cPgSJKfyyUHsfpfWU68XDwoLhXAa");
- a("JbIDppv9rgArLaf2ssv96+1pFB5BYStMa2PonbpbNl+pcjJSY9wXK+gW5PzlbB5NHp/284JN/8xW4jyzeTuso3Wd8Eyd3qE50p");
- a("XTEWmHAMt6wKAsjiYM0HPPWlWWqaObDIUrNGmwxrHgoFFmuBVaF58q67Qkm/DAXcIuCeT38u46ibQ2krOTDfne9VCyw1t1Dhvz");
- a("KS97klIXo0yDy/+etb8bfZ5a/PxjdKv29p8Nva78Va/EXab472+7GWnqHBuzX4E+13j/Zr1NKDvP5LZmF+8u4zYmcaxzQhXNoX");
- a("R9BFISiBoOwQZCbo4hBk1TG9e206jZY4Lu6M7wuhevYRyZB8b5XmBKtzJ5VN3kvPA+1QOEgLDMA94tEdJGJwBVM7EICgeVhnib");
- a("FT6UVuGlpg06vU8Yr008D+OeAFLKF47hsldWOaHNXLDZTqHuiAAvKUuoHZtIPp/bi4X0VcwlV1E7Jx/0SOO0jPqiT2O8Mu+te6");
- a("WZucTtzorLopnlOlCt0MCNrqE4wGticwNhhEtbduK4QHVge9v3di1bwfidiGCN9kpkJQwEMDOl2mqy3jMDfHjWXhf/52owEm+t");
- a("v7AJ3Wtz7S7iIcGlEvwG1ueYeDLVp+x2u3PTtY6jsM9XX4mXWs6TXBWJ4zxlaZCIt5/fjMZa8JurPgkJJkVY6VVcbh7kRE2S3r");
- a("WgLJRDfQy+VHsp/CRNfzEr1bA79T5X2HqPIfAuBivoYeTe0cthBTooxpap+h+QER5eZp5Q4KXKiVW4AER22RgeyvBUZ1KX8gl4");
- a("85T6KF1eMvjm1F+D4EiIXmBK2C447N5uLZL1RjWzyE40cQo07cyXKFAKdikBI6UDVpmuYMD8oi7JuyQQ6WgOYvti37GYeU62zz");
- a("62aavW1HGcSDbf51zkVAlH4Hlf4GxFd6AoYZG35OVlJuQDJF1CU3kq7/p9gniXOwQ9QUCR3OuezyWa3aEe5ZOEo+QPcLOIRuM3");
- a("3zrpGsoN2H/D6TsguaSEWHCRf2qBBFb6jatJkplf4s5gnpEZpuBvN+UN1yAfrR9P1tfIk1ZTGqP+4yFjGP9gdTnwcNEAziX/sB");
- a("1t+CjxatBPXbJ1HB9l1EvmDvFHwEML4+ki+wd/uKDre/ZGD638DFoNBlGvoBa7Fe8z4KFnVAj6g3xmMtnIg4lz9kexFIdkJy9w");
- a("VCCyPkAPaT/tcO1m1aNVroNl2vtoJoALIJb0EWmmBwTxNvT6oXoSG35nFDbKC3/b0QvSVMrxGwX/3pZu5/ddMefHN98afFtP+X");
- a("2tdsumyn0DBSig5ryiRS/tD+pNh1TycrUyPd6DuYWC0grZGqgfgoBiCmniBnJj+gw066AphTs5F2pIIvD/cuokxNkCypH+bQQX");
- a("Tc50hA+scifSvStyVYDU5o7yOGiHkuXFmQ9ncjy93qUh8HQlHOWxByvXrKSDPNa2Npj0D2wQmf65eJUkmUabl3WjBCR66rPW7K");
- a("UzUKdK/U6c4TdF2gC6r5hCHGB1CWgCLXWZACgY9YUFdmR/AdEXQi6A9ysAx5vy8XeaW8Fen1J3CndeKfLKp8IShEfTRdqwelUE");
- a("PXj+ZO6NfQCTz12gyeKjciDkn1nNS/4UdKmiCSnkScH2l/1dIOU5pNpD1EaXgP+Tbx5GrwMtu/WSjfB8yMeB8ASJ2M7GT/RiIl");
- a("TA9HOv0TIA0TSLdIpNenhiM1AEKrm46j1aZ/Mu7lEnfE1eG4QwEBdz3hfhJg3P4S9+Mrw3F3AALuLYT7N+C2/yiatO8WPcO2q8");
- a("IzbAVUgvuQd4yGl2hHq35zmEvYKDOYImoenMIZypBBiJ1eFBlWyAyFEVW6HBAyXKhnWC0yXCUzNE8Lz/AqIGQ4+HYowwyRYajM");
- a("MPya8AxDACHDu3qGEcggOTOW/s5WIW9yFfpIgYcuPnIJI+LWlyNCq3qRb59ly/vCgI47E5KnuSpOGjB5TPP4AwvZzWDV+K6ECn");
- a("23pmeErMaGE7kQRBDv8i1VhUKkXJKi9xv6NaULxxSusMvX4SoYbSgvcmWNhmzDlRX3Rnke/hoqL3BlxcP3AYXd5/HfQa4sz+Dy");
- a("c1xZiTBY4soad165hQ7qSxL9sCkdSGLf0MIvQ+xGv4f6FsJ/420Z1OoOnFXw/lztWEFN7qw6v9Dnpgb25gZGZChABiS4Wuzqxg");
- a("RxLykX3qj722VCeentlfiN8uU/LMJjv5IU0j/4/DqyX4he1OVGkl65Ru9X/wG9e4jeQ+H0uun/6tPtpzwm6sBeove677uLzg/v");
- a("u3VLRN+dd+a+MyKDP7rPZPsuqtTb1Uuxn3TuUKllI0TLEPUTRB0Ia9vz18ZjPsiQbYvq/zbPf0bv50Tvl7Hpwb5Af7qfHER/bP");
- a("jjGUFr7NWjWMsiQPKh6Vq4D8KXpnPYsqVZkoqWv2L+guBcySX99vE5n3qb2X4hokiAekkTaGr6+33J5Io6kFrj3cYmmz0H8r5Y");
- a("8Z7LT/o6J4S+zgxeYM87zdB2Af1WQG8L6EsBvSGgN0W+8dcwNF/TYxJQ3imGRgvoTgGlC+hbQWUUIHXaSGqlaY+DRBmmffjZmI");
- a("CAikD7KRfsbyKA9AP4kad8VsUrwzKYGveW0YCgHcGPibhid4Ly37EKdNHvXVnwQTPtdUYrpmXI5T0aVzEAI7YY8idhIvrrbLIy");
- a("3WI6DrEK/XPR+tfM69/L2vr3C7n+RaxEmwCpf/xKrH8SKaEkYv2bCqRqgXSLRLrQEY6UCUj9mUAqkkijneFI6YDUSwWSTSJ5Cs");
- a("ORFgFS+wPJ5cf+2g7gSVvU7N9V3wOvlPUPVX0T+KBGgrAMvCN1CHXO1xFL2+dXxJ4nZ6fjeWP7b7m/fNvXlCRkuOCoYqTF4Kjd");
- a("Wtua3uGobazBfnSMzd1vjNWdMibbPWyM353TTrIirDJbXSN7Q6egl8FhWdfUfi3T1OKTEZ/A8Xxms7y4dfXWY24c7uIwdg7L/U");
- a("2BC2iOXnnU4hnknAsHrYUJmZor2zR4tDLhJXVgMD27Ti3K3umH/8Gimp3uRO9xi2XtdOxC+JW11CmJtR7iVDTnOCtFscUfGMV+");
- a("hd3QNdyjPUqiq3+6s90NWB01GueOwvTJRsx+OZ3FLTjXauc+9CCpCKxNz+BLA+FOTr1reOipg7tEro91wtMdz3wE2DQgm4A0Dc");
- a("goUWqYGKnrK6AnztSFoAizCkhrJUQFuALN6RVRMCL1CkdAGaQwP+uDRqNh+VTMAfmPpm9Hcnki3FlZ7ilF7xTmHVwxEFMF7l7o");
- a("iEYS7fXPsY1wZWA6FJf01viSmxx0Hm0/m3L5VD8rlkGGpC9o0v4/68dCvWHtt5qSjZH1zJWplwhV/XXY0+qqNdld7p/LMN9Id2");
- a("185XzRMIp6Id3PfkMfTd+A3xJ01FMMHxdIWadZRYE64wlOX8v4jnr8Ed9+AwlYVM9QTdK7MSHylprirkPh1AJ9PQPpbM24SiN0");
- a("cUux3fnAJghw8VH6sPX4Vt1zdDHuJ9N0Me5HCGKshLUJfhBipd8MHJKHUCAbKTYK5LawVgo7IpJmYoShpC6NeWqI9rE7m2P4/8");
- a("Ry+kGp703oKJUolTayU0GmeAqVqmyEc5n5qi8nOpaahcI0Dxe5DY3nCwrImM9Hr7Kx4Fmv07R6NqQgnxzZbSnGIB8KphYjkkj6");
- a("2fuch2QZlpoHQQLlWcFNLF3Hbu8+rBoOiKw+Xd5LLcpClRuod9Upz7L6JD/i94H7Ksya3twkW6HvziGaMT906bDZepfeVaZ3qR");
- a("dBZn9SbzGdulHH+bnEmU04vjRqknEN/sRyNdpVPifVJrFd/RhdWOp7T7kywbvX5ZlTfQWJTj2DipW6o9SIJ4UCSGIR7IN5ybY6");
- a("OwI5hqajnOeM6jzQwft+O3/RCGRwv+MKFgcVB/BLfMdKyb7yuTiuFADmcmyWmpw4bvoo2Szlar1ZtQhqX34ZxoXdtKz+s5FzHJ");
- a("6l57i5SM/hQpDQ7UASNVSnniSNzSN7LMVNviZy6ZnLBB4VONBD+NaoGVy+/UvawNUwgogJYskBSquOchVQnApXh5lcaKstvYjQ");
- a("MOsJpMwvxcZ0GmT2oYK6ZILc5RWjISzXD20i1zltsgjv0iF4yH0Hs8c6jlEmDiG56LbVncvmsXV5aq2TO0f8GruWSPIpDUkZ2K");
- a("SVfklk6R6t9Mf2YdoSyHnbVvzF5Q/rqWOBUDdcqWEvArZL4R6jnU0HvlllLUPqQKisBGbgkxr9CkC3PVQd8tUWCgufbbJjZBgv");
- a("Jn942aj5cHuLZFAi+BqCWD9BErlh84SXtSiXpd36r91Y7HtfsyBnB7uzZgV7pi2huyS6ujdDkufwfVikuJwO8TVYVo8DWvu5LE");
- a("sDb+dCEpkQ8hFdNyGuMH+RuTwdf5MrzlWwYhvdJqzqlf3VjfcJL2obasD15PUcOAmWVTtEyGzx0uRHfj1rXkPAoX1zOLvwElvL");
- a("H96YI/zhJWsOdNtzjJQlrjKP1HDtJWDwW47pDF6o9C7G5hixDhR7uxqyQeJJJbF5YDbLl8keX/xkM1JAB1uSRkFJ+5jVR/hLF4");
- a("5qgN/1oy6Fr056/6dZG3x6MMvXqADqm8J8m2UV2e9hQV+JuLXTutW3i+8/eB8fux8Tyq+knqmA+1x829SNnvH5sxPK++XPNlck");
- a("i/GwebJR3nwHamt0+CY7Q931hIGmlWRqW3C7P6w+5Q8AI5fnxLIIRpHnmX/RdiXwURVnfDcX4dxFCARFCQoaBDF4JgZ1Q7K6kQ");
- a("2NAooWlTY1YuuBklWsIQmGaJY1uPWqtrXiVW3VitaD4pUETKJVDIgaATUq6ksXNaJCuLL9f9/Me/P2vc2GXvx+ZOfN+c3MN9/M");
- a("fPMdwOl3R/FoIfQGhco809nlq2dB7JXFV9vl7vqggd7g1PdXlu/d8lvV3yjYoyujugWCky406FfX2Qb9+hJBslRw/eF6viEqX5");
- a("PK9yqCwlLBjnlG+m9U+kpRD9nToPP1rVCHrDl91YvMG0MPv8pg/dhFxZQrifVbiyWpTZ2JEGzib/cRs3kYPrCGr8dV0AFZaxde");
- a("YrRB8EZE7/+3I/zHG/EnjxQiinbgz2tf4s9pzBlPna0A084yAPsCQeF8YgRgGN+IBrdcIvRRqvkmtQOQm0ccNb3hY9jWmfULMx");
- a("Pr+5zSZ7rir+MRlPFZG5OprHbL8qMS119ArlLQh+hoWzbpP9GaYNV36Cf9/X7SW/pJ/1PidODFHJBX7ZrPVDa7/arQ4e8QGoXw");
- a("5rEoWrfL5i892KN7yYdXahhpW58VGR4uxvZCusfLoTFFUSqT24+l2JnXW73erE8p4L0lmmi+lGNuJSnPjl3v7kas9uHNxFGuEz");
- a("of3h4IzHSn8FmypBscw8XvOHGWlHbPutDpLRc6HWwnG/yPr8mvilf4kfonfQLSuenaBT8YGHEQ7V+YsP0Rpva/0tD+Rf23/8H3");
- a("RvvKH6fS9o3nvzhhOgBnIULccNnddybCMrOejqufNcmsH++MhnscKiWu/JxqIpnrofd9Fl9Mskazg2q2BKQibebe4srLBnqk1O");
- a("6yXiTWVA5EgBzsVE3GUD++WQ31L3Ig4eG6gIeaBIlYwlfTloJWhblxbrmbZxIVh1BxzHwvEvpEj/PPK6uFWtEa/PiDjzbyz1Nt");
- a("/PN8O/+80iFO0jg6lHuD66FAtIs1KEdDybkncliYxZ9qfy18IM9QPpC9iF3aA+lwei/6DuDme3sCm0TciewAcLUYnn2+BtQQSv");
- a("KLCJzYaXNFV/LaA4Nkc8AjUuA9wut6cX1x2Xs4/qIGMb509r2bpIoiF5pw2AUc1giH765mHEaYnUUAhzWJwxoG9p1/qIE96kvg");
- a("8D3n6wP7tBzYCVCIC9V1sjCVGLWQGLWQGLWQGLWQGLWQGLUQj5oY+INf711VidZbmQnWG74ArP+c2+96u7xbrXeTfjSQeinrSE");
- a("Mer8dw4GBDvSlo9bhNqtUucOS1u+ZYUS+pm8+uwR5oBNPuobDQzZICWAtoMYQWQ2gxhBYtwt6J5QVhT0HBiGuapNOQkSou24xX");
- a("SDTsndSpN5lOh+bg617nDghGVKSCV1L9HkLcF6dpBF8hitU229qXU76lvljF5mA7QQFtk38MlXRqK29MoI9e0k1rhSwBFJCynQ");
- a("HDQCwLmBzXloWpO95OXktc3Zl/5xiNBfnu4Oc4fCgQzPLkbRgZ40mAeBPSG/g6JlGEQJq4DO8sous52zPEd3z77rBjrl23gDiv");
- a("UdgRbFTyuab0mxOkA5qyTWxm0mEhrH3Ru9BMtojyNiqFEtxxmKYtbWqaNkwDyo0/zzpNt38tZA8UqnUoghcfvxT8Oy+1i1gp+F");
- a("ZhvjoxX5ofS7C8CJMHmgXx2xGYgk5MENKaouct5PlCSqdDiE+Fw1iuHXSOoIX9gpM1LGndenlGcXC4CbkoD/WMC1acyW5iKnIp");
- a("A9XOg1bPKuciZQTa6zCnli7A+wP6rk2twwxSrESKWHnc1dolBX3hY42tfwCK7V/228+7nKqfsnlY/XMT1mpXocFyYHj5REf0+s");
- a("NcL87tLsI5lD3bfAY8EBXOSI9kUBJH/9QUzVXBMUPUVdfBxt7gBycauIKJpNPQX/U2ou01gwmjP17oBOXnriYjiPTVSG9Hettg");
- a("QTLX0DvveoVJUz7Fgn+xVMekByUmeSPYOS7vu6GAauh3l/fZ0ABTQ09QQ7NsDW37p1R5mY3F97/Ag5mAXDu61oIHB+1fnxaedu");
- a("rFABPO+4bR7jpQOdSPo//EhKYUV3CPe53uL0Gl83dmfPus2MGhwkZvcrPRaCZM7Fadg7e4Si+E5yiFIyeBcGxA0lKXKQqi2WF8");
- a("pvMnfPyWtWiXuaJRkplKLswE5zAT7xnd8aBFD72s81KwTHPC45r8HRQZS+Zx6R2PDeE6yVVDZmQA0RLnuZmqD2Z+uIWm8hgSM5");
- a("/dXABWENRPMKcG81Nxxs3/+tl/6blvKSxpp7GCkYelc4LthEJNe4AfnybD74WvqScJ/ASMThqp8lXBB2FrVTJcF1BEatTFBu67");
- a("idSnYdQgUpwWSPOHytIjZ/saQGVDo7Qb7jOMfJ9ILVYRvT22WSHvER8BeZ/xW+ntOI3pLWTr+9jL+8c3tmeIEH5BDI+A/hgh3n");
- a("BCvCEG4tl07+znfd3YuE8y2gEo6ptl7Gjx90eeOS2b90GyCV+YiRF0Vw1iZGM8SuCvVvm4IpwaAKmkTMfSAfR+Xgh9g7Kv/Mll");
- a("mf78MnfVaPzNqhoK5ju1thYPqkgPlpH6Zjq36WyGWydiLv1xSDSKlMyC4AG8x9i1eGLpuaatzO/LPkCNOM+vEef5RnGebxPn+X");
- a("Zxnu8Q53nd+ZwuB1C04qocOg+zKJR0IgHQvh9A2YA+eECs24Q07/KvWYhSiQcY4vh+cbKWUvn8noG7jzx7M+DvFSEqByZQ+Our");
- a("c8VRRj/eDlbH2wmNCgu7O4GFg2fqWLhcYuF94FpHCk1QLOVK0lQln7xmosNUScs5eiWvy0rmoBJeXehqtuhqNnf13X+rq68cZu");
- a("vqPwvNXd1f2mdX80xQphKUWedYu/rX7f119YdXVSWNn6CSrcXWrl6BSsJ6X/1p9IjTAlKarZWm6UabSyDCd+ReuTMFWTldoFJI");
- a("oFJIoFJIoFJIoFKIUUms/MTnJ79xfBppP1aU6+eK22LOT/K4NP8qfqnNIn2abujTkAWi1MdOTsZ3SY5xUN6137qZzhBbZr5tM3");
- a("WNS7yf7vsc0/r+Tf/FfpqtnQrPjxzoTUGAKd1JVwlK5yJKN8igdIreqP0zK8R7q/1+oWlVd6r1b6cPHdrVpybSv2KZWxomSqDu");
- a("gWz7cgDciyhGhzGK4oGiHHxPJumB93X3hhBaPX0RclJkE6PcXA3FurXdAaeDDogYMOGp03Ub6dDAXaLy1wlfhuQDMeSF34WUZr");
- a("xFkLJUyrTGSDIu/TW5rsDF1Lo/RE1pobnINbKdK7+oSnINphspKe1grU/GuuNO3wglSJ5J2SFc32jUP8USOIzObl2fYlDyL97u");
- a("uv0Gk52xh3WDXmuFglS7mOnY+YXiPC2a33KF6obBQjnHEfc3mwYlG87o2JkL6jbfefXi81DcNM8J9UfUbrWR9kejZMx5pFO8zx");
- a("fBvA2em7R5qfygZ7tvgcUcgx/t2iwI5vOYeUWgR5uOgMIYtZ+E+9pPfKy4Byxqp+w6NiktPvJXliaGSRqI/xniiLnD90/B+ZmF");
- a("YUJUBw+VJvALvaaLROrOgUl86RWl2rVfohSS2xkfG4hy7IFsr+C6aV/ngkCOh9AUKDDRJu1JrDMZ5oyN2kVnyIn+rrcPuqbWuB");
- a("r/2iXZjsAwDKmdpRj3PpmlbUpWOazpbJ8YlcEgEYF0zNlGVp4fLK5WDz2m980Padf5B1g2VaPEcqQb1CFESO8QtEfWQ0SQw8IP");
- a("20BeRSkYLh6FENYAJwJzcH/CB5KBarVFuuPRTDFHwylB5HTIM5kaKFv/yPMImBi0FbFvFF4B9vFQ+GjtAknSKETsix8U6DTGIU");
- a("je35/SnHQA1yaW86seqzmZ4eYTephH4FlOAsrfh40Oj4MRJzwK58IUI99ia707nJxtcpTNtobm7uDMYxmRmnW07iS7ORfvqG7n");
- a("sTw+Sn6+aBfioo2QvBA8I4Aph4pQCVOCkL3/PVTyIPvPtJs2B/ZPODGsyLXqJMA93CGn+a6oevSJby94lJQ3nJmlHcMEpEl7p5");
- a("w9sHEb1V9YZBnt66MqrXZhNmz/8FoZRBW8ut9sg9a+X8JJOTb6XyC+9qZsCDuQvjYdpocXsC0a/nty5Gx6l8WAB7cY7HXth0KH");
- a("g2whmOKTKX4bxY+yx69HvKK5cd4Lgu1ouDKtKN/jrjwEVLyEGJQZX+ANUVuYpDBXwS9MaZCuFt1Fx+/CNmS/c8bkz1/srkxnJu");
- a("qAKpw1BuPiiiYeoiZSqYn8xSMryAaCFNyi25m2LQTkXDzSqNhcX90uo7qRRnWzn0N1L/DbPdqrOhWVVg0S9vQXISvFHeUrK2Tp");
- a("MNbhSSLwQzPd0NNpI2I0aBDNGa5D9s4c5H1uiXGfm/WLg7zPxa8ft7D8wpGBwVTpbKEvxsDOxuXspHak1ha6nX34B2Lcqhgr4G");
- a("jBKInQlRSS7kUtCG25HxrXQ7KXV/srt9PPo9ZSPKmxuKkzmS5vrKXlb06XCNAwslvb1tsbDRWOPN0BcKuOaNKS6D45auOvRvrK");
- a("Zo80ZjVthVoXgDw+fTOZyaLtr0FdGtzyvF8cbNfP+i9vJvtpp5tZ/yk4Isfy/a/pUETANt5isJemwf9R5ALYRRmJ1PSqAaTy5I");
- a("zk8neNo2oQOtekJcMp8EREgeWuRyUh6pDam0ZSETebglpLTOZk9Bpj+CMIASr22dgy0xqL4Gs1klzb6CzIa8IlGd5XC4KNM/NH");
- a("NgciiKlOW8P0GNnj6jdjDaQSTqv1dAItgOfpNCfRJ50AGClwf+nkPmZxDmYRrK9gN+mxwR5XL+ZHTmtwejfhWSL/xbU3uh3sH8");
- a("0F9tHlDaVRbbN0iBPs27+lM0r2s2t7oxVifbJ9KcsAmfnr++xvxnZ66gY9nSepqIvp53j+eyL0ta001JMcn4ZmJ8enoW78jXM/");
- a("SVf3k3jvG7V7nYEMfXc3rnndrnF8vAC4lfo9D9wk4/hRcWk0quP2om2Y0TJEcA3gC1NepMnzyZnifJKr9nkzn7RH3Os0lSrudU");
- a("e9j9NhL06HfDSSq6J/+ibIylDz6Z/isAcfLsYKYn/iYVj7FH+x2t1adp7Twct+HAKCDJ18qSCMbiKMgw3CaKEJdnuPHfxj5tk0");
- a("eHv4ZJyxqRejdPhCNhpofvMcpr95PvjzRG+ehz2lGAeXvouqHsqzvnnmQC+R+xrI0HO+t4Xeyy6mGpk9K7j+p+6luRLAWrgCB9");
- a("+fJOpPyeV992fjzxL1Z+aTqj+3b0JVm3Kt/VnwruxPxXgD9Pn7hdNZOvIEBvH0XXEq62nau2P3XyUuQ3gPh3F34fT5THJXiwWC");
- a("NYjjxTScM9c5Sa4cx01faJY7uEX7C7sLhUvaLi8z2+DzqRhHS3fd1uot5WGrJydF/8zPZC1krL2VcGlErKhBO+GnWdRAnfcO5f");
- a("Me819ZZBQG0ukDV2TeZPnM96kiXnb6K5pH69ouloaXX2t7CLWjFRnoi0FrDGAUJP/dfvfW25jS6CmJ97vqjQn2Oz9zvdJJW/Ux");
- a("iBTS4B1iGzxF7/5z+nZXPPp210Xi2iXZ1ly+wZep7b9P0b15HejjE3v/t3RvMvkaSrtCp3uJ3q+7tVfNoC27T7EG/sP7KKqcad");
- a("xG4UFdu+oiY0SORJCvKjdilEQPR4l+uGJvnmEz0LMlsBdCP6IpUzsAX3imPVed77kH4+6zbKEqvWbJFJiVafFMPbLFc/yUFk/O");
- a("6aGMBb9xOqD02+KZ4kRx0vj96x7MyH0TUIusRre37SRfqtAVl9F9789ZuE/THQvyl/yyPZg/yuEShX27ay9zNFmaW5wVGcdIKe");
- a("+aLMNAHPiIsOhmQc4E7xuZjHYzqQNf96ADa3IEf2oYTj8+arT1KNxbS0KFHoqk08Lh9GdK5DSGifSfqdiDyMX2FkTcQxTXQHEj");
- a("jLgNFHcj4sJ9ne93FxQRkYbp43X6d7rlO0l9W/HxYyyWvvmd4Ice2b+8BT9t6Pfj47BeuOY5VHPsSsJwR46kXMTX1Mqg3G9dT2");
- a("GS3uZ6vBXsTHcjI7AP482x394qb9/n22/f6v0Uqk2ptb6ipHW1C4oOqPT4+JMp8CdTu3OkwB/+OPoCHX8qRxr4kxnJioc/mZGB");
- a("2tFuJwfVLMW33zV1/EHb7xIQmvl+Whh6ZmYBnGBr7bdOWDg5UbdwUiTsm2DfE/y/Hs5KFdBeTFUcB2YzmTLpYPtlL8vhRG/7sm");
- a("Gl5Pd8zgTye6sl27K2GgM6FT7bM1ngKuPtD2h9XEiHDiKfF2RSu5kusbrXRTL+5owMN48nWN8PrKufPyGL7NvzQYQV7iom5LBp");
- a("Y6k/yaLsFOuRKgh7SE/+R5IbGGDaZkotlwsL/qr9sUjuiw77vviHVnTgq+MT74uXv2mgoxqvdMt42fnRdvwYNg6dAwBaKgLife");
- a("uIWIwx+8NZA3xBPwJtwJd2yG91+MG/i8UbvVfGKgVWsNXqCbj9sI/mpd04XFA/qnvMuAXd9eLar53QWK+cXtzaQvhl2JXxsuFr");
- a("WsUm/PJqhga139npb5iQW5L3Y3U7vwcL5Z+U4kn7CY/xbkt8kZunENKdEr9R120PoFajYY/eLhoVYKp2e4x2xZN7hRunDiIXeG");
- a("vV7v+mNxr2O79UrQhROdBjf1539RACL7iHz8QT2T1qj7NyLMYlXIx1RDvujBVzjozWY+NsQYHOag2dct1+jemdI188b0CnDXMR");
- a("wlyEMBchzAWYlAn9y+g37lg5PvRBRYQRAU8gUIPiOM0Fi/IWP712e0nQzmwpIS2VDlyIpEo7YkLHwCheVao/78ulI/zsRHs8lA");
- a("Rgo6crJB6mv2D5DBjUQUe/qTxkBpRIJ0drewaREulQKJF+UZx/RGC0nw0aFK+Jin/V2q/ApI14Ea2di2dp/MLuZsmkznMa5hwV");
- a("xTuCNhPKTVThsBk1lZOjQwNp1EJ5mKJcHDUoMICi0HZJ8HjPi3D5m8DCkk1/j/Vx3sXZ00/6h35ilOcCoauGx/Q/r2cpyDZ1eg");
- a("q9nefs6nqK0Cv0Ex+cMfOb/Bbgo+FuKz+mMFgpFJ9/RMVVxcEf/Zjzy/EqjV/Mi7mnP5tG5iB9NEpoC6d10yh5pyJtKhG/ySiL");
- a("X0vZiShbHDrbp6wQOFsNR/nBpIIX4IW2266WZ32/HDYw0X7eqf310AT7T4lG+3lRPV/9OplahLnW+nSwquj8eAh90lI3NvSw8S");
- a("rMsXyo+/BbkMxHYJyAhnIO34ukCJosrbZ6/kgnN024p3byhXHyAV6N70RO7LucuQBD+KUotIlXZJf+8uhQp4SE5zkfudngFVaw");
- a("2qn90yy1Gf/8Z+SHHIK2Nia/zP2mcEmj3T9FbQIHx+/lI+0YPsU6hvCRZIivAR8nZrONeT6ycHqm1jlYT8fHCE6X7JBR8CSQgE");
- a("/8392/wvHuXyOhKa2Ng9doebfK5BqkWq64mBWNlcEWz3GO2KuXR1xM8mxXr3DCu9fT69Doip/a7159+WeOPT3FfJGZJT2iDRFW");
- a("fQJ7fSA6eoFSrg81BPcq0bU4dVjX6yV4GEokb9A7qq/1ukr4wwu0W9atkD3gyjemINTnulUx+q7YYXrzUjulc11MVoeMzltXNd");
- a("1WR3CdrYrLG0Ymx+TLEe8Otoz6i2E5STUoPSHIM4D+Br3bg80xRdxCP6QI6fJK0SHTjANvh6ldTE00PA9lIKdQ/YS+d1+jU4pb");
- a("EBCe/DCgdn8qtMxrLaJvlvXTSWb0j0eExML48utkfiyx/EgnzSXxa4rqgetUZlCyPo0jYoVt+E1KRak546VS24xL9li3nm6dvB");
- a("MTFnQ2q2Q1Z/DKhgk6udW7jSaoXMqdbHMyGS7zboNISWy5Uh7wbcR342H+NkYURI0vkd2jrL5q4r/ndvsbZqBjGVc+43Sw/YSf");
- a("ybth4SLLUok7vkv5jRvnZQ0LWA41C7MLrswSWAj8KpnUvjdfwyKc2Kaljv/s7b1RlMPnp8gLMDwExhersdfVCyfrqAwJWP+k0D");
- a("5BR638qOxzaCk/XON8qMn+2+/jszBgCe7b6l0+8KZ4l284S7zLb1BC1RrXtNkR7/4NIClCW+GZUj9jivqaWj9jqvo6vn7G8eor");
- a("p35Gjv4V8niCMzxiTZX6JCfLp31wSDSqshQFZxTJLJkMSz2EZWVEFkecCuMWtrs/6WHL/Tvm1f/NiWpRmd4ja286CfbdMNrPOp");
- a("neegSO1hae5FTcKvN7+kn8nn4Szp4IC9mTHCF74lE3NUXf+T6LkR78Bmb4aC/fYFxSdpNss9SvA4zi83GIW9avq+/ox343+jJ1");
- a("uBQLmjjchq12+t4IfGUaD7zrwP0OeBvQjPtdd4xcEBxTWjc3davO6wn8HGMjuAVzC16JsYf6Ou5VmhQh4hJUoR9LAtHimtdtum");
- a("5BKJL444eL090Q2EX9tvol1A0PmDx5Q8j0ST3JLzcC45mgAuNxGwL0oYDC/Pjyd7N6E8vffePi8WvXvnDZx89+nqVtMai2Rfy2");
- a("q+3xWSI4QDJjl1DbircT+4rcU1QijwCw3FYAcjmWenj3Rx2cl6SsYuoAmWi3Fshycnyntf5sEd9hjc/SV8tLOqHZRIEE48v+xo");
- a("b140+kzcRwaiKMMISzzG7dbh2cDH/IexEp3brdY3XrZj8v8V1XuzgiWEFy5Wxo430H1USGy6h/tOpRqFCtqPj9+XiovT92+X8r");
- a("L21aNJIM/WO1XmiFVE2Ghls8tpk6FzILjNC+ObZoII01m6U9eIRQkZLfN42I3b/eQcLPxKgIQ6J3AUZisswr3LkOMcOmbQ1HBs");
- a("p9eZ0zhgJ0UP861DI3969H5lT9iy0aSHtJ9S+f+tdxkP07Y4jkZ52MgOrowe7Pdj4Wy8Pc+xW0laFORHwhTJqVJ+R6YSZLLstn");
- a("41+CVhG/pyC4Hj7tKqeWlL2lUhm4DlzJxda90zLTFZk2PKlu4MnmsXDxXCfY3a33D0At58eOfyPU3YGpUF53YEt8PDNfK1T9bb");
- a("TC3qEurDPfYyTzSF1KVFn7fK0cdLD86fg4mWHDyWTgpL/scyNe8d+K89ZXjjXHIw50QI6PuAz8Gzi7gWfkOMbO+Lzs2PP8iXZ1");
- a("dPt5/YgzE6xPde+ik1fB37McSuf0QIvQOR0KP9Os21e0gi/UYpsboBPvlYpDEbf9P57Rb/v+YLz2l8r2G1pk+4TfNl5Ktw7HLT");
- a("Y4bPef2f2PF/Rn8HKdiP80NT3BfdbOf+JrT2ACdY+qh10xdAEzOghH34Lobwj8rt1C54Cb/+RHrp4VGwrRlL7xY993Svtz2Hqb");
- a("OgcFvW/5yua+5UvGDo/sxKn5HvZEGMbfjZbi7nyDmuOOYh9/S9095TUq6N3sK0O809uxbGk7hu/MpSkbL2uHiP7mfO9bFfdSIt");
- a("cyqRlBUqDWG1qBhmwzQTaPZAbAfnmGJDB/FLLZ2m5PkdtBPuCoUA74O2zLkLP8Xm379vno/SHBfGRkTU7iRrXLz5Vi6yvTEumz");
- a("SnxT8xPLb/gZNwaNTopC9U3HJrHiJjUhafElkIbXT2FQ7aQ4457fxvOy3leG/8ksjo6SGZX2SsagEqnm0o5xxfSsjzM9b3FFTm");
- a("/7sqVtPD2pGy9rKw9jLvO96yvCnIoKMD9iHvUGB9sbfPwkMQt+yF2L4zDG7PseaqWRAcFGka6zioFXjTDpTZZhikIljX6ky4Nk");
- a("t+b63uEwT+chtUsbHa4Hmnn4ZnwudOJRP32OgFaFaTArJtnAGn6SQFQbIjFefH9A4tAghSA2/Ph4Z+LzdlWKSk98vlZocNHO/+");
- a("xcrZa46ehrrSeMOD+G33Qk1vb0yJ5mRWXgVEXOLPeLPCT0e7+G+YCoIqUnNAlSOqOJSakWtt1c3brs/+1oNyH/Z0PuQdPzWCCe");
- a("ahRAvNKYiJ5nJh08PS9U9DyB//8keX4LJP1X91X7Oc4LxvVhfsjCq0MXg9/1kqTn8p2yErqxCR4pO4trdzhLyFVx7X/yXvg6hd");
- a("246Orv4x+9jH4meiyc/xG/NLgLgsyNojJ/pjIleT9Uh3S+4otYcv3egO30ODwxycHD/gGcI+O7Bt88+q38Dfz9xiE3qS8cieeD");
- a("34dXYz7WYD4aMR9tmA/MS6DDUE3t64nY2Hwx5AGM002Z1O/nuN8VRTyg0i5MllMNqKJ/UEA/QnfOlV5Cw4xYfXyXvsRwz9Wozl");
- a("Xb+Nytibneo+V87XDQcY0ciw0sgUPfHnqF7euB+B7zhJvmu1PNt66sOJWosIRce3MH6ukLvo/W9jf/W8X8Q8bCmH8qg3fhWP23");
- a("owQOrAYOrAEONKJjbcAB4ALmQOKA/f0/2nuw/j7JFslgLjQwAsEaDuLo4EcNAExHerUf3BnfBehsf6i4NNhORrZKQmOd6qs4NN");
- a("+JSS0oLQhuLG76NMWLF5Kmz1JmhUa6ZwVHcsr4TRDAR0IT0pHgT0/HI6wbSeeWwmoxVeIPjk2inN7xjcX4PCc435EeK5IRWkbP");
- a("POylJsl1RyPkKYMYJl8p1LlQKUAaqL4A0kDU7rODNBwgDUSKDaSBBNJwKgSQmpFGIA0HrsYHSfELQ6Xzl+2lk0TlOF/Zm8XBth");
- a("LUCRsBxbARUOJsK4aNAL+zKfhmZBj5pGPR/EgylD90JcEcq/RHXH33DRBurV+fXzXP1UC+FmtevYXyVJSGzpp3eVHDwmhB3gHX");
- a("bdc66Bnl0qhxrw+dXxrsoOElj5CY83mQrjdH+pPStRS8HRbkfVT9DunjnmCqr3Ii1RWOV48b9VCZz1EmWDUPNHp7wMXP5rhpyS");
- a("5Zdejt9nTxDA/VSfEgny0esENAgho2kQyVUVoXec2BYf6G06sPEAGAh9zISGHWIeT2h9ZSRo4lRYKyd3GYIrGM6ry8j10rh7Ld");
- a("oW5Ihof8lJ8c77dDaGgluZuB8AGnwUdTtJ18WH/CewkKbCsKflUQ/LEoGCku+6G47G14f/JNatKq/YDF2Q3vSWW6XUnT/Tyvt2");
- a("os1bc3tq3qAZHPwEOOOPM+XpoRB5bq7QxHR3Avw5G3O5ACDZDUvO9dRbvz9lX/mXoFfCerSnntlaMxL2dhEDBWRcHPuCaNzF9J");
- a("h0UwL43Bqh4Dl0JOzoS9SmSq7WVa04epXhs+4z2a8dKndK9s8ihtuskCEwshF/lDhfPyC+cLvY9t+0nvY97SE6H3Mc/Q+8A2Mb");
- a("sUXwKZ5iSR6HppsJs/nU3a6H/0EqzIpEe2kr6kQ8UwCoIDqN22l3C5sBR6Ik1fYrH+Iie9tnCesQnkJMVKwKj3AEj9uZBrLWti");
- a("pKVhJgeJt/C9qUozyfp+MBHP6QtgrwTgLoQMSHT2AkPpgK5qnwxh/OnrPSFwCDRAFzlAhkO+JbiSKn3zePzPNmHbAugkpAgeAl");
- a("zc0yjenDCAI3NpM7ltT2/UzKEJFcyPpZcF88zfNv05P2pV4wekzElXT/7x/RlqS4R8Fnkl8laxRgV1flMH3UeE4NEu0DeFEeYW");
- a("MG85NG+be3qjtklSnNt44yGln+Rw3Nl3E8HKnPT4dSt/XExL66JLR/DBLOP+avQDwzm0g3TTq+a7VpL1A3jfpS1A2kufTXzByg");
- a("lZmEdRaKEs1PEBpVSVOipgAXY+kJPetWeVwpEokzPN14a+lp01H9VJt12CAiDdyT67RoMXTyVAvbTIebxOpdmas0qDVfO7qgEL");
- a("AdVwPQI4ZU2qrZrnqHKjbbyEAmU/2MNlqAou72s9q5QN1niBPZxJew5ZYrpThnwCylZekAzpH1sFINqjnKpACAu6YZ8f83oaZp");
- a("6PyBD7FKDwQegvsrEOLXmPrjK4Z1v/ujrx5XVrX6LDQlLFQFAkumBHCkj+03yFKE1iueFJoVriKuCEdzI5zE+LZEam0N06I/VG");
- a("A793vkf4De6+kLHq0HduD6qgkVLQ2MeHCcA8R8WksIVUGt0diUtpvAGLow95n9OM+VaiiLqW/NgbrXlJHA1Gi1S10R+W4uR3z1");
- a("/Ncyaky5zdbV64I3O0qtdZL88Mp+q1fb0Wmdbr50gENpI+p6NP+ENDktSXPwR4CQDUAbTFmiMIZ4VSsHGnmCBDrUgGArvJCQCW");
- a("PmqQZmCDqM8gmThg5PZFF+LrC/+tnobw0NrepIBLLzgPBem8Q2mq94n0meeRPnPGYTcJAYQnoPSk7POZ91PdA3PNq8t56k4g2j");
- a("K/XTyAsVTBHu3+p4wHsEIZdc6TRhRbtzg2tsTvVYnhMupeowTQ2Lw7Hsz93B9c2s0W/N8nSzLenCjd6FrZqx3VPf8Hvu+QXcfi");
- a("G5UG2P1AWq3baTVgdcn9tKZgPVJcEQ2+PkxFRi7jcxXMivLhq9lHZ/quM33ON30b94L9RjT2Anke9YdSkvDMrFfiE7I+RF0G4L");
- a("hU5oyMwc+voogIuApedNa+RovdWeTyfh725n2x9PfUhaJgVlF9T1+3cH9oqfUmZKc3vKH+9HsegOGCyGh/AJeOSc+R8UlPYFAr");
- a("olk+JmynIvb9V5K0AG2+bdcbxGkutIoiU4Qy7rwq7E/dSH98CadruUiMedbx2JE/Pv28aZ6zqqDmpTpKCQzUyenxlsMeBteDBr");
- a("4T5PrQH2IpmYlOx9qnoCuVXNFOdRfz4XYmSatdhUCVBxI9g0HTcy5IsuaM//77bfz7MvyWHGB9SI1/nu/Gj1WhApvPBKH92EPa");
- a("j+/CU5UMU9U0CTU4i0Xc9AXoICfh0L5Be1Yjhp3E/hzM34OpAjSl3cKV1SFsVaUEBqY6rlMLyU8mpW+NOuRCekAupIzfSVbmEL");
- a("62i36EuB8Sbe32bEge6ICSUounb3CQ+rh23dv38JdVbp88oNsiaD6qP1sE/55+6s/XkT/CKX3rp047JpF+6hPXqkH99reo6oRe");
- a("h0U/tRHKbNw/pW972QPIOY+9DxWywjrLILe++j/Qt72jGVV/NLnv/vzs6ET92bpI9Wcc9efnB6z96f6t7E/FeAP0HY3Cfoahb5");
- a("uu7dnn6EffVvEjpK/D2ipUOh2qtumGqu1UVrUNCz3bdMjLz3iZoHgd+gksOLGTBOKhGMOKth9a+QT28yX47MTCGm4yrNTmULe2");
- a("k/Yrn54J1n+kr/XfKOZHE/PT3Wtf/1itcul3TDCWPqaOVv4tOHEplXQhClDMDEQJqoZIIZh8gkEGGlJ/Cy69kMBLU9aUvlPWlB");
- a("4A+dD5gyfKhS0mpdtu6S3++0C3X5j87ha23ohxrRlC2hrbetPYBIyU0e6krUhm7CHLohQnBa81ofPaTTqv6hlB6byyzKnlkYHl");
- a("rk+9B6N2yFTMkMVg8r9rn7Jq3H9hzyS02B05XNiZvD6dLUy2eqCpII0EJO9BAAeEj/uyZ4IVI5zdXXgEmyp08+hA7V6hnWqPbb");
- a("Ff646kUFtKL1yKWTh4599ugdlGn4Hufh/bF/L68n1uLE8Y50Cr7sgkXwh/B/Cd7zz0BarJ5L/El9cU+MaXf056gPit6aSy7MVR");
- a("cIB2yxEWO0Dx1sfQzv2w6vzSc2qJ2OwdSdY/8j5Heas5b+3p9+CDkSK1ASEfaAChc8TF8Hm7EZFOEQJDhskoNxuR+0TH78UC75");
- a("RUvh0+D7V5WAL4tFmoRNrJC1yLEsOoxId/E1B27wOUgWNhr/D2F0z2KP/mxE/qI/jhmSGfJK3IybAPfQUhTWzLzch8PgpqNx4m");
- a("GpErxM3gz7GAH5/+/HFXAvn9oQuosfy/9d0/5JlOeQZQHmmWfOihFFOnv97eFpWBhy1Pevb3xVT3XpqsjIH8cwhThRzVtEVeHQ");
- a("P4NDLChGMYRd/bw0U37FFFs8P6kGaSRaUTeZSatHwdoJsVQPHtsaGFEm5hHNubatSre4OqewQJVN0OED47P1KREFaEeWwUMrNq");
- a("VoHr7vUVk7Fas3E5ID7IbYfGJLmRlCmkg7QmeLANQxY15kbEvkp9+ee6A8mrnety1OnIZH+F4w7eHmWmtvtQnbfx1KH98zYS6X");
- a("9+0RtFIEdLRcA6dYnlG/k24QdS+YNvaKOonhDqGUr1sM5QYCIWStUzaqHcvJoXyk2r1UIpzBT9+WCvvkBKUECbl8m2d0gNic8Y");
- a("GkTh8ZGNjxxtK30E6ZFwsVg5x9LK6VNCEO/7tTdmMs+UDEHPcAM3+tCv0dqFqbjICcjD+sq8QbcyrcbnRlb6wt4BkEGNCRtW7h");
- a("V6271E+d/C8PP6AXLAlEDcC5LFfuPKz3v7knew2VuVYiz/rt3VMOWUpCYTv93c8Ml/YMG2dt3Yu7YckEh50v+NHfNayJpplxzd");
- a("tz37EMCYmplIHqRNu/qz3gT6SGabAG2GTQAaOC1VHHI7DBHsLuKJyP1EKgp0aJfu5xm9lCN5ozwGwQ6kZ3HzLmEzoE0UwiidgQ");
- a("MV7Q3HoePtjsAoHbdX3gm0XTaK22wP03Bw9759lnk13NaI/QIilOyApbwKDDNXgnMeiWd73MLSauVpOJbH6CNprI+kBZu5yunP");
- a("8FIRI+3LJCQcCNZf/sVa9WYR6cnkrgTyZK/S4Ztfh/PLO8hfe4aySGJY8kAE/FMIeA179i0wosgf5fhY4d3B3A21tuLbAwxk6q");
- a("0todZ+lSEuO6hXt3bT8Uzf9lMVPVYk0GUmgahH3EFOp2sHj9uSKNQMpgqjBGSPgNrB45bmXi3HaugpPyQ5aKg+hrwgzBHgvsA3");
- a("lZ98qx8ML8tIREclMbf3F1ThpX2MQ4PF+Yz3l9XKpp08/4EG5QgDY0NgCyxHu/5pm3Ux+U/kTMY1GgQrB/RqXWJ7Ejmm8U7/Dc");
- a("Z73wge7xwx3jk03gt5HC6xWIuw3Y82ag8Ukl/EQo8OlDW9WqTPiJveOoMNtzNMFROobe2dZ/lymMP4OJyjpo9k+305cez32ez/");
- a("5ToqpqBQrnarqCeX6xnDUT+M4HrYce+ystIobetx62P3tR3iPuaplyY48kgSaG0U6eIx44WveqPsC4C3I98oYV9lhGf5LhyKg/");
- a("AkIP2+Mj48wj5/MYyW87brxVKPtmOJYiTZ02dob/WV3gDzrdGPeqMy0WbvQspz446cSbAlh5Z4ykOzPcGe8rxmWFupL2IbFldF");
- a("DRsW85UNi9G9IjYXsdKGheAZnI9TK7+1t1PnQoUzmr51L4O0Oz7yelStp8at9dMDfdSaJWu1W8aw84fQdT3COl5EhrUd29SQ2P");
- a("1RcPnaBaW968zfvlJnHP9whrV/eGwPDJHL9f40QChQ9vwwoSoRlKKGBVH4vdbtqeYQLVn/BNlZ7+FiTYaSSgGkwahUUf4Cd6Vb");
- a("lhey/1h/EP9f+pqZgNj5Z29PV+hghxf4uhzHx9qZpbgJ1paVfisgPZMuZadRa4r8TRbkj/1I6jC7ATOg9dTzWeWhqKB9H8XQNL");
- a("O8Pcvaq2MwkY4SrVfYB38OsBFtvABTjBcnyAQ/ezffQs8yWbMPWE3iH32pOv89WwvqNDTisFiz/z1c3hh65odjXfIalKYL4VzB");
- a("0NWLZFCiziYGfRbR+AIwGdhd5ZT+BUFW09McCPGxUInBSfzwrIvFn9ds95VVdv0Q5WKBBuKX8jEkdCe/+/3Ul39JZmCu9BHxQr");
- a("Lg4XiNwUEV1sF5Y74anLtvpveNLuvgVC2n8+XuwlIW3z1KDNJYGiA208HoqMaI6FMC5RDLfamdHJ1AyIjKLrIxyvvi916nMv43");
- a("/KIlNn5Rq2eO02ByDaVirGbrx0jGspA8gg2QZ2MhhRPykL6vxXl0w2EWHpLt/YxsebiEroc6b2CbL2KfxVW5gP0qxJKrbiw+oU");
- a("Jynng7zwWT8v7HWI1Xfl3zZ8ZKqPAKtnZxKGUCCIesShwIDqGq8ue5qwZynfPcLOsDTZanfA2zcrUnv3Rw+xUOLpTJYzMrk9bm");
- a("M/xmwVZG7tGEAbzhJLY6RICv+FqK/Kj53O0pJd5VYDBdii9HyMjbF/8+MonkXHkTb/0LX5Tkgtuzm/mYjMrc7gJxLtmszhtx71");
- a("tAawbBA/qWLijbyQZRYw+eR7P+kaG/hKYh+XHanwRj4FkkwTvnl+VhddOync+26FPZCOhYEVBFtSNqtTOSlNOoAFXyZaZqilvX");
- a("OyT5KxVwFodjqW9eATj40q9wi6C/mKDwo8yxLg6VMC392e1EKQKpJcEdkfSivN3V7wrfO1YTkWgqsT24DpxipTfjtxFU0MfZX3");
- a("Ma+6lPjcdClnWfJd8YIRmvaKy0b/sjTzQo65/QrE6VhgoJEcR6IHJh95SpwOujP2JtGPlRHQh60S6DoN+HZkUbiN/WQyJ8ZxlA");
- a("vqEDGZ+DG+99HMvIx1bYZvmEexwsPB+TiVwsZrdymeMeSoblY5+4/w38arPjVwJ4RtvhcQOcwxQ4TW6+aRDRSH0pyeOoiYXMQq");
- a("9rl6BSN5vICXlE99IjqWuiynNtv/ndtvz281q884N2K2dsoZuycnaDDNYd8Na5ageM3EDvnZ9Zd8DKpTT53byN96PPPXTVF+Bk");
- a("/uMpxVIwv8/GeT8rIfbnr6jQ9SgEZOTXgn/+ic06f+MEAfqZdCdAejw7+B6+g/3raBOZCHnZEaC8RzTQ1U+7cmsvve1QmFVwhg");
- a("zmSXML/yXkLFCbtJRkxAI72C4ImJY924lpeZ5kx0bwBQbpdvzwzvY4xgfN4kUsh30YDH1TZFjHP0rVpVu0MIZaaK0kWmRWYu3S");
- a("3mWIkM3yMJdgPEtpaG560jKedv8NBPYEynv8k2oYH35UDeN5PIwMk2UcP3qEQPGkMy//KHSQIttEZKbq1Tjq1Xc3yXF7ydq3sy");
- a("Xz3OKswdqfGgyZ9sQTqj92+zZL29GnDhzWuF90nkE5H5Wb/YTqW+sjqm+zYvk1tTAzhPMXO1HDGYb3R7DScQTAKsaSIrlHYquY");
- a("/NmMEf3SqtehX0gTfSqM6iwXsJ8AFsT4UafqWrz7zbQo0OnvnxM6zQTcqxHSDqPBLOv2AVofwD2RLMuhHfouDm4L7kS+eso3W0");
- a("AZbZc2yQaUh5G/+gM+//TYCI2dPyzHCxAcQxAEDl8jV/a5y4TtkAcfZo/pg5BabvD6JzyIZX92stAyQi7xujnDLbmW3fRIFgb6");
- a("sDhiWrn06zH09c8AsgcV5nt3VE0QC+MZirvtIUKFUi7PLLsnBvACbEWGMGUYLAudKQpVUtwFXGhup3hVmuEOHCkSL6XE05CoQ8");
- a("JKVTcC2sgkUvEQufIo1y8eQ+RITr8Q6dpy8jR/KVnd6FvftkObmpxIP7VHnqe1Fjhb4qMtfNqHLhOUh85rTFsHOVhFjY3B6KP6");
- a("/kqMasFdguMYFsdgN7c4PYhIRswkRrMro4DbTWxLNAJ5CDc+neEV3u12fbbUrE5+tBnT2f97j8IHlNM+4XKf4kc99gj1STdg4P");
- a("fZeu8O+f7EaC9bt9ozueStft7fOwV91/AjAHjXIBSenF3gt2HR3UeSdHntFeX4JKKLGe+uuFDcQdnfNXuqdEcgCin8ywAkTz3b");
- a("3pIenUenonoRxkmHIVv/Hr+AsCodbPWQasw0JHvSW7hbJ3MdSBUQhgChnfja7eFeDUF21r+6TARg3xwBNQI2ewasb6XUxFHgJh");
- a("Swq1rhlkXXj12Rn5K7iHPoDeN7Fh8ArFcIpXcBwZDl+JCErBOSWXJbzxSGRjLm0vLN7mAmgc9V9L2ouSKV3kOe5J5PjuobONOw");
- a("OPRL6XFguqReRqm0l/D3qUQhR2/rpYY9LzpQbQlnqVmCi97RltzA/O2rANAx2ISDLXWNHtfdrZhXFMqUOT1KG4+Ux6A1UrahuL");
- a("bLaVRknEe1E7aQ1PUusMP4wJJyhsjT4OsRz/ifASizVLN9fbdpsyz6Vbb3j2g/7xuKBvjxrNHi3eaQasfSOjfw2FW3X/eEdPtv");
- a("6MDK547lCOatc9V16mmLEYGJG4w6nF1vIlbR4HlBjNk6iHIRGTBiZ1DsUyK2LezHfPuFSax2mtb1gup0Sr3QNopbLdpqpwcNPp");
- a("pw4wxQG+LaVFzeusBJtpx4shW5QGcRz/bFD39YPLikEdiRFPwVu+PduhWaJ/llYpv9ZSIuvX31QOL3NqkPi7HWaJxj/Xqfe73Q");
- a("iX3jfHwSXZVMig56MzIEiqTnOo03MUwSt3v0xfKkcpXlEVvaHy8/nbfG6JYkno+t2FBqoYuP8FgKP5YPovNQGEid+iSy6AB5QM");
- a("i0yQ9y0ZO2ctGLKfsSyp78IGW/mGpsTb0D0fhHwd9yUPVq369RyZeruJJLt6rKP6f4DSL+bFGLf0ts0UWb+UX3CvzIvmP/Zleq");
- a("y5o7RZavPwQ82fuoKxmf4nqIqEMxjNrru23W1+znz3a0p+17UG2RlnQPpW+1pSt5FGo8cppKt79nBzTsT74PeX8q+NC0P6H6c6");
- a("n6+Q+qY1/779Sx75hW73469oW8+/k8u1+cZ4f+TjAn5qLL+YH91Z0868cgIyp0UIX5SEH4hw46L4twD4WPQnjaJphmPfYTHqY7");
- a("CfgNeVQw9cWNScxOHBQauh/R0fbIAIz7HoY3Xevay7XcQQU+QhiFz6LwtZt5Cn6J2rEbPbynl06HIaRAHgj5b6Y8B+5TvtNy0C");
- a("WD32LqF/KeT3mn3Sf6diPayL94f/U2JJxOCQsRAfQ4DmH6R+9tFH2uiD5aRrekXgp3D046b1J/k1epgb3hPjWwUwkKdZ62jO9T");
- a("9woYftxjHt+vDvCQ5VC9N73LEDz3AY2vmPuhH9DHQ7kk4ozR/DO+hPyNJwfI/Tt8yqfSbPDDmHqWZ9GdD8NViURH4E10oxoh48");
- a("Jxj2jwaap37e96ibAOw/c19H1oLpW1XFit/rbV+4RExn/w8xPvPsQU0+bcJV6ksumhUvf3gzjehMpJ98/1Gv5MdNSQsf3migHl");
- a("y7CYotWcVI7b4tH4UzGw/LhodYUrMiZsXMMjF4fLEc6ODojMxt5YvuzKCdmO6aLY6W9HK8eiXPVon+s1euTZ/aHv3SvRHhVA0S");
- a("yVLa389N4BVYN2utypH0I2PzLPt/EXyBh2vYgc9CqUA8H6k2QAVeDd048gb6ED2zgeTxtjEIHYtXIwanwD2zmpHLOGH9Qu2Doe");
- a("ucEqfoUcriYxNIZZh3JqgGDIktTFnj/FnD+kcvZVf7o5v89agIJtMfkHqfz68+JoXegod11c+Y6ig/Kn2xjPn+6QXcAJPs2Rz+");
- a("8XihRD5c1fgM6+0u6wqExMvpLv4dSGvGul+4QdOMiHGL7/y+Z2a8vGWiVBCgQH/jSbJEh5OKEsyA1oUzsvRcmCHLz8Zmj2WLz6");
- a("TAIRomXglM5tFOODj+zD4JwNsEMK82tm8POT/h2Qqe1f1tM+307z/LleUPNteZ+WsrrQhBqrLECa/BfMs7+p2O1fvZbg/JdIf0");
- a("a9RUHDJMcQMhZ+5mVf+fl1Qvf0blfdsyqWYS6obykvCnaXT3Q5XK81BtP+zD47loes2YKtUJO/biZ02mx+RTibNNX6amNwQOTc");
- a("sNkGAKpF3OlGnAdxiCC9nnMLFZJO/DmQNHODFUlvuYJoqNk63gJhTZTMoWodr/ZG46d1aS8jTdgfwJrrXxvHNF8L1Hwlsues/W");
- a("Uf+2oqa5d8Xunv9ny4vYsx/WGX/1LnvRaLLzhr+lnUBjDve5fbTm+Qfj7SfVc0uo+hgVM5jPRTkM4JO80V2Nabl152/8hWObUB");
- a("FWPZ0dwv6a9reYWITak4q6uBOqO2J545ZfsO0VKIfTzdNEOjinjNmEciMkv3Q/MnkpMa8wrUXPINnzPnUVwqxSnfNJdQ3Hcv95");
- a("p909xBcR8hLvzvrN9X447fCziKAkNVgnV+9iSen/fjp9vt37+U6L7BsmvGnVznckm5AzY3jyxkgjiUxAbIJKIjwbjDInBpWNBy");
- a("kJNrdhGveFttTzQwGQtNO1MttJcvweg9/aZ1oR1ejo64XvBucz3h3RFZwYefKwaQv1UkaA/09korjBP5qLvDTLrj2/PEotyvP+");
- a("ukmDEllDp+itOR791fQTTg6zMUaOMJtJE20G6+jGmAMiFifz+Sk74uMV4G26DOSnrX14+Ki54Kn8z8CH6dKajtGXJdJtbBkIo0");
- a("/E0PDGH7u7vp0BwBL0A0oredZtozgusAe9m70md1GkCo21qFt97RwsKgkdnKQbDTm9OotVbxBPTNe6gnyv0AtSnY2Gnph53i2O");
- a("v75y5V36vbEtXXv33hDWt6haGg1xHo194mAWFzEINT4InCVxxGjd+FoNHEWCRB0cT5Yli54e/OlxK7x+H0rZm3rQje0JWh5hqn");
- a("Lfdn5twGftORPaE9W/iverE3gf1UzazjELY54K/tyXDd6sBOO74RaB7B25evLOVmqKJGccbr+krYk46Mlv00l653WiJkP7bY2u");
- a("gC+0suLPTqaSdiVjqZ15Mk435Pcb8WcSky7laKKxdxg2TcYoo7j+Okwftu2ZKkQzz/L/RGu44zvFXf/gM/mG5hfSMqf4hRXlss");
- a("0zZ+RqkZlPqDzpu6gNKaRco+6sUWh1GO2BWSX9V1vbLfZxsOnFFqe5IXj7AOHMoZ4/EAIccwY3y1aB/j+pllXOPmctUtAdLYck");
- a("bGq3E9nr6Hh9emy+9xUs6C9SsOMMbJC6JVXhH7t7RsE8lneJftc6DWqgGv0k8kKfix5Fj6eqCryxdFxeHUN79J30M1rkVILKaw");
- a("xGIC+6o4X/YYInLFwR+67hLn78Kx+YVZlXNICL6IRY1msrtkZfmwMKtO6GvvyVM0vQSnX82z3krT/3op0fTWwrG8QnCwx/F+Uj");
- a("u0tWHWu8jl/5ZagXPrsWSIoKTsdUhTaTPreqNFzl+NhWWaYuf6oknf1kVdt5fHcSCGw12PZTDt9o+fO1h7V/bDJ+v//U3p6dXr");
- a("lq7ui2vpKr7+zt8Oun2J5zYwzAblEKj+WPBD+4Lhv7hvtsW7b/7hK/N986xT1JRfdD75e222TvlLF/N9sygkFJ7U1VAiqWh8Rr");
- a("a8epZqa4+2XjtniKtlvu3aiXoT3jujaFvb8mOv/d558Po2DTNLtbMBEhA/W6tC76W+KEJ0u3TR7XKQcbtUZwkbvwJdu32pEmaN");
- a("l16dID3kwxB5sg0+s5m/QfbHlAu5DwOYiLu+tZ5Q4+JboEd3BIuaC7MN8pbXzce0P52s5vfXc1DtVY3W+d0KhZHIcKMCRTBRfS");
- a("igVmR8/ZfVvcIQbN3qBOcHm/85MVsrvDnFIebkFQsFwZ7ikJMwuDhUQJ+aVP5QZmOFeKDfF7qT7ERww1OuIFhJzHMnQzSWv0va");
- a("ycZQ6Svi8eEwJvIw10TKMyEqKszm5tBdU/F3lU+2+PIHaO0Mk5qVfTwe16qe5vFYrQUQSDgeNRiPVfY3C9qkk+jBhnU68Zwj33");
- a("6RC9DxKDViOB6Xw7JaH5Y2rPdJ+u0ixGY0GI6hC3kqV9PSZQj3X87j8zh5MMt5WQgH133rkCWBpOLXo1CJXLqVxk2tlw221LgR");
- a("cgLfTjlR4dsgHD60A69Y8e1XFwLfxtjqk3hnlF5+NfnT/6xXvICr7CAS5iKOWBB45pEnOreNJ/YMMBEEYapX0573sn4rOpOTMQ");
- a("9qvu3rVR0YlHvZuPK4Ldi/QfHW0Oom37mh+nZ+eeSH0Wa56leo++zB+RcPWgSU/vGCSUBpmDaW1elAmwk+7w7w05Y4Ko7wNSAY");
- a("5PNEqMaQ1/LyIpi9pGbpDkfFsSS/NU1N109LMeCzXrZO18sXJBA7stt/xXMeACVjGtp1IqwR0OUI25eDuf8eYX9jEf+8skSY4a");
- a("jBjz/4aD3/PBXmn+fv5Z9XVh0gAN9SVknrqFUZpEZ5aRTDYJcHa+MATqElIYSLQze4u7YlGedQP+uCn5/N4J8JMItrX57Ay6si");
- a("szh024TVPHpe8upTEL2LU4CNs9hZOUnlT+/UvQC6lr/PyHgWuzKtewPP85sisPQ1vOa0YYEj0AZJLOZA6JtN08KI6Dyct3E2Pi");
- a("NJL+WGsilKvUGlBtXkjXLVXeOMm6ad/5V4mG0oHON6YfYY3EHoNRyPmxhwkmpgjNHCt/aaxRzkXGx5jk4Ar/AQBX6hxPvsgPvI");
- a("dVKwjiYcY0rTL+xNNFAQ6NM2VaHP2Fm0Xtfq6POoRJ+lc7GNYfy6JRwkcb8HTUOiZ5Q+JPQErW2noaA7h8lciguF1hAqXf45da");
- a("SOwoCnUcCzRsKDBFFzXbtIaFOArhGARqcoQBeXANCzDEAbJKCbocDd9TfKoiZKe/o7APVHEZmtBBpQHnwhnHpp0qvxTfm165oY");
- a("iMfZRuWs7JK6Nypgj7S4hw6+k5rwl11AoSJ9In7zd+K3Ma7yWi0pe5tEGVRb+kpaiIz+EIf9PEvnA/0aqCHt8PUYXxZRZ+3mV1");
- a("+jtbELZxpX3ZG0QEB8PFr2GnnS/QkrVIhFFhKLLCQWWUgsspBYZCGxyEK0yNRaT0wfJVGLm96j0s33F9bJkAcPtaEohKxNF6KR");
- a("VrHTRSa8e2QmpvOGNfp0viqnM3W27XYW976/VD9D2Q5AeM/sHRhIhYPRyEm1vekI5UQjRDTPMyHT0dT6mBetRPPW80haqIcBCC");
- a("01naOs9HLWY/3wIwIxdwppnVq7IMt6kYDB08BAivKsyGEon5ysoKw5B1AufsEK5afnShmMhYjwuF5oAbwW9WubP+rX/iN4jxmv");
- a("4E0Lefb7NmoK4vKQgHjvsQriDcWAuOl5K8TH6xDT/dH1oh1gO7+MOXVsGp4AOaKHzesUI147oYLuspHTFV9qFXCMUtZcxzSdOA");
- a("34Zpt1XpfIcmA/S+F0Ufg3g0XcG7tZQvEVvbEc2di1SE/kz5EZMhi3GbnSeybOx6Uk5Xev9v4W+34Zz97+sEd7hX+r1EdVgbj7");
- a("aylGDFNUo9jWVh9XDd52JkNSozhbOk0ljvB2jpOrmRl6MiKXzqMy7EZ4Daq7l6vTncvx+fIDJ2J2QwiSX6mS8KM0tkfL9mhHbd");
- a("dO3yCM5kfSdQajUDiqu8uhF1qzhnfnUwymIwoKdwml40kIqUlUWN8oPWfJgYY/xzV6dUAARWXYdQRdk+sliakHMl51tELGgrOJ");
- a("v/2cjoxNEhkfmgX8ifWLea90mUdzKnuYC9jfd8honOkpqet1EwPVgP6OLCZ2q2Uve7iXE2RnHE7d0BMyGB3q4Tu07FMJaqHCq6");
- a("OlxAdYhfFOkT5AvKuWQaeSbbFRQT8EJ5B5la+1mTkDSFfkFx8ozX0iRczIWGF9vUs7JJn1BdO0K9DxsFb4JTDO0Ad7j3WZZBnD");
- a("Dshc0h+/gWf0XuE/olmJq5S0et9SfiHhZ4PlRN4KNnPO5c1c7PHdnjnci9Ho9eO8Nn79awb5cWqpPJx/8Vssd61jV93vCfuklY");
- a("BYM0Uep4FCjKMVR8nBXSXmvd2PnGpwKQ/6B6y0+SNl2b8ZmwBHvlcLHEtpGGAHjYEar8+ccrzySmi8RnyhxiswXIiPk26AtsXP");
- a("eMRuPriOCpekBxrRA/RNjmsSd3/w9WoIj5VDiDym8eNsRYFolMrQ+HzOddgdxYmKF5Qe4BLPBlTFk/S5CVvr3QGqSUW4XjHuSa");
- a("ax9OWCUdTGsEsKYXgZKdcpQGCoubNjZEEfFdKuWkz01dVA1h64vbEmqE41uuux9XdOBdsK0CvTTro2GgWMLP8e08JhSGC+kw7N");
- a("ACHyOojR7uL3MEvarfCfoP38cwTDQj9hr9x3qhAQIwhKypuO5D/p4q8QUtbue4kNlz+73MniXf/s6GWXm9fp4ie7PaJhN8hDj4");
- a("M2wcHaF5uJfrcmE17qjGCmwjmb9E9FgGsIbU5EKyxqKfnI3SqfTqQh9ByG0LJiacn9g3BBijjmSFTrBKrlYuuw+zeJZPD6FDxy");
- a("imrWcsEPZ5L1TjfvfJ/zx80pxraQwxREbRGdsY8pPZIe6u1jHHIEVnRTjwBKTmwBh4muRtwMj3QjffgeqadTJEDR+GN3sjzwDp");
- a("OKJYaKyhBOv/U73Qar3d8+M9fKXdWwJ6+OhWZuSGpgHO3u62BIKCY1nXDcNaklMpySaVXs9LmObaQo/O8Ol7uuQZ38XIipOPj2");
- a("XIFjbIdTFSHlaFzZMLfF9kbx8T2aRYQru8XeqIGvG3BpQfmzzE250ZSMVU2pCOnBA0+nGXRMmibcXUg5BmUOg3Ht4Ps3PJCduH");
- a("+Z+sC6qYPk72Vnn+Pa9/k++L79iN9a17inwgXZCbw8XYc/aXsqnD2Lx3DG4E68qFJ2g1ryKXVOljoYZON9XjvsCespNQgfu/aj");
- a("fwL+rQ0w8m1x80XiUaxiKEl1ZNGfEyPFYVNeJbzTEplvjpcCPBRfpOLlDojI44H76EpwnOrKxWegK6V/sXblVS/bdO+Ozw3uF5");
- a("9G9IdPPolPwwifPmU3Bo02RLLLbzDU2neajUUu00EYNlsS4/Ovr14j+dev3ycVNfzPyhfxhz9SJ+o45+kF4jx9L1BsFabxcYFi");
- a("sRxrpbDBNU77SNihW5MK8AOETAMOVzOwdTrJaz9unYHpRbqRybWZ1On9V/ILhlbRTVIA/BL991NNL9Hc0tlg2fAxBKOa/5EoMG");
- a("IUeBlH8hmQ8xSa8oyWeb7NQJ5ep253sfQAPety7okfqdxdEDro6pCXnP3EIZCZPKZM6ynT3/hNnPNtNuXr2aby/YHyhaQv5mi6");
- a("626RJcNU1Y3bBHTnEnQLZLsn7TPVZ8rsp/ryVbt/wI7tym7jfGFTvgmUb4TKl4J8ICdNnPFWU8Z9W5Hxn4Ytyin7TPkeMOV7l/");
- a("I16/kQ26nlHGJSxKk1dfoxynuPKW+HttwtrgKc91RT3puQN3KVzIf3jRGcr53zXWPKN5vyeZWcMEQPgX2NDnG2bQS23WjCtqtO");
- a("o/fdx3Rsa5HYtqHA8BP4rjC+gXM7EDwEBOelb9FvWnkPr5Y1Wp0IPK5VisC92mIRWKX9EgFjIan1g8Vu3EWVehPf7UwPHPfK31");
- a("VCxEq/m3KnzXfSbtOds5NSjAcBvoIGSN7eeWcS633o54eOtczL+90yvne1E3PibJoCrDXuwYPgyeP7Xr9QdOkAF6+kTBo45p61");
- a("P8oZVjEk/MKA9Xk3pmGSuZqLZDXmXO8jV9dOcf1k1i0AkA8b6doVG1BAv8aGOf/1GxnGNurKxGedND/rsJTpWPlEkn4HbMNZko");
- a("839+7gU0+bwTVuJHZuUk2uKzBCmEMDoVu8jatsjKTraIIkQDz0DuK9XNZGh9aA1xhw/Ma8+wCfJo1R+HR4Lgq5H7FSr6oz5d2m");
- a("keal61ZMut7L2rdtvQy3G72sGOUX9wjh5/6WZCz9JuRRUytvNOrBGKXN6U5Rcw3VbH5wd628ETE5m2gMq51iDC93qjF01V2IL8");
- a("FPiIAnPFPwIMOE5uL9aA80c8TRNJ38Pxai52lvM0v7EBFdmsVr4rs7xcP1GnPzgaONoneHiQscgkqkDMsmtNz7pdVwug5wBcG6");
- a("eVHmbRMbh22Hgw95qNOBhIUiYYGR4NUQu0TELlKxYfl8WI/prhGcjgaqDRPZOVpN5JxTSP/uYX0iA3Iinz8doJa+D9w+IxzJRz");
- a("W8FGvW8ExUHC7qL02PcXOoCTO3qVruGSg8ggo7BW15UYjPqvvTGro/5da/63mBNflyAStd0zsczDCagkZUNJDF+G7wPa6tuKM3");
- a("yl8tntUOGXjOUT9/QpbIU6v5WSdB/yqlr2xTffWdDlP9flqi8huMkk6ZUNpt5BDnGP6sWbLaUTG/ZslzjsD58SEMAcI2qIIRDp");
- a("yoZ+EFcPObvACsxbQVb1PZOYgMzmgLczI1UDHJlNOn4I9Zlbh+Ao/1O58PxyeL/FtY8gvfC0vq/PJmScFn/5kDjdpF4g27TXsm");
- a("rAi37fyTFeX3OsFWfGUe/zwPJKT3uoX889Qi/nmeUNHsRLDbzHZkGDIBg6L9ghgpk5C11W4HyyfdmKHQ9KkTgaarHrDSm2H5gt");
- a("6MNtM92PMpWJEyYYpzeqbrVg9uqROjwkeq43jTwQnjFudyMiCwQPcs+RAcOyC8n0lD3WvCBZK/zLtfmvd4dhNo1KQUJo1TRypQ");
- a("kwjUH/9oBbXsNBCXvcniNPMl6vaXNcqaFlJNnyQbZxMfLLpB7FVPLqbkRlnyrdi04yjtEZm2QKO0F/W04ZRWL9LQkTatfSfrkr");
- a("eRTP4Pb5Do8X6IHvNYXzXCxP88AR04ydaBh/JorE0D8MxG1J8t236um89JzTLtPQ1pQ0TaWqI+2olwEEkNh94kdPcNND88xkxE");
- a("KcBQY+OnRmjviz9fQ+NcJmHH9gXMuKxgXwQV3IwKWBlXzm3LdxgJdm8BaobThXebJBLebv0ZPcwarnvYu/+W6J2UtWbpNmwXpw");
- a("gXNunYsAzH/4Tj4iRSyJIsUiJrcBJBg2gByiICZTfvPcacVKYJk6W8Sp9u6CWwMpnIjjdx6ENZzhho+IocJm63rPqLLagavABZ");
- a("b6O2PZ254fowZnyO9EojfY22fACnr5Hpl32C9PlG+iotBRgK0FfJ9Lk7kI4bS9w5uO6SWm1oxUC6smZHzisP22ZEVFKCrW7pO1");
- a("KOtI882lukDih0B8d/iRXTJkxUeoR94g0XKjT97ALWZt16gck+sYfa9minPiRdD3xTHLw+hyalOHiWuzhYlakP++vfiqVQ3DAr");
- a("W8u9DVvVz8V5f+x3VFQftmHAvojPOGMXuF5ImQDeNohVWB60w1g83cMVVCmgMdoHv7c+Hlx2CnZAYa+XWYqCkIYEIQ0JQhoShD");
- a("QkCGkIhDSxvReQpas/jPatr56a81tdDRV+LAw11J8j6KvNBT/SYJ5egCd2nW/a6vFRPXqtFvmvFXKvqBOBRq0SASbqi1ckvj8L");
- a("eZd7Y68B7QbpV1uBOv7HPYx2moXRsUTarI9Y7UDb7ZjkbfZHLJaDzGVu/g8vRKNASClq3CS2U166wArbA0DXd8qfC3Gy3fz0sE");
- a("2cSjkrPIbWtiUHZ5RKDgBVwwO0NdgrOJYPfYC5ivzasDvT6eQzO948MCl1C5ziMagM7rv/LiwY1JGMkHyz0Tb/slcIddyNWDHi");
- a("Tpw32ZkYf41AvHzMWYPeP06NK88S3gZKpfn6e1TIgN2EWukGYO2r1Ndn+/LqWSLdFHaTPfi7DNQadL+BWgMQBGpB2AhZnlVZvv");
- a("qDkWU7guIkj/7O8EXGGHrteWRPCqJanIqksM4fNtDU81N6LFiaaUs49ULm75oZynq49pzSZJPN5G6dO6zeRGSEeBdJ3X+nAfU0");
- a("BfVUBHnN+GR2nzIAfTJmXL1r0bzK9thE8/QLWAHa4BjnX9xZvRWwGvIZ2gooVkfAN2P3vB/hQ6CpeJ94hWTXtK9OQL7mNxEU7/");
- a("coJqaM15OiEXZ7JA/0Sv/cj0p7JG/dksgeibSfaTC3NLMDaPXMb2esgpdaMQTKNxXgqo6sSAqU2HmqbK+uNjrSVfc8r49RDNi2");
- a("Z8SMA7cZPj8A1Z0trwKsXfVUf09tzyGo9WjUyrwAo85FTrEEperQBvQ3ciFlzzBl7zayL5EPCzL7J4/0ChmPqwcpCj5jEhDx5L");
- a("utx5+Hc+Sb0O8w5GarnWr47fITl9RJ7uLcOjkROx7ue/zNYy/H2joHvEcthINEDMgeWJrVRoJ3vHg+xRKvD4MfyKNeF6wZgtwx");
- a("Q7VQDhWDcdlqMezM38ModF2J7HLOYgY3cr4u1LGJxYcQrttEt9vzeIqGiruxkkyBmEflUdM2hWubIR86DK6R/Ugt90LHKj1a7g");
- a("0WFffmtVd/JnlO74ihNA2jVf5/uRy/R/8gx2/I8sT4e7BjOGFrvDH82CHGcErMGHZbx5CH7cinMWx1yJEIKbVtD9PZQh/Dlfvj");
- a("jGHXn3ppFBC5lSJ/2lO7z1l5/DRlRxN5fnysl9x5skxn2TvlOIj4MZ5Bf2lv3j5FT15LgJqJ5Lk6lLyWRT61nX9esYipqrGlA2");
- a("lDQ48hgng4jlJ0OCZonE59yz2CTTQBRTJ8+YXpFS7kcFMO4X9ZZppI/TzwtBCvDO7B0ls1DSvx9y8xq2UA5rbHyDsep2RN93cZ");
- a("6hZHsR79dKycL40kskp2s6mmc7mmQIlxnJOOn6T8qOSRaEKE8A8piiI4jkHp5Dt0ivCypAi/gS8yaRYL48THOZvIrM0+KXuCPr");
- a("Rrpe5P2h9anFNStws8KbY3e30SLnBTC+DD3lv3deX5MfZUiZQWtST5Q1nSslEY4853qgvW8hiNQxjwXZEDcH8hooZwVn9wQU9k");
- a("ahjevatftNrNcsBuViPLlqbmoKAvr8NVdzlatVk5Ndu/2OkaXmQy/wQH9wyowzeefMMP4cuUSGrSTvJNjOKyUa7zZLKU+Qhkd9");
- a("3dVB5CSjnOJLddSixy2nxhBmNAhY/vEhDozcZVaiEltSKjc3rEJe1gAFxYsRAtZcfUWtEp08ORE8rDXC5aHTmGyyHsmC6KbNRs");
- a("piyykWf5GxXp5cv8yFcT5owMIVkKJUvq0uBHWSlRJGA64nLkKesniOvD/kV5ELqn/CeOJYx0p02eknLG5k6Jk9u0njlzbIn0OC");
- a("XE+ywWMS7rQglbmwQskoU6hEUMWzn1gv2/toex/1mzflKLU626h44ke1YN1n34sEkHaw/j2g97/0f2MC5Hm9qMpt7/wB6G/uUw");
- a("jF8MNYxfdHfo2kn3PNu/7Qvze+gwwrZzB5vwII6/zJ99g8++MCe+vuxfK/v0lxl/P2D+H5FMQxXRG3zL2Ggh+H5qsGcofdR79z");
- a("Mzzaz5zfDsbmV5Ihf83etj5eP9c5huve/C53ut1vvSbpHHF+ypvx7E8tpZFL4aYaUfbCfLfMtWpvxi35edKNzn+/L2gbZEla7t");
- a("sqb27d9dqL+z2q52+0DdR3KqsIevTFLw2NgVuu3+7AeyfDr+RobSJ9OmUweanXUkkHdpAxXYICFKpZIHUB5x3xFMG8G1twqUyP");
- a("Io+b1rOPYyWdZFZZtQln1lo+zJVJZL9W8fe62bSteitG/NzAtvyX3/9atO8u3+0tf0z8FU1aGoylgFqv2d5vaHUw0FVIMOwPa9");
- a("dgDs5/NXb+xXvtniFhKTxCUfOQGNicNF8bkgVJtvEbpnhxA4QwmcZ7HpddG7pl7kWlXkfVK+eVAVkfNWTUUCpiJnqCLrqMjVso");
- a("iaeT+KRLx6/mEq/2zKf4bMP0SQmXGUOZPKIoD3uwHcEs/XALlwtmFxWMSsE/mz6a2pPAl/q6unUq28Ca5NI0m0CrkR2Rd81zX0");
- a("tazXURONVh6FQBQqFdWHUvlkKv9rlHe9yKYPXuvB1bgQWWiDrjwSASzr6uoxlDeF8s5CXtGB9cgqujaCEk5OM7q2pceEPzb4q2");
- a("+YbEDu6AfyyMUS2hsUtG+lGtAOJxBOk0DeoID8c6oO5DgDyFGUEE5V428GMoG/6W5sEMbbYtWhxlR6VVW/TCVaYKDhZHyqmq34");
- a("f30s/ifQN9cdUquVoHP230AvC1427OmvdxYFO4M7a3vGXZ/cE0l2Pdy8+AgvG0XnJreuFsZ/eH5RksvsH1fZIlD0SUQJf1Z2lX");
- a("GFkHZ7pPoA7ZYDVN2zjFXCqnl60wjO8Sk0vZV9T+9oyjqEsu5K1gnzlbC+ARcTI4UvGUWcDT/XOf3Y71h7CFX4KCqUwKWFqqEQ");
- a("8a2ofihXf32Gbs1jp53891d/Bs8/1686L2p/+keufbS9dobfVr9d/6NB4Yddv5dtXVnoYyhtYtSFWb2NbFSQvtRixLKFoioZuO");
- a("0qpwisrNSTPtcDu/TA83ogxSkDozmQrNeTWsHWjqYjrWL2cRF+N6Z3hS6XeF9R+J+EyBncX+mvnCKm8fDiwjlkLZ3Bms1Hj66R");
- a("+ENp7X+PSSulNPSS035AWr2RlElJHzlknUti68ylxEZZbizSIJ+kp2VT2iMyLQtpLGskE7Mo8Vbl08RjSc8hpP1lubEnrQJMvL");
- a("Q4XXC72FawvPCCUKVJR9IO5Uj6vD1KC3fqaNJvqtXP3Ovkmfuxw5Wfua3CDgbb6FLr0X4+kQYoyPlNuvan46JRtiKhziV9+3uK");
- a("XEo0IbifzslsXGJSc3HZel9e89JhMGjBFiiEvybD+oSzuQQZMEIbZsD4xKSvipxlY6mIs4XNYWQGhqpjOB9Lq1dZDKTbzs/1MT");
- a("cpZx8n6P7pT1Xaa/QTTkR4Doq+/J/uX5WPxtiH+EHhwpEZwIXjaqz3r98f1rd9CM1iH6LFk+P8X/im/Aptas1/+0/uXzXk/mUQ");
- a("G4O4Fl2VNODoR/u9byXilzmciew5XHsqnQe7E9pzUPNXJP2F9j9/iyzzR5feHnqaUab33f8j+4+Hkv3HZ/sdbwyrD1wkn7E0Co");
- a("KNcPilD0RnAQZiMONNI9/QzNnn2V3A2PXdjrg6gb1F8/6zYm7/tiU6dPtVs8Xo+LmJl65ijqUHzEM8l3GU7xqmox0x7xzdQkNF");
- a("Y7sSnTJJqbsK+wJRK2209GfWVf+P/lwg+lPKTUSutPVnydV99YctyH+oPYawrUeSR59v7VNifrKVSsbzh/T446gS7oDV9Md/34");
- a("Y8+oP92+MLtgt7GfjhkerQ0W/aFKDfH8DIpvEKC8Pfc7Wo0u8y3pOD3u38rd4Us0HfYrUg3frT6EXKJHhf/c9U/bfo//7qoO0J");
- a("LfuM9g39WezugLG1a8EsCckqMTUJ9Hevrv132kODXGrNLaqx6XpjD1sbi79/x6BRm/TCdQ7tzQ/hERMPhd862f+W+b7A8uK4ps");
- a("AHImWcdAqLerP+bpqQLnofqeQLcWOYvtrwZd+/7f5IfWw75jyD7ij/PM21e6NQymstZBeorYWlBE1knMooJ5w9kwRnZwKzgoWl");
- a("8f2VUmSb4d91nqNijnD7N5JcjQMNt2SSvcz7mR2fx97/mBPewCxl5uMX5kqG+cwF5M9LPmPMnsfGlsnrtr4v5cb3D058UDxf78");
- a("O0WPW9Mg19L/WG34Fwbt/rSTnw75ThTIt6Vwe7osfLegoHhP8C3HqNj6/ER7dS6pJabHElOjSdfOboruNPVUts7myJ0B1chr1e");
- a("/VQp+HE1av/RNQfzIFoi9Blrve2m9/h2o4TyxNSkzbufDKS3s383IbUNmYLPr9eR7KcK3WPGt4OkFGwyElK3jsKhuZuDpXNE6K");
- a("1gaalZ3y5sHW+rCp0BKcabq/DMCXo3i1Ap9CDDZmkdCsMhowoyQtPQKx1TAK0zzJWsBCFo3ih6L/qd0FrEeU/ZEchCwr6SqCGS");
- a("oeODXukwoxb02NA15r7jxLiR/QySlrsXRAy/Yhoy9VrUNiTnBy7pSq7EzOsVpcuK5h2wVGRGq26JPfw+zYELew3ssZxXQE3F2s");
- a("wKnVX6Z9GFP2cx+1mQC2myOjJ891nUQ45I4b1QpGeECufkF5YGBnA1AdgYbUsqDxeFZs5Rb+dKNE6USa0tnOMMS+ZMiVRnScVv");
- a("zU1ZsF8vE7YfiM8AYugFo5b3GL7/hTxKPe9g7I95VL6Y9LJNRhafrSp7ffEyx02f1096pyNxuuaw75+sxND7WmJ+lVxT0hhvDy");
- a("mvbn1I+mOrmk9O4aTQTpH0AhZm/198lMbqGwn6QPvfKvYNmCnj/aGUdoO0kQwlOW8nPzWG/32EbeSuXRhVszrQUf3hFutyUVzS");
- a("aQ10B4JFdxMZ1B4p642aOmovby2wGAUoTpJXzW6MBVVZ/fW/+nMWq6jXvDdxoEabzoGGJVTlKk5tWEThu0R4IYWzl3F4AYXHij");
- a("CDsEjkyabwL0S4vRfh+ns43EbhShEmezOaR+RZReEJf+LwGsqTLeIbKTwWYQW9zX5UDf+UaLpVNZMsYb38rRG/rCIhg4tUcKEK");
- a("LlDBHBXMVkF0Rg+2qSC6wkG9J6fhbonoNSpHowyGDQ//ruWrRgm6Z9HZ0am9j12nz6JdBmo8rrprkT2s45j2GKsN1nkAmlBKud");
- a("4NSn2tJOFerppThTUFNDdNlPdqqBj0bzIHpZI0m+TQJEVmRGc/ReTDZzv78NnuIDhWOCBRP9p165cZSqJ+lMMkUa/guxWC+tis");
- a("apZuh100iZSZlKpdxSntkUFiI5uAMISY872bA4NPJya/q+5WVK9P/jhIjYo9oHQyaLeOH+m/JPtIPMLy2O7BVUcvtOJnVOhuhG");
- a("3rQe043J/pTtfN6AD6VZE9RdpQp982+k1yLa+n3yHi4t31Af4Y+yaJCOrWudK1e1ey7YpGRFZkkXhxqGRzdG4jKwhJaVLtX7Rd");
- a("C3xT1Rlv0geFFlKBQgGBIoWCPGx9QSlqAw2mkkyePgBxs1rYg+mwUaYtrYRuDbEY3XROh7KNaTenq9NhcQotdW15iEXYrOKjzt");
- a("etAa3KpOJo9v++c27uzU2atJvj96O55/Wd73Xe53zfjTiP6vwZYGBSwBG3UsQmHlssO2Xcp18g7oci7jkZtxC2duEDhM0RXvkw");
- a("T0kHksYkOkllYGpcJRKAJZ3aXSV/FtYxR3nOJ3m36pcE4n76ZvAHv4rMJtXWSOepYfwblO1K2BXC2ZutnqWbESLdy2RanX+MJl");
- a("+hzg1ZX1hWiETYuLfVl1jOs9XdMco1ksBYqu5FLXeVtwkV2IyAiu/Zq40qwEJOXMsq0GBQAVnop9ezCtRHUwFg4axnFvyyu3cW");
- a("gP6hTL9D7nfxXds1uDXC5I+UlWdQMpJ8igNJ/jTdS0Yf/TZXvUl9gGyAa+NK59prOEquBWw+XgHgYzuvCSQ6tzi80o6fvGUMUy");
- a("/ApfJFKgqurRwqDbjk23yWzU4Kucu3x5WqZKRBOx1IV+2qVcAhTeWL+EThn4wbqnF556qIXH60JBqXJ6yOyWWJz9Je8PkUN5jl");
- a("t655Ty2JDpedy49Rk3JfDUuMqs/ZZxnkKSrd8ZjWLuTwNwFMYSmP1ktZHRBvRQG9mst48WSw+btMAiLwI6A9s5aPYlWF356mU/");
- a("ifpWmimLYyoiiG3xRNFA+sii0KqXwbqPev4dFQp2rVNEqGa9sGH6BSVm4oaWkxeHvAYmwr1Ur+E720lUolE0n+dI2FFAnm7bqN");
- a("tx8q7V4UX4WAjm3ftejYtsqise3ktRHZ9lZxNLZdv7IvbFtezdSfb4lCva/zlSEG2sVc6eCTQDVcieTs6Smk+jM0Dsh4smdQxq");
- a("ghhB8B6kdlIaxYPUTHisVDNFZ0XhORFa/eEI0Vy1bEZgXS16q6UDgkhi7sGcy/ZP/gpTjV/sGb2uKyCV4QlUNrwuwfwMOqxkMx");
- a("o3rwOZ7Q0DdmPXHIiVCtCCWLUJ0IpSHE3C40cJvhLAqBo/To4XT16OF0I+QfLg03Bm0x3DKNuyuKQxLhYa3nhNdmIIEOO/enam");
- a("K44eqIYlj4nWhiePma2GIACnGqGMo/jzZ25aeGjt03PxKcN7IObaYt5JAR3ClyiPede8nOZxL5+90iZpbPCiWg8kgyUdJ0mfRL");
- a("TuKCao68vZbNmzjaKWaX+dbZlqpbOGYehZJdJXKeym+oJQuu4Ha2jb4ZoEyV7JvOqfxNJo2vKxZtYqwEJHHH+UaKvYU/hU25Fy");
- a("kRjWYnQmrWfE63bE5P0YT25PKIQnvg+mhCy7g6ttDUBHL5DQcMIekFscasW/mKm26+//ZAsP6urYL1y42paxOQWixTHeZgqmZb");
- a("jaVh67ZsnolU1txJ+NB4aMePkU2fDOQcdgEomV9AvYE4XvFxn9W1jPggCnv46XrnQXHPmUVAuWCrGHykL1mM2Zi+kd5cHF7OB0");
- a("5cEMrIOsPenSdTpNSDsNLKQyjWeadksfAIzbldmZFqemEaalqDIv6Fvqhg5yOPzMCIMEFqDM30UzCYZoIH5yAM6igaj8sk/bTM");
- a("Qp8XpDoT+hFaAV4zLiJcji2Tb+8YgVDLBXcma5o5bGlEzfz3qmiauXFZbM2UmInzlhP46H2M8w8QXJYMmR3QKlX3AI4vgRBlng");
- a("LkwfGLAW1e+ttWMXfxzTZ0uUdN3JDNFg7qEJLv3NRNDu0hW9lV2qRM12/dj/4HH7zl7eMOSFL05gm5K+j+BDH6VvL5AHD/Eq9o");
- a("JWeBMgY7OwTspQArrMxhF8jOaWJfsobgKIGfBqh01ZEkTU7fXxxRTstWRpPTP5bElpOR05tQkU9jEE07r0Q3pSf++g8l8c3gAv");
- a("yxTEsKHQ8sD3Bvj7f9kXj62f2cmoFUv4VJKi7IoggGL37yuTDuF8rV+75EjRPfWRSRE1esiMaJg4v7pLGZKomr/DHWr7MSQ2n2");
- a("bxU93v1V7/dIsseGkL0/mKGjR5qu73JvyIqTEdpkbQtDmMOxrsHBqVhzgsaC1VdGZMHl10Zjwb5FsVmw5X7ULThwx3tR2+ysBO");
- a("O8lPfk3n+A+2T6xjxgKOO8rRUh2ox+bRPsorPv9RezaKwSRT67TlhP+SCeh+BWMUDTD98boB7BHpxZ7DbOLL643zCz2HsGzfnE");
- a("XaL9PRQyfbCr0wd32PThR/rpwxrqbQ3Th5QB0aYPJ5JCpg/jVorpwzgJSCIIfhnnD/aQ+YNdPzD+3awJfJ0zosCvujqawNu/1a");
- a("/5w+tZ/Z0/XGAWWEeeA6Src4BUczhx3YAdHO79Jv1wb3KGDfcvsz+82OP91gnoe991/lfj/R+c/RnvD04ke+HO2OP9Uuf/fbz/");
- a("NuHid/Q+3nvjNE2auDCiJqUuj6ZJWx39G+8PfRCt7+Ch48BH/JKiUrMMH/t86JYY5z8bYqRX6tLdndeQu8/tKEP/KNzZchu1Sy");
- a("38kSE84HZ9OKMzOzM0/JEh/PgEfTitc83K0HD2qtDwRwjr6Vc+vCuKf0k+n+pQznfzqsm7ygz7XuXsYX0PTKAjqhV7hko89ubC");
- a("DZSGvR88UELHmF/uIbPH/tUlvqLiZrwLJYcQhxXcioSBwMaOBIB+/wW0xELvdHNJYd4nrgm4ki0TDrzAryTMyejo6Q30E0vRNr");
- a("J8Jda8f92avMZWU5pl8ietsdaUZQUK806VPyouzKUX9YS/CAy/bzJkTdT7Jp4jutvj+7nEmyhB4zI648Yb2Tgka93vuFNpN1w4");
- a("CffPVRLr/QbqLPQ0h1V7k6wWzthQ8+O6mh+WNRvfQBjlYb1avWni9DTbPK+wPcXLAdWdj+HvR1QZrDPhXqFqjm59oRmVtHCMbP");
- a("QQGO6+m8oW2HJPSLsQVvffTJadA6yW3ybdOrFg85euEQR4Mq8wh8GphL2mzBwo2El5Ck3d1TiIbjHZ8o7zeaTghPV6TURSP627");
- a("yEIBeqC3b0IPlBd83amdj+eyS/OqfeIBMo7K5Qvl27rteW87LI5mh8XZxP7xQM14+9QvcHuyfAC/+/QPwffGAbyvg7ekr3raQv");
- a("xzCi7l7cdxyTH/AOWPZ/eQW8F2eZcG98OKPK1csRMMKfIcRsXCj4Yzr9FpcRx2WpxtucecVa9uXORfUOLbYirYcn7B7ObSmbCC");
- a("1G51+79jdX89+taE6fBljpi3gzFJBZWfIA5ZXcN5H6rRZHfvxf8mU1HeG/wOFr8bLXyUddeH9Hdql3+8c2qrs6ohSBq+Q0gDUR");
- a("H6v0D6YCsJdy+QLx9QL7kClAfUy6KqJyE1/wcFfcxP/NlnV32LWN1fmcqTcxo6t5F+QQ1snv1W92lcqr+bL4sd81lBH9SmNKuo");
- a("+Jhl56pRAbef2LE+1f31OHrs7s9EyHJfA3TTb8fdwbHIV1k2KjDTNcyGA6uLbHmvWx5tAGSaA2VrQHLcXw9aP9ztPysSMBRMRX");
- a("5b3huWe+4U8yfJKKP/i0JDe438fh/vTRT4N+wKXgkPtt+qgCtxD/EInZ7swFZg7bSmsGZNwFb1vuXuDdSGXtTscVB74vsV6OZQ");
- a("pqj4ZfvU/eS5wf2uBQ2ivBFZtqQmVzvSAvbGTxKoKR30X0x36nFo1WFBh7kCWSw7h5vVq3iDeLaG42ZvPGOwT8mw9XBhXHVztX");
- a("AnkhQIfYjv8IIg7zpDb2K4/2mwX/AGuSHaxS+IsmkvwtNc4i3vLsGbyvm6F+zX8XX+FO06//xD2h6r5RI09yuWqnusf5N7rO0n");
- a("0Aa7wg0FaO8DPUfQUTpqUItA4DHsI5R46QVz1asWW5P2sM5433BetPutTFvk53R/QUFPu7sbmnxaPP0oTac/q/jtB/kB7fwn/q");
- a("hvGTRrPEbyE17WyE8jE7sLlxhtMb0OX1rsLTMWrO59GqyX8gErsNgIq+Y4zSyh77FgHT+gwdpAsJ4Jg2U9rhp4eTzcLkak8a9e");
- a("6SmQ/uf+xR81lSio/Pha/q7m8w+RwaccLTBIxmjfr0fY9+sR9v16hH2/HmHfj0MHQj3XuXJ0JvzqxG8V1S8/qXr9Eai8eX+wwG");
- a("AwRHq462De8O11zVpgZ0Wqup7wp6jrCmTlS3b5yxsqUghUZVlaYJLrQ3wi0ta+MceBq0LSgKsDP9RYmQdpoA4RPoyksuWutkKv");
- a("fbIk3BCYUR8J4EP8WqtfmjvJsmkYhDh9kmXz14PwO770SrogcHu8uChwXoL4/Yh+kyybr04S4XsSxQWChQPxiydLgSQRbjGJcA");
- a("XiO58fRPrMBpzY/m4KXzpaJO/ptfJ0rdhhTg6ag/LpzEH9LVMIHp2Salj0c7uIYohKwlVQ8hYURBAPbAVZN0eqw1uIuaA3cjWr");
- a("w6vxhlSzjXZSi+GK6vmzZB0poo4r+1zH6fFhdWSH1JFH+8Le5Ts8bafaLUVtnuU77MVshLdOUyIyPLi8luIqZ88onQYp1z6fg7");
- a("pY7rVLucf2OZDMYCH5Gy8Df+idtB1ZyVMXZ1ebzW1cAt9sArJO7j1WLkaZ+IG8pg7KbcygcHq9vYltSDit+ZfraXUuQxWtBrHV");
- a("D+yn2GaFV3N0gb6aD2nSf6NebMv6W8eRcWF13BJSxybUUWKUm207KqjTzN9MbSMDaHgfoknr9OJwae28BGzx0Btl4kuqxHl7Mu");
- a("O8IGg611OaNSUCAWmFcH6Dm51qDRnZ+EAN3HPmzwXomQBN3IiXkBcki62uEYiPDh3XSOJCwdMNTeVfk3VVtOejigNi71WPf8cA");
- a("xv9y3Iigk/he0bfusgBjKKFKwNV66HcQ9HVJoQRUATSfDSE+KnjgnxwGf5Ye/mjAx95xSjj+mQL/+X3iP/SEYT88SQd79xzg/n");
- a("RiKO77UBMfKSb2gfnJetgVetg3zGG8lyaG4b02qX98j1f58k6WDr6ZcP9XQijugyXubyX0ne8a/D16+L/JY/x/lqDiH6ykNpHx");
- a("t/e5ggS1gtX6Cqx5IOBCSYDKG0eiIOBsxMfkjxH8nok68P+czfgfiVfxD7pZVxIY/3P0MHlLQjWInT0PmDWbRC9olqX+HKGUZa");
- a("eu1I+olE+WSpKlymLV9QSVWiFLDVLbvyh1UXgpOceqEgc29K0CWkKjw1kS0EAJ6Ex8OCDLczpAjqVhgAYu1o0BFgno2fgYdBxZ");
- a("hFL3yVIpstRGUersiKWUgllkm4zyD5X5vyXyj++tFj4f959HCjNYFhkjioyJXMWJMqNNdOrvoVgwPFw6jLx/5NtqywfxwIAEsm");
- a("nrrAWoelIh0acq1y4AZXebhJ4mymp3QC3CqrTWp4lBnIejCSP1ltbr2D4gjfpWgNLmXSvNjP9YPTDWb1511qbxPhtyB0fKc0WB");
- a("cRFaxGwqMZ5KTAeuwfGb9tCj5WbqwYeN07GDYauFpQSVhCEjwkhIIRI2Sq8JvFswkPxj2d0I0VyG1hSN75rFWuPIP+15p29Pss");
- a("PVT9lbajXlA5ANDuN8VNt2XW3b08Nq23Yp5D0M7ZcisFb5+1IsXZIv6gm4y3cExClP6ESsGKN8XpulZgfbS/5VnOtKijJO1vDY");
- a("TCeoVq1etSefdGn4JOBpVOt3xgb343Bw/7hEnfkvD4K7AeBK5FoAaRz3LREnjXh28G1sdXGw9SdfyNPUDXzpBmslYcKXf7BWEi");
- a("Z8DQY5xXqa7b7lHBPmz9wbagMui+rHC2n2Vv9gNVhLQTXQSrtWiGjTIvLtSsUQsgMPISfY84cnl06ykWFymWNR9y42S1JFz49l");
- a("dWvbTH7zM6bqdoM9HCN+tAvfUlBLszsu2VKwQ/e9nb4xHE+hXwm5AGxS6yUz95VlZqzEEp6Z5M+DwzuFDCbQb3ec+N0uf6fgN6");
- a("QcrBmaA4ppGEwqNFl2Nunx1JvNs4ZUNNM1XwIpUFFBLuUJkwTu3jAFB9MSe1QpjQPRg0COxGGDZ9524669Vp/yHT0k9LzhpXeo");
- a("0MVbs97ez6DPS80yoj+D3NQnZBH2zQW/MvG3Sok/VZfEIJIJanR+zClNFRz4PXUKBsIFn0Lzu5ZqfMoIybKLlzvWT4I6VFwwRS");
- a("PfM69WT3eoEAw8MNij/VZOtP16tDendA4jvbsQbpYqJ9ChkESP3te1+4eVaH7q1MpDMuUvaqhIow5iS2FaYG7e7Qlzc249bMyx");
- a("caQWA7p5vCk6Ie06Gjl2rqVqlkmrUjTkIVrOa9r8o3ShWh1utUbc2iuS7PnXKJHq33dcX3/NUhPobdNl68LxhBhGEszoBcWeJz");
- a("7oEZuSBr8RtHF2uf8mX8Qyzm4afTzWKf5VEdORSBsm3jjYcPDnaTC4y3mPMmToMmSEoz/oOLWFELl0euNCJNgOBnSU/1CNwdWa");
- a("DvzSfk0wCkE9aNaeRWJQUMi/uNiXHFLAMd1ApQRnpbAdedvEcIw2+LG/zltFrLKyF79BGDLRNtiM51Wt2Korx9aj7BwblTYSTK");
- a("/7cdLL9/dnaCre9/019p/RI/xn8M+LlZylppZ/+DIUWYqweV722nJwOP0gRXhds/XO70FhwZaC+GrbSZAKfZgmbOokSgs6MwbK");
- a("j5OD5McsTOI6t46gfahCTxd2X9dnIt41ht9lnwmUJuHvsI2Z1heHCZsRI0p8wXjLxmTri5Y4raxl07/jJNyH5Rbut+DPzlL1gc");
- a("BtW628XVI0HYMsjSTEWnbbwrfEaCXNB1yLBlhZbkUtDbzT8EuIvfNrROhgJPYGY0Uc3pk0CDhJztx9KpBlBGSnuA8hU2UZ3rkN");
- a("COOvJxGWJehhz80TSb1YBmKbg9IVz0VaLO90PIglhP+6Ej2NN02LQWNyCI3wtwOt8Y8CDAFYTH2FXcKprPb3UzR7dcosfQPgRD");
- a("BN76V++1zyUt9CVznODEfFApTSiYVqUfFrW5wn+ZTDWNRGRW9CUZQMWLZWoOSamtvNOK07B7z6/oFBWgl7cTMMOZsDpla3koO3");
- a("1s0mLS24p4NMZKunWV+shXxeiVEPc/0m+6l2TxPOrhFffARn1ziY4Umjm0xYf33asvUOfFCk+2OTxn/lFqwoq45Z7u4ExjjxKa");
- a("YTn7JLd3OLBi4qvV/lEb2vSJbhhRSIp6M/65ZlaYHqZckBK85MrXknKw6APrXQS3l6Jln5jEmjAJgK7MdSWf9Iwv21EFEpbnAw");
- a("rECOpYoVN5xLhGDefsvWN0OTa6ymLWDwHNtJy+ZGGsd/4Sg+UHRKtRhUk77KbsIPK6qyaCCqhFIK9qgd0MfnEyL87SxuKUI7lJ");
- a("xQGoCiSu/R2cwk4v/Uw0FWDQJZjuImx9S9YD0x7CxmmFro0dl6Jrm/DpRmqkmbQ+C5O03NMPidA30OJ93zD3+Cz/2JCcZ6hofo");
- a("FnOs9IOQOMkNVzwXKB3u7jG5srUclXNmuDIkDuDOanLd/d0paOr1Z5EG/UOnPedfjOhfIxrzBqN2SRnuQUuBgQqD5iomgdjBsH");
- a("gVuXERof1IQAMPIrWEaa4xCKEnMJTKRyn/OaRlY2ldFzHPSOQxApVIvkL3vf6axv3cN9BXb5vcv776xGwwORDaV187uZ99dS0B");
- a("eb6ffXXT2Eh99VvnGfrq43PB3u+E9NW7JvWvrx44m/rqsXL+Gd5f/xjpeg1Ff63vvme4snTBDeaZruFqI7oMI8uW5SerF5n9E/");
- a("V5TDidV/OMUfOYfJG78ocuDo4Cz+CRDjoss5enC+7uhI2pvFkn5w8Ru6UWOksp5nT6qplnIlMs91OYwbC77qdIBMU1FNR3Th/N");
- a("1zqnZxIidU7OmfrOSe2YskngSUA2Qr86bVZPb4hilMks4pZnlmXkQc0pauo7Bwu7DU8SlqYg7lsfQXykjvonNBkqp7Gk807xdk");
- a("llGyb5DFeyzT9STRgKfg7VEtS2dVxtW/fItnUFt62/G9qWdWKveucQAhB6R/ahIfTOw4bypolR25WEgXYFAMsJgA8AZGwv7Sn3");
- a("VWpKG0ZHakr3TTc0pV/noSldBj7pcFp3Tp9p2nshsvpCGoprVITmdC7vyUSe8Tx1QVDXW1K0Gc+pXB6M0EwwekGeT6T0TZ4WyN");
- a("PyX8vzRxP6THvzBRHkmTuh7/KsuqAf8qzNiCTPveca5Hl4Vrg8t2X2mabPz++bPFdc0Ls8386V8izNUGU5LUc/5/CP1vpFbQcQ");
- a("ox9KWd2fxvtX8j06QwtXx/AZ/LyjAJ1uXOlM+rLsXGTW9U7nnRupd/IAYR8Bt7oDporHOq8j69qaLg2TgBI8bapCjdY6CIu+gw");
- a("Bv+6lTY8f3mf/rcyPo1Fvj+q5Tubn90KllIyLp1A+nGHSq/KJwnSoa12eaHskx6tQMy8+bXKMjqFU8sEc9kfXqJ+eF6dWRGQa9");
- a("Ch9jMPgF9Wq+1Kuo+vNpdiT9KcrV68/uSBXhCt/GUZuPlabLMrQ/sYlPV0Gub/MxSxUdLPH6HnGlI2CxYg7+r6bLJo/RRRk6M1");
- a("X55PByTrZmp0pon3IruN75myQeE5HKz5g0TLR8CynfHcF8wjRVVZt4oTV5Lr/Qag+dPHju7xBPtiiXBkoOxvszAXAq4ac1XQ3i");
- a("0XwNolZdNHh3ZPK54muJkiEFprkWy09bEzWrJEpcqJ9PVFMjqqkLraYewRCkGgRSFSJ3q8CizoAFb7CfRMPks2UBf50o0RYKv9");
- a("0APypdvyGIJkCMwPch+f3n+xKC93SCAZ4Ro3ZRwZPwDx4DPzPB+w7BQ/5LRP46I7h6HQM0fp43JyY/d5DaxSeo/ByLEmHo9k9P");
- a("lowj+gHcF8IyydEX8vqrd+ZxRH84PKPIGfx1eTH5+eexdF4cL/g5Q+SvMwq4XoB7ajYnN+jqisHPZQT9GbPKz5dn96r/eIcqoR");
- a("srj6r/Z5P+S/h6CdUJmP/GTnmv+nDZ7Jj68HOC/4WJ4asANOiPSOhGjCX8d2bFhH8hwf9Zb/Av1eAj5JvVf/4cHQP4F5h65c/c");
- a("kBoOXdxf+ZYS/CNxqnyfjAIg8RYkRmn7916s19UGQ228z56E2vxrkdd2cTRWJCaJ5MhtYmrseh4ZTX07Hfx0w7Z76ZzexsoJoQ");
- a("vqobphcyHgqLbZrleiHtSyr1X+EZvu3hcrDae3hvc3D8qjgCO2nBPy7Kw7wSXfByQ+b9YdtRUUbNmAVekFuBOuvqP4R1mJo+YG");
- a("eS+9CHZPHUim7DiHLzhp3ZWJ4mQh3I5zh0kXYSOr4+SZALmXsiNDi5Y+RWlBwnzsxE4OWH6LeZTVct/fbh2AuxN5H1Y8Dtptm0");
- a("+Ujg/iVzocky79TOl1zFJ8hdUKn1Ks1R6LGO/jt9KFX+/yHJwZzabpGhUWXqYcZJa0kZzaKWd/pJ2JGO57s81CWZ4MP3UTkIRI");
- a("QF77UGW73r9BQTXuibcQUHoHM5mmjpd+Do6Y2v0TcBYh+Fgw58J8V5K9JiHfn0pvYSrn5se5Ps5tMPg2CD3fpe3AZ9CdGw8rtf");
- a("vvB9xNCezvi/xjsTlo4OwZbXeDqQnMWuNherh/Bok82RnPrcyPK51OFJR9RjK9xQQ7t/cG2NcdLWPOcmDTXPhsSIElSLb3362R");
- a("YMQfjenZbDPee6h3RBuVox+ekeRE848B/x140QJXeyQKAS59DnoiBzk2w6sIuefympXehAEFe1VALLHEPbDPixAFZRLHanQhRj");
- a("NRb3zvBvkXevbhdl6OvXifswa7wUBTs+4oxW30NzE0hr1i6CTec+0nsNobguJXi0xtUpf0dnsIV2UlQOLX8lz6r0+b6HKU0olF");
- a("CncPldHtJw9um2yG/8G3zmgo6fBBeh2lf5/T3ZfcgUCcK1O9479qLHunXo4f6WfWk3gNsnDFv+CKE+0c5soN/qQuxpdRmuH45V");
- a("D9X7+p4Wc8T0eeVMrTwnm8gz+dhMBDlxJDmugghfZ+W2wnA/jntp00AaWXkQM3bE7avak4ck7fzUEbggl7g+9CwcqrvjLFwULg");
- a("EmR5WJ/Fg567/GRc6VQkbOIEJxISb8cnO/xN2I+E7yIkXkmYscZgl4W72H/UXyGX/OtOWu65WbwhgivExOPdmkc43wjmqQc/wv");
- a("kF1QfwGQBIrShZ3Qyg/0hTAPnnc038BAPFP8syx0kF/xI8AD/eQYyyBUdvVBpjythDiEB8C8WvRzyw/StHwUfT8CZU9SRCQrPS");
- a("WJLrxEjXrR0kR5FXJYFdeKxXffo2pY85JvTpnKwQfXp2FNP+5CidPsVlhepT10SDPhnqp/zKgTd6rb9jIun7G6L+5yeG1H90JN");
- a("f/8khd/Q9ODK2/Okb9lQR/oaF+4/0P5LuG8g2jfFI5ae/OdhJC9dhOQqbd55iBS+pe5bKxcXHQt8T170JoQ6nUi/lSuctmwgkd");
- a("l1X9bXeRfp9AUXIOSPqtfHs+2X3uqngP8NVrJ+Q3b05QZXafE1SZprmy1zgXQDVxc3ut196bAUm2brCMKmpJOMx1dyeu/4joR5");
- a("zivStk3OHySPvBUAz4n0KbiH7K59bn0/7lNjT1Ot5U7bNsvhFx9Xq6JT4vTSDFvfCwPe8L14CC50x+a4mP8HoHnGufQPXhTKmq");
- a("oSz7eaZF+O9N3E2livcXeS9spYJJVDDZBw++HQU5gYJq4xCl2UNXJ0oOvL11Y+ybhHt29J5sCt3/akU+MptyF37VgaizlJj8Cb");
- a("vB2xvM+QjnLB2k/J0T4v2LlTtPh2a5U81yw2mRZaYy5UxolmvULJYzIguMLl+gVuzFr2ZcXa+v6ZnoY9jd4JqrIj+eCtdfl8I6");
- a("7GlzeJo0f8NwIawOfpnSCnpIf+WJF32IPRMypOgiRDeavLggu9ee11g2EE9DE/Em0x+PZ5v0unOqo1gWWZRJZon5fe0zJn+K4n");
- a("j3DHoz2jYqqH5bnQdnBwKQFr34Y1davfsLeGpQH/zhQbiGN9WCNITIAYj1Ljw2pk3EQ9LrcSD9siSokf7Rl3xrXQG8en9qHel9");
- a("+aC++ytjPG2elxyeV/BYLQa2zuKDQWzvTQzDNu8Ly5Vv45Uz5mlNmKexIZkb0EFJHxlXMx1h3spi0/N29v/Ibw/uvkpu41aUwP");
- a("/1hMjcvisCt43vc7O/Sf4ydpK7QezyE3rl7jBwt+hwh8pg0+tnAv3mr9eaFsXf46EBfZhfRiWFwazZHQg6yBiTLceF+wyzycj+");
- a("FXj96kqXrgK6gm5+uoRv6644YYIfdEsL5fJdKU+G3vnUFEfN3Ub79dISsfAvRrnxI0CUWoX36zmUl7IZ/f50C78/ipYu/P5UwO");
- a("WPsuIKEESxhqE8nB4F9HTRrTSqVfguUhisSpTCvosU0FSm0tQRQhN3YU5FpUfR09Mh6VEEPV2CHoWyGenpEvR0aOmCnj89DXq2");
- a("FAl6lFj0SH9MffanVRvqjwmZQI5nXpr46vLM48JYAMMxMVIuqcPat2z8DNqS3Zg6Y9ZXCJ2Fk5+KVOEqKznOPwiwxbfBbVaB4E");
- a("NemCOn6H6c/lRH9NsNfpzC18Nea4aH9iG8RcML0YDUOV9mCs/5RuGHpGJYkkT0N5MQw79ROdqZqx39Rwfe9ytyUSqdBstW56hZ");
- a("1+1AezoHsPDLnt1O08nEBGwOYe3xxnETt0Jayo3DvpTw3hXeSvECQ+kZHfbamD1KLJjCU7wubcn7/vmGnOxf04EYJ8U4KcY7gv");
- a("ul7x5V+6VAj+obCXR5QZcXdHnXyQFWv3/ELNKTW+T5FxF5SbyByLmjiKL2SF0PkCWazwVN+AQn2mCPiajMGK1y3eCsnQq3UcAY");
- a("Nu53iI5PXylrq2VTIz5n0GfpEj6tLKfw7K+QVPWY9h4/XkycuybzToLOxZ1Sk0tsjW+O+5T+Fpj+yj/mPZ13q+/vzaLss+FlF6");
- a("tlA6Jsj38F6tOVqQwvM1Yt0yPKBPyTZRk5uXeEl+mkS+nqdo42/va5vy4N6a+pT7XWK2f4/PLQaWEwDi3a0EXPE91wflgXDbhR");
- a("++hjf0Sb3lkYuY+W7VltwHuSuQHXJ/OiLWIDXlOTsMTdYG7qTT++IX50Cn7s/uob58eBJ8CPx+b3iR+WgcyP5IHR+dHUx/ai1/");
- a("2TE8P06t6ZkXU/ZOew0NNwuIM/w+cj6K0OF3qaHJ79uPN9+L28JsuV7ZgmJWOapLz/yhkxJeoOpbioGJLaC9/Zl7FNqG6REAs+");
- a("BmJs0x3jRwAKSjbZD39dmNdkRYViTqaU9lJfPXUOvfqPXd1z5puYb516VptvPTE2+nyr//q6IUxfoak3YjyQmipdKsE63jc1zx");
- a("r5e+js5wVGnQ1vvwNE+x1g1Nfe+L11TIz1RCuvyRuDLHcW76OZOQYT9weoJH0btttCh8HDHXLMHDpBjJmagtdNYwUPWcrSsDke");
- a("pnGcFMkmnSjSO4xHzvNePhP0IztfiE+OlWH25IAk4QaEoZBFpsaiw1/RDPit9wnLT0+ZVFZ42kKaTxxWzEb9j95+5VhyYWZY+z");
- a("18rmH86cWf/Adow9iPPtyR12q5stFe3Oow7fNPk/svQNpsbVSSbdWmIizpHXn7bksu3GJGEHcdhU0qMyJvf03yQcITDbKBH3N2");
- a("gpRWkFKY14AG2YAKimpSi/xZ4hzJ02az7EyzNv4zGb8FJpuprcTmYbAAz6Df1LO4/ulo7fWp099Ie738aa29fj0qSns16Ht2Eu");
- a("t7ZlKf9D29cpxJ1PdRdpT9mVj2pcLnnzOyAVi54WOcTHrexZEH7QzoDy8EaZ85PYqyDmcJ0oPXetVB5LWxjT9FpqdurKTn1Pz+");
- a("0xORFjyQcA0GqujQln51JuC/xge3yLI9zxsr2zNqlBr/DvjIU9GviESlch+dVQkx/pzSr+xk4/zkqRicAUtCPbDlRCBcEB27/T");
- a("17dvj8L9swl4v8ftVrNuz9KyYcjPkvFPux/Kah1brl7IEO71B8ObyjnRR2DDLNr05NkcnVqwaarJgGoYlVvIwK/qf5z0uG8YS4");
- a("Xb2dKLoH7j+Vc3FmIIpuag06v6umT+VmJPFgU9kuqxehN2UI9/SwAvizCeuEwh8EoTxIRW88BFmFDE4FYgDKCxucoo9Nd/4GOF");
- a("41J9LYZFzPaE6XB+udLqOMl8lt+B7h6GXSljG+Xsa1FmzYI/f1cWTrgSm1HzRleLqhD03skNOf5nN6jju96+Ic2L4duARaWXXC");
- a("ddwdsJS9QsepQ+hUfWDQbXPktU/E8a8cDHN1A3HspgLNdn5vefAMLSLhffBm9qLfouJfAPxxWurApqsblqg2zlJL3I4SMB7Xna");
- a("6dTZGjeiWQYHRnsQ43G4P8aINXGO/VqTgPg1P8CW2uqwmqazCSScCKFVB9Ko926Hh3DfjlHyr0WY27EXGyIBr3xSiKa6W3v6s4");
- a("8OVN/HJ9XJzp8lSx56ugPeLXZZi5RezfmTc5ryo3mYmSZrvqwd97FdBuWE9ol5Z4Ex/A19QFqUrPAdS7EUQMV4lYhRjlI/yBbF");
- a("V22REEH1NV2hTwQeXJv9f2CAhzZDeaHy/m/OeCwS3DNQZPjAeDH4k3Mjj1UeLTdf2iD5KuMjF9VLOl6o/Ip+L/wn7gPxIIs4nh");
- a("Ep+Sgm81sQKJ/M5WCuHR78o7pz8junbx65BpiMNVXne3+dZpIKFQR8K3zWTv32wkoegR6IhaxVyq/xf4w8xj4V7LtcL0NYH/AQ");
- a("LuBakmA82x5Hl/nCrP0qUsy/dvYVkucP8w1cT8L1ExeGgf65JrrBJHdf2Vu6LbgjQ/sZZpltKqoUGPZdU0TCP0dhMI/dxkJPTb");
- a("24yyCutP0NTovLjHxAe6g7yDpx/DXKDNP4DuD+HTOxtrFE+3mOKl5p4WE6TM3P3iIwsfjUpOrpyMWD1HrY3HE6y5R63u9y2wgc");
- a("sdjf9s4G/12pLzE3ffjDPOBPQFPupsFAtIR0+DN1P55WmuN/FpqfqFuH9SekWweB7eZcnyG6l8ZlGNM9mbfgO+lW2tWCY15190");
- a("EyUMsHrK0/wWAfuZVobtai7x0c/8Xew5xukkS+t/o4zWFlsqsRrn2TcT6rZkpwflHkY524T3r6hxvJfh8HysrES4yGNjm+4exd");
- a("D1af6Pj9CFqREt89NYKa9qpV6hDa7lPPOTfZofY7395mR7C2uQUjRZO3nU0nEwlSZH/DRyflcHoxI5DTJf5PGS94cdfdofLtX2");
- a("h6Vtaih+R1aP6gEimSck93SdCYTuDF8mxrrZYTvDUfeFf/Ewxrj1Fxj3hY3z4TblkU8N8+Hw/WKH9N+v2iyMvW/885B9Yx9t2o");
- a("LYLyb2sOMjB5YSRCzX/8NGnki3MTRwQakhhNheG4p+I3vE3ofAi5LzDXvE/6s8N0SSZ9pEvTwBxpumvPCJUaQFQnB5YSKNvtff");
- a("9EvQ8UiuQaYGeR468X+Q54MR5TnxHCFPSSiJlVF4eI9BpM+fkCJdHCZSq+DInDCRlkSX6XMPghf35RhlatTvDmX38cj82JFVJ+");
- a("wVtAlDBe38Iy23dkhjAyn2Gr6ArtTjAaX8xsybAd/0JcSKusUtnMS3B9PVT2LG/GT8QrlJaz7TLkP/rksyYRWri6jXy/Vq2Ov7");
- a("q0pyYzoI0lA+BqM12yvafU0QQcWLPIeEDWGn52DlJXOvBgyy5ZI4rFuMMYO9gzPeozEG10b8U+01Y4ci5M9Ejs9OBUehkneCo1");
- a("AxPpEVwxAGvSGgC903+mVMye8tB9cPzuUFobg5uIfniVjkiAy3UIYnkMFaPwdoiMhjlYh8AJEOstdVhoCHAwAx+Po2ej8xjl3H");
- a("X1/keavIOwQXQAF4QVaPHvBIArwExYDSb1NNErKJYuci1uldkCyiPqGoqbKys6iysxHoJA0WNaZvpvmmViMArggCrKMCftywCe");
- a("Kxe2IIHvdQhv35jEd+sNiPKfbZfFHpr+5E4HEE/JMF+AuC+RZTvrtlvlLKV4EAcqn8DKS/vRyIavWNpxIrZIl5VMKJQFVg42JY");
- a("MAhUfVlWJJcZBbTOIEh4EO8d/pKE5guFdpgApEpoJ+9AIIBlUF5PRRPGWmD6dApJ/g3kfJxy/hOJNAXaTzn/joAPKse3ZPVXap");
- a("+X6xyyP+Bpc36/IcNRM/incHt3uWVnqslR3Agz564RWtIPkLSwJsHURGVOjytrMVz4Yf3mKzbqep/NJpeRrY/SITP2k3oP4G8/");
- a("fN9Neitgiut8CTjh+136pqU12aeQvidGO9grpz1ZXA0ecpoazEud9yEE/7IE2my5OxUhTGlLbya4t/E50I/V52tl6kcFfwyEyz");
- a("f+WG7ZXKUmVasf/yHuusOjKoL4vcu95JIQLpBEo4LGDoKaKGpE0BwkkkBi7/WzECsWSLAFOIloHkf07FhQbFiwYCGCSkzRJEiL");
- a("IIrYAgK+4yxBWgrh/M3s3r13zxyI+un9cW9md3a2zc622V1vCLg/BDwYAh4JATTe8j/JOg5lvvJWYNOAAS4YC9gj4AWlgEsE3O");
- a("sWwNcKeD3RXCLg+YADZ4u6O/JWwCMEXAv6wEkCPpfcjxawRvDBAp5B8N6y3glOFPCn4Omjtc29QmPdd79EuX3ZxuUWOD681YSD");
- a("bZlhK1s2r0Xow5HqULi7KNzEdg7nBnU6NM6kzWGNk7o2rHF6ASymsRlb3/5OU+K9HpJDtGwpZxb70VNdSEGtfrTFjNSi/1fp1R");
- a("ui9Yc+sV9bClNo6pNY5WPmfQZnkLJA02nZF2irmZnSUzyszAoetk/y9muMmtVfxxoZX70BGZ+7jTqUhsB+8DyzxPBcQJ7ztrKn");
- a("dlk6Jg/tPHmg3kLPeFAuJZ4QDO27ljaL7iGafc36riBbcK1cb8mo9f5reqoVWZ6JJYJXkO05WFKbF75+vshYUjOMurTV6OyY+e");
- a("0YlPHIhA4ipNlvkqugaxBnwAU6wkCrnwE6seZl3BPeBIY1VFK0Lw64mQ3kJ8iy5QKsQRlVjjHKKH4Nnf/gMqot0lqKpqwrUYtw");
- a("X5ivUFtLiLMAxupOyKv+2wOywDZwd4rceZE7L3LnRe4M+0UI2ZaFbNK5BH0esCrIM7BlZ5DiUM+41Yi85Cu6f2ILe3s6FVtDTj");
- a("qRJN1ikFxHkr1lM5OMkSTgCZEll1HgCWxQJ2N9CWtUe7cjrFVYDXlG00gVjBSYK8YD1F+kfXLEazjbybkSzmYmcj6krzyUjXz5");
- a("EQqn3kiYNx19uHkqJO0XZYx9l1/NSWvEh36BVLn+Ms5JWn/LKaT96RmM0p/N712waqZKzrRJ60aPzbjGVms+lKSnVnccWAN98A");
- a("B453kdnvK1MSiSW4F5U32YadF7IUnDWhRa8NNHviFFN3uX/Fmo7l7L7Dc6DlwOhplgmOt1hDm2/sAcPwBJjb75dYOt8TP4Z4QV");
- a("l54NUmilWDKVDKhsXSpDdk/fNnvX9KvyMI+kQyDU+R7iBaBvRRANTIYScWlvfetrzCK+EQRyVA1fo2Yt+m4Wgls8LfXJTVm+GH");
- a("E7Py/WWuoCrnsRNB6vvdUY01nUZCR/1MIhc0wxRLdPtO3h+xZLta9gQlcEHqEl+1xtrdaOgXEREvrWmyiVemz5Dsa9OnTBDEcy");
- a("34EVpk5lYiotxbu1rzmEXs60PuhJmj1SNhUkJpAIB1o2OGeNHGCP2uXuhFyfz62o54GRW1yzth0iiH292KlwCtgrVvFBW/NqfN");
- a("T935auXd/3N0HaOC4K5z8rmLWNxj4NitZK73VuUzAZKqtrs5VmCpXLjLdu7OIdJqJJmk40lYW1sD9CfDzkCziJx864svc508Vw");
- a("0thIH9k2mz9a979++KfpLURayssm7wiWZpmSeyont6gN88Knng4Geah9ECi13Ad3/P306vrO77t2995G+D7FrG94HFyv8MN+V2");
- a("/lMqujJGUj1+z4ABwbc5F4/Mo748pwH/3r8GrAFvEWWErNp37qg8RkSMT62SwRo30NNBzAdG4Lz+USQMAJU0WGdTGsfPmpIGSz");
- a("XI8pb4sZl4W8Y3YYdGMh73chYNx+4YzuKuQcw/sls4394pig9U0Mq7xVtiG4Hog4r2Odz4qJ7IIWMa3Vxf17rYxhasvvPnNhaY");
- a("uygqzv5f5EYUM2bhwbkevGGFVbHYrrgB18opJg2iUEkf4zoqcA0xpoUkVhsiPDBDojwgg6fS6ClQd7lEGcikPxinud1Pwn5sdR");
- a("sW5vx3KmYN1GrPPQQLMMvg9b+DKRfmk4OZmKDHOEEeZySxgm0vtzWuJc00hP0m7c0VTtffl+DgSoOFWlt2mS6nbS3d98f7Fklx");
- a("xmh8o8LVlvwbEjJn2fSTNMpOs7zKTp+lyQUlSDKar9KapxHFUshz99B4XvZwr/UkT4DL00FFUuk/Y3kd4ZQdpPHxkizeok0kNN");
- a("pKczKcNoFpumB2nbIrG4kd8cV64NpIOQwEKMl7pobkcJ3XdeV1A+yU3NXbK6en2XKdZM8QDgDwikb/y2O/pBEfTZgn4Z0X/A6S");
- a("2i5pVqSusL7eZsOfVx38hsXdRB2drPRHp7uzlb+yJbFaJcj2bSPibSogjS3x6nOlCoYgZSxbgov6vbydFOjkeRY09y/JQdY5jr");
- a("1+3EdR8T1+1tZq5PMFdHmGsPYnAPM4jjpt6Pm5Voq17RVr2irXq5rcrmb+7/X0bmaathySjwciK8+b2tJl6sQCd+M8gyl7uq6n");
- a("KnFjoOwxefwwOFpBcrmnKzm8b2z6tocnuwgVxRF3qPzVOn5FEI12w1uQjjqezm2wLQSZ46u6ejx7hkCzMfOcbn3YP3uu5ZWPqa");
- a("ZYBljEfTOMH6zlldWI9poPsHMb4o1urnH8H6Er70Aq26+hfFNn8kn4cPOTXBqVF9G//xDhug2QTZCHoJEKvb6bN48JQZsskoxl");
- a("bAwZp6N/wxAA1CtWrq7UDYF6PFBC1tDFCf6/1F+keQZn5/yDP0ErjZSmL1V1E14T2DyP5y/+1R+x/jPMwi83tPCCWazeZOCLx5");
- a("HBuUk6LQe3nDVtJyCw9CbA7aEIFZ1nwbdT79nucdqokDqEvlffmrmml0VHx32Zk7k2x0Iw+7MZ5gw92Buh0op7iskzd7Q2Ok77");
- a("bJYRGNMo3zMVb5Kp4ZbXxJfUs+L9yqlb+ivORgnJYzxBrgUy9i6wXZ1NS3YbgM6BBNfV9A/TR1gYAGamo9IBJgfCjgIPc8D++P");
- a("ot4Z14fN7QpWqK+zf9KCdvh5ZlJe1P6/ilWDPpgE9QUMLm+S9xrh3YFqxHmuoW6EjB2XCDkZKZIOtyPJbWxK+dBBAJSxCY3qdH");
- a("jayZMyNg+AJcPh+WKBjc8fOxR5/hjHlhH/d3AOTTfuXqHY2F+/7wVIex2cqkUofda6aOVpka8v5fw9DUDU+TvLm/l8Chu5LfVO");
- a("yLTM2nnpZnx6kVZLtmQPVis2Mm8JpsV9rtB+GqwKxu9XoG0izxLh2cpnVn5qZn9okDHPdAmLDimkM5ZLIZWO4dPS/Qohm0Whd/");
- a("vYjpyCQKlfjyBaB8u0fj8kmcy8SEDlKZ1OUnDGYRdDHi357W4+UYj9XuOgt7Y41zsmE4meN4MEoQQG/ho94Km1423nXG2jSMJJ");
- a("SELhVa0F5b/a9UkgRB5OoLWDcYDL224v3TdXu/GQjCI2hJKbvhW8rN7g008X9HH6vfy+eKHW2t3MotC8TS3P3y+XZxTpfCLeuq");
- a("wZl+LWagsr+87AkuwIbx9vXvzqYt+UmrEtuTRPlM9CxuV5C3YUfO6XL0YCzQGqw4vqIq0XajEkeypgnTYRrFJ2tmG50oyAhq3/");
- a("MZSzo2DaT9+qH6maU4xLJ7yJIc6zm8H5y+ewtJMgXjTrWAHRlNpxd/yXgpa+50XnP4r4P2bi/6SZv+jPUACCPcvgPs1SBsPsUG");
- a("b9IOTy5EJBWPR+W6bAoEDUe8rMsOgZvVS3/Ocv+6v8H1gmbQBEFHOetUZh8A+/JABe0PAEhlJ2RzfB5G+X4U0xHx+VBYdH2jlc");
- a("roblCjALxRx8xhqse3pTTIufiRKTVd70d5Am84qT1X9sN/67bS9jzoreXkTdmJ9XDbWUn5YYLeUbwPqszmDU/k0t4LO3qn2xQt");
- a("iHAushsKQuxmIFdrnAbAJ7W2AdixiL2cnYFoEdJ7BfBXaNwHSBaQJbK7APBfatwJYI7EuB/QBMxlcfeR66BjpQ92wQmxx7R25y");
- a("9F9DoeoD2eFlK2+sltvNcn36hcai5os1CLlMhOQl3aTX5sLlyBjeKoMN113p81NAujn/JV+oFnOs5mjGe9HrRcpi6YYcXuTPBf");
- a("9u34+429+Cj/8T186gGf/Cgq+z4I5vgpH+VnxVJL7la8Zl+g6D3YGu0ND9Wz/f3fOSKOlnBrNEnBBkbCYw/aktoDpsK/42bSP6");
- a("7Uz/6c9Msf8wI1fW97Af2gjyvvTXVkNh0h7cxCWdkAOuW3FlJeCJbsD7LO0ieDLBSQKeRbAi4NcInrKB4LSTf2cWL6+FTL/DLN");
- a("IGCKcXyelZwXU6hahfwiFKOth7JXl7RIjrdrDTsHVwGiOc7hVOl9Ps4iLB5CqCJ4KJ3F637Cf42nm9YTp/Fszkz9xX2nm9YQ7v");
- a("+nw2NS+zsHJGDSMp7obhThv+4vHu5PCEvIrhofcuK6cQReGJq8ZnNEyZBxC7pTAWn0vg/IVC4vyz7Xx3LmzxT1KvPw2mR5JW6Y");
- a("Z2EtO6PXclYHCfN3iUc0JsQXkgOfBoUeXwZLerangCMjwaTKY67O6KnHj31OFOfJ3wyomH10XwclXDz1V9dmL/5toWUH2S76pu");
- a("ElenrmgpODgGjcQ9NSd+CJ5zjUN0uKrwgIFyb4++LkV8J+Hr36BQesBteGJ5jQMxJSKmMxIhRM1FHFMydCucE9yeGxIUymP/Vd");
- a("QCa9cmw8S/QLMVuKpzEtkirAPmQGtj4Jpf22aH82KiW7ERtTUarJDG1F50z/wD4xSa2OGUJe4RvEbc0SXi1yPiPyMcvxKK326K");
- a("f+MexL++0BT/tM02I/6fbKb4axQZPxhWpjUXipIu152h+B3m/DtM8WOVyCFWiTheDCBX6PR+hYjXoeCyZLzNbIr3ZnO8ekS8F4");
- a("TjdYTidZrz/RfiVU3xlsXJOAvK65P9A/jZDdEwvKJheEXD8HLDMLUmqc+N5rSIVyn3gUhBNiugvMN4rqu6hx1/6o1AsAl3KH14");
- a("M+IG9Fcgu64mP5YNzQesUfAZYs+vxKt2oUZhJkgAgWcIbvh0VvS9DGyKfbhNircI4Q+NHn39v1W/CQaE4n35hXs2X+HHdXEcSy");
- a("9DQGOPke3AkvJxfYL+MDyQsSGA5X3bWFfroPswBwBGDVaot8CvQdXwj89D4vMUPkGxSOtVgyqVyhlOXqt1ggcn+sIviDOAOVh8");
- a("oLFMbUsGrCgzqH9GABk4rQ4wB4wLBcwIBbzNFDBGnQ9ChH2ewqqd+Kdxi0fdBEjhcPmwRnRVqbWcmrSRI2nen1rHXm/Ai5a7jW");
- a("vTyndCiSwlS1i246A7vmiuNTU3G7PhpcQCtT4LX0hirJDEirTxwBHDW/jgpQpXVdpojivpe1w+UOHo5apKOocd1O/gMDXtfBXO");
- a("qU5wShsiCKdASvUM2IIgbH/htPx7zNscDyK2bGJbgwI/GsAQdeLhlISDI5IA1s+D3tvD90FwEirpXLDy5Z+40/XASWIc5xmqII");
- a("BtQjLDK5GMSa5pX6GXbVBfARL0qM/ho4DPYHyRiof5k7SYEpyaPDjVWZaOHE5wcBkez3FN1pfS4wH7wX20cN9fuIs0fA5Pz9CR");
- a("8FHLZjaoborG51FPpHgQ5Bh8jVbg+F60AmGrAe+UCO/13yn48DN56tcxdhJV9XN8ga7GR3YVp+RjMMVXR6UNcnAhHulgIdLXN9");
- a("KWuToDtMkIOouCem3ovV4fgd7rHQSIEQF2wEcshm7cjjy8gXA+z9ApcFVd004J8o3CoF4JB/2WBrmYcw3afJQJNI9vjCGJMR5B");
- a("cn3buVVpSIJekswd/xvCaRY5XQEnwB/YEdWUT7sIvoyivQOwL8KemSMJWw+Q6cKjaLEw9PCc3Lv0BK1tSrDsYDr5v3+xLwdX+1");
- a("F/WygbASaHr4JfwA25kPM/oLD3yyzA2n0vN3ZLlf5fBbDuiN6njp41wUwNr0xMCU76GX2Q3OHcsDS0vmKxD/mzfVxoZ1Q0OTlb");
- a("Le3Bu1L8CAP0NjxpLUss3A0Gb0pmnY2zlJf1C9N6Tupdmk0LBN6k6TQ0Ongir57HZQXZTkf43Es+8ezjmnIpnPmdlcB5RVDGvQ");
- a("JZbNO8SZiWba5DNGCQ4Mb6mHLNsMoh/dA/xRYqrXTKB8sP9LJ/OTaLY92ek22ljQT2lAsU9+GZU63Rp7V1a5Jl/Fiyz0Qjc9vR");
- a("pdVHKx+csTPnf0mXyBKPzyi6eWyiQi9F9Ibg9wYrSiKZ21dOtGMx6Xg3lFjZiXlZ6+j9pE8Q3+kDRCZ7ikyWHA2xbcOoYwACDg");
- a("iHb8zDhY5LaV3Fr6ceTHHVk73BtCwkKkrW5P6tq2rYETAyKG+JKdmXrKomS1us8f3wV7K3f7w4u+8dlo6jhVPT/cWMA+Wd8Ir6");
- a("wAUGBzoLkMikGm3/4iCAkh8DzCsXBWhOLKhjy1uUkmR+IQ9uQWQQnHqaENSv8Qph1PNEKNHineJqRNfH5ydjoBODJkRi/dujXa");
- a("F7rYgqR1BZyp3M6V3v52HB+JOC8k/tgRO5nsipX375kAZbaQ+GC7WBDSxv0A6i3F1VNhOL8p8VnJ6bhNbbrj9+IBc+ieN9Fot7");
- a("pN+SdlguBJHw25PzYYjYB9c6yAzoa/qQ1cleRBMLicG0r5F6i8irHsP2+/pZHdTOajHk4vvVLOsCFvuYeL0+aEzho9s3vYIhxx");
- a("wMOeZhybAGS4ZNhTDxKsQyIsxks75BDiihTZgUk/RlrnMvoMHd1LghEKEGOXgv5m/JSL5/3F5y0cB41+TX2G38EcBPhvtRRDdR");
- a("0k8W38n3iu995I52sMCJr/9W/AFWCB4tYDvBFxJMRX8JVHnu1Ozcijbwjx1oH58QSBb0ASdoBS/oUDoCCGPFEoirw+165JPAvq");
- a("E43O8pgSQJI0uo82LvqUcUHxpjc00bS3MhBN2n+EgF6FVAGbq/nRJxDtC8e9aJ0wm5mk4X90+7D47UiPaiv0PJLHIQxsklw/03");
- a("2UWbOtVJOspVTRLjvxCOhtvH7JZndruKnY6JCOtNx/j8ALsRZ0q0ODsUUzhXFfPaEOH2PrstJzdLnNXKn+KcDSdT+RQPVWylCU");
- a("RBttuBngXe2PwYIF4b4ZAcqKxTRbtHPZebCul7+ahBGv31owSfRAk+zf8p1av3vAzauQme20qGJJyYN6zuQeH+aKQ7BpnkOknM");
- a("XQx3OAL3X2NKwsUyCb3p70BKQiYl4aRAns8SeeBYhLVEHDgAbhGRQoaMyIp9LBd3meK7WcaXQH+9AlchPISgnkKez/DHBPsCIy");
- a("PuIzl1AIqSjf0chrVkTq6x7rQuSPsnS4JBcZSqVh6lSsMpLJ/YJoBBH5q0F03aiybtRZP2oknTGrz1OJzVvhPZmsA2nlAGcrhS");
- a("KIYrDX2oZ0R+eqJNjY0t11U0q3FO90dOanix7o8otUQ4ozvCsYPJa3IfsTP0JDZ/p5J2SB1ovy0j/+6f+GTWR3bi1MtHuI1wRd");
- a("SpkCg79Vzp3HORLwH3jgXg3yRMpFq4yAciDPdn9HcQVfGRVMXZ/hQhx5BcvKiWmp5TMdhvg1MIL9YG+1ttBg50DfFlXEFJZKMt");
- a("LLOkh/vBBCbhxkAXH8QAEY2BbtNwl+9wlh4ZbhIQPSmgBRqJjX8COBKKLoHQm4CaiF0gdmttUsYCZ2sdITB/d/LS6jbk5T0yGT");
- a("h/kVVe1o/mwyCoci+qnAUEVR7tPii9od3SmVj8q7oM/2jyZdz3JGXLULtoN6x2ewu1eyNQgib2DlxNykaBWGf7n2HdHkUXyeJ3");
- a("morfXJZmzdAYON8Ej0Kd7q48a3KM8rx6B8oz7jNreT56Nbe/NvPtT1yce1AeaGsmae/N0j5GjtNSA8XFvrA4yrLYA1m0FIYhhY");
- a("HzDBH8K7rokVOMsrigE2XR2WQtC+0qlEW0gmB5IVvGlAjzXqt9Jq7L1Gu72OybDnjvQ5MRnLnqSaOfJzZ1YY29VGU7O0xUzEaa");
- a("Uh4fM3b69qj8xQwr+2fMsLwjpHDeK4UzTQjnbSHh7Ou/kRvwCAgo+stkhNV3BjAXmEE5Q3iznIJKVg31mUBk1XCfOSI8Vs71js");
- a("hAFkMt/TwDttTNiO7qJv1ko24+oh3/yxutdfPLFVHq5q+Wzyb9g70wArQN6ema3IeWbXuWJA90uu5ZR9o4UbHq7FSW4rukFO8v");
- a("xndCz/ZIh9TpizeixFbssW6NrlXvi9SqtwPdbfseYpTbPW0ot8MbrOVGrwT4AkfxGZQ17Qb5kidBnv4pyCNONt8L8uLuylnK57");
- a("Yo+2uW83i8PwwA8S/ZzXkFn7BnbOLPAusxPa47eYIgbAAqhH0UzEhoYP1jKldrnGvymbRCH1dy6UC7657rFB7cx6Oa+/uz7aEz");
- a("J5ymW1W++kSXawxXLkVNpoHEJ2g4A985maZF0kxcAZpNCmiM9lUV2b5eNtrX0wDRcNAlZ8rw+1cj/NvK321f/dG+WFbk6UQIiI");
- a("Qk/+oF4H8m+O+K6AkiorGGtT3yeQ0pV82Qq4rBhqAM3Eb7hfVWubr0MsiV/wch/39V50SoHO+7SA33B/+JzrHm8cUTjTzmb0Ue");
- a("A3XWPN5x6U55P+IBYq2/SRjydXOm03oeaWkzy3+LPvezPZH/uc0mwc9rCx1YMs6qQo1t7hWS9yKTvI8xy/sgu7jbh1OQQmc3cY");
- a("JVLinlogz8KfzeDdNwcg/4nGlWSZo5caD5LYpOfFfqxIP8r1KSpEpEaGkP9+MHqNd3lOj9vG7Rizrd8GDSiwMkLza7pELWfWBZ");
- a("WDmFYKEzW4Pn6v7TEMefSEeDFFJPcIjuME6LVZc2o1CbpDw0QR5KTjDkIXsz8vFNjVUerruYZP4rW/flclu4rxhjKhc+7j9zDo");
- a("rkWRHu75VJssw35Rd5CpxLCHgzkr+7vE0/3sjbJb+TfcjH1rxVXhSS9WPNsg6BlEK+a33//RKp7497azf7RR7kbB765xo056bd");
- a("6fjzPxM6PtgzJPNZCst8LyzQJEHeCyDvh/r7KBH6/TkM+qV+19MWouh3gKNJtysxYd2uzyXl/y38/964qWqhHDf9LzqsZZCp/2");
- a("+l/r/6T/3/BaF6HcUVirL3ouy9KHuu1Sj12XOxrM/Rb/xb9blJPzEpVItHi1pMQS26UIunoxYH+PfldsrXx9Zw3AsbWCvpUit9");
- a("BqN2/1bBrINT+Qd7VxnjRBCFt6UNxdLC4RYCxa24BooXL+6kBAnuxaVoIAfkgAQLrgf8oLgEOQiB4sWdKxa6HFLcKW92vrLtQP");
- a("HAHybZ++abeTO7M/Pe7t7s64ztRMSt7Y2W+ZNI0jdtU3yPe35Ytc2/8X+JOIbvS6pjmPCIxrDzbnEMn7QMjWGraGMojl+Vgxi/");
- a("Vev/pD3mP87tsV+qKPZYkEaylmiPaV+q9sieh6I93nxH+bBH57HfssfJx/6lPdpLqGP5/AGN5dxd4ljmbfFL9tj3AMbz/No/Z4");
- a("9rU0Sxx+I0ivW/tMfhngh7rPhKtMfuRyLs8TKN60/b48Ej/9YeexdXx9CSRGN4doc4hp2a/Yg94v3Owb9XzKPhWNrNONaZwMeE");
- a("NoktM5VURJ1LSo4p/KxczV9rQlP4y6k2WdZg0J4n57ORqe8Eg5/3UM1NRzHspdpI1mNenk1A0ea4Fvk5FQan81rkOwI/F8Ztxk");
- a("IS7Xd2SN7H3/+Qnljgegc/CdeiPx31F5MkRYjy5blc7sfnt1griqEVtW+jFdnpym3sK0t/9nVFyxejkSvxutXBdZpgjtSugHKf");
- a("wWCHklKwfvqKvNKkBxLk1aTL0jfkd38pv1aQz49MapwvsY/vegcf6yQf66RN9yXek86IapjOJfa5dL3DJSZ5iUlOgWRSo26YV/");
- a("/2+5y/iKqj0/yko8W3iTq6x046SnXSjZF0L5bpXj9nAvRTvF8oH9LClJPKXfhi/jpRg/lrRR9Ph/Sxi56P5KibYfqYj46SdFSh");
- a("o6n8UAMbV/St7aFnxrSSfIkSP6eltcgege8Im+cmpSxC28pp5RWR8+GsfU+NbfQ2WZJIpmgCkxmr+dl7hzL/r+PN2OpDM7LRpd");
- a("dhCtkPCjmXUM7NrDJCX6hBJzGyso7rIyVdCCU9+Zp+0XU/YZnnuGIg6SlL2v8t+ZVfys8U5LMqmegXi5/3i5fd+3qiZCgzhmU2");
- a("oE5jmQ1/6HuOvZCqd+nZAhfbN4t6V6sRn6dTPuSE6dyPfK85nIw/osiBNOIFYBFeADLzO+OM0AtAaXmCBH2oY2gw3WyhRSOME7");
- a("ezlwtaRYL2R6pLHhd0G6phIJnQM+VfzG+WL6j227U7bP3FTWK/pWkY9bvGT86/Z1SsdTSesGZ5kBRhM7bY5GQlvN3VDfxd6def");
- a("s/SMDeuTt4j/iC7pCqh94rlNfdJro9gnb+pHm/MV13/nm4Y5C7Pnt1mt1z+J6i3lFic5l6He16hP3H8M6hibZkd+Kj+b+2bx99");
- a("VghpWUJuwWFrX8FFa+GZXnhZWfYA2OUt42vYnBNqGi5ExGCyWxffpitchF/oQKoby0lEeg38l818Qlg5NScH9ritIuaOmpR2Yx");
- a("sc5e5mdbt1Jqk/Nu2PeGbUG+97+uxJmkGLribiTLHSB15NijIR3xYro33B/srOIo5d9Jf7AWZ7u4BrH52JotKRrGdjG/ZpvC1i");
- a("XHk6QK1M8ZaalmpcJYxc2upplbEvtN4eHWim+VURWKraxlvkUPFI8oPTmujN479bXgAfZd/zfrbWX4L+dl/m+y4uB2ncXnLWbx");
- a("DJ3uKNkjrmnIn5Gyo+8nQ9sHxhQlMjgL9U1Kivm7dmdurfq3RbiUul4bvjcKzitR19dY/J31ydV1GaizuJ/sTrPy++IN3J0sM/");
- a("32ja/Hc4SatPgdZbVZQv52qbFOj78wnYLv79U2GMRv8oZi/ylh8fLv7m9DLhIB+PbSBl5KrQsX0TKgJV4yh7DmJYKhz95WZU5R");
- a("Xfo6Iy3mwdaV0zymtULHxNBK48oPZ5W8rG7mD8hUxdb5UIMKvlF6knHuoz8NjI1f8fXQF9I/FFMDX9uapoGw0VoQQZIE/j/8kS");
- a("D2pcOtNWkIA0DJxzHXRnAEXyYJHCEkb9EpaIK8QTif421kucB7cCG4PkSm51rL63MP42gazjEunuNSoO+Dhpf7yDFuHPKBWha/");
- a("y+OtiyT74twhbr3AZL4f+qO9OnbNiLuS0fWVVuNLy6lxSyU1nlBFjdurUxzX50DcwOoPi7sQ17F2hcWXhsVNtVT5XGFxixKHfB");
- a("Me94uNgezvBK30b4M4ZiVjhIQsorwQjh33HLl4ynPi5NVLVy4fvXb9RqLv5u1zd+7K95MesH5fBL38weBYCvlfDCaBP1+Q/fLs");
- a("ysbqK5Ltaxdf+EOen61PJya4vidhAgplhIw/dX/WSL8Xkv2kvKVEyVKly5QtV75Cteo1ataqnZI0OC3VkkHSKUcMOyjNTKjUX7");
- a("dvt4jzNerUN6K+YYM85uMdx8/5yPnqIPSw6fVcvVMVuHUa6TuQ3jCnc2Vbb4GDacCPAs/OGtRjvtm8ri74NWDyDjlmzXg0a/Yk");
- a("8EdABNd+cDVYh1TslerGe6SnQ+rmDMmPjDw5N6E8uBnYtHej1dbKqdcMBi8LrF8xx/29xjtxbnAbsP2SeSsGLjj0MiMMfwvSJ4");
- a("5/MO9evVsPe0OdumNgK1U9dCbxnGdirw+cN8B1jR9b0lpg4L6pGd5xPu9jpE5ogpJGQ3+IqC2kKFgQcqCRISUdXejws/tyfrr/");
- a("TdZI1upGyTWHZqNuvtBLRxdU+lzj8CX2mJpnq4b4AG0Uu3Rzu7Zv4hjYDL4F9r6NYy7waMG+EuVXfF1uSkwfazh3H4U80HqMow");
- a("PoAiaE8AZHL9AHDAClRI4mYC6gBWgF2oEOYLT3h6XveL4b6AUGgKb3qB9oB/YHxgHdQC8wFBzt1GdaQI2TIqrx8NDcXtsSzn3Z");
- a("8MzPzjEX0Ap0AF3A7wWNvkgxbdGKRfq34vJxQDfQB5Ra43xAK7A7cAowHugB+oGGNhwLAG3A7sApwHigB+gHGtpytADtwP7AOK");
- a("Ab6AUGgJnbcSwPdACnAOOBHqAfaGiP6wbagN2BU4DxQA8wAMzcAecFlhSfr0j/W8H1k+fLC4xDua0oPA/8OfhS8INazuPBveA7");
- a("wG+CJ4AnxwPPA94U3AveHPwSeCtwH3hrcD94G/AAeFvw1+DtwQ0dOe8AbgLv+Im9u4xxIorCMDy4u0tgcAlSHIK7BtcQ3N2h+O");
- a("DuVrxYcCjuUNyCuxd3ggYnwLlvA5xgP/jJTdiP59zpdK5Md7c0AcfH9bCN6+O0uAF24YY4N26CC+GmuBRuiSviVrg+no/b40XY");
- a("wevwWLwee3HI0KwHjod9uDP24y74OO6KA7gbford2Kpn3B1Hxz2wjXtiF+6FC+HeuCL24fp4FW6Pb2AH38Rj8S3sxbexD9/Bfn");
- a("wXH8f3cADfx0/xA2zVN64UhvHjI5HYTzh6GuYDx8AuHBMXwrFwfRwbt8dxsIPj4rE4Hvbi+NiHE+LjOBkO4FT4Kc6IrQbcHzg6");
- a("boBt3BC7cCAT48PXcSlsl2e8yu1xMuzg5HisshenwD6cEvtxKnwcD8MBPBw/xSOw1dB4JI6OZ2Mbp6rA+HFGXAhnwRVxDlwT58");
- a("T1cW7cHOfD7XF+7MZFsINL46F4Dx6L92MPPoC9uEEl5hM3xQdwf3weD8EBPBbfw4vxU7wVv8F7cPhGXA+Ojs9gGyerzHzjFLgQ");
- a("blmN+cYr2zG/2Ifb41XYwavxWLwGe/Fa7MPrsB+vx8fxBhzAG/FTvAlbjY234Oh4K7bxNuzC23EhXLoD48f7JjN+nGEP48cZsY");
- a("Mz4bE4C/bibNiHc2A/fr6P8eMXOIBfYauJ8WscHr/F0fF7HB9fPsR84ABOix9jFz5wlPnBnrPMD15ylfnBS3F7vAw7eDkei1dg");
- a("L16JfdiH/XgVPo5X4wBeg5/iex+Zr6bG93F4rN8fSEu9FNmc/O73ob5/+Q4Hx+t+Hk87QNbMzPweDyl5kHohl6m7T5v6Ier+gh");
- a("xP/UjwfNl5HaR+lLovBz8PnjH1Y9TfZDX18ydN/Tj1QDZTf8PxJ6lXLMbxp0z9FHV3Ec5/zNRPU2+fm+MZ11nqT/Pz/Zb6Oepp");
- a("s3CfnzD18xaN4z2c/wLlRYUYL+e5SP18Aa6HebhE3ZWX52W8l6nHz0edcV1R9dzUr6q6m+e9puobmbeAqp+nfl3VPdRvUq9flP");
- a("lnvLeohy/JeZif28HxluJ5Ge9d6mMLczz1e9QPlGZ+GNd96nYJzkP9AfWNZbhO6g+pLyrLPFB/RD13ca6f51VNv9tYyAph+fVd");
- a("FFK93yd15adXt05zV88e04jjQ3xpIb+0UF+aFSLk93/CRIkSIVy0aJG+/gkbNWpEK4Q5LDTNihQr6s/e+PR0ZV7I8+QbMtjid2");
- a("O/kDVJN+khN5LnyTdkfDePJ2uSbtJDbiTPk2+C9e6Sv2x2D173u5Nk3Qntw8t+ob+mytGdB0WR+cZ+lXvSrZHHN+9pnFZl1rc5");
- a("ZWne4EUq1yTtGEleL3oZu1RWWfEhojw/XqQyZtJSkeV1qDePUxmzQnrpd/VhnqgH84z/slyfh/7mKlenuyTjC9/X+Dj1YDZyV5");
- a("Trd9NfSOWElRPMz3V4kcqToRLI9VV0jG2VVedGlmX1Y0dll5YJpN/uZ/zUIcn4c+eZ1wP6a6q8MNuR9bX6Gx+gHswkVc1vfg79");
- a("uVXODCyKLOuDN6rc/dC8g1xzAPtC5dxlO+X6N+KhKhc/SxRWxjeQcVEPZughD6Tfob+iysZh9oaT/Yc3qmz8IryMr/0g9o3KSD");
- a("nfRJD1w4tUxt4SyoxvMOumMmW9PDK/B/BYlXtfXZP94xpibKlcXfKInN+Lm6vcMyVKGHn9GWp8nnowJ+aZEVHWn/76KlcP3GTW");
- a("f5ixn3owq+aaIfPnpr+QyvKfroWR9ccbVbaN4JXrTzvCuBTZnPzbNvQPx3tH/eF8o9nXo0hyQOLWZv3pz63y6O4Ncv3n8SKVod");
- a("3Xosr6jTEOr3L+oGwhZP5xfZWZlg6LaG5Qrot6MLO2eSL7uzn9uVW2iOZI/wHsUZmyYy05f6FxzI/KeRMWy/V7cHuVsc+3N+uL");
- a("D6jMMO50BNn/441tlYsmJYgm9zceqrLghwzy+PgTjO9RD+aCzSNkfdz0l/qWnD+U7M8A9qks5h8YRcY/0Ti+ypeJysn8eXB7lS");
- a("tiNJH78w0+oHJtnTNhZH0mGbtUTox+Web3OPaqzJEqpHx/yT2ZfaOyW+nX0u/BzVXuybhQ1jf8FK6LejCL3HfJ/Lanv5DKlL7j");
- a("oeX6sFflnv6f5PEuj7Gl8tXh8+b+w81VZv3YXM7/Bh9X2fhMdpn/+lON06q8US2yjO889qhccWVkNFnfacybyqPNm5nfg7Bb5c");
- a("sH5h+A7ensO+rBbHv6k6zfIvorqsw0arqsf6kZxgHqwUzSoqFc/z36HZWj4/WW668509hWOfrBLZmfjXioyg+pd8hypJ1l/JR6");
- a("ME+drS/736G/psrSVT7J4wPYp/J1/IGhZH5nG0dXWTfrKfP9CbdXmfxNHRn/G3xc5cI0q8z6e1l3lVXfJTI//2CPyqwFQ8n9EX");
- a("8O4/aSZMzYu+X63fSXUlnl9dqosj7Yp3LtkZ2RZH3msi4qzy0KLY8/gIeqHD0mt7l/5hm/oR7MXdU+yPp46W+uMnTaxtIff77x");
- a("eerBTNC2nMyvQ38plX2LPpL9qZuf/l+1+mf5PZnj/tTiL/j9cSUqFrWzZcqaKatdO6sra9bMrjyZs2avYzdt19F2585ZL2d2O6");
- a("Ndo0XbnNmt/+1ftDBk/OHsV9I9yqRDelhfL3mAPE6WYl0rkr7QIX/4PFAUnqei1cDqZDX68rW1ZVtVvnxtZ3W1mlgd6Y8ToUi7");
- a("Bh0bF+neuUkISs4ts8ViiEwLW6Vd665Nvv5np4EfP2f4Rn3+yHNd+n/dbtP/h+bvxecTepus2Mek45iM7v192v1MWv1N+oaY9J");
- a("PHyWALV7VCw5ZNGnU+wPiCzc9tsohxpe7pomX89qUof6Nlz9nb8nN8fM5zj3nyUvd/5u5KY5opwnDL54GIUm+84nrjgRZBKZ6F");
- a("shUUZIWixCN2LatUy3btFuXTGBs1indj1KAxpj+MIWpijZr4wx/9oQne9YrXD+sV8cYzeNYp+wxtt9t30SiubjI8zPHu7PPOO7");
- a("Oz7850P6D1MFVHT8smucycC/N+Wk8u5AvAv6qnHUKDalJJXCBHlElDY/Dj/YzrAEpALvskeL+F6/dwvSB9jZ8p3hOaiurC+VFV");
- a("TmwWpmRdUOOCnkxE1QuFSFxlJqlH46qgz2haPJFkSdNaNKZMClEV7+kuHFWQKCSnFEHWtFg0IidLQpdFk1OCLMyo0STLk5NMSE");
- a("/KsZhuJEbikwpqmpZV+UIlwQqsnkRLxC9MyNPCjK7oQiQmMzzChWP70Rk1GZ1WBCWRYGOoa0uBnfgA5gcT2N8S715dVxKr9V8g");
- a("ly4Vcg1Cm2GHhwuxqKoILp5+iHHqi5WEqsQ6j+LpY0oyNJVQ5Ml+RY8kolrpjKvltzMeW8RS9QzdW6BrY6mWhs7tbhybYhpjje");
- a("lKVfrQ55C/05Ys65iurZCcgvletYD8Hbfui8djiqy6q72Ai8jfpqlX1aNjq/pbbWekt1h2NIwxm/WkMl09TmzfODiuXqzGL1N5");
- a("Mbe5a67JbWKjnxdyLbWGyk2rDUWqauT9zf8oQ9SS/bLBdcblRlHhwd+LbSzEWEixcAcLCyw8hSAgFFjoeogh4v3s/y9YaH749+");
- a("KvDH99kAXEWxkm2Q9ESM/9XpxnyMO1z7JvNzxnpDc/awT2fzlA5hyW3sXCwyy8zsJTiwa2sbyP2P9cW5nDN7meeMzgwePPPG7E");
- a("m19hcix8z0Lo1d+LGgtPsTD3Wjm4XmdcWOh6wwj+11lA/C0ml2FhrzdYQD7PK7xm5K+uoy2yOhDy7qKBDWw83KIcft2yWGxsLB");
- a("af3sUI6R2KxZu3Kf1vlE97isV7W0oBZRBWtioWzeNsqh3z1SV6nJ3dZ5Mj7kfZs6qvs1lkfUeRp3k/nvjE+n7iAz/PpzTPrEN5");
- a("bicGA4xnUgFR/xLNc8WG55JDeW4rBkc0RQVLZpef0jwLn9E8BcGxPNldLbHG0/OZNc9lpC9+TvOccCjPJnGU3XxBkx0rNjyzX9");
- a("A85xzKc1vxzESU9052FD6nec5/SfPMOZTn9mIgJuv6afFkMD6jTroW0V717iupr2ieKw7l2czstsyyNMeheU59TfP07utMnk3i");
- a("UFRPlvvn/Fc0T2mZ5hl2KE+PaMyxq9my+r6m+fq/ofnOO5Rvixhgj3NxVVENutoyfy4/5pjOwDHezkB7Z5D96QoEjm73HcX+6w");
- a("34vN09wZ7uHvHoK10T39B6mfiW1kveoXrZRhw5X1cS7IEY95NvrP003P+Q+Y7m6drPGTzzwLTbvYqF31G+aKAfKAD5eTNFIMrn");
- a("gB6X28AGnG+T2+QHMubdGuygDelvmfX3vc246DD95a4xeAqQMyM/tgqtzt9c2e/A3w3+vxv8F8A79wPNfwH8wzZ6kO50byj/5b");
- a("vQ3vOIo/783bCLe4AoV7jPbB+leZ+SyEIPc0ifLVbrJ/+jzfx9f7wvsNFP+M2N0Y/rXaMe6W3YyTsG5lB/geM7Zn2szg8TedhD");
- a("GOkZ6GPuN8wLV2zGVehDAvJj0SQnxa314dXdlvz9mvsv6SM1AfuIgu/FBnrPhh4uqj5vDvE8T0d5gcsB18ojLsXqXPc08oE8PY");
- a("y4XzWdD/w1pKeBwiXABK4DmEJ5fjSF1u6rq3H/b6gfGAZqwAaTX3cB7TRRx6/btsMmy3ITSOdH4Ufab77yk8087YD1jbv+VvcG");
- a("v18ISqU5WhuuX+B8zfx+pvml6/Br/aVaTth7Y/jx8vk9YU8C6gXyY8tQiT2r/zfkAzPAGk7gw+0gZZqvNkJPfsRzJj0Kv9o8h6");
- a("7TTqT9NtZOtg0Zbn1DW6y+X+j+4P3NZh6/vzXPCZNcdmJjeGJcLc/TEOfjahpY1oekJHSmDAxMWdhLDpivYz9+8PPUsR8f7MOH");
- a("+KLpfpX/ndar/0CsFzDZUcEkl9vp39Vrbmfod0f0tx0MzALzQC7H/hrn2wm4K3AXA6Vdze0TiMdiSoS/f+JHGnqUEM+a9Cu46f");
- a("7nOQjrFaFnfnjdpvgRf69+80e7Sf26DoYeEQ93Vdtt4aDqebanrTruRVwDeg+1vv9n25EOfkIP6j0S8xJgoQPXdZSB/k6UAxba");
- a("ref96W7w9OH6cX7pWJznOMgdXy1fQDx7AniciHo4+nF9fTh/AOfrhxwwHYT+BtzV43rI8Gfo5vfe6FdpxDXuL4c9ZDfR9uQ/yD");
- a("o/Z5Y73aH2dBrygRowBeT2lEXcO4J8ILenvAS7CuF8p/81e1qGnHcU6UBuT/lx2p68Z7j/UXuSBpE/DHlgZgjnAWZCON+ZiJ9h");
- a("Ht/K/rUqe4Ldebh98uc/7lfZkrbH2YOc5R9Yr39F2wL6BnqBEtDjAm5p7V/ZLjQgq5MxxfCysPrR/8zzGw/0N7AVracV6DFrp8");
- a("9G9/9Kj9syP01Zi0x/0Jf5uYLbY3prWj/eg51pjxrajesxzOKUvy+FfLO/z7WNtR53CgVm9GR8eliZjic2l/UZht2Z/X8L0ONS");
- a("I60vbZ361JrcjtSna1t3lT79LE7pM72NuZ9XazQLvXmRnzfp09tE62thnfqUWpypz79qny3M36jHZxIR3te32UT69Qvb0noqOK");
- a("yfr5X/jyM/dgn1nq8nE3IkaSw6M7zF7D7WZD2erKC95rej20VoW1+75a/bWL9P6nrct4AZYIGn34Dx43b0F8RzwAJQuBF2D/QD");
- a("PTchDgwDU8AcMH0z5G9BOWAB6L3VwCwwfZv5PtC3usa0utXY0Uz3t4EWG/99m7P625+3b2f103r9zHgLwfwF21n3szDaacVjs1");
- a("9xne1VeHZj+pn0HOwcqAEzzyMdWADy8y+/jn71Buz8BfRHYBqY5+kvQh6YBeZfQvmXEX8V/TGPcsDwKwYuA6VXqf6F1mLHFNrl");
- a("/cWvTnJ9dMApTz28j/vkyZ5HW3fYhPf6nUFRDPjEjnaxi62y7+o9qqu9L9AbaO8Ieju6uo/p6uzp67jS5d3B9Dxm9pPuaONvOs");
- a("RZ/bR8/x+Kqhcrq/7gwaQyHd6BHo+EnWgeAw7jae7XO1bwPSOqR5NY0TLA2o/yg7fuTPNKrZO359yN6dfhc8zPc+ANP4N/J+v5");
- a("sp/b8S40n9ZD4T8t8XZAO/Nj59C4mlD00m6iyVHlAiWhqBGlxBPtZ/bHt4Lnsg3fiUOdZdf82D00FI/IsXF11Ewa87pdrJ/beT");
- a("sv7Urzml8n74K8Ye+xMN6XKQ+W9tWAceuu1uO0D/Ze2I3m89Z6+V7g/lfGrx1CfTPRWM3w5WrczZr3CtLfaqV5eQ5zFu/UhdXj");
- a("V2sIrb1m35w+L2CyczP/3Wl+C+AvldAB/F1KNf/dGP/puAX93en71uIeNJ+lw5w5rjWHBtVo0vDlltp4xYZndk+ah3C4M3luF5");
- a("LiesXSmMJaexl/izg2obw4EixBTf5WSB3bPH1+PEbkY8ecOX9r5Jc2tbGtiDX5WyI/GIvLSYv6m5B/ZnRSQR2W18m5HwE86Iq+");
- a("QHdn9zFib3tHT09pXe1Rve2+Y3xd7cEun/fooPeYno5A75U152ng+mui62HZZP52wHr6wNvCuu1xWjRWbkyL5wyz3BYoN6RckH");
- a("QR7RyKayWo2w4jZ54mjjKsp5f2E12kfFCO6QrDetcXSswo1PWplbyJ85w2E4tR+j/PTn58aIjk0Ts0JlI8RsdFisdpg0O0ni9T");
- a("lQTR345AgZaqDXV8N91cjPfmrVe3fyi6eV9gS/UGNb49bWGfOoJZLle54avtU0IK4yWXq9xA5fnMVk4QIFexIWkFYpJQKzbBy1");
- a("du7Cl8Xl8AxxyXM22UWfyCFs1xuaqNJ9kv7fS/wuUqNnLMf1VfyrsvytdsiEh9TdUV5nK1GwvIS5zncuWF93PfEBJ5Xr5mgfnH");
- a("DZYq2A/lsSA7+x1d3MvL8wXK1AeGVh1h2JDd6K72V/LzmBc6TyDDVPECL4+FwOuu12+a15vPk/+BrFfYH+VNC1fXU7VQkS7x81");
- a("QuNPP9SinbaH+L+vna1UXkNayJNdTU7a072fFtcZo8reRQvg2pHN01vLybQvKFrjy/nvJCU5JD+ACUNxZmNv5swzjNy1cuUJR+");
- a("sdVTjsvVLhSzbyhvOXnF6jxYZAaFW9bP1+lt3zKIqULvpKwx+wrjmt1dR96rfzGa3+G+B1zCIydc/U75FA3sbjIL+ZbywiTi4h");
- a("tYyELChzROZqCq5JM1513+nSLjOQjlKxek+N2o6qD6/Llc9cILvuyibb86krNczrTQYF3t5iknZ63OwxcrLNS/7hUuZ/WCPrwV");
- a("ffVYzwDelZL8NfTUwXUkNS5X++KVlFzgctYvANnrP7qnFLi85YuoZjxctdWfB7RB3vrFCHstQtcf5vJWjnrupJ+vX38GWc1rnX");
- a("Yrk/27M8Y/4Mvrq3Vwk1fqOQRyFo5i+IgtRQe4XKWjFU5WavxKcTlrxyU9FtSM+jzeVh4HyPNzr6j/EAvFw88L+fqORu5ilA61");
- a("OMkEl7dy2MFZR1TvmufytY4v7vKatZJ+i8vVdxzBY9R4mOV4iNSWeo6XPztW4ZBsz7s7dVmuBS5f5SCBd4QwtCUuV+1wKOxBCp");
- a("b9JtknjQIHFNnvx7DwOgsHsPtXkoXXWTjAzf5n4WkWDmgoFq9l4SMW+jcVi/ezsMUWxWKMhXr+G63d5j13DENUCR21L3Y2omjl");
- a("SUeG64u3t3n/7xH09adjzvBT1fIUZ9lIrcoxPK+1W/OcAj//kTbt5Fieg3hAw/36CGueEvi1eWkeyw7l2ST2Ry/t23yWkojjex");
- a("Q0T08HzaNt2pk8txVHZfVCZa1F/V6a54oNz7BDeTaX7HaEeQkuiMUvw3c1qP5ZOIrmMe9Qnk3isJycKndQz1HWPJeRvthJ88g7");
- a("luegeqkci06OaPhuC80z20XzaFSdyXNbsTQEsbGIvTfAd2hInvNH0zz8DuW5jcg7J/9uD80zdQzNQ3MozyZxXJ2sIJo92vRe1v");
- a("z7P900jwWH8tyW9c+RmfJMYf4Ymqfko3kU/irPsxv+4d//GVBkzXBxVP3+T7fN/K+H5tMad2a77rg2z62e2Gs+6/adQrr3WJrP");
- a("RNyZ7dvC7zNSPKoy4uEemmfrcTSPtEN5Noust45cYBgyiw+w9qJ+p8l1PM1j0aH228zbMyDrSXz/jBqXlmx4ujRn8txOPENORG");
- a("U8q+G7asR4lD+B5uFzKE+P2BuJKLp+RjQekyvfbZxgzXcJ6bkTaT6aQ/luI/bN6GhTfDeQbNeFk2geGYfybBKlBJv0xthiG3y/");
- a("kOaZ9tusW3Qoz+3Z63I5cvHa5Dd3Es1ztpfm4bnEmTy3EQNxNZmIxwL8O5X0/SXcR/PwO5TndiWerDH5uJvupXkOBGgesw7lub");
- a("2I11wgOttH8/T20zyyDuXpEdc+GBCs/F5AOEDzFUSaz5JD+TaLxovHwJQSuRjft6V4NgZpHkLCqTyNZRT8VuoTaZ7LNjwnHMqz");
- a("URyLXnj6TDSJuBCkeb51Ms1jzqE8ty/5dy9gk3qMR40n0/P63ADNI+dQno3iyFiln2H5ZLo9FwZpHssO5bmjOCZfoETkmMnP8N");
- a("YAzXf+FJqPV3cmX494WtwYkcaMb+mUv0tN8p07leYz5VC+OzO+5bXw4IzvalN8Z4ds/KEO5bsD49u/WR2Knq+DLP9eOL1vdnGY");
- a("5jOQdAZfen/7+lE6toHM58c2IVGNxCfX9lHMD1mP929Bf20jNvNsh+kxdzx+z/cEA70nGpgDugLAfgO1kwzMcOwzMIX8NDADdP");
- a("kNzAMzvQ3m34/pC4yVdVwYttavD3qdk2zm9/8z/WpBxIFZHu9HXLTT73go2F3Wr3/EWr/z0OvS6TbPE/8z/aZOhh6BOWCex4Pr");
- a("0K+vrN+MZD3O8vHBN0brT5hxln6FAegVqAHTwNQpyD/VwALSPYNIR34Y+RowzeODpvlJaNz4JN+aSnGMWutVgj7TIZvnJofqtc");
- a("D1wPU8BL0OGyidBn0hPQcUhq316hmx1uvubLnvhaI6GZVVSwVPQI+jN3uuuG3vd4fufe/MwiW7n3DSkyH++xzdfR1eX+Doo9o7");
- a("+n1Btj+wv6+9J9AfbD+6W/R2d3T0dPZ3Bq905VF+ib9fRDsJH+K7kOM2613qtJPvjOr0vNSwId/DzEGf/DggNDwTS0ZX92DNRm");
- a("IzevRSZXXx9NhmNTKViKvRy5VE6bpm0X7AMFADpoBpYAbI61rk9gzeBaSvmO18nJ7H+s+0Gc8d0i9qnrNDw6PimeVnMg16qLd/");
- a("8QAXvc9y8sjpIzdb5Ht4/uR+wn7T7GCwmR1Irruvs3eYzpeG6euZmjpWVS3yGyvzj9V1ROvumzxFVsn8oHI+mT8sJ8j8Xi1hI7");
- a("+Zvr4/aDuXXadhIAx3AQuWvAEbJFgYOU6cy5LboiAuUkEsK8dxG9M2qZyECh4ekcSTuplSV0LCm9Hn+W3PeOI0PTo5p6vu+Pf+");
- a("9but179SR6//k2y9/o/1D6//jZI330uG/e+E+XldR7f/ZhR4rk+ogyxv+KEOev8PdXjg6qD8/v3PW++zQx26pr32P3J1aNUhV8");
- a("bzHjfUo7YqtF+uHvNpsM7VZdL5r48719+H2u//0imv/5sq/OPLzn8+jfbHL1r/3xnoqsKWHvun/MCP6+Hya6wA1dXlV40KTz0g");
- a("TwOym/FCvqBC87h8OwMK3/X6Qm62C+/nwbzp/EDDZLTRYJevPnBKFwvRHGqS0HTSvfm0Igmjgy4BfZLw0aacgmXj+JT3/fKY8n");
- a("gB/VZPacphPquLYVwc2PnTmNn+EPwRWDtfPM0XZ7Y/6cefdFXUp4akSdR7R10flmtNqTft+rtugLc5CwPm/LtmLdc8pgEJsrSP");
- a("M9dbDvsSUBaPcQc0SkBuOYjoRR4DB4gZ4hBxhObjiGPECRqfIs4m7toNCcbRwPahdrPZqJGn/QoYp4gDxAxxiDhCzBHHiBPEYw");
- a("7v6lLkw3lcvh/jOwipq7ZuyunnQqTvId/FUVSqURPLUg/YGlFMic70u9ooUTkWRuRaOi5VbtTJ8dYotbsYL38avd9ridZr9OH4");
- a("1/VMfRCVFtXE3c4IPXQAt6XQl3qp5uO1VHtRFVpO+s7sdFM6valF209n6xuyyb56u7iK57WNdf3642pkiJ3IqrF8ZJTSYNKvQU");
- a("/etqq61CvLoA9BP3GEmJ95+ZLP4tGCk60y/Qad/WR1UsWYH/DH2pzUdkiwa4hopNaL2fwsDhBn7nywJASbgE2tTSlYex9hKbc2");
- a("o2CtPmIUrL3vRCy6jP/tq9dvlq/J+/GSGn75sipUMehtVaHtap0SY+9PSWAtrJ9Ruy6lmZv57dfX5N3nKZ8shCM78flAy2NAGQ");
- a("eY/H1Xcrlu5/y6qUma8owEiBniEHGEmCOOESeIU8QZjociDhCHiCPEHHE81acz9VFc5Z8SPTGjjJHv9uTKZrn6NHT0m4/8c96Z");
- a("837znm26jl19spDOrneVy0K7W5aoiq6RohKFmPQhWA42ATvMqTrZh2KtrEZrQ4FW/iLbnLjPsG0epBQigPM2HB9SqDnniFuBGP");
- a("lFM+fazHmHxh8Qb7s5H4X7fErApp7nFAn2ln9zx/9kcd1+w+MdNO/4p2Af0qHd1lGwD0Dmjcfjf3bH//yOn8z/18NV/v/re/vj");
- a("8/cOUexruXtSqFbJVhU31vvDyPkzpw0DUJzL0GZISzL0jrsOVZdeh15CL+2VS/8BDSRN27tcQ5qMuKAUl8T22SYHW8aMGTNmZG");
- a("RkZGTsyMjIyEcoJnpYkm0JT5H1fpJO5ECW39NzfP9Z9fn2EAleMdM6+U3PbJeSIv1jWvOKBP6A3S0anlkrXVLLPzFMv2y75Gxu");
- a("DyKmRZbZitqc9+TONPH9PAvHGTQUN8zgfuJ87RC23i5YpGU1DKse4BT7NsSu1VquO7tl+CRYk68wYKMUSuZGINbOU2J6xLJ9Yp");
- a("+RWpCAJgvhZlD/QuagN8jcbn0PBVL1c8jFVn2r04nWr6F+dpH6K4K9oJVGQ/mctmNZyv6wm9OkrkXPtxfr5j3q75pes+xSeuQY");
- a("NVpqF+59Q+nKD9vyG8EZMQXXNTpVGIqUxy2k8n/Z+QyPKyeUNhc4FtIP1XjqivGP0pWy7V4Y/hH1ff44lDbEfAiHP2dI6mBdKm");
- a("dQ1hyZgHJWKucwDjbQvFS+Y+U+K2NHFeWcOP4Bu/1EGDhA/L161PGOffPcS/WaTP+gUuz41ENrV0y5gYYFKpUaMy6NoPqSp+PI");
- a("9ZnzSDuIuuPsAKHjKvRhcByRcZxfJehvoA8D2Ihe9+P0A+i5IDMyzJMYANcUHB8Mzme1IPLNaSFo+/K1DqyC44KryKz2FeO8Bc");
- a("cFQZEBHV4kc//A8cHK8bYWXLUYFwYVh28UVB56LvDXe6sfnwOOD9AhPHedPCFdcJFA2tU7FTwGFxPscnL6zyFjMz4pKLVux8Kn");
- a("4ITg0f6OAkJ+ChwX5Mm+103QEJwYjMl80IEO46JBk4+q2cmBCwMbiGo0nBjAgZ4LPow+6ef/DpwUJBh8VrMjcKExv5tXIMgVpE");
- a("WD+01BM395cJJhvF1Ug21wEQN29YuK7IETjMyHu7qPeQJOMAbnSjqOuIxbGG1JWcWcQi8ZVlf31D1dg1sYQKdKYgB9jJFytJ9M");
- a("4pqCjxgTh19VdNZjXKzBr3+g67kBPmqY635TwF1wkjEsUCnP6/bkdcZ64KRhK8XoiiHjR/q5/a74nd+HXjRUwU7l+AkT0QYnGo");
- a("VgE+omcT2By4GD/WWcxE3ARY0eP1VDJS3GJRsZYGE4bMU0cAp+uRf4x8zlG51qyaeQll5UO7/U/3kTxq2llluRk0vosZBekfVj");
- a("Xn94qX5PXtc8X7c09a6m/j9zV87rRAyEEYIOEOK+ZQFB3AIEEqLilpC4xCGgoDBZByw23ijeBUJFzdFT8l+oaBAlJT+BkhKPPZ");
- a("MlXnvechQI3ntJ1t/32eNrdux1yiXuv08e59frTkMC/jrLf5rjB/0TafwKwmMC7jqbvxPH/0v95XN91j7Av9R13v54mYkj9Ypn");
- a("rZrfCK5k+8fZGfWPVzSusuknmD633nnrztULN67fvnM7k8/dFEcyQ2XraopBipF7tXtgd/tQxAiOPj6axm+nflSXw8rY2h61Eq");
- a("kc1CNZ3AVpQMJp6sdGSDGwoq7836NJ3KauXsAqmNu76TeQDhQrKlKKf0uX31skKkwHt4906AS8oFVUynpBPZ6Uakyfd/F7ErpE");
- a("BSSmnjMk9U9RPK+ZlHooayWMHKsz4pyY0/hPipAvWYJnMhPqhXZa/exQEDXw5OwwWDjfXpSOvjWCLJ2HLeY8Kd1tjK5lzv8/SO");
- a("uqZakey1Jc16Ww/gBU35bxUGjhOafNEA9a7FUPajypZ4FLB/apJ/ujfMDU/M/y8dyTJfEP5/tPxLNw3yZscAd9PibTagI3B8oe");
- a("FTdLJa0SjfupnyhKbkVjdA1h2VnVeICPTkpTiKmCNqVLldDdlcj3dGoqZMU8dHGbEedbJ4VAjajwjPJO+q0ZnZoQcJHJ310jH5");
- a("UKxpqhPyVfjLR7C+pnxMAijtcbBaQfeNSLjN6Ojp4zvInV0vaI9QCJatnx5wrEEEZyqKLx54l8psCgV65cdF0zmc9YTxOVqbQu");
- a("LKC6uI2Iw6BC29Yh1tqvXDpA9Vg+Vtn5CUoThcajkS1t/01ZPcTw5aGOMhMTF2Vj23vMT0gA5sc50nG/G+W7JuGY9Q1WzzNl8w");
- a("nn3DrDNc5o+wfFAVE1fmniEcxt9mivdg9jumfAKTeZz0O0Py7wj32YSjx/Au1evZhIA3c49LGlU7p7tcsAChifBW4e97f8wiX1");
- a("egML/7DP9dUjw84Xgbj1tHDothcUnH02dHUAAxC2n92k9qitFzlSmXLG+FcRP6RuGxjTP+kQ8chl4vsX6bTeUpbf+Xe3lXq66B");
- a("upLv/OLr91OAdbRMW4vdT+XFF92LF1QFQh3FtbTR3SOyjL+vkhAQEArKUUTqTHw2qeDSz4b7S/QIG9HArP6d7Clj6aVmOnhUMm");
- a("zv1oKra8sa6psPPw8yn4NaBbVxnV/nrg1WT1ti70axsW88jKVr/MrT9vyek5CoSx88dd89TlzMxH5zORH8+UqwlQQvL5i3WEm0");
- a("CUGGTrbdeSekCQ6h+kN6+kVhOdNdJO6R5I6LZUxIREwJPJ/7rFcdN7tILpXxu7uh6DkFy/oPvMxoKnZ/wI0JhoDGD2PUR+JlAY");
- a("pYpfxgS2fkgfy1dXra2hGR3l/f9Wd+hZPEldEQXXn0kX+nBXM2UvRhdI4lb8/RM+9/N5Ofvczo/XSzwn+PY/fW7nEs64eErlfi");
- a("zH337/Gf/9dcz+9gc3r1y/fKNz/dhifVtVi1vn7om5Dx8mhCs4vLSfpw8r+Xi2b3z2+xuMG0eGAjtFXyp1Zza5YkbVYn2vXn3n");
- a("UpjGz5VaWqJd23cPwX3k2bhugcfvESGS95AGbUWvKTcfKB8Ob5oxzNKq8BRqycx8BWy0UPKN8rO5w7eYqf3v2kz514smOoYffc");
- a("F+9d3/ZZ4zeHDbx/nwbdqPIv9fm0K9SPj/zLxkZ9aPB8H99wQ45DJ+DOkN5UQOdT0LkuBHq0IVR5m4YKRHBCjJzNO0WCrGqn5S");
- a("4f4vxg9tdSQiUSNKv5r4/WK2KJTRqkjnI+b1CATkntcj3mftcYy8/xPzt0D+vvGathY8Jjl93PhwpDZ4s44OzZJ6hBwHJpLLlG");
- a("tgXaXbw6LURglX+7lybezqwPI11gZjN1rkxn2Ev2E3QiKQj8Odb2xwS4T774ouS4g5F6KQtRShClj/ptV91Ni2UNl2hpsLjlwQ");
- a("T3Tdi3cYEEPiTa8HwOY8cRm/PLMXb+EQIwBw7aqNMy70POHAE1kPn/Tof5QUjZOpb9h4ZKG6H82EW9iscvW9PsH/7NEMIGz7u+");
- a("UdJWlrocBLHPlIXS9+l74aQWqWnzYL/bKldPCi1zioEDkHsvt6L0OgpV1ZUUXvfgFFcMAlcGtincz9/qYcfyb96pgXgp6MPTu8");
- a("mfSbU7w+3qbNT8auWCeOGIhenYQ2Shc3SCmSbeiiNChFRBGhcJf0m9072AK82Bzo/p5n+xmL9XmYCgF+M7bXM/M8M3s37x/qeC");
- a("nJB4yoOl429SDSAiLc40R9RDfsouQbgGJ9Rvu8mVgoQNGeznH3uIGFT4OxbJlS+nNQzowQnk/JXy8SCPX4Wv5u6H0jfp8u9olR");
- a("jFyoioL6fYOgKGIl99lTb7pSh2mq4yD1ENPcN8of3YREv5+3w7QD4VDYI+VHYOO5L86XSW3xjbqucL4E3OeFHj6NvBBnmHBRnA");
- a("PqiwKa/oV6svXr94mA1n2bdYpQaiEAP/NXn6v4NWEFpcozwqz6mAqbLZAl36iPj9RrZ9FvUF9Ss3WVIvX6KAD/UukjuZDsR9YH");
- a("AQWm1vfm+j4K+uxcj//B8ak1cJEm7cxVLq2GZM21Cxkx+FvzEEbTuF2n8+uQHFGU3pj/ZeZVBzj/aQBP/++w9K12ZuMr3KFMsb");
- a("KPen7AAuap5Pj8fpfv/2f93+CN1B6WkdjNI8h7qKw2J9jP+HV2E+7hGdkJ/qfMj/ebp6SV0OZ5W1/8+vP3YmNAmsDRQol8i40Y");
- a("oUqOC0UfkPf8vFnBz6fmXMjPX5I5+dBjoNhvG5FDaOtliJT88PqASHpr4siv5svl2vy0Y7zBfT95d+oV67Feqn+dHKsPquIhmJ");
- a("DdcbzA8xb+kMxDcd/JQ2V7f2k2h39nKwechMbPzhkpnov4EomJT0uuI1byXUAS0ubtsem9bIsirvqAyIBmvqe8zgZK5dlBzSuh");
- a("ji9kkHzPec+/TkA9cod0+xMRzf358Mo/U7DqXCZvS0DzHGysDW7oUNpAfCN/X8m3NgADjjCxv4WJ3qv93bfNdMuaikHp+6w7G1");
- a("eK+w7LSA6FfuBb6/p03N72+d0dPf8oEInvnN8xJAddPjmpcFqY/ulWKjvh+uiipP3/Rx7Qh9wt06SGKB3/ABGIYKZYhfxcrS/V");
- a("XfD2KruUxpVeX0LI/LHoiz2Gz7RdS6vTQBT+JjYmk8ZHfWHEggUfwW5qra9CQa8PFBUl6koUxW50JdqVuBMEQVDci+JO3Ii/QP");
- a("D+ANGiuHPRjTsXBcGNfqYTJ53EIQouDie5mXO+b85rQi7cu220iU5Gl9m6fH9NvVT/XkdcctVGxv7K62RofM6pkLdfy4bq//rp");
- a("7+IrP1Bbfu9y8sDZo1TYpNbtV3oTpYMd6GInetiF3diDvdiHA1jAQRzCYRwBbN/dzybnzh47cQYAqvz9nusK96HSwhVwF6ilA9");
- a("kVpxuNpWgMKT0X8oY4/fkbkPl4uQ5Yx8F8aV1u/bIalvVqhbX3uO4NpUPJMKKaQI3661TZrxKnf2tvCbwF55K4DoilDpZ2RSe1");
- a("e5bZa5vsvqCFgOgAma/0OlyKsOu9dV8vueRcFx3tW9n4NfjJ7Fl6/Wh2rX1UwK27qItDmFma9wpjVQnGoIHBdCUGkxUYjJdjsL");
- a("gMg2GIwaiOQS9AKLZCnFY4DnVrOVoTidbYR2vRQ4t5ao1ctBh/+Yr82g20p8vQnoRoj+toLwZoDyXaIx/tnkd/62f++g30pyH6");
- a("kzr64wD9RYn+0Ed/5KHfY7zExtm6tBYc1oJIcz3DD4lfJ35AfEl8cqFv+Y7PzfVxA/G0jngSIB5LxIs+4qGHeLQUcc8lzhriqB");
- a("wluRw5Dn5FXtWYjruZO50jXY9RgIg4EXEi4kTEka/ma/MBO/EjZRNFrPSxMql/lZ9z+JmvlH9A/pL8ffL3yJ/cRy7518h/Vco/");
- a("7zs6Adw6BTw9nuPUDNGkfZP2Tdo3ad+kvXw0zwv09YXy8pSxt8BFsEB2+XrqKq5mfadYklg+sTxiEa/npljzPVvs7x1ngeeUz2");
- a("eKfWPloPJi2pj3s77YrPtig4cNQ0pac9vTWBo4OobW2pvfx53zgLwAdKgtcaw08zoXgSuUrxeKMcns0/0nOg4asxrG+0tA6zLw");
- a("kLp63A2c/LXiodfqninnrJ/b8TWO9Xq5h+UL+Y76+174cRV4fI29cNXYT1LGS/XxKqOPK8R+003WPOXzDc2xMN/X+ljLOl3LXl");
- a("qrfIishxJe5+Nsn3lqZhSx8v5scy6ind7DTM7dBu5SXlD0Ws3fjFXm38xTee7KZ+R8jNSaG8aa1RKrRQz9U7OGjZxa54fGrMxb");
- a("LoHkvMnHohjT8pjZtcXmf2jzXSuZr+FP94GvlKeU/83FPIuVtubRzE3pvEqMeWa8E9jvy2fvn3r0j+8TQQ2B2AJaG/Vt1FLel+");
- a("I+hyWdVEfhkt/nWr5fjz0BvlPwVOe2eJ4W9b/mquzd2l7/lnOmYK96v6u63JJzM2f2s8V+npm2dl92v4Yu5W7NTzFm5Tn7yap5");
- a("hv4UhXH8eey9R4SQn+y9905GRNmrv1227E1WZEYoI1FSyi6RTVmFvEIo8YJIVrwQn64r7nPPPa5x69tzzv0959xznvOsc84vCx");
- a("rqxr/an0uf/w91ydtTDnl9/jDR9qZR9+Z18Vj4r5T4Gck1gOy8JHISnAF/kyNOvixyCNQDafgLXxHpCW5fTjtuzz42dVxKv+7h");
- a("/mtK2viT94ZITXD7eooYFuT8+cj58+Iba8X2T8/pZ8JNXCP0R1uvr8/6Za5ZJufZG895DHX6NrN//+38V98T2Qt6A0+/zn2StS");
- a("efDfr2uDZ/Pnhf5MsDkRFQu++y9UTbzqHB+lh9CKnb7xfNI0WJoeG7WI6H/UXkB0SeiRQDVYBLf517lGkm1mQZf21knobHt2+K");
- a("6Frh3FJYj0usrz4/dGfrL7LNJnl0y/e5LI3k0iZPrmXy5JB3k+H15gT/Lb5YP/jzfZDTVEMvTPlv4lbgI3NK0dCmvp+HcQZGPG");
- a("hNPGhNPGhNPGhNPGgdnF81iH83sIXc2AJ2wF6yTHgWmeocBGp98/HsKlfBCJDGl9o5ROLM0aieT+W3s+Ap+DGGgO/td75s4Riy");
- a("cqlsya3yBj6lPpD6VeovgTeXQf+S5OGai/uc1PiaJoWlCevRhPVowno0YT2asB5NgvWoF/PfdQuo1C2kcj6/OmVwhN9KFVZpCV");
- a("znJDFfuykqm4mcWpcsSv+0F56y1CtQf0Ld5zt+niORX6APldCHSsF+vE5sDlOKqeQuTg2auO6hb0SHYvHgE20LllDZA/Wdr1uf");
- a("nbOkykCwgbY/+F39v4DnPdgArB/wr/OflxPPtDYZnUqRE6Y5y9heTuU1KF7erGeQN+Qhb8gd5g3ud2lz98g7M5+ksc2ppPIc5K");
- a("/sX58V/L4bVAT+/NXK3dqD9VVRWyifwU+Bw1W+fzkf5WngNnXTV+q8YVxVlQugIvgxxsidRTiO8DdzPpuPPB774hu/2pg9nz1c");
- a("TeVLdZV2UBNnnDmFK2a65GN9xeNaKutrqyyGCs8j6Dbqe6BuuafX0891VLLqqqwEzvzJjtHa/tHoWPfUUzlVX6UeVHi2Qi9S7w");
- a("21srY+0q7h2AYq1RuyhtDYOtn44Gifl/ub8mAEffhi5U54ejVmHaFWz515q/f+Ktr3qiYqBZoyB2iatT4H74JmjAUqPCegK6iP");
- a("gP72/Ay+bM3RC6hz3MH5L2e/jLUk7WM5A20LtlCZAk3bZhb8r0A98CdrM6WlymdQBHj0LrW952+tsgacb2V1xb3m1dqotAC3ae");
- a("PjOwDPRdAbJOov1NrBprYqg9rRC1R4hkEXUK8IdbW3uVOR9uROHYiNtBGeXNR3UT/cLp0ele6osgocpo3wFKS8Edzu4J/vO3jy");
- a("dkKHoD6+2fBsAhWBkcsf2UezzipFuzAu+knT3vrgB7Qt2RV7gf7OPubAtx+0A+Ede0jt+YTfZ/vvI/znaUm5RuJdQthX+rzG87");
- a("2kcWeKSIb74QwyzyDzDDLPIPMMMs+Ea/ZH/Vt9iOQ33WJ56qn+KkMG4HegYdu/yJk8Z0uRceSiTc5w32XGMVil8RDGAXXFyp38");
- a("dh98BSnWw8rFm2vdHYYeD8feoT6+2fDcA/WA0w/0ifqB7iOQLXgDv/B0ozwaFAGRdg2i33nI7x/BYuDSGzPv1PFiX5ZKoZHYIN");
- a("Tl68s4fFmDUSpDwXnaKfXqlNeBYyApl7D+uNlo5j2GPmgjPBWoT6P+hLrnbt2ztuZdAvXcxdi81O9b3O/DfXtucrFcgdy+75vz");
- a("EivzECuJl7xHFvYcxanftyaxB52s0hEkfT+NH/Ddk5lyStl75BFSKwe3zdeI2fywGdj8TOwBmmZvux/eorPIx6B/8l+dJbR5Bu");
- a("oBMxfnWnyYTbyfo3IURGzD6HWjuSo9wHn4DjzLJgUp9wNjgC9+X+P3h2AKiMoqJ7LK4fSPLeZhc+DNr21+OTeysuoyX+UQeEKb");
- a("SExLabOzF6pkX0QusuB7j1nUC1A/v8DMzXx3LTynQT2QlLM5xx/KKPuP7y9ROQKeLP7e852lrP0yyrwL/BLlpaAi9fAeyH+/k+");
- a("W6twErVHaAc8B79mPjiD9ux3SwwiqVzGrkt1JT3b/9y51Mkj9X8GCNyrC1+F8gPPepT6e8B6o/c7d4ztHHf4cX1adcMb24s06l");
- a("73piGvR3/yE7CN+VjdgH9LsPXx74cP95rD//HL+ZfTyo9419swrBIoii8PnHLuxE7O7u7u7u7tYXxcbAwsDu7m7sBLuwu1FUDG");
- a("yszxjz2i8+uHA4Z3ZnZqd28i74md+b+Ik8kvk7bLWZ9jyLNCqgrMCol1/f5/Xp+Mo26Ot5du4xrB/AltE/GHO/WsNkGRdQC7CU");
- a("cOKqNDagAbgP4f4qXfZ8zsf/bj89LPvpYdhPZy+d8S03fnMzvuV+Z3NX7Zu+qu2EgDpP5l3jjXe9S2+Id2Vq2UT9ytln7qnM1Y");
- a("DAr/i/g78C0ygL+Ed7KzEjBFOEd3mKJp+nYCIe8Hw648HMgA4A3GoyK6DL4BXArbPcHzgnoCVAXDfwvwwtWFzj4HW488Gftxm/");
- a("B2yNE0/mUofz+GbgQFjGhWbv9+e9/sre5Qs/Vtl+3f5+af0QI5RiNALs18d41z6ifFPfWszabinpXOTrw9utZJL3G0RSu+tOtZ");
- a("YFtGpFQNtX4h93Htw70VoFRN3iDqC3LP1QTr3fp+/LswTOEWiLWWiLWWiLWWiLWbzN8VdpS7+GfZUN9CWrA98dh2JGDqbI5O3z");
- a("9Ab15+ybGHdBOeIQV87N9AlbiA83d1RnY0DJcJcF4sqFuxx6C8/NebkxVh/F/4GtxAn/yjyo3DbSsJ25wNZff8dI/DffQf8Hf6");
- a("zjd+cYrPMpv/iU3w/2v386xvqzI6u/jLg7oPngIPilNpcszNd20ub88eUexq69jF2wlS7bnuar78ewG/P3fqVvObQ/oIUH6I/g");
- a("H8+zf38f/fQh5seHiRv+9THYp5czdMOu+d6RgPYfpS+EfXnY8/vPx327XocfDyjFCdo++FG9WmHLn2TeBTaDH9o6G/P54acCug");
- a("nSgV/xX/90QBuBgDGf+uF8dsAZvk2QDvyqLUv2swFVAwI/8zsPPztBO/B1PVg2Kn688GyeWZynT7rAOgkW13E4Pe52cCB0EN7h");
- a("0n0Tx5Ev48h8iXUMyEc4cdW4GFBb3IcuGHX9t/aoRtsfciWgcyAf+O764V2/HfKLOYhfPzx6GFDfR6wtr76Pse5j1gug3Ad3uO");
- a("u0iRd8W7h/Na1Gv/jT+o3xOqCM4OKrX5urDMXvIlAOWOdYRvv9yubK6KP9/d+0ny8bxOkBEHg/nwCMFVH9vobvJ41+5+tvMG4w");
- a("p/T4vxjUfdXPY99OmGTEm+zdGJTrm34+dAinQ5GdyhHev9OzWWfOu3/+j1mO6E6jYxIA9nYvvzb3tdPaKpZT5/TkkzjftZdtRn");
- a("vx65XlP7ApJm/WM3st/+M22DCz01gQD/xof/M6zyNmcVoK/2r5DcT/mazUDfyjuLNkc6oPBH7kbzXPL4Ge4GfvzpPd6QAQ+OG4");
- a("/6n/NPdOvo43aC6nXmBpTvdL3+wV/MbM7TQV/p3xfThhLoF84FfeUzGPU38QAfzOe+7jP39e0gf/rK1swN910BNY43b2fE4jwB");
- a("pgPQ+X36kB6A+s55fePi/Ac/BNG7PW98Z4nqGg0ylwkTjMcwe+HWtf72ZhpyxFnGqCH+3FPuN5kaJOLYH3Z9nof65/Vq6pijtV");
- a("AfeKOfOd83j2HMQtYX179j7JFPxGLelUD/46nV/PE36WvrOlCFeaNgL7uH53vFhO+LugHPid8+juZZxugHjAp9+fDZr1U5Y+u5");
- a("zTevBV/f/CuvcX3L9kJ22nLXVVpy5gCvjRuUqCak6VwFL8BURc6H5gAbDifcn9MtWdOoIfxfuA50lr8P3C79o8XAN3D2DsNZvr");
- a("qlP4TVXTaRjs82rY5L5fNzQw1g2/sA7ZV8+pfH3eAX/0HzuMYjPGxiZMbMbY2Iyx1v+xpwjXu4FTO9hYh9pngA1+zD/ea/39by");
- a("F9E6ch4GJj36Z/3RYkfVPyB+4R/lfDXMJ/hmZ8v/CvzMcG4rdwc75V+LP52Nf/GprtYw3h0rWm34G/3mP35f9lGkKRhpDfpCF8");
- a("W6eZ4FAbH4+3dY7u3V/lPxT5h438DG3vlLoD6YLf/w8SBhuG0NgwfLbH8dV5nGkzQB5+kX9sc9DB3tf3+Qm8K+uglHUQytpR1g");
- a("HK+gBl/cG2Hv0+hl8vg9zdndr3os11+7YP/2ptaX7P1j3fdu3/Dez+8f3/q+GUDJvfZEff5jM0+QxFPmlbpNt/0+Z56RHD7vzr");
- a("fOPHumd8v38exydb38//JzJtfQeNcHo2kvELNuwuzDB9RzldG0MY+Lv1++Crf4TGOm0cx/wP/tUwecczl51Amxj362Fe47/0JP");
- a("oS+FfDHMR/xCn0yXAgJnXaLPj7ev1szzgQLaSiNQuqaPQv0ahr4jDPzO26+cH/0l7/yhm+/X/2z+2X5jltBflA4Ed2qnyT+n/9");
- a("k1eEaFJJUG1WENWDe4F66GFwquhSM3Q6uBYYhq4HnwRj0Rfh+2ADWjGksGAH+l4cKUxc6RA6ApwEnESXiydNBhfRU+FE8aXb6H");
- a("RwLfAQXQ8eCV6gp8L7QdDZQXQIvgHCou/BIRNIUdAR4PggNvoi/Cwh8aKVSMoGUqHzwUUS40aXg3uDYuhh8BpQDn0RHpaEckDD");
- a("iplUaoSOBzcD7dDt4KGgK3opnCyZ1Ac9FV4LBqPvwdGSkwd0PHgamIheCqdPIS1E54ODpaTc0BHgBqmlXeh2cJuM0tG3Gt4IXq");
- a("C3wFczUQ5ziB9elZXsobfAM3JKpdBL4au5pE7oe3CRPKQNXQ5Ok1eaiU4HBy0orUTnKySlLiKdRaeDN4Pb6C3wLfAQfQ+uVZQ0");
- a("oOvBM0HQubwLPgnCoi/C8YpRF2hYpUA8dDn4EUiGVnHKoyRli54Kbwet0IfgmWVJM3opvAesRB+Cw5SnfNAR4ErgHroefBK8QF");
- a("+Ey1QgDfN4F/wYxECronQaJENfhINUkgqhI8CbQCn0FnhZZer0rYZDVpV6oiPADcEwdDt4CpiIngoXrkZa0eXgcNVJJ7odfAzs");
- a("QF+Em9ag7tDt4OQ1aa/odHAJ8BRdDk5bW9J87sOtQDZ0uzcM3Xl0HVMAgPFBUU4x59hqf/ateAiKYFAEwaAogociKAZFUIy9Kh");
- a("gURfHsRfEQVBtMq6gqXq0Rxdhjf4i9lt8f3/m+pmky986997VNOuU5GKYbvPjhxqxDPhttOuXoCPdUR3wMxuuEv8ZE3eCNK65T");
- a("l/kiTNYZP4gpusZbeSZKriOegT5d57ajXKeu8AwMfMjb+cSj3V+d8M0o6Sr/gCG6wfM9wqxJB8f4u3NEOuYz0KJT/hOxDo41Vo");
- a("zQMXegolP+F+06OM5+QofOeC7G6oLXaTd2XeZ2VHXCjxxvvLrGs5HrOj9/gv2lc17sRNeqQ95slPU82Tzw/Qh1jd85zRh1wX+h");
- a("SQen+zho1jlPGO180FV+DKN0znMxWsdnGC/G6OBMaxWZjvlCTNQZv3uO7+nWBS9+rjNTh7w9enTEV6DQGXfjO53zx+jXBa88xr");
- a("h0iZ/CwIe9D/+D9XRwXhCsiSad8e7nG4uO+WS06oQHXmDt6ZAfRruu8ZgUuso5Mp3zB5igSxe6d6hq/wdPsNrF9ogucYI5usbP");
- a("XGJcOucDLnVm6Qr/hH4dXGb9YMAjfi1/jEG64Lsvd190nRcdayw65I0R6TLvghYd8/WIdZV/RZsOrnBOoF2XeAckOuIj0KEr3I");
- a("lUZ7zEOGtPh/wQMl3jAVe6jzrk9XGPLvPumKxjPh1dOuW70a1r/BZm6oL/wBwddPqncXhbl3gzzNMR74fPdYVPw3c65evQr6s8");
- a("FfN1zgte5foedW28CdbTZY5R1jEfhaE64QyRzvgutOgaz0Cs6/wpRugGL3i1PatDXgPtusy7ItExH4UOnfBFSHXGd2GsrvEcZL");
- a("rO32GCDq+xNjJrSVf4OUzWdW691hzqmDe6zn7RZW673lzpCl8x3lzpjBe8wWuHDvkiBDVv5wVvtN91dpN1NMG60hF3Yj2d84o3");
- a("+zld4osQ6YwfRauu8e8YroNbfB/Era5DR7zjbc4HHfOxSHTCl6NDZzwbqa7zgbf73LrCt2CCrvKrqOo6r3mHedBlXrRqXekSj0");
- a("CPrvAldzkrdMZP4Dud82fo1w1e4m7rRIe8BgY85mPyThikYz4Ky+iEL8LKOuO7sJau8QwM0XX+FE26wTve42zRMfegRVfutZcR");
- a("64J3v89c6ZjvR7sueN37zZXOecQkZ46u8C0Yq6vch0w3+LYH7EFd5esednt1lR9/xP7SOS9Vs6d0yKfgc53wNDR0zos8Zk50yP");
- a("dhwOPGyLs8bp3omN9BSRdcesI+0hyciGadcA0tmoPvMFw3eOku49UxX46ROuPfnvTaoYOn/H4Pqc55m6etBx3xAxiva7z8FOPV");
- a("JT72GWeOTvioqT63TvhjTNEFh9Oc1zrkLTFLR7wf6rrCp6FHp3wdCl3lx9Gnc34TDV3wz/hDB93OKwRPuB7eDAN1xOMR6io/jp");
- a("V1zm9iLV3wzxiig2d9HDTpEm+GZh3xfhimK3waWnXK12G4rvLjaNM5v4mRuuAlnzO3OuQ9MFrHfCtSXeVedOqCl3jevtNl7kJV");
- a("5/w7Jusgd16iS0d8B7p1lb/CLN3gI6abW13hVWeYW13iZvyhI94fQZf34dMxUKd8PUJd5RcxWNf5M5R0gxd/wRmlQ14TZV3mnT");
- a("FUx3wkIp3wC2jRdS7PtNc0B3ugQ8f8AlJd528wSTf46BetK53whejRGd+JQtd4Ovp0nT9BQzd4gZeMV4c8AcGTxsXTEeo6f4XB");
- a("usGLvmyMOuRzsZ5O+VY06So/hmad81wM0wX/hFYdzPLnLwzXJd4UbTribLa1oTN+EKN0jV/DaF3nbzBGNzh61XmqIz4Mk3SFz0");
- a("JNp3wjpugqT0Wucx47x6XojCehX9f42NecM7rKb2PQU66fz3vdeatTnoaSznnQG+ZBh9w51/3TGT+BSOfcQIvmoPVNZ6yOeZe3");
- a("nKE65j6M1A3e6W1j1zGfgDE64S5conPufMd164xPetd4dcLT0K1zPvw9Z6yucD/m6KAnCK7GPJ3xo+jTNe5437XqlA/stTZ0hc");
- a("/BgKe9nVeaZ8y6xFejWWf8L1p18KE9izZd8C0fWc+6wcHH7qNOeBzG6IzvwiW6xjPQqeNP/Bn8U+eUDvmzz4xXN7jzc2PUGYdf");
- a("uo865B706YI3+MqYdYUzzNcZz/zaWKZYS3zmN8aiU2771hmoK1xDWbMXCXtWB5wh0hnPw3Bd8JDv/Xpd5rMwUqec/uA+6hrP+N");
- a("H86jrPbfg5XfBGPxuPLnM7qjrhPkzSDV7nF2tYl/lR5LrGX/Ubu27wm7+7Jl3w338auw7+Mg8Y+Ixx8cS/zZeu8XQM1nX+BCXd");
- a("4CXnW8865NVR1mVuwVAd85GIdMIXokVnfCdiXePpGKHr/AkqusED/zFOHXKKRKd8LVJd5dK/9qfmoIrxmoMnUNU5v4VJuuDgP/");
- a("dMB7wSpugSb4FcR3wDZukqh4F/E6dDvsLXbD/XGYcL+nrGVG/nOzFY1/hAz0Qp6wqfg1ad8vsYrgte39esR+sy74NUx3wKxuqE");
- a("r0amM/Z3uMEEHfLamKTL/ANqusGLe/5JXYf8m2eg9GhfaAp2wcBproF/wTI6Wsz3iqGkMz5pcd9PpxOejkjX+U+06sBzSrbGcB");
- a("3xVFR0zr1IdMHHeW5Jh054V88a6dIxP4C3dc69KHTBf6FPB6E583yShubgWqzVbT75FZR1nf/DUB145sgQRLrMG3iGSIsu8/7o");
- a("0BU+A6lOuYqxmoPHkOmc91/G3OoKX4opOuMnkeucz/cMkVk64yfR0DkvtNwCwR865J0x+Fnj5XNR0ikvvLy51SHvgCYd8XFo1g");
- a("nnaNE5Nw02zzria1HRVf4Ao3TBy6xgjLrENyDVVR644gJBpw55HMbrnIetZPw65nMwWaf8ELp0jV9Eruu8+8rGqyu86irunS7x");
- a("A+jXNT5v1QX8Yc7H4dbVXJOOOcd6mm1OY9QBb4UWHfE4xDrjP9Cmg9WtMYzUES+3hnWlS7wbMh3zq5ig6/wDpugGD1zT59Yh74");
- a("NZOuZjUdcJv4seXfCpa9nLusaz0dB1/gZ/6AZfuLYxPO99ePl1rENd4m3QrCP+GMN0wb9itA7WdSZgjK5xuJ61p0NeG5mOeBQm");
- a("6ITX3MA90mU+Dz065eM2tEd0wud7Jsd8nfItCHP3nadisM75/o2sPV3jjxHrgpfa2DzrkDdAuy7zM0h0ztdt4pp1lb/ARN3g9c");
- a("vOHF3mPdClYz4B3TrhHs/hmKkL7sd8HWzmujBgunnjbTBIR7zt5taMjng4huoK34BIV3nbJmtGR3wIOnSFT9rCmtcJT0RVV/kN");
- a("TNJ1Xm5LZ6Mu8c7o1jFvsZXr1BEfgvm6whdjwAxrkm8Y6jp1laeiWee8/NbutS5xO9p1wuMwWme8/jbmUJd5D0zSMS+2revRIW");
- a("+OeTriFZqtQ13iFMu84P5yN0o6514M0QU/tJ0zQtd4JkbqOn+DUbrBu2/venTMJ2C8TnguJuqC+9GtA8+MWBEzdYm3wRwdcWdk");
- a("7+uMH8SAmT4v92KQLvjhnVyzrvFsDNN1/gatusHVnd1jzcFUXKJzHjzM59Al3gaTdcR3okvXeCbe1nX+BfN0sIvzZFfzpiO+GC");
- a("u/6Dp52xavHTriQ9CmK/w0Ruqcm3a3H3XMLyPTdV5zD/tRl/lfVHWwp33R6t7pKk/DTJ3zBXuZK53yI5ina/wdPtcNXn5vP9Yl");
- a("Phz9OuXJCF7y/rzGPuZTl/l8DNYpz4iNRdf5P5R1sO8CwQEYqiv8GYbpBpf3s981B+9jhC74xv2NXVf5PSS64KWGW6s65Ntwia");
- a("7y9AOsGV3n9Q90xuoyX4+Zusr/oK6Dg1wL5umIj8LnOuFx+E5n3DHC2HXKt6D0srHzKgd7vdAl/h5NusHdh9j7Oud1DnUfdZlH");
- a("YpROeBxG64z3bTMWXeHFD7PvdMhHYpZO+CG8rWv8AQpd8LKHO2N1iS9Gv874YczXNV7vCOt/lmvgvbCWjvkrDNENXrxizeuQN8");
- a("JwXebRaNMpT0KnrvHCR5pnHfKe6NIxP4puXfCmR1ljOuKj0aMT3vBo169j7sKgV8wV92KwLvi5keZZ59yLWBf8F0bo4BjPZvKc");
- a("gorOeC7G64LHHGf965QfRU3XuAfdOmj3e0vM1DGfhLpO+Cr06IzfRqELXut486zL3ImGzvghzNc1fhUDZlt73IdBusHTTnDO6I");
- a("L/RkmXT/RvHLCezrkXQ3XB8SivIzrm7U/yY13hLU82Xh3xkejQCY9DqjPe+xTng465OXHPdMRHY4pO+EnkOudVT3WPdIkPR4+u");
- a("8Gf4XDd45dP8vkJHPA0DXvVrec3TvY7rMqdYWaf8HIbonFccbVy6xHuiRcd8LmKd8cJnuKc65I3Qrst8wJn2u67weZioU97Qsw");
- a("Lu0WXeC3N0zIt0uGc65IsxYI6Pz8+cbf51zr1o0gUn55gjnfAEjNJV/gGjdYMXP9e60iG/iYm64EFj7E0d8kuo6zpPOM9c6SpP");
- a("xYDXfF7uxSBd8OoXuB5d5j3QomOejVjX+c3U9emC/0GHDi505iDVJd4OY3XET13stUDX+c9L3EcdXOpcRaE5OAR9usJXoqEzzv");
- a("GHznn2Zc72130c3utya1XHfC6G6JRvR5Ou8pNo1jn3YpgueJ8rnCc65mMwVifchUznPBcTdcF/4x4djDNGTNYlbkaXjniJK+1f");
- a("HfK2mKUjHo66rvCp6NEpX4tCV3kq+nTOl3Yau874L5Te8Hmv8iwVDNEV7sVQXfA6VxuXLvOZiHXKd6NN1/iYa5zvOuFxGKszfu");
- a("9a49UFb3+dseiI17revOsy74F5Ov6fYrsMlSKKAyg+dhfYhYKFCDY2dtfY3S12K7aiomJ3C3aLLWI3drfPbjGx4zcfDucg+9y7");
- a("996dh8KfV+Kp3sZnkfCSs+Ccc3zXdAGuMNf+65DXo6HexqfRVl/il+iqP3DKee6SjlwYQ3Q53o3R+jA/wQz9gTfOd4/1Nj6L4/");
- a("oSf8Y5HZhXX7zQd02v4BNIeNlrOMki76dT8jmk15c49mJ7q1Py3mXWrw9zDAboyMFyz24deSDG69H8FzN0sMLzBKt0Nt6ATXob");
- a("n8U1fYlbrLSfui3/QNwrftZsdyGk1OW4A9LrPnxprTugIw9f5+z0aF6GOXoFz17vrkbNCTa4hzolD8dpPZpf4pr+wG02+my6Lf");
- a("/AWx1sspcIrnovLrjZenQ5bozMui33Rw49mnchnz7Mh7bZt6j5LzrqYLu/Y5dnl2az1H7f6ch7cEAf5soHvLcOuTuCa17Dh5FQ");
- a("R/6KlDowJ93tsP3RfXgJ+ugV/PKI+6M/cOajzkJn4/zHnIUuwC1xTbflccedhZ7B25DwuvPifye8lw5O+n8S5NGX+Mcp33kdnP");
- a("bsQiUduTVq6bY8Aw115DNoqS/xnTP2RMdw9bPujw65M2boPrwgQq/g/VihD/NSs8rr9ArejXv6MF/FUx3DH/FWB+f8ux5fdMhj");
- a("ENywHj6PhPoSxznvOa9Tcl1k1iGPRx49gzeggN7GRy945uhLPP2i77KewUUuOV9djqdhiJ7BGzBeb+MGZpGn6rb8HAf0B65yxf");
- a("3UIa/BNb2NzyJGX+In15yr/sAZrjuXm86UVyG93sZ3kEfHcJUb1qxDbn7Teem2vA8t9WGOQVcdOc4t90en5LMYoi9xrtvOQhfg");
- a("GlilQ/6HTTq44/uOazobX8U9HcPBXd/rW17DOZFUF+AaSK9Dvo9sOoajed9yOnJGVNPZuDtC3YcnY4CewTcxXMdwx/vuie7D17");
- a("BNx3C9B55lui33wnHdhxfhnF7B0YzuNR35JOLe9tk5eYx91il55CNr1qO56GNr0+W4KxrqPjwDLXXkHeioD3MMeujIwRPr15Gz");
- a("YbiOXA7jdeTmmKrbcoKnnm86JVfEXh3yNBzWM7jWM/dHh3zlt2eljuHgjzXficPeK0JHLoc8OoY/ooAO/rrDKK7L8V2U0zH8Ew");
- a("118M/nRksdcneM1n34JCbpSzwyMJejR/MyHNcr+A/OaQO1QTbc0pGvIEbHcIrYZpl0Si6LD7oc/8J3Hc3SZkRw189y6rjmHaLm");
- a("TSitt/F9hDqGf6KpjgZbq8Y3d6FDnoNJegX/NB87Qwep/TmO6xVcOo0163K8Ftf0Nv6MezpIGzuojqc65G94q4N01okvOhuvM8");
- a("/6W2/jm8h2z9r4D/LowNzr3oLmL/Rh3lgotvvu9fwG4/UHzl84djBVF+CxmKNn8Cqs0Nv4EdbpD1y5iLPQIffHAT2aX+G4/sBZ");
- a("i5oh0dm4JG7pcrwBMXobn0fc+86Xc5tVTaoLcHnk0yH3RBHdhz8Ws3c6mlfNgrY6Gw9GVz2al2KSXsHfMEMHJbwe23Q2jsFeHT");
- a("lzSXuus3ElPNVt+SXe6g+8pZR7orfxZcR94Gd5UWlr1it4P4row1ywjHXqctwcHXVbjmXWs4dOyXmxRBfg5VilV/B+nNOHuV1Z");
- a("d0OP5kWI+9Br+DuSapc4OIoC+hLPKu9+6hU8q4KzjpqvYYaO4Z9YoIOK7j9WRF0pdjAI1/QK3lbZPujInavYB92H5yJpjLXxoK");
- a("q+J3o0r0YRfYkzVfPZdQHuikp6Bt9CqD9wYjOVLXVK7oqOug/nreHsdAFuhHW6LQ/DNj2ac9d0droAt8U9PYOv4amO4fy1rFkX");
- a("4Mn4olfwfvzWhzl9bfv5yLlzZeTRIfdFAT2aU5l9LK6zcXn00CHHN+s4QKfkhlil2/IubNKH+aQ5yJ36EverZ316NM+qb516Bf");
- a("dr4Cz1aO7c0DPnsX3grI2sT2fjno2tTffhJSiuV/BBlNOH+Tmq6Q+8oYl91tv4LProS7zbrOIQfZhHNrO3ejQvwmm9gic3953V");
- a("M3gDgif+Hq7Wwtp0yL1RRPfhv62ctQ5bW39b76v78CS01TN4A7rqbdylnfXoPjwbC/QKXtEeOnLRDvZKl+NhuKdH81o81dv4Hd");
- a("7qD1y7oz3UIa9C8NRr+AES6hhO3sl8jk7JDZFet+W+yKZH8x7k0Yf5KoroGP6J0jow97cVlfQ2fowh+gMn7mK2U6fkZZikV/B+");
- a("7NSHuU5Xz0kdcne81H24RTe/j3RbHoH0z6yHm/e0Nt2WR6GhHs3xevnu6JR8CR115NfooT/w/t7upz7Ml7FEx/DRPvZIX+Lsfd");
- a("1VXYAbYKduyzX6WacOOVl/69QpeSISPnem/B4p9QeuM8CadcgbkU1v4+QD7adOyZVRQIc8CcX1DD6Ecvowf0I1HQwya4tQZ+MS");
- a("aKrL8Xa01X0Ge5YOca90Si6MAXobJxoaOxiuU/IrjNcfuNgIv+N0Ob6KdTqG44z0PNEpeYo5vcN6Bi/BW72C3+OL/sATxnqG6B");
- a("k8c5zn4Qvvyz3+s1v3vAxFcQDG6+UDGMQgTdyhG0OFUaJJV0MtImLoILFWYjJVgkjjpQiplrjES5n6EYiRoYsQi8tUYiAxivj1");
- a("e/QmT55naXL/555z0iWz6xz3Lts/OuAXjOiIkyvtsTHd9DgmdZbnkdV5XiyYSxf5ZM29rWt8g6qu8ytq+ou/172/jm3Yq7hv9q");
- a("a7GZEOeBoNneU5/Og87xXNokP+2/JNG3677d5DQgecxoDOcHzXXDrgNGZ0httK5tddPISSTvHjvnOtI+4oezfdxZWKM65DvkXs");
- a("3Vw8e2iP6RzvYFiH3H9kDXWS746tj67z6Klzp1O8cOZ/i85z4dze1kV+xrWOuOfCO+iAJ/Ck6xyrult006v41EU+wK8O+Q2dH9");
- a("ac+y59dx3wILp1iqcQ11l+QEJHXL6yt3XraT3/7MitSwMBAMbhQw6DGBYWRNRkGgYxiJhMi7JgEDEaLl0WkWEyH5dFjg38OD8Q");
- a("kywtikFMC8ZhWhCjXPLgHlzZn7C3PC+/6cxaWfj/aw9hEHXD4Lczbstlq12FwUJ33BplWy/bpJ3pCTt8Yp8fHPKHM9eVdTa4wz");
- a("1GbDPlJXO+8I2fHLHg/E3lIte4zRYPGfOE50x5wZw9vnLAIUcsOHdbucQNNnnAmKdMmPGRPQ74zdm8coVb3OURY7aZ8p59vvOL");
- a("Bet3lavcZJP7jHjMhBmf/wSlj0DpG1D6FZT+A6U51kDjE0rrgGkEcILyw6B0Gpp8DZTfBaXnQOl1UHoPlD4Hpe9A6XdQmmkty2");
- a("i+GM0Xo/kCR75AAPfUkuCSFI/EvJScVCjfOT+vGEA31e62DcPAvJrnuliAeDFqY/6t2NdUgywZFFXUe/pJFoUlQfpLvCPFj6Pk");
- a("DFo378xgfCR/KxOQ/SfluSFylLz9A35T2qP5mrCydjYxzZfmjtwE70s9RRzWo313Vam4LLGDk7YoTCCCLfeO8x07fBDUHMlnsa");
- a("mH6BXUYnG05bg4UDB41Qa/1BIL3bK7AJkbSfMeJZnEPNTGeYnLcydH57RlFCUaO5/fE12U3TxjSYNGfHIqTnghRdso/tRkNc+U");
- a("2z68EiARCTlaFLfRp67Yb9QElVsb7zZ1DrwGrjvJem7aYhdRfkKtiUlnZYybxE4VZcc7LbbQ0erL5kv1rH3Zq6B9ukkZySFIsv");
- a("QGWNMZ/Ao7y5WkrQ/LTb4BtGh7W2JUmqMKvbbXOOTlDybOOueIjrQjzbLde+7xvUiN8wr7Hx39Cy7hegV1BA/LZUo0nxFVh9wl");
- a("eIdlx8U+Ws1aGf0XNUUrDtxjkkf/AgN+wjeWQY900gvqE0/4gbZvrrTBsP6xMQY36hn1h6LIFnNwxS9/tqq7+9+d8Rv/I6OMeh");
- a("UGYSjsX8PtmtyEp+udeybamUUF0o3M/XuPtCTiHs9HCxR6em9cnBMT8EzPWZgN4ZbiIfl8Gm7Aq0afRljX3Tu/jP4iTMXPM9eX");
- a("HnixkPhM/2ukyexqmq23pdb5a3JXXTlgu7Jiao3RYtRLheR/wS+EoRDtwFvRxVuqizt7bBuWqR0Zrxp4NcpPxBPKlpMwmqJjOs");
- a("6MLiwRub1JBphW0gD4i2OFdV6/yVMC077VZwdLDMixJhLTTcQtDQ6/a5vfNte+inflKEs+s+xhQaL/aBOls2UfpFL0TRcj8T4N");
- a("Q79TYsNSEY1BwleGqTIqJevVTHzJNxXojuRiBiRXgEqJ7NSivNQcYyO9lJwcBmAqTSwtgXJKgR6HMocp0NjAAj7bhwmKTYB8Gy");
- a("B2AeJgf58w1yCw78FnwASIActvoHgYSA80XPNzylKLQNmLAcwMKK2qykk1NGUYBQBm7I7vcSAKw/iDweJgMVgMFgMLxWBhIVgM");
- a("LBSDhYXgmZfMnJnMSzCwUFgYLAYWisHCAwMLO9vffog9X+H6H7n/45vzrpkD7oDAHkqooIYTNHCBKwyAMMMCd4jwgBWesMEn/A");
- a("ZCj/QLbehXeqHfaE+/U6CWLvQnfdBfdKOf9MDPvFJHVauTatRZXVWvZrWou4rqoVb1VJt6qaQ+sMAdEtxjiQc8YYNnbPGCHV6x");
- a("xxsOCDjjD4z4woQfutA7TXStT7rRZ93qi+70Vff6pgcNGvWsF33XUT/0qp960y+d9IcpzM4QszelOZjKHE1tTqYxZ9Oai+nM1f");
- a("TmZgYDBs3dHKZ26qZ+GiaclilO67RNaSossaWtbG0b29rO9nawaBcb7Wo3m2zhiCtd5WrXuNZ1rneDQ7e46Fa3ueQKT3zpK1/7");
- a("xre+870fPPrFR7/6zSdfBBLKUIU6NKENXejDEDAsIYY1bCGF3Omed9f8lAWQf5UaaKGD/l1pgQhrrpOgoISWtKJ17tPSLtcZKO");
- a("Y2ka65TKIFI6xkFatZw1rWsZ4NDNnCIlvZxhIrOOElr3jNG97yjvd84MgXHvnKN554IYgoRSVq0YhWdKIXg0CxiChWsYkkipGM");
- a("h7EajyOO83gf47iOz/E1prGQO7mXpazkUZ5kI1t5kVfZy0GCnOUio3zIp9xkkh9qp4gq1eGvoLefi+qyoJsChW9F2dBbUPbz1n");
- a("PACuvsJ+t52/lDmd3yyAmGURgmqaEOuRKJRK5EIpErkUjkJDUkNUjkypev7bvDpxyJRCJHIpHIyp59OJmk2512+w/Iw3XumcxQ");
- a("yCd8iAy6EBWHCYoYzxeYWM7X83rezz/PRmM1D43duM1j4zVB89SETQwvSZNBjGpGmJmaBWrWZocbo7Ugx25d2PHaAHrCNoafpM");
- a("0gSLUjDE3tAkVru8OR0VmQZHcuLHldAE1hF8NT0mUQpboRpqZugaq12+HK6C3IsnsXtrw+gK6wj+Er6TMIU/3S770FW/bgQpc3");
- a("BPAVDjGEJUMGY2oYoWwaFjhbh/1N2oLf/d+Cro4iuLDmSRFCFcNbojKIU0cXWIUd7ozcgjw7d2HPywPoC/MY/pI8g0CVjzA45Q");
- a("sUrvkOh0ZhQaJduLDoFQE0hkUMj0mRQaQqRpicigUq12KHS6O0INMuXdj0ygA6wzKGz6TMIFSVI4xO5QKla7nDqVFZkGpXLqx6");
- a("VQCtYRXDa1JlEKuqEWanaoHatdrh1qgtyLVpN6if6rCO61Od1Fn9XCtYvkDzctNsvNhw7MMwbrXifw3czFSs6HE1KWmJK624js");
- a("PL+LxNxOukucJlNtzDLJzbJSLeIuU1dDHKJTZewi6TSuH5Vzz519rBs36rv8tzRthK9pfSPkplT+iqRlkvekJbF33Vq97YWPv1");
- a("8dXDdu6vxpSW+u/rybXM5wVbMbEUV/YRcSEpN6JlJVfZxwNW4XMXEZeRchuTrMLoHK7B5x4iLiLtNLYwo6/HBhyuwOcOIiwhQ2");
- a("XHfkFhjcEcjiU43IIvazjJDi7Qvx3+d/wfj84a6v3bjGA/VZrmN6o36R7vF282EetTvtG4SeUOnftFJG9VU/ZG2yZ1O/TtU3hE");
- a("4ymUa/ie0eDDtUPZPm1H1J3Ct4aMudrg+jDtULVP1xFlp7StoXuG600a7UqhfWl0KJU+SaczKbWWVk8v15cdpX74YbPSgXQ6kl");
- a("In0upnqfU/P/Uh0tP+H5/91Ck2N3FpfUKmITX30PHonk7WfEPL34w6KLkvSlPWe2a/NxbcRMNdURq3qcjU7PbMcm9st8l6i1V+");
- a("D1CdhtHl1muzv6OV3U6PcovbSz/1m8iF2Vu9I/Y7ZcE1Gz6z4nRs4L/eLx859lnziD1PWfTbd70PhD9KtU55Bt2aLZ9Z87vW77");
- a("WMbZ//dwMs/VyuWIF5zz/7rln4mY2XNcgSsIHf9bPtM+u+se+/2juz0JnCMIwfBh1ZGkVOpCypIcufLCdLja1EMrZMoZALW7IU");
- a("QvYsyXYhU8I5M2dmzpnvnBmKsu9ZUxPRlCXhYkppkCX7872+rN98thsX5mbu3+f3PO/zfk0N94LBGws5Ik4+SIB83lNK1FQq1F");
- a("V0aiutqa+YEi+4nH+Qryae2u73qQzued81/6DrRqnLrPyRe9FjdNFkIqLLDGUxRVqTK+AG3mZMSVb/xBGKDN9H7qgEv+OJi0j0");
- a("Uv4evFGRJPtkcof1vR/C/Leof+eHMFI+Tns7oeA/StSvVHJuEtuLQbMrmstF0V3Kor3oToToBtcKoj917biC5jDxG5NluCBZI3");
- a("qjyux+RfSaKl4/sxpV0QpKOaE1RKc8o0tEqKFg8hRbV9iC3DtZuAB9nxfe8fuodUg7AH0Nq7PVE4pOs2ZDyx3WbusQ6Vex6tmN");
- a("oV8/ezA0nG8vQZZ59n6oeMt+AP3qJ5vwu4jU24iU2p88DN1qIZE6pLohi5YhfdKpADrdTj2EQhGkzgxnHvJmp7MXulx1bkCP9l");
- a("BjRHoc9utG6HA//RQbtUWmLfJjRGYcEmR9ZiumfwfJUTfbCIkxJDsCc1+RXY95H86exo58mf2QNdyebn+kwyJ3BWZ80D2OJHjq");
- a("vnF1r43XAfOd6E3DdDd7OzDVx9573DBdcr1wvSzILcUkg9xBeP1R7hk6WEfWHVPciJmdZpew016w9+hcXf3e1LngWe5WhU9X0t");
- a("VxKihX3V7TyZ+uwpEx2ljbZDuqJqRN/KprmeTExYpd1Jo69GS0ZlwV0l2k0wYaqtg5lSR3YI1stwg3lsiDhmK7nCIHaopm5ZIH");
- a("y2mxQyStahv5sKjYIYvJiYcUvWm66ErfNnh6JUFbing1XpycmPirTREhL06XbATRk7AXIuhIMcVOeOVzwsyvs1/ctK64asvEV0");
- a("SR/UXiKyzau6wNHSK+6L0kGtIWg63qOW9xwsCWaPCSC20DEXZR0W/mEmH7FD0mToQlZAkvLtShxNcGSbrzq1THXVpDfM1VtBVD");
- a("dJRqGX/vF1K+THxFFL2kSISFKePlb3CniDBN8dK2T9yH1buHxekCV7p4O+Fkmd/ciduIraKyYcgpK1GOGX/cMUxxM1Zv3VospA");
- a("3+hZ6RoIQrfbkgFS8EkqwDkZxG84/6dYxyb1uV3qG+L/eB0Fd0V5pgUn5LEp/fNmjKPrz5EaGuokHHspjd5JBm4WtKbiaosXIe");
- a("culJrhZrwtqwbmwAG8WmsHlsFduOLDrCzrMSJdAg0DHLX4D82eWnkDxX/OvooW/9OqCjZ9AfVMwJFoIGJ/DROW8HD5E3zfKtsM");
- a("eG58eAg2X5tdD/YP44dH+af42c6VToAb1nFOYhXfYUMlD7ZuEuV3luSDvH/6vFag5th1mjoelSaw009a0DVpG2lW63tNtBz5H2");
- a("eOgIDaHfGfsydtQL+71tJLskeyE/piZnQjmoBsUuJ69BqzqphlBoYGoYttPy1DrspKOps1Ao7LSFGmOcCdBhvbMVbfCkcwE58d");
- a("L5gBbYPd0HaixIL4UKJ9LnkQu4YDD77pm+mPvUzCz0v9HeBLh1tbcJPuU/SAppY/GFDUBOnay4lHVW22/gG+TDmL8e6X6MXr6b");
- a("wnWjgknCaZz5kNYUX9iQlGM8tbT/n3/68xHeVZKEADYEAA==");
+ var shift = (11 - Hole[n]) * 4;
+ var a = State[n] & (0xFUL << shift);
+ Hole[n + 1] = Hole[n] + 4;
+ State[n + 1] = State[n] - a + (a << 16);
+ Move[n + 1] = 'd';
+ Cost[n + 1] = Cost[n] + (RowIndex[a >> shift] <= Hole[n] / 4 ? 0 : 1);
+ }
+
+ void Up()
+ {
+ var shift = (19 - Hole[n]) * 4;
+ var a = State[n] & (0xFUL << shift);
+ Hole[n + 1] = Hole[n] - 4;
+ State[n + 1] = State[n] - a + (a >> 16);
+ Move[n + 1] = 'u';
+ Cost[n + 1] = Cost[n] + (RowIndex[a >> shift] >= Hole[n] / 4 ? 0 : 1);
+ }
+
+ void Right()
+ {
+ var shift = (14 - Hole[n]) * 4;
+ var a = State[n] & (0xFUL << shift);
+ Hole[n + 1] = Hole[n] + 1;
+ State[n + 1] = State[n] - a + (a << 4);
+ Move[n + 1] = 'r';
+ Cost[n + 1] = Cost[n] + (ColIndex[a >> shift] <= Hole[n] % 4 ? 0 : 1);
+ }
+
+ void Left()
+ {
+ int shift = (16 - Hole[n]) * 4;
+ ulong a = State[n] & (0xFUL << shift);
+ Hole[n + 1] = Hole[n] - 1;
+ State[n + 1] = State[n] - a + (a >> 4);
+ Move[n + 1] = 'l';
+ Cost[n + 1] = Cost[n] + (ColIndex[a >> shift] >= Hole[n] % 4 ? 0 : 1);
+ }
+
+ public FifteenSolver(int n, ulong g)
+ {
+ Hole[0] = n;
+ State[0] = g;
+ }
+
+ public void Solve()
+ {
+ for (; !Scan(); ++maxCost)
+ ;
}
}
diff --git a/Task/15-puzzle-solver/JavaScript/15-puzzle-solver.js b/Task/15-puzzle-solver/JavaScript/15-puzzle-solver.js
new file mode 100644
index 0000000000..1904d1d75b
--- /dev/null
+++ b/Task/15-puzzle-solver/JavaScript/15-puzzle-solver.js
@@ -0,0 +1,97 @@
+class FifteenSolver {
+ constructor(n, g) {
+ this.Nr = [3,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3];
+ this.Nc = [3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2];
+ this.n = 0;
+ this._n = 0;
+ this.N0 = new Array(100).fill(0);
+ this.N3 = new Array(100).fill('');
+ this.N4 = new Array(100).fill(0);
+ this.N2 = new Array(100).fill(0n);
+ this.N0[0] = n;
+ this.N2[0] = BigInt(g);
+ }
+
+ fY() {
+ if (this.N4[this.n] < this._n) return this.fN();
+ if (this.N2[this.n] === 0x123456789abcdef0n) {
+ let moves = '';
+ for (let g = 1; g <= this.n; g++) moves += this.N3[g];
+ console.log(`Solution found in ${this.n} moves: ${moves}`);
+ return true;
+ }
+ if (this.N4[this.n] === this._n) return this.fN();
+ return false;
+ }
+
+ fN() {
+ if (this.N3[this.n] !== 'u' && Math.floor(this.N0[this.n]/4) < 3) {
+ this.fI();
+ this.n++;
+ if (this.fY()) return true;
+ this.n--;
+ }
+ if (this.N3[this.n] !== 'd' && Math.floor(this.N0[this.n]/4) > 0) {
+ this.fG();
+ this.n++;
+ if (this.fY()) return true;
+ this.n--;
+ }
+ if (this.N3[this.n] !== 'l' && this.N0[this.n]%4 < 3) {
+ this.fE();
+ this.n++;
+ if (this.fY()) return true;
+ this.n--;
+ }
+ if (this.N3[this.n] !== 'r' && this.N0[this.n]%4 > 0) {
+ this.fL();
+ this.n++;
+ if (this.fY()) return true;
+ this.n--;
+ }
+ return false;
+ }
+
+ fI() {
+ const g = (11 - this.N0[this.n]) * 4;
+ const a = this.N2[this.n] & (15n << BigInt(g));
+ this.N0[this.n + 1] = this.N0[this.n] + 4;
+ this.N2[this.n + 1] = this.N2[this.n] - a + (a << 16n);
+ this.N3[this.n + 1] = 'd';
+ this.N4[this.n + 1] = this.N4[this.n] + (this.Nr[Number(a >> BigInt(g))] <= Math.floor(this.N0[this.n]/4) ? 0 : 1);
+ }
+
+ fG() {
+ const g = (19 - this.N0[this.n]) * 4;
+ const a = this.N2[this.n] & (15n << BigInt(g));
+ this.N0[this.n + 1] = this.N0[this.n] - 4;
+ this.N2[this.n + 1] = this.N2[this.n] - a + (a >> 16n);
+ this.N3[this.n + 1] = 'u';
+ this.N4[this.n + 1] = this.N4[this.n] + (this.Nr[Number(a >> BigInt(g))] >= Math.floor(this.N0[this.n]/4) ? 0 : 1);
+ }
+
+ fE() {
+ const g = (14 - this.N0[this.n]) * 4;
+ const a = this.N2[this.n] & (15n << BigInt(g));
+ this.N0[this.n + 1] = this.N0[this.n] + 1;
+ this.N2[this.n + 1] = this.N2[this.n] - a + (a << 4n);
+ this.N3[this.n + 1] = 'r';
+ this.N4[this.n + 1] = this.N4[this.n] + (this.Nc[Number(a >> BigInt(g))] <= this.N0[this.n]%4 ? 0 : 1);
+ }
+
+ fL() {
+ const g = (16 - this.N0[this.n]) * 4;
+ const a = this.N2[this.n] & (15n << BigInt(g));
+ this.N0[this.n + 1] = this.N0[this.n] - 1;
+ this.N2[this.n + 1] = this.N2[this.n] - a + (a >> 4n);
+ this.N3[this.n + 1] = 'l';
+ this.N4[this.n + 1] = this.N4[this.n] + (this.Nc[Number(a >> BigInt(g))] >= this.N0[this.n]%4 ? 0 : 1);
+ }
+
+ solve() {
+ while (!this.fY()) this._n++;
+ }
+}
+
+const start = new FifteenSolver(8, '0xfe169b4c0a73d852');
+start.solve();
diff --git a/Task/15-puzzle-solver/Mathematica/15-puzzle-solver.math b/Task/15-puzzle-solver/Mathematica/15-puzzle-solver.math
new file mode 100644
index 0000000000..3a7bdde6e4
--- /dev/null
+++ b/Task/15-puzzle-solver/Mathematica/15-puzzle-solver.math
@@ -0,0 +1,178 @@
+(* Constants for the correct ordering and board position mapping *)
+correctOrder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0};
+rowOf = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3} + 1; (* +1 because Mathematica uses 1-based indexing *)
+colOf = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3} + 1; (* +1 because Mathematica uses 1-based indexing *)
+
+(* Function to estimate remaining moves using Manhattan distance *)
+EstimateMoves[board_] := Module[{h = 0},
+ Do[
+ (* Skip the empty tile (0) *)
+ If[board[[i]] != 0,
+ (* Find where this tile should be in the correct order *)
+ correctPos = Position[correctOrder, board[[i]]][[1, 1]];
+ (* Calculate Manhattan distance: |current_row - correct_row| + |current_col - correct_col| *)
+ h += Abs[rowOf[[i]] - rowOf[[correctPos]]] + Abs[colOf[[i]] - colOf[[correctPos]]];
+ ],
+ {i, 1, 16}
+ ];
+ h
+]
+
+(* Find the position of the blank tile (0) *)
+FindBlankPosition[board_] := Position[board, 0][[1, 1]]
+
+(* Generate possible moves from current state *)
+GenerateMoves[board_, movesSoFar_] := Module[
+ {blankPos, possibleMoves = {}, newBoard, newMoves},
+
+ blankPos = FindBlankPosition[board];
+
+ (* Check if we can move left (blank goes right) *)
+ If[Mod[blankPos, 4] != 1,
+ newBoard = board;
+ newBoard[[blankPos]] = newBoard[[blankPos - 1]];
+ newBoard[[blankPos - 1]] = 0;
+ newMoves = movesSoFar <> "r";
+ AppendTo[possibleMoves, {newBoard, newMoves, Length[newMoves] + EstimateMoves[newBoard]}];
+ ];
+
+ (* Check if we can move right (blank goes left) *)
+ If[Mod[blankPos, 4] != 0,
+ newBoard = board;
+ newBoard[[blankPos]] = newBoard[[blankPos + 1]];
+ newBoard[[blankPos + 1]] = 0;
+ newMoves = movesSoFar <> "l";
+ AppendTo[possibleMoves, {newBoard, newMoves, Length[newMoves] + EstimateMoves[newBoard]}];
+ ];
+
+ (* Check if we can move up (blank goes down) *)
+ If[blankPos > 4,
+ newBoard = board;
+ newBoard[[blankPos]] = newBoard[[blankPos - 4]];
+ newBoard[[blankPos - 4]] = 0;
+ newMoves = movesSoFar <> "d";
+ AppendTo[possibleMoves, {newBoard, newMoves, Length[newMoves] + EstimateMoves[newBoard]}];
+ ];
+
+ (* Check if we can move down (blank goes up) *)
+ If[blankPos <= 12,
+ newBoard = board;
+ newBoard[[blankPos]] = newBoard[[blankPos + 4]];
+ newBoard[[blankPos + 4]] = 0;
+ newMoves = movesSoFar <> "u";
+ AppendTo[possibleMoves, {newBoard, newMoves, Length[newMoves] + EstimateMoves[newBoard]}];
+ ];
+
+ possibleMoves
+]
+
+(* A* Search algorithm for solving the puzzle *)
+Solve15Puzzle[startBoard_] := Module[
+ {openSet = {}, closedSet = {}, current, children, bestMoves = {}},
+
+ (* Initialize the priority queue (Mathematica doesn't have a built-in priority queue,
+ so we'll use a list and sort it each time) *)
+ openSet = {{startBoard, "", EstimateMoves[startBoard]}};
+
+ While[Length[openSet] > 0,
+ (* Sort the open set by total estimated cost *)
+ openSet = Sort[openSet, #1[[3]] < #2[[3]] &];
+
+ (* Get the most promising state *)
+ current = First[openSet];
+ openSet = Rest[openSet];
+
+ (* Check if we've reached the goal state *)
+ If[current[[1]] == correctOrder,
+ Print["Solution found!"];
+ Print["Moves: ", current[[2]]];
+ Print["Number of moves: ", StringLength[current[[2]]]];
+ Print["Open set size: ", Length[openSet]];
+ Print["Closed set size: ", Length[closedSet]];
+
+ (* Format the final board *)
+ Print["Final board:"];
+ Print[Partition[current[[1]], 4]];
+ Return[current[[2]]];
+ ];
+
+ (* Generate all possible moves from current state *)
+ children = GenerateMoves[current[[1]], current[[2]]];
+
+ (* Process each child state *)
+ For[i = 1, i <= Length[children], i++,
+ child = children[[i]];
+ childBoard = child[[1]];
+
+ (* Check if this board is already in the closed set *)
+ If[Not[MemberQ[Map[First, closedSet], childBoard]],
+ (* Check if this board is already in the open set *)
+ existingIdx = Position[Map[First, openSet], childBoard];
+
+ If[existingIdx == {},
+ (* Add to open set if not already there *)
+ AppendTo[openSet, child];
+ ,
+ (* Update if this path is better than existing one *)
+ existingIdx = existingIdx[[1, 1]];
+ If[StringLength[child[[2]]] < StringLength[openSet[[existingIdx, 2]]],
+ openSet[[existingIdx]] = child;
+ ];
+ ];
+ ];
+ ];
+
+ (* Add current state to closed set *)
+ AppendTo[closedSet, current];
+ ];
+
+ Print["No solution found!"];
+ Return[{}];
+]
+
+(* Example usage *)
+startingBoard = {15, 14, 1, 6, 9, 11, 4, 12, 0, 10, 7, 3, 13, 8, 5, 2};
+(* startingBoard = {0, 1, 2, 3, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12}; *)
+
+solution = Solve15Puzzle[startingBoard];
+
+(* Pretty print function to visualize a board *)
+PrintBoard[board_] := Module[{},
+ Grid[Partition[board, 4], Frame -> All]
+]
+
+(* Visualization code to show the solution step by step *)
+VisualizeSolution[startBoard_, moves_] := Module[
+ {currentBoard = startBoard, frames = {PrintBoard[startBoard]}, blankPos},
+
+ Do[
+ blankPos = FindBlankPosition[currentBoard];
+
+ Switch[StringTake[moves, {i}],
+ "l", (* blank moves left *)
+ currentBoard[[blankPos]] = currentBoard[[blankPos - 1]];
+ currentBoard[[blankPos - 1]] = 0,
+
+ "r", (* blank moves right *)
+ currentBoard[[blankPos]] = currentBoard[[blankPos + 1]];
+ currentBoard[[blankPos + 1]] = 0,
+
+ "u", (* blank moves up *)
+ currentBoard[[blankPos]] = currentBoard[[blankPos - 4]];
+ currentBoard[[blankPos - 4]] = 0,
+
+ "d", (* blank moves down *)
+ currentBoard[[blankPos]] = currentBoard[[blankPos + 4]];
+ currentBoard[[blankPos + 4]] = 0
+ ];
+
+ AppendTo[frames, PrintBoard[currentBoard]];
+
+ ,{i, 1, StringLength[moves]}
+ ];
+
+ ListAnimate[frames]
+]
+
+(* Uncomment to visualize the solution *)
+(* If[solution != {}, VisualizeSolution[startingBoard, solution]]; *)
diff --git a/Task/15-puzzle-solver/Zig/15-puzzle-solver.zig b/Task/15-puzzle-solver/Zig/15-puzzle-solver.zig
new file mode 100644
index 0000000000..e566437561
--- /dev/null
+++ b/Task/15-puzzle-solver/Zig/15-puzzle-solver.zig
@@ -0,0 +1,187 @@
+const std = @import("std");
+const Allocator = std.mem.Allocator;
+const ArrayList = std.ArrayList;
+const PriorityQueue = std.PriorityQueue;
+const AutoHashMap = std.AutoHashMap;
+
+// Constants for the puzzle
+const CORRECT_ORDER = [16]u8{ 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,0 };
+const ROW = [16]i32{ 0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3 };
+const COLUMN = [16]i32{ 0,1,2,3, 0,1,2,3, 0,1,2,3, 0,1,2,3 };
+
+// State struct to represent the puzzle state
+const State = struct {
+ est_tot_moves: u8,
+ moves: []u8,
+ est_moves_rem: u8,
+ allocator: Allocator,
+
+ pub fn init(allocator: Allocator, order: [16]u8) !State {
+ return State{
+ .est_tot_moves = estimate_moves(order),
+ .moves = try allocator.dupe(u8, ""), // empty
+ .est_moves_rem = estimate_moves(order),
+ .allocator = allocator,
+ };
+ }
+
+ pub fn deinit(self: *State) void {
+ self.allocator.free(self.moves);
+ }
+};
+
+// BoardState represents the entire game state
+const BoardState = struct {
+ order: [16]u8,
+ state: State,
+};
+
+// Find the index of a tile in the order array
+fn findIndex(order: [16]u8, tile: u8) usize {
+ var i: usize = 0;
+ for (order) |v| {
+ if (v == tile) return i;
+ i += 1;
+ }
+ @panic("findIndex: tile not found");
+}
+
+// Estimate the number of moves (Manhattan distance)
+fn estimate_moves(current: [16]u8) u8 {
+ var h: u8 = 0;
+ for (current) |tile| {
+ const ci = findIndex(current, tile);
+ const gi = findIndex(CORRECT_ORDER, tile);
+ const rd = @abs(ROW[ci] - ROW[gi]);
+ const cd = @abs(COLUMN[ci] - COLUMN[gi]);
+ h += @as(u8, @intCast(rd + cd));
+ }
+ return h;
+}
+
+// Make a single move (swap hole with neighbor)
+fn makeMove(
+ allocator: Allocator,
+ parent: *const State,
+ order: [16]u8,
+ dir: u8,
+ idx: usize,
+ new_idx: usize,
+) !BoardState {
+ var new_order = order;
+ new_order[idx] = order[new_idx];
+ new_order[new_idx] = order[idx];
+
+ const rem = estimate_moves(new_order);
+ const mv: [1]u8 = .{dir};
+ const combined = try std.mem.concat(allocator, u8, &[_][]const u8{ parent.moves, &mv });
+
+ return BoardState{
+ .order = new_order,
+ .state = State{
+ .est_tot_moves = @as(u8, @intCast(combined.len)) + rem,
+ .moves = combined,
+ .est_moves_rem = rem,
+ .allocator = allocator,
+ },
+ };
+}
+
+// Generate all children from a parent (takes *const so we don't double-free)
+fn generateChildren(allocator: Allocator, parent: *const BoardState) !ArrayList(BoardState) {
+ var children = ArrayList(BoardState).init(allocator);
+ const hole = findIndex(parent.order, 0);
+
+ if (COLUMN[hole] > 0) {
+ const c = try makeMove(allocator, &parent.state, parent.order, 'l', hole, hole - 1);
+ try children.append(c);
+ }
+ if (COLUMN[hole] < 3) {
+ const c = try makeMove(allocator, &parent.state, parent.order, 'r', hole, hole + 1);
+ try children.append(c);
+ }
+ if (ROW[hole] > 0) {
+ const c = try makeMove(allocator, &parent.state, parent.order, 'u', hole, hole - 4);
+ try children.append(c);
+ }
+ if (ROW[hole] < 3) {
+ const c = try makeMove(allocator, &parent.state, parent.order, 'd', hole, hole + 4);
+ try children.append(c);
+ }
+
+ return children;
+}
+
+// Compare function for priority queue
+fn boardCompare(_: void, a: BoardState, b: BoardState) std.math.Order {
+ return std.math.order(a.state.est_tot_moves, b.state.est_tot_moves);
+}
+
+// Hash an order into a u64
+fn hashOrder(order: [16]u8) u64 {
+ var r: u64 = 0;
+ for (order) |v| r = (r << 4) | v;
+ return r;
+}
+
+pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ defer _ = gpa.deinit();
+ const allocator = gpa.allocator();
+
+ var open_states = PriorityQueue(BoardState, void, boardCompare).init(allocator, {});
+ defer {
+ while (open_states.count() > 0) {
+ var item = open_states.remove();
+ item.state.deinit();
+ }
+ open_states.deinit();
+ }
+
+ var closed_states = AutoHashMap(u64, void).init(allocator);
+ defer closed_states.deinit();
+
+ const start_order = [16]u8{15,14,1,6,9,11,4,12, 0,10,7,3,13,8,5,2};
+ const initial_state = try State.init(allocator, start_order);
+ try open_states.add(BoardState{ .order = start_order, .state = initial_state });
+
+ const stdout = std.io.getStdOut().writer();
+
+ while (open_states.count() > 0) {
+ var current = open_states.remove();
+
+ // goal check
+ if (std.mem.eql(u8, ¤t.order, &CORRECT_ORDER)) {
+ try stdout.print(
+ "Open: {d}, Closed: {d}, Moves: {d}\n",
+ .{ open_states.count(), closed_states.count(), current.state.moves.len },
+ );
+ try stdout.print("Path: {s}\n", .{ current.state.moves });
+ current.state.deinit();
+ break;
+ }
+
+ const h = hashOrder(current.order);
+ if (closed_states.contains(h)) {
+ current.state.deinit();
+ continue;
+ }
+ try closed_states.put(h, {});
+
+ var children = try generateChildren(allocator, ¤t);
+ defer children.deinit();
+
+ // ↓ Here’s the fix: shadow each child into a mutable `var child`
+ for (children.items) |child| {
+ var my_child = child; // now `child.state.deinit()` sees a `*State`, not `*const State`
+ const ch = hashOrder(my_child.order);
+ if (closed_states.contains(ch)) {
+ my_child.state.deinit();
+ continue;
+ }
+ try open_states.add(my_child);
+ }
+
+ current.state.deinit();
+ }
+}
diff --git a/Task/2048/BQN/2048.bqn b/Task/2048/BQN/2048.bqn
index a73e95c7b4..cb0a27ed3b 100644
--- a/Task/2048/BQN/2048.bqn
+++ b/Task/2048/BQN/2048.bqn
@@ -15,7 +15,7 @@ Spawn←{i←•rand.Range∘≠⊸⊑(0⊸= /○⥊ ↕∘≢)𝕩 ⋄ (•rand
Lose←Left∘Right∘Down∘Up⊸≡ # Losing condition, no moves change the board
Win←∨´·∨˝2048⊸= # Winning condition, 2048!
-Quit←{•Out e∾"[?12l"∾e∾"[?25h" ⋄ •Exit 𝕩} # Restores the terminal and exits
+Quit←{•Out e∾"[?12l"∾e∾"[?25h" ⋄ •term.RawMode 0 ⋄ •Exit 𝕩} # Restores the terminal and exits
Display←{ # Displays the board, score and controls
•Out e∾"[H"∾e∾"[2J" # Cursor to origin and clear screen
•Out "Controls: h: left, j: down, k: up, l: right, q: quit"
diff --git a/Task/2048/EasyLang/2048.easy b/Task/2048/EasyLang/2048.easy
new file mode 100644
index 0000000000..410f4010a9
--- /dev/null
+++ b/Task/2048/EasyLang/2048.easy
@@ -0,0 +1,161 @@
+len brd[] 16
+gbackground 987
+proc newtile .
+ for i to 16 : if brd[i] = 0 : break 1
+ if i > 16 : return
+ v = 2
+ if randomf < 0.1 : v = 4
+ repeat
+ ind = random 16
+ until brd[ind] = 0
+ .
+ brd[ind] = v
+.
+global pts stat .
+proc show .
+ gclear
+ gtextsize 5
+ gcolor 222
+ gtext 10 94 "2048 Game"
+ gtext 60 94 "Pts: " & pts
+ gtextsize 7
+ gcolor 876
+ grect 9 9 82 82
+ gcolor 987
+ grect 10 10 80 80
+ for i to 16 : if brd[i] <> 0
+ x = i mod1 4 * 20 - 9.5
+ y = i div1 4 * 20 - 9.5
+ gcolor 765
+ grect x y 19 19
+ v = brd[i]
+ h = 2 * floor log10 v
+ gcolor 000
+ gtext x + 7 - h y + 7 brd[i]
+ .
+.
+proc init .
+ for i to 16 : brd[i] = 0
+ newtile
+ newtile
+ stat = 0
+ pts = 0
+ show
+.
+init
+#
+dir[] = [ -4 -1 4 1 ]
+start[] = [ 16 4 1 13 ]
+proc domove indk test &moved .
+ moved = 0
+ dir = dir[indk]
+ bdir = dir[(indk + 1) mod1 4]
+ start = start[indk]
+ for i to 4
+ h0 = start + dir
+ for j to 3
+ if brd[h0] <> 0
+ v = brd[h0]
+ h = h0
+ while h <> start and brd[h - dir] = 0 : h -= dir
+ if h <> h0
+ moved = 1
+ if test = 1 : return
+ .
+ if h <> start and brd[h - dir] = v
+ moved = 1
+ if test = 1 : return
+ v *= 2
+ pts += v
+ brd[h - dir] = -v
+ if v = 2048 : stat = 1
+ v = 0
+ .
+ brd[h0] = 0
+ brd[h] = v
+ .
+ h0 += dir
+ .
+ h0 = start
+ for j to 3
+ brd[h0] = abs brd[h0]
+ h0 += dir
+ .
+ sleep 0.1
+ show
+ start += bdir
+ .
+.
+proc handle indk .
+ if indk = 0 : return
+ domove indk 0 moved
+ if moved = 1
+ newtile
+ sleep 0.2
+ show
+ if stat = 0
+ stat = 2
+ for indk to 4
+ domove indk 1 moved
+ if moved = 1
+ stat = 0
+ break 1
+ .
+ .
+ .
+ .
+ if stat <> 0
+ gtextsize 5
+ if stat = 1
+ stat = 0
+ gtext 10 3 "You got 2048 😊"
+ else
+ gtext 10 3 "No more moves 🙁"
+ .
+ .
+.
+on mouse_down
+ mx = mouse_x
+ my = mouse_y
+.
+proc handle_mup .
+ dx = mouse_x - mx
+ dy = mouse_y - my
+ indk = 0
+ if abs dx > abs dy
+ if abs dx > 3
+ indk = 4
+ if dx > 0 : indk = 2
+ .
+ else
+ if abs dy > 3
+ indk = 3
+ if dy > 0 : indk = 1
+ .
+ .
+ if indk <> 0 and stat = 2
+ init
+ else
+ handle indk
+ .
+.
+on mouse_up
+ handle_mup
+.
+on key
+ if stat = 2
+ if keybkey = " " : init
+ return
+ .
+ indk = 0
+ if keybkey = "ArrowUp"
+ indk = 1
+ elif keybkey = "ArrowRight"
+ indk = 2
+ elif keybkey = "ArrowDown"
+ indk = 3
+ elif keybkey = "ArrowLeft"
+ indk = 4
+ .
+ handle indk
+.
diff --git a/Task/2048/Zig/2048.zig b/Task/2048/Zig/2048.zig
new file mode 100644
index 0000000000..2f59b71609
--- /dev/null
+++ b/Task/2048/Zig/2048.zig
@@ -0,0 +1,228 @@
+const std = @import("std");
+const io = std.io;
+const Random = std.Random;
+
+// UserMove enum representing possible moves
+const UserMove = enum {
+ Up,
+ Down,
+ Left,
+ Right,
+};
+
+// Game field type
+const Field = [4][4]u32;
+
+// Function to print the current game state
+fn printGame(field: *const Field) void {
+ for (field) |row| {
+ std.debug.print("{any}\n", .{row});
+ }
+}
+
+// Function to get a user move
+fn getUserMove() !UserMove {
+ const stdin = std.io.getStdIn().reader();
+ var buf: [2]u8 = undefined; // Buffer for input (character + newline)
+
+ while (true) {
+ const bytesRead = try stdin.read(&buf);
+ if (bytesRead < 1) continue;
+
+ switch (buf[0]) {
+ 'a' => return UserMove.Left,
+ 'w' => return UserMove.Up,
+ 's' => return UserMove.Down,
+ 'd' => return UserMove.Right,
+ else => {
+ std.debug.print("input was {c}: invalid character should be a,s,w or d\n", .{buf[0]});
+ },
+ }
+ }
+}
+
+// This function implements user moves.
+// For every element, it checks if the element is zero.
+// If the element is zero, it looks against the direction of movement if any
+// element is not zero, then moves it to its place and checks for a matching element.
+// If the element is not zero, it looks for a match. If no match is found,
+// it looks for the next element.
+fn doGameStep(step: UserMove, field: *Field) void {
+ switch (step) {
+ .Left => {
+ for (field) |*row| {
+ for (0..4) |col| {
+ for ((col + 1)..4) |my_testCol| {
+ if (row[my_testCol] != 0) {
+ if (row[col] == 0) {
+ row[col] += row[my_testCol];
+ row[my_testCol] = 0;
+ } else if (row[col] == row[my_testCol]) {
+ row[col] += row[my_testCol];
+ row[my_testCol] = 0;
+ break;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ },
+ .Right => {
+ for (field) |*row| {
+ var col: i32 = 3;
+ while (col >= 0) : (col -= 1) {
+ var my_testCol: i32 = col - 1;
+ while (my_testCol >= 0) : (my_testCol -= 1) {
+ if (row[@intCast(my_testCol)] != 0) {
+ if (row[@intCast(col)] == 0) {
+ row[@intCast(col)] += row[@intCast(my_testCol)];
+ row[@intCast(my_testCol)] = 0;
+ } else if (row[@intCast(col)] == row[@intCast(my_testCol)]) {
+ row[@intCast(col)] += row[@intCast(my_testCol)];
+ row[@intCast(my_testCol)] = 0;
+ break;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ },
+ .Down => {
+ for (0..4) |col_idx| {
+ const col = col_idx; // Convert to immutable
+ var row: i32 = 3;
+ while (row >= 0) : (row -= 1) {
+ var my_testRow: i32 = row - 1;
+ while (my_testRow >= 0) : (my_testRow -= 1) {
+ if (field[@intCast(my_testRow)][col] != 0) {
+ if (field[@intCast(row)][col] == 0) {
+ field[@intCast(row)][col] += field[@intCast(my_testRow)][col];
+ field[@intCast(my_testRow)][col] = 0;
+ } else if (field[@intCast(row)][col] == field[@intCast(my_testRow)][col]) {
+ field[@intCast(row)][col] += field[@intCast(my_testRow)][col];
+ field[@intCast(my_testRow)][col] = 0;
+ break;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ },
+ .Up => {
+ for (0..4) |col| {
+ for (0..4) |row| {
+ for ((row + 1)..4) |my_testRow| {
+ if (field[my_testRow][col] != 0) {
+ if (field[row][col] == 0) {
+ field[row][col] += field[my_testRow][col];
+ field[my_testRow][col] = 0;
+ } else if (field[row][col] == field[my_testRow][col]) {
+ field[row][col] += field[my_testRow][col];
+ field[my_testRow][col] = 0;
+ break;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ },
+ }
+}
+
+// Spawn a new number (2 or 4) in a random empty cell
+fn spawn(field: *Field, random: Random) void {
+ while (true) {
+ const x = random.uintLessThan(usize, 16); // Random position 0-15
+ const row = x % 4;
+ const col = (x / 4) % 4;
+
+ if (field[row][col] == 0) {
+ // 10% chance for a 4, 90% chance for a 2
+ if (random.uintLessThan(usize, 10) == 0) {
+ field[row][col] = 4;
+ } else {
+ field[row][col] = 2;
+ }
+ break;
+ }
+ }
+}
+
+// Check if fields are equal
+fn areFieldsEqual(a: *const Field, b: *const Field) bool {
+ for (0..4) |i| {
+ for (0..4) |j| {
+ if (a[i][j] != b[i][j]) return false;
+ }
+ }
+ return true;
+}
+
+// Check if player has won (any tile equals 2048)
+fn checkWin(field: *const Field) bool {
+ for (field) |row| {
+ for (row) |cell| {
+ if (cell == 2048) return true;
+ }
+ }
+ return false;
+}
+
+pub fn main() !void {
+ var prng = std.Random.DefaultPrng.init(@intCast(std.time.milliTimestamp()));
+ const random = prng.random();
+
+ var field: Field = [_][4]u32{[_]u32{0} ** 4} ** 4;
+ var my_test: Field = undefined;
+
+ gameLoop: while (true) {
+ // Check if there's still an open space
+ @memcpy(&my_test, &field);
+ spawn(&field, random);
+
+ // Check if any valid moves remain
+ var validMoveExists = false;
+ const moves = [_]UserMove{ .Up, .Down, .Left, .Right };
+
+ for (moves) |move| {
+ @memcpy(&my_test, &field);
+ doGameStep(move, &my_test);
+
+ if (!areFieldsEqual(&my_test, &field)) {
+ validMoveExists = true;
+ break;
+ }
+ }
+
+ if (!validMoveExists) {
+ std.debug.print("No more valid moves, you lose\n", .{});
+ break :gameLoop;
+ }
+
+ // Print the current game state
+ printGame(&field);
+ std.debug.print("move the blocks\n", .{});
+
+ // Get and apply user move
+ @memcpy(&my_test, &field);
+ while (areFieldsEqual(&my_test, &field)) {
+ const move = try getUserMove();
+ doGameStep(move, &field);
+ }
+
+ // Check win condition
+ if (checkWin(&field)) {
+ printGame(&field);
+ std.debug.print("You Won!!\n", .{});
+ break :gameLoop;
+ }
+ }
+}
diff --git a/Task/24-game-Solve/Dart/24-game-solve.dart b/Task/24-game-Solve/Dart/24-game-solve.dart
new file mode 100644
index 0000000000..38d41aaba9
--- /dev/null
+++ b/Task/24-game-Solve/Dart/24-game-solve.dart
@@ -0,0 +1,226 @@
+enum Operator {
+ Sub,
+ Plus,
+ Mul,
+ Div
+}
+
+class Factor {
+ String content;
+ int value;
+
+ Factor({this.content, this.value});
+
+ Factor copyWith({String content, int value}) {
+ return Factor(
+ content: content ?? this.content,
+ value: value ?? this.value
+ );
+ }
+}
+
+List apply(Operator op, List left, List right) {
+ List ret = [];
+ for (var l in left) {
+ for (var r in right) {
+ switch (op) {
+ case Operator.Sub:
+ if (l.value > r.value) {
+ ret.add(Factor(
+ content: "(${l.content} - ${r.content})",
+ value: l.value - r.value
+ ));
+ }
+ break;
+ case Operator.Plus:
+ ret.add(Factor(
+ content: "(${l.content} + ${r.content})",
+ value: l.value + r.value
+ ));
+ break;
+ case Operator.Mul:
+ ret.add(Factor(
+ content: "(${l.content} × ${r.content})",
+ value: l.value * r.value
+ ));
+ break;
+ case Operator.Div:
+ if (l.value >= r.value && r.value > 0 && l.value % r.value == 0) {
+ ret.add(Factor(
+ content: "(${l.content} / ${r.content})",
+ value: l.value ~/ r.value
+ ));
+ }
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
+List calc(List op, List numbers) {
+ List _calc(List op, List numbers, List acc) {
+ if (op.isEmpty) {
+ return List.from(acc);
+ }
+
+ List ret = [];
+ var monoFactor = [Factor(
+ content: numbers[0].toString(),
+ value: numbers[0],
+ )];
+
+ switch (op[0]) {
+ case Operator.Mul:
+ ret.addAll(apply(op[0], acc, monoFactor));
+ break;
+ case Operator.Div:
+ ret.addAll(apply(op[0], acc, monoFactor));
+ ret.addAll(apply(op[0], monoFactor, acc));
+ break;
+ case Operator.Sub:
+ ret.addAll(apply(op[0], acc, monoFactor));
+ ret.addAll(apply(op[0], monoFactor, acc));
+ break;
+ case Operator.Plus:
+ ret.addAll(apply(op[0], acc, monoFactor));
+ break;
+ }
+
+ return _calc(
+ op.sublist(1),
+ numbers.sublist(1),
+ ret
+ );
+ }
+
+ return _calc(
+ op,
+ numbers.sublist(1),
+ [Factor(content: numbers[0].toString(), value: numbers[0])]
+ );
+}
+
+List solutions(List numbers) {
+ List ret = [];
+ Set hashSet = {};
+
+ for (var ops in OpIter()) {
+ for (var order in orders()) {
+ var orderedNumbers = applyOrder(numbers, order);
+ var results = calc(ops, orderedNumbers);
+
+ for (var factor in results) {
+ if (factor.value == 24 && !hashSet.contains(factor.content)) {
+ hashSet.add(factor.content);
+ ret.add(factor);
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+class OpIter extends Iterable> {
+ @override
+ Iterator> get iterator => _OpIterator();
+}
+
+class _OpIterator implements Iterator> {
+ int _index = 0;
+ static const List OPTIONS = [
+ Operator.Mul,
+ Operator.Sub,
+ Operator.Plus,
+ Operator.Div
+ ];
+
+ @override
+ List get current {
+ final f1 = OPTIONS[(_index & (3 << 4)) >> 4];
+ final f2 = OPTIONS[(_index & (3 << 2)) >> 2];
+ final f3 = OPTIONS[(_index & 3)];
+ return [f1, f2, f3];
+ }
+
+ @override
+ bool moveNext() {
+ if (_index >= 1 << 6) {
+ return false;
+ }
+ _index++;
+ return true;
+ }
+}
+
+List> orders() {
+ return [
+ [0, 1, 2, 3],
+ [0, 1, 3, 2],
+ [0, 2, 1, 3],
+ [0, 2, 3, 1],
+ [0, 3, 1, 2],
+ [0, 3, 2, 1],
+ [1, 0, 2, 3],
+ [1, 0, 3, 2],
+ [1, 2, 0, 3],
+ [1, 2, 3, 0],
+ [1, 3, 0, 2],
+ [1, 3, 2, 0],
+ [2, 0, 1, 3],
+ [2, 0, 3, 1],
+ [2, 1, 0, 3],
+ [2, 1, 3, 0],
+ [2, 3, 0, 1],
+ [2, 3, 1, 0],
+ [3, 0, 1, 2],
+ [3, 0, 2, 1],
+ [3, 1, 0, 2],
+ [3, 1, 2, 0],
+ [3, 2, 0, 1],
+ [3, 2, 1, 0]
+ ];
+}
+
+List applyOrder(List numbers, List order) {
+ return [
+ numbers[order[0]],
+ numbers[order[1]],
+ numbers[order[2]],
+ numbers[order[3]]
+ ];
+}
+
+void main(List args) {
+ List numbers = [];
+
+ if (args.isNotEmpty) {
+ String input = args[0];
+ for (var char in input.split('')) {
+ int n = int.tryParse(char);
+ if (n != null) {
+ numbers.add(n);
+ }
+
+ if (numbers.length == 4) {
+ var sols = solutions(numbers);
+ var len = sols.length;
+
+ if (len == 0) {
+ print('no solution for ${numbers[0]}, ${numbers[1]}, ${numbers[2]}, ${numbers[3]}');
+ return;
+ }
+
+ print('solutions for ${numbers[0]}, ${numbers[1]}, ${numbers[2]}, ${numbers[3]}');
+ for (var s in sols) {
+ print(s.content);
+ }
+ print('$len solutions found');
+ return;
+ }
+ }
+ } else {
+ print('empty input');
+ }
+}
diff --git a/Task/24-game/Elena/24-game.elena b/Task/24-game/Elena/24-game.elena
index d4170cfc82..b363901a03 100644
--- a/Task/24-game/Elena/24-game.elena
+++ b/Task/24-game/Elena/24-game.elena
@@ -3,8 +3,6 @@ import system'collections;
import system'dynamic;
import extensions;
-// --- Expression ---
-
class ExpressionTree
{
object _tree;
@@ -18,13 +16,13 @@ class ExpressionTree
var node := new DynamicStruct();
ch =>
- $43 { node.Level := level + 1; node.Operation := mssg add } // +
- $45 { node.Level := level + 1; node.Operation := mssg subtract } // -
- $42 { node.Level := level + 2; node.Operation := mssg multiply } // *
- $47 { node.Level := level + 2; node.Operation := mssg divide } // /
- $40 { level.append(10); ^ self } // (
- $41 { level.reduce(10); ^ self } // )
- ! {
+ $43 : { node.Level := level + 1; node.Operation := mssg add } // +
+ $45 : { node.Level := level + 1; node.Operation := mssg subtract } // -
+ $42 : { node.Level := level + 2; node.Operation := mssg multiply } // *
+ $47 : { node.Level := level + 2; node.Operation := mssg divide } // /
+ $40 : { level.append(10); ^ self } // (
+ $41 : { level.reduce(10); ^ self } // )
+ ! : {
node.Leaf := ch.toString().toReal();
node.Level := level + 3
};
@@ -97,8 +95,6 @@ class ExpressionTree
<= readLeaves(list,_tree);
}
-// --- Game ---
-
class TwentyFourGame
{
object theNumbers;
@@ -121,7 +117,7 @@ class TwentyFourGame
help()
{
- console
+ Console
.printLine("------------------------------- Instructions ------------------------------")
.printLine("Four digits will be displayed.")
.printLine("Enter an equation using all of those four digits that evaluates to 24")
@@ -137,9 +133,9 @@ class TwentyFourGame
prompt()
{
- theNumbers.forEach::(n){ console.print(n," ") };
+ theNumbers.forEach::(n){ Console.print(n," ") };
- console.print(": ")
+ Console.print(": ")
}
resolve(expr)
@@ -149,19 +145,19 @@ class TwentyFourGame
var leaves := new ArrayList();
tree.readLeaves(leaves);
- ifnot (leaves.ascendant().sequenceEqual(theNumbers.ascendant()))
- { console.printLine("Invalid input. Enter an equation using all of those four digits. Try again."); ^ self };
+ if:not (leaves.ascendant().sequenceEqual(theNumbers.ascendant()))
+ { Console.printLine("Invalid input. Enter an equation using all of those four digits. Try again."); ^ self };
var result := tree.Value;
if (result == 24)
{
- console.printLine("Good work. ",expr,"=",result);
+ Console.printLine("Good work. ",expr,"=",result);
self.newPuzzle()
}
else
{
- console.printLine("Incorrect. ",expr,"=",result)
+ Console.printLine("Incorrect. ",expr,"=",result)
}
}
}
@@ -178,7 +174,7 @@ extension gameOp
{
if (expr == "")
{
- console.printLine("Skipping this puzzle"); self.newPuzzle()
+ Console.printLine("Skipping this puzzle"); self.newPuzzle()
}
else
{
@@ -188,8 +184,7 @@ extension gameOp
}
catch(Exception e)
{
- console.printLine(e)
- //console.printLine:"An error occurred. Check your input and try again."
+ Console.printLine:"An error occurred. Check your input and try again."
}
};
@@ -198,11 +193,9 @@ extension gameOp
}
}
-// --- program ---
-
public program()
{
var game := new TwentyFourGame().help();
- while (game.prompt().playRound(console.readLine())) {}
+ while (game.prompt().playRound(Console.readLine())) {}
}
diff --git a/Task/24-game/Perl/24-game.pl b/Task/24-game/Perl/24-game.pl
index 071bb8e2b8..d4dd33e728 100644
--- a/Task/24-game/Perl/24-game.pl
+++ b/Task/24-game/Perl/24-game.pl
@@ -25,18 +25,21 @@ while (1) {
print "Expression (try ", $try++, "): ";
my $entry = <>;
- if (!defined $entry || $entry eq 'q')
+ if (!defined $entry || substr($entry,0,1) eq 'q')
{ say "Goodbye. Sorry you couldn't win."; last; }
- $entry =~ s/\s+//g; # remove all white space
+ $entry =~ s/\s+//g; # remove all white space (newline is whitespace too)
next if $entry eq '';
my $given_digits = join "", sort @digits;
my $entry_digits = join "", sort grep { /\d/ } split(//, $entry);
- if ($given_digits ne $entry_digits || # not correct digits
- $entry =~ /\d\d/ || # combined digits
- $entry =~ m|[-+*/]{2}| || # combined operators
- $entry =~ tr|-0-9()+*/||c) # Invalid characters
- { say "That's not valid"; next; }
+ if ($given_digits ne $entry_digits)
+ { say "incorrect digits"; next; }
+ if ($entry =~ /\d\d/)
+ { say "error, combined digits"; next; }
+ if ($entry =~ m|[-+*/]{2}|)
+ { say "error, combined operators"; next; }
+ if ($entry =~ tr|-0-9()+*/||c)
+ { say "invalid characters!"; next; }
my $n = eval $entry;
diff --git a/Task/24-game/Rust/24-game.rs b/Task/24-game/Rust/24-game.rs
index bdcad8b01d..8e9e7f0ced 100644
--- a/Task/24-game/Rust/24-game.rs
+++ b/Task/24-game/Rust/24-game.rs
@@ -79,7 +79,13 @@ fn calculate(input: &String, list : &mut [u32;4]) -> f32{
fn main() {
let mut rng = rand::thread_rng();
- let mut list :[u32;4]=[rng.gen::()%10,rng.gen::()%10,rng.gen::()%10,rng.gen::()%10];
+ // each from 1 ──► 9 (inclusive)
+ let mut list :[u32;4]=[
+ rng.gen::()%9+1,
+ rng.gen::()%9+1,
+ rng.gen::()%9+1,
+ rng.gen::()%9+1
+ ];
println!("form 24 with using + - / * {:?}",list);
//get user input
diff --git a/Task/24-game/Zig/24-game.zig b/Task/24-game/Zig/24-game.zig
new file mode 100644
index 0000000000..4c224f1030
--- /dev/null
+++ b/Task/24-game/Zig/24-game.zig
@@ -0,0 +1,153 @@
+const std = @import("std");
+const rand = std.Random;
+// (hint: errors cannot be handled at comptime)
+var stdout: std.fs.File.Writer = undefined;
+var stdin: std.fs.File.Reader = undefined;
+
+fn opType(x: u8) i32 {
+ return switch (x) {
+ '-', '+' => 1,
+ '/', '*' => 2,
+ '(', ')' => -1,
+ else => 0,
+ };
+}
+
+fn toRpn(allocator: std.mem.Allocator, input: []const u8) ![]u8 {
+ var rpnString = std.ArrayList(u8).init(allocator);
+ defer rpnString.deinit();
+
+ var rpnStack = std.ArrayList(u8).init(allocator);
+ defer rpnStack.deinit();
+
+ var lastToken: u8 = '#';
+
+ for (input) |token| {
+ if (token >= '1' and token <= '9') {
+ try rpnString.append(token);
+ } else if (opType(token) == 0) {
+ continue;
+ } else if (opType(token) > opType(lastToken) or token == '(') {
+ try rpnStack.append(token);
+ lastToken = token;
+ } else {
+ while (rpnStack.items.len > 0) {
+ const top = rpnStack.pop().?;
+ if (top == '(') {
+ break;
+ }
+ try rpnString.append(top);
+ }
+ if (token != ')') {
+ try rpnStack.append(token);
+ }
+ }
+ }
+
+ while (rpnStack.items.len > 0) {
+ try rpnString.append(rpnStack.pop().?);
+ }
+
+ if (rpnString.items.len > 0) {
+ try stdout.print("your formula results in {s}\n", .{rpnString.items});
+ } else {
+ stdout.print("no input available.\n", .{}) catch {};
+ }
+
+ return rpnString.toOwnedSlice();
+}
+
+fn calculate(input: []const u8, list: *[4]u32) f32 {
+ var stack = std.ArrayList(f32).init(std.heap.page_allocator);
+ defer stack.deinit();
+
+ var accumulator: f32 = 0.0;
+
+ for (input) |token| {
+ if (token >= '1' and token <= '9') {
+ const digit = @as(u32, token - '0');
+
+ // Find and mark the used digit
+ var found = false;
+ for (list, 0..) |val, idx| {
+ if (val == digit) {
+ list[idx] = 10;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ stdout.print(" invalid digit: {d} \n", .{digit}) catch {};
+ }
+
+ stack.append(accumulator) catch {};
+ accumulator = @floatFromInt(digit);
+ } else {
+ const a = stack.pop().?;
+
+ accumulator = switch (token) {
+ '-' => a - accumulator,
+ '+' => a + accumulator,
+ '/' => a / accumulator,
+ '*' => a * accumulator,
+ else => accumulator, // NOP
+ };
+ }
+ }
+
+ stdout.print("your formula results in {d}\n", .{accumulator}) catch {};
+ return accumulator;
+}
+
+pub fn main() !void {
+ stdout = std.io.getStdOut().writer();
+ stdin = std.io.getStdIn().reader();
+ var prng = rand.DefaultPrng.init(@as(u64, @intCast(std.time.timestamp())));
+ const random = prng.random();
+ // only values from 1 --> 9 (inclusive)
+ var list = [_]u32{
+ @mod(random.int(u32), 9) + 1,
+ @mod(random.int(u32), 9) + 1,
+ @mod(random.int(u32), 9) + 1,
+ @mod(random.int(u32), 9) + 1,
+ };
+
+ try stdout.print("form 24 with using + - / * {d} {d} {d} {d}\n", .{ list[0], list[1], list[2], list[3] });
+
+ // Get user input
+ var buffer: [1024]u8 = undefined;
+ const input = try stdin.readUntilDelimiterOrEof(buffer[0..], '\n') orelse "";
+
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ defer arena.deinit();
+ const allocator = arena.allocator();
+
+ // Convert to RPN
+ const rpnInput = try toRpn(allocator, input);
+ if (rpnInput.len == 0) {
+ stdout.print("exit.\n", .{}) catch {};
+ return;
+ }
+
+ const result = calculate(rpnInput, &list);
+
+ var allUsed = true;
+ for (list) |val| {
+ if (val != 10) {
+ allUsed = false;
+ break;
+ }
+ }
+
+ if (allUsed) {
+ try stdout.print("and you used all numbers\n", .{});
+ if (result == 24.0) {
+ try stdout.print("you won\n", .{});
+ } else {
+ try stdout.print("but your formula doesn't result in 24\n", .{});
+ }
+ } else {
+ try stdout.print("you didn't use all the numbers\n", .{});
+ }
+}
diff --git a/Task/4-rings-or-4-squares-puzzle/EasyLang/4-rings-or-4-squares-puzzle.easy b/Task/4-rings-or-4-squares-puzzle/EasyLang/4-rings-or-4-squares-puzzle.easy
index f2e05dc87f..22e54e305a 100644
--- a/Task/4-rings-or-4-squares-puzzle/EasyLang/4-rings-or-4-squares-puzzle.easy
+++ b/Task/4-rings-or-4-squares-puzzle/EasyLang/4-rings-or-4-squares-puzzle.easy
@@ -1,12 +1,10 @@
func ok v t[] .
for h in t[]
- if v = h
- return 0
- .
+ if v = h : return 0
.
return 1
.
-proc four lo hi uni show . .
+proc four lo hi uni show .
#
subr bf
for f = lo to hi
diff --git a/Task/99-bottles-of-beer/Elena/99-bottles-of-beer.elena b/Task/99-bottles-of-beer/Elena/99-bottles-of-beer.elena
index e88bc758db..f80cd1b687 100644
--- a/Task/99-bottles-of-beer/Elena/99-bottles-of-beer.elena
+++ b/Task/99-bottles-of-beer/Elena/99-bottles-of-beer.elena
@@ -31,5 +31,5 @@ public program()
{
var bottles := 99;
- bottles.bottleEnumerator().forEach(printingLn)
+ bottles.bottleEnumerator().forEach(PrintingLn)
}
diff --git a/Task/99-bottles-of-beer/Factor/99-bottles-of-beer-1.factor b/Task/99-bottles-of-beer/Factor/99-bottles-of-beer-1.factor
new file mode 100644
index 0000000000..55688df8a7
--- /dev/null
+++ b/Task/99-bottles-of-beer/Factor/99-bottles-of-beer-1.factor
@@ -0,0 +1,6 @@
+USE: math.parser
+100
+[ dup 1 - [ >dec " bottles of beer" append [ " on the wall" append ] keep ] bi@
+ "Take one down, pass it around" -rot
+ first CHAR: - = [ 2drop "..." "why's all the rum gone??" ] when ! if leading character is "-" then replace with new string
+ 4array "\n" join print nl ] each
diff --git a/Task/99-bottles-of-beer/Factor/99-bottles-of-beer.factor b/Task/99-bottles-of-beer/Factor/99-bottles-of-beer-2.factor
similarity index 100%
rename from Task/99-bottles-of-beer/Factor/99-bottles-of-beer.factor
rename to Task/99-bottles-of-beer/Factor/99-bottles-of-beer-2.factor
diff --git a/Task/99-bottles-of-beer/Uxntal/99-bottles-of-beer.uxnatl b/Task/99-bottles-of-beer/Uxntal/99-bottles-of-beer.uxnatl
index 2d10b5487c..868c8dd512 100644
--- a/Task/99-bottles-of-beer/Uxntal/99-bottles-of-beer.uxnatl
+++ b/Task/99-bottles-of-beer/Uxntal/99-bottles-of-beer.uxnatl
@@ -1,63 +1,73 @@
-( uxncli 99bottles.rom )
+%\n { 0a } %\s { 20 } %\0 { 00 }
+%newline { [ LIT2 \n -Console/write ] DEO }
+%plural { [ LIT2 "s -Console/write ] DEO }
-|10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1
+|18 @Console/write
-|0100 ( -> )
- #63 &loop
- DUP
- [ LIT2 0a -Console/write ] DEO
- #01 EQUk ?&done
- POP #01 SUB
- !&loop
- &done BRK
+|100
-@ ( num -- )
- DUP ;dict/wall
- DUP [ LIT2 0a -Console/write ] DEO
- ;dict/take
- #01 SUB ;dict/wall !
+#63
+&loop
+ DUP print/verse
+ newline
+ #01 EQUk ?/done
+ POP #01 SUB
+ !/done
-@ ( num -- )
- DUP #00 EQU ?&zero
- DUP #01 EQU ?&one
- ;dict/bottle
- [ LIT2 "s -Console/write ] DEO
- !&end
+ &done
+ POP2
- &one ( num -- )
- ;dict/bottle
- !&end
- &zero ( num -- )
- POP ;dict/no-more
- ;dict/bottle
- [ LIT2 "s -Console/write ] DEO
- ( >> )
- &end
- ;dict/of-beer
+BRK
+
+@print/verse ( num -- )
+ DUP /bottle ;msgs/wall /str
+ DUP /bottle newline
+ ;msgs/take /str
+ #01 SUB /bottle ;msgs/wall !/str
+
+@print/bottle ( num -- )
+ DUP #00 EQU ?/bottle/zero
+ DUP #01 EQU ?/bottle/one
+ /dec ;msgs/bottle /str
+ plural
+ !/bottle/end
+
+ &bottle/one ( num -- )
+ /dec ;msgs/bottle /str
+ !/bottle/end
+
+ &bottle/zero ( num -- )
+ POP ;msgs/no-more /str
+ ;msgs/bottle /str
+ plural
( >> )
-@ ( str -- )
- &loop
- LDAk .Console/write DEO
- INC2 LDAk ?&loop
+ &bottle/end
+ ;msgs/of-beer
+ ( >> )
+
+@print/str ( str -- )
+ LDAk .Console/write DEO
+ INC2 LDAk ?/str
POP2 JMP2r
-@ ( byte -- )
- DUP #64 DIV /try
- DUP #0a DIV /try
+@print/dec ( byte -- )
+ DUP #64 DIV /dec/try
+ DUP #0a DIV /dec/try
( >> )
-@ ( num -- )
- #0a DIVk MUL SUB
- [ LIT "0 ] ADD .Console/write DEO
- JMP2r
+ &dec/try/num ( num -- )
+ #0a DIVk MUL SUB
+ [ LIT "0 ] ADD .Console/write DEO
+ JMP2r
- &try ( num -- )
- DUP ?
+ &dec/try ( num -- )
+ DUP ?/dec/try/num
POP JMP2r
-@dict &no-more "No 20 "more $1
- &bottle 20 "bottle $1
- &of-beer 20 "of 20 "beer 20 $1
- &wall "on 20 "the 20 "wall 0a $1
- &take "Take 20 "one 20 "down, 20 "pass 20 "it 20 "around 0a $1
+@msgs [
+ &no-more "No \s "more \0
+ &bottle \s "bottle \0
+ &of-beer \s "of \s "beer \s \0
+ &wall "on \s "the \s "wall \n \0
+ &take "Take \s "one \s "down, \s "pass \s "it \s "around \n \0 ]
diff --git a/Task/A+B/Ballerina/a+b.ballerina b/Task/A+B/Ballerina/a+b.ballerina
new file mode 100644
index 0000000000..7c90b9d2f5
--- /dev/null
+++ b/Task/A+B/Ballerina/a+b.ballerina
@@ -0,0 +1,16 @@
+import ballerina/io;
+
+public function main() returns error? {
+ while true {
+ io:print("Enter two integers separated by a space : ");
+ string[] s = re ` `.split(io:readln());
+ if s.length() < 2 {
+ io:println("Insufficient numbers, try again");
+ } else {
+ int a = check int:fromString(s[0]);
+ int b = check int:fromString(s[1]);
+ io:println("Their sum is ", a + b, ".");
+ break;
+ }
+ }
+}
diff --git a/Task/A+B/Elena/a+b-1.elena b/Task/A+B/Elena/a+b-1.elena
index a4c98a1213..afa03ef6c5 100644
--- a/Task/A+B/Elena/a+b-1.elena
+++ b/Task/A+B/Elena/a+b-1.elena
@@ -2,8 +2,8 @@ import extensions;
public program()
{
- var A := Integer.new();
- var B := Integer.new();
+ var A := Integer.new();
+ var B := Integer.new();
- console.loadLine(A,B).printLine(A + B)
+ Console.loadLine(A,B).printLine(A + B)
}
diff --git a/Task/A+B/Elena/a+b-2.elena b/Task/A+B/Elena/a+b-2.elena
index 8097b76574..b79d01d958 100644
--- a/Task/A+B/Elena/a+b-2.elena
+++ b/Task/A+B/Elena/a+b-2.elena
@@ -3,7 +3,7 @@ import extensions;
public program()
{
- console.printLine(console.readLine()
+ Console.printLine(Console.readLine()
.split()
.selectBy(mssgconst toInt[1])
.summarize())
diff --git a/Task/A+B/REXX/a+b-1.rexx b/Task/A+B/REXX/a+b-1.rexx
deleted file mode 100644
index 46a34f359e..0000000000
--- a/Task/A+B/REXX/a+b-1.rexx
+++ /dev/null
@@ -1,4 +0,0 @@
-/*REXX program obtains two numbers from the input stream (the console), shows their sum.*/
-parse pull a b /*obtain two numbers from input stream.*/
-say a+b /*display the sum to the terminal. */
- /*stick a fork in it, we're all done. */
diff --git a/Task/A+B/REXX/a+b-2.rexx b/Task/A+B/REXX/a+b-2.rexx
deleted file mode 100644
index 064640ab38..0000000000
--- a/Task/A+B/REXX/a+b-2.rexx
+++ /dev/null
@@ -1,4 +0,0 @@
-/*REXX program obtains two numbers from the input stream (the console), shows their sum.*/
-parse pull a b /*obtain two numbers from input stream.*/
-say (a+b) / 1 /*display normalized sum to terminal. */
- /*stick a fork in it, we're all done. */
diff --git a/Task/A+B/REXX/a+b-3.rexx b/Task/A+B/REXX/a+b-3.rexx
deleted file mode 100644
index 774178e64d..0000000000
--- a/Task/A+B/REXX/a+b-3.rexx
+++ /dev/null
@@ -1,6 +0,0 @@
-/*REXX program obtains two numbers from the input stream (the console), shows their sum.*/
-numeric digits 300 /*the default is nine decimal digits.*/
-parse pull a b /*obtain two numbers from input stream.*/
-z= (a+b) / 1 /*add and normalize sum, store it in Z.*/
-say z /*display normalized sum Z to terminal.*/
- /*stick a fork in it, we're all done. */
diff --git a/Task/A+B/REXX/a+b-4.rexx b/Task/A+B/REXX/a+b-4.rexx
deleted file mode 100644
index 05e988dfb5..0000000000
--- a/Task/A+B/REXX/a+b-4.rexx
+++ /dev/null
@@ -1,11 +0,0 @@
-/*REXX program obtains some numbers from the input stream (the console), shows their sum*/
-numeric digits 1000 /*just in case the user gets ka-razy. */
-say 'enter some numbers to be summed:' /*display a prompt message to terminal.*/
-parse pull y /*obtain all numbers from input stream.*/
-many= words(y) /*obtain the number of numbers entered.*/
-$= 0 /*initialize the sum to zero. */
- do j=1 for many /*process each of the numbers. */
- $= $ + word(y, j) /*add one number to the sum. */
- end /*j*/
- /*stick a fork in it, we're all done. */
-say 'sum of ' many " numbers = " $/1 /*display normalized sum $ to terminal.*/
diff --git a/Task/A+B/REXX/a+b-5.rexx b/Task/A+B/REXX/a+b-5.rexx
deleted file mode 100644
index 3aed91ea3f..0000000000
--- a/Task/A+B/REXX/a+b-5.rexx
+++ /dev/null
@@ -1,8 +0,0 @@
-/*REXX program obtains some numbers from the input stream (the console), shows their sum*/
-numeric digits 1000 /*just in case the user gets ka-razy. */
-say 'enter some numbers to be summed:' /*display a prompt message to terminal.*/
-parse pull y /*obtain all numbers from input stream.*/
-y=space(y)
-y=translate(y,'+',' ')
-Interpret 's='y
-say 'sum of ' many " numbers = " s/1 /*display normalized sum s to terminal.*/
diff --git a/Task/A+B/REXX/a+b.rexx b/Task/A+B/REXX/a+b.rexx
new file mode 100644
index 0000000000..928b14cfbb
--- /dev/null
+++ b/Task/A+B/REXX/a+b.rexx
@@ -0,0 +1,27 @@
+-- 1 Jun 2025
+include Settings
+
+say 'A+B'
+say version
+say
+do forever
+ call Charout, 'REXX '
+ pull x
+ if x = '' then
+ leave
+ parse var x a b
+ say
+ say 'As given...'
+ say 'A =' a
+ say 'B =' b
+ say 'A+B =' a+b
+ say
+ say 'Normalized...'
+ say 'A =' a/1
+ say 'B =' b/1
+ say 'A+B =' (a+b)/1
+ say
+end
+exit
+
+include Abend
diff --git a/Task/ABC-problem/Ballerina/abc-problem.ballerina b/Task/ABC-problem/Ballerina/abc-problem.ballerina
new file mode 100644
index 0000000000..0428dff997
--- /dev/null
+++ b/Task/ABC-problem/Ballerina/abc-problem.ballerina
@@ -0,0 +1,32 @@
+import ballerina/io;
+
+function r(string word, string[] bl) returns boolean {
+ if word == "" { return true; }
+ int c = word[0].toBytes()[0] | 32;
+ foreach int i in 0.. len w$[]
cnt += 1
return
diff --git a/Task/ABC-problem/Elena/abc-problem.elena b/Task/ABC-problem/Elena/abc-problem.elena
index 99216ac706..2525c26eed 100644
--- a/Task/ABC-problem/Elena/abc-problem.elena
+++ b/Task/ABC-problem/Elena/abc-problem.elena
@@ -41,6 +41,6 @@ public program()
words.forEach::(word)
{
- console.printLine("can make '",word,"' : ",word.canMakeWordFrom(blocks));
+ Console.printLine("can make '",word,"' : ",word.canMakeWordFrom(blocks));
}
}
diff --git a/Task/ADFGVX-cipher/C-sharp/adfgvx-cipher.cs b/Task/ADFGVX-cipher/C-sharp/adfgvx-cipher.cs
new file mode 100644
index 0000000000..3f4f47932f
--- /dev/null
+++ b/Task/ADFGVX-cipher/C-sharp/adfgvx-cipher.cs
@@ -0,0 +1,117 @@
+using System.Diagnostics;
+
+const string cypher = "ADFGVX";
+var N = cypher.Length;
+var size = N * N;
+const string symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+Debug.Assert(size == symbols.Length);
+var square = new int[size];
+
+for (var i = 0; i < size; i++)
+{
+ var j = Random.Shared.Next(i + 1);
+ square[i] = square[j];
+ square[j] = i;
+}
+
+Console.WriteLine($"{N} x {N} Polybius square:");
+Console.WriteLine();
+Console.WriteLine($" | {string.Join(' ', cypher.AsEnumerable())}");
+Console.WriteLine(new string('-', 2 * N + 3));
+
+for (var row = 0; row < N; row++)
+{
+ Console.Write($"{cypher[row]} |");
+
+ for (var col = 0; col < N; col++)
+ {
+ Console.Write($" {symbols[square[col + row * N]]}");
+ }
+
+ Console.WriteLine();
+}
+
+static bool IsSuitableTranspositionKey(string s) =>
+ s.Length >= 7 && s.Length <= 12 && s.Length == s.Distinct().Count() && s.All(symbols.ToLowerInvariant().Contains);
+
+var keys = File.ReadAllLines("unixdict.txt").Where(IsSuitableTranspositionKey).ToArray();
+var key = keys[Random.Shared.Next(keys.Length)].ToUpperInvariant();
+Console.WriteLine();
+Console.WriteLine($"The key is {key}");
+var plaintext = "ATTACKAT1200AM";
+Console.WriteLine($"Plaintext: {plaintext}");
+
+string Encrypt(string plaintext, string key, int[] square)
+{
+ // Create a lookup table from symbol to fragment
+ var map = (from i in Enumerable.Range(0, size)
+ let k = square[i]
+ let code = cypher[i / N] + "" + cypher[i % N]
+ select (k, code))
+ .ToDictionary(kc => symbols[kc.k], kc => kc.code);
+
+ // Map the plaintext to fragments
+ var e = string.Join("", plaintext.Select(c => map[c]));
+
+ // Determine number of rows
+ var K = key.Length;
+ var rows = (e.Length + K - 1) / K;
+
+ // Pad with spaces
+ e += new string(' ', rows * K - e.Length);
+
+ // Sort the key
+ var order = string.Join("", key.OrderBy(c => c)).Select(c => key.IndexOf(c)).ToArray();
+
+ // Reorder the fragments.
+ e = string.Join("", Enumerable.Range(0, K * rows).Select(i => e[(i / K) * K + order[i % K]]));
+
+ // Transpose
+ e = new([.. from col in Enumerable.Range(0, K)
+ from row in Enumerable.Range(0, rows)
+ select e[row * K + col]]);
+
+ // Read off each column.
+ return string.Join(" ", Enumerable.Range(0, K).Select(col => e.Substring(col * rows, rows).Trim()));
+}
+
+var encrypted = Encrypt(plaintext, key, square);
+Console.WriteLine($"Encrypted: {encrypted}");
+
+string Decrypt(string encrypted, string key, int[] square)
+{
+ // Create a lookup table from fragment to symbol
+ var map = (from i in Enumerable.Range(0, size)
+ let k = square[i]
+ let code = cypher[i / N] + "" + cypher[i % N]
+ select (k, code))
+ .ToDictionary(kc => kc.code, kc => symbols[kc.k]);
+
+ // Split into columns
+ var cols = encrypted.Split(' ');
+
+ // Determine number of rows
+ var K = key.Length;
+ var rows = cols.Max(c => c.Length);
+
+ // Pad each column
+ cols = [.. cols.Select(c => c.PadRight(rows))];
+
+ // Transpose
+ string e = new([.. from row in Enumerable.Range(0, rows)
+ from col in Enumerable.Range(0, K)
+ select cols[col][row]]);
+
+ // Sort the key
+ var sorted = string.Join("", key.OrderBy(c => c));
+ var order = key.Select(c => sorted.IndexOf(c)).ToArray();
+
+ // Reorder the fragments
+ e = string.Join("", Enumerable.Range(0, K * rows).Select(i => e[(i / K) * K + order[i % K]])).Trim();
+
+ // Map the fragments to plaintext
+ return string.Join("", Enumerable.Range(0, e.Length / 2).Select(i => map[e.Substring(2 * i, 2)]));
+}
+
+var decrypted = Decrypt(encrypted, key, square);
+Console.WriteLine($"Decrypted: {decrypted}");
diff --git a/Task/ADFGVX-cipher/JavaScript/adfgvx-cipher.js b/Task/ADFGVX-cipher/JavaScript/adfgvx-cipher.js
new file mode 100644
index 0000000000..0bdfe6eb1a
--- /dev/null
+++ b/Task/ADFGVX-cipher/JavaScript/adfgvx-cipher.js
@@ -0,0 +1,134 @@
+class ADFGVX {
+ /** The WWI German ADFGVX cipher. */
+ constructor(spoly, k, alph = 'ADFGVX') {
+ this.polybius = spoly.toUpperCase().split('');
+ this.pdim = Math.floor(Math.sqrt(this.polybius.length));
+ this.key = k.toUpperCase().split('');
+ this.keylen = this.key.length;
+ this.alphabet = alph.split('');
+ const pairs = [];
+ for (let i = 0; i < this.alphabet.length; i++) {
+ for (let j = 0; j < this.alphabet.length; j++) {
+ pairs.push(this.alphabet[i] + this.alphabet[j]);
+ }
+ }
+ this.encode = {};
+ for (let i = 0; i < this.polybius.length; i++) {
+ this.encode[this.polybius[i]] = pairs[i];
+ }
+ this.decode = {};
+ for (const k in this.encode) {
+ this.decode[this.encode[k]] = k;
+ }
+ }
+
+ encrypt(msg) {
+ /** Encrypt with the ADFGVX cipher. */
+ const chars = [];
+ for (const c of msg.toUpperCase()) {
+ if (this.polybius.includes(c)) {
+ chars.push(this.encode[c]);
+ }
+ }
+ const flatChars = chars.join('').split('');
+ const colvecs = [];
+ for (let i = 0; i < this.keylen; i++) {
+ const currentCol = [];
+ for (let j = i; j < flatChars.length; j += this.keylen) {
+ currentCol.push(flatChars[j]);
+ }
+ colvecs.push([this.key[i], currentCol]);
+ }
+
+ colvecs.sort((a, b) => a[0].localeCompare(b[0]));
+
+ let result = '';
+ for (const a of colvecs) {
+ result += a[1].join('');
+ }
+ return result;
+ }
+
+ decrypt(cod) {
+ /** Decrypt with the ADFGVX cipher. Does not depend on spacing of encoded text */
+ const chars = [];
+ for (const c of cod) {
+ if (this.alphabet.includes(c)) {
+ chars.push(c);
+ }
+ }
+
+ const sortedkey = [...this.key].sort();
+ const order = [];
+ for (const ch of sortedkey) {
+ order.push(this.key.indexOf(ch));
+ }
+ const originalorder = [];
+ for (const ch of this.key) {
+ originalorder.push(sortedkey.indexOf(ch));
+ }
+
+ const base = Math.floor(chars.length / this.keylen);
+ const extra = chars.length % this.keylen;
+ const strides = order.map((_, i) => base + (extra > i ? 1 : 0));
+ const starts = [0];
+ let sum = 0;
+ for (let i = 0; i < strides.length - 1; i++) {
+ sum += strides[i];
+ starts.push(sum);
+ }
+ const ends = starts.map((start, i) => start + strides[i]);
+ const cols = originalorder.map(i => chars.slice(starts[i], ends[i]));
+
+ const pairs = [];
+ for (let i = 0; i < Math.floor((chars.length - 1) / this.keylen) + 1; i++) {
+ for (let j = 0; j < this.keylen; j++) {
+ if (i * this.keylen + j < chars.length) {
+ pairs.push(cols[j][i]);
+ }
+ }
+ }
+
+ let decoded = '';
+ for (let i = 0; i < pairs.length; i += 2) {
+ decoded += this.decode[pairs[i] + pairs[i + 1]];
+ }
+ return decoded;
+ }
+}
+
+// Helper function to shuffle an array (Fisher-Yates shuffle)
+function shuffle(array) {
+ for (let i = array.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1));
+ [array[i], array[j]] = [array[j], array[i]];
+ }
+ return array;
+}
+
+
+async function main() {
+ const PCHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.split('');
+ shuffle(PCHARS);
+ const POLYBIUS = PCHARS.join('');
+
+ // Simulate reading from unixdict.txt (replace with your actual file reading method if needed)
+ // For demonstration purposes, using a hardcoded word list:
+ const WORDS = ['ABDEFGHIK', 'JLMNOPQRS', 'TUVWXYZ01', '23456789'];
+ const KEY = WORDS[Math.floor(Math.random() * WORDS.length)];
+
+
+ const SECRET = new ADFGVX(POLYBIUS, KEY);
+ const MESSAGE = 'ATTACKAT1200AM';
+
+ console.log(`Polybius: ${POLYBIUS}, key: ${KEY}`);
+ console.log('Message: ', MESSAGE);
+
+ const ENCODED = SECRET.encrypt(MESSAGE);
+ const DECODED = SECRET.decrypt(ENCODED);
+
+ console.log('Encoded: ', ENCODED);
+ console.log('Decoded: ', DECODED);
+}
+
+main();
diff --git a/Task/ADFGVX-cipher/M2000-Interpreter/adfgvx-cipher.m2000 b/Task/ADFGVX-cipher/M2000-Interpreter/adfgvx-cipher.m2000
new file mode 100644
index 0000000000..1cc6519280
--- /dev/null
+++ b/Task/ADFGVX-cipher/M2000-Interpreter/adfgvx-cipher.m2000
@@ -0,0 +1,116 @@
+Module CheckADFGVX_Cipher {
+ Class cipher {
+ Private:
+ buffer a as byte*36
+ b="ADFGVX"
+ key="ABCDEFGHIJK"
+ orderkey="ABCDEFGHIJK"
+ map=list
+ map2=list
+ module preparemaps {
+ for i=0 to 5
+ jj=0
+ for j=i*6 to j+5
+ .map(chr$(.a[j]))=mid$(.b, i+1,1)+mid$(.b,jj+1, 1)
+ .map2(mid$(.b, i+1,1)+mid$(.b,jj+1, 1))=chr$(.a[j])
+ jj++
+ next
+ next
+ }
+ Public:
+ Module SetRandom (&returnvalue) {
+ return .a, 0:=str$("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
+ for i=1 to 100
+ c=random(0, 35):d=c
+ while c=d {d=random(0, 35)}
+ byte o=.a[c]
+ .a[c]<=.a[d]
+ .a[d]<=o
+ next
+ returnvalue=chr$(eval$(.a)) ' convert to UTF16LE
+ .preparemaps
+ }
+ Module SetSpecific (that$){
+ return .a, 0:=str$(Ucase$(that$))
+ .preparemaps
+ }
+ Module SetKey (.key as string) {
+ .key<=ucase$(.key)
+ if len(.key)<7 or len(.key)>12 then Error "Key has not proper length"
+ if filter$(.key, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")<>"" then
+ Error "Key has bad letters"
+ end if
+ dim aa(1 to len(.key))
+ for i=1 to len(.key):aa(i)=mid$(.key,i,1):next
+ .orderkey<=aa()#sort()#str$("")
+ }
+ Module Display {
+ Print "The 6 x 6 Polybius square:"
+ Print " | A D F G V X"
+ Print "---------------"
+ for i=0 to 5
+ Print mid$(.b,i+1,1)+" | ";
+ jj=0
+ for j=i*6 to j+5
+ print chr$(.a[j]);" ";
+ jj++
+ next
+ print
+ next
+ Print "Key:";.key
+ }
+ Function Encrypt(p as string) {
+ crypted=""
+ for i=1 to len(p)
+ crypted+=.map$(mid$(p,i,1))
+ next
+ m=1
+ encrypted=""
+ For i = 1 To Len(.key)
+ ch = Mid$(.orderkey, i, 1)
+ For j = Instr(.key, ch) - 1 To Len(crypted) - 1 Step Len(.key)
+ encrypted += Mid$(crypted, j + 1, 1)
+ if m mod 5=0 then encrypted += " "
+ m++
+ Next
+ Next
+ =encrypted
+ }
+ Function Decrypt(p as string) {
+ p=filter$(p, " ")
+ decrypted=""
+ m=1
+ dim b$(len(p))
+ For i = 1 To Len(.key)
+ ch = Mid$(.orderkey, i, 1)
+ For j = Instr(.key, ch) - 1 To Len(p) - 1 Step Len(.key)
+ b$(j)=mid$(p, m, 1)
+ m++
+ Next
+ Next
+ for i=0 to len(b$())-1 step 2
+ decrypted+=.map2(b$(i)+b$(i+1))
+ next
+ =decrypted
+ }
+ }
+ ADFGVX=cipher()
+ for ADFGVX {
+ .SetSpecific "A9GKMF1DQRSBVX8Z0WTEJLOPY5U4CN2H76I3"
+ .SetKey "volcanism"
+ .Display
+ encode=.Encrypt("ATTACKAT1200AM")
+ Print "Encoded: ";encode
+ Print "Decoded: ";.Decrypt(encode)
+ Rem { ' using randomblock
+ thisblock=""
+ .SetRandom &thisblock
+ Print "Random Block:";thisblock
+ .Display
+ encode=.Encrypt("ATTACKAT1200AM")
+ Print "Encoded: ";encode
+ Print "Decoded: ";.Decrypt(encode)
+ }
+ }
+}
+CheckADFGVX_Cipher
diff --git a/Task/AKS-test-for-primes/Ballerina/aks-test-for-primes.ballerina b/Task/AKS-test-for-primes/Ballerina/aks-test-for-primes.ballerina
new file mode 100644
index 0000000000..575c645a5f
--- /dev/null
+++ b/Task/AKS-test-for-primes/Ballerina/aks-test-for-primes.ballerina
@@ -0,0 +1,58 @@
+import ballerina/io;
+
+int[] e = "²³⁴⁵⁶⁷".toCodePointInts();
+
+function bc(int p) returns int[] {
+ int[] c = [];
+ c.setLength(p + 1);
+ int r = 1;
+ int half = p / 2;
+ foreach int i in 0...half {
+ c[i] = r;
+ c[p - i] = r;
+ r = r * (p - i) / (i + 1);
+ }
+ foreach int i in int:range(p - 1, -1, -2) {
+ c[i] = -c[i];
+ }
+ return c;
+}
+
+function pp(int[] c) returns string|error {
+ if c.length() == 1 { return c[0].toString(); }
+ int p = c.length() - 1;
+ string s = "";
+ if c[p] != 1 { s = c[p].toString(); }
+ foreach int i in int:range(p, 0, -1) {
+ s += "x";
+ if i != 1 { s += check string:fromCodePointInt(e[i - 2]); }
+ int d = c[i - 1];
+ if d < 0 {
+ s += " - " + (-d).toString();
+ } else {
+ s += " + " + d.toString();
+ }
+ }
+ return s;
+}
+
+function aks(int p) returns boolean {
+ int[] c = bc(p);
+ c[p] -= 1;
+ c[0] += 1;
+ foreach int d in c {
+ if d % p != 0 { return false; }
+ }
+ return true;
+}
+
+public function main() {
+ foreach int p in 0...7 {
+ io:println(p, ": ", pp(bc(p)));
+ }
+ io:println("\nAll primes under 50:");
+ foreach int p in 2...49 {
+ if aks(p) { io:print(p, " "); }
+ }
+ io:println();
+}
diff --git a/Task/AKS-test-for-primes/Elena/aks-test-for-primes.elena b/Task/AKS-test-for-primes/Elena/aks-test-for-primes.elena
index d1ab382bf3..714dc0f0ae 100644
--- a/Task/AKS-test-for-primes/Elena/aks-test-for-primes.elena
+++ b/Task/AKS-test-for-primes/Elena/aks-test-for-primes.elena
@@ -45,7 +45,7 @@ singleton AksTest
while(i != 0)
{
i -= 1;
- console.print("+",c[i],"x^",i)
+ Console.print("+",c[i],"x^",i)
}
}
}
@@ -55,18 +55,18 @@ public program()
for (int n := 0; n < 10; n += 1) {
AksTest.coef(n);
- console.print("(x-1)^",n," = ");
+ Console.print("(x-1)^",n," = ");
AksTest.show(n);
- console.printLine()
+ Console.printLine()
};
- console.print("Primes:");
+ Console.print("Primes:");
for (int n := 1; n <= 63; n += 1) {
if (AksTest.is_prime(n))
{
- console.print(n," ")
+ Console.print(n," ")
}
};
- console.printLine().readChar()
+ Console.printLine().readChar()
}
diff --git a/Task/AKS-test-for-primes/REXX/aks-test-for-primes-2.rexx b/Task/AKS-test-for-primes/REXX/aks-test-for-primes-2.rexx
index f2aa00be60..1942f69672 100644
--- a/Task/AKS-test-for-primes/REXX/aks-test-for-primes-2.rexx
+++ b/Task/AKS-test-for-primes/REXX/aks-test-for-primes-2.rexx
@@ -1,43 +1,91 @@
-/*REXX program calculates primes via the Agrawal─Kayal─Saxena (AKS) primality test.*/
-parse arg Z . /*obtain optional argument from the CL.*/
-if Z=='' | Z=="," then Z= 200 /*Not specified? Then use the default.*/
-OZ=Z; tell= Z<0; Z= abs(Z) /*Is Z negative? Then show expression.*/
-numeric digits max(9, Z % 3) /*define a dynamic # of decimal digits.*/
-call AKS /*invoke the AKS funtion for coef. bld.*/
-if left(OZ,1)=='+' then do; say Z isAksp(); exit /*display if Z is or isn't a prime.*/
- end /* [↑] call isAKSp if Z has leading +.*/
-say; say "primes found:" # /*display the prime number list. */
-say; if \datatype(#, 'W') then exit /* [↓] the digit length of a big coef.*/
-say 'Found ' words(#) " primes and the largest coefficient has " length(@.pm.h) @dd
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-AKS: $.0= '-'; $.1= "+"; @. = 1 /*$.x: sign char; default coefficients.*/
- q.= 1; q.1= 0; q.4= 0 /*sparse array for faster comparisons. */
- #=; L= length(Z) /*define list of prime numbers (so far)*/
- do p=3 for Z; pm=p - 1; pp=p + 1 /*PM & PP: used as a coding convenience*/
- do m=2 for pp % 2 - 1; mm=m - 1 /*calculate coefficients for a power. */
- @.p.m= @.pm.mm + @.pm.m; h=pp - m /*calculate left side of coefficients*/
- @.p.h= @.p.m /* " right " " " */
- end /*m*/ /* [↑] The M DO loop creates both */
- end /*p*/ /* sides in the same loop. */
- if tell then say '(x-1)^'right(0, L)": 1" /*possibly display the first expression*/
- @dd= 'decimal digits.' /* [↓] test for primality by division.*/
- do n=2 for Z; nh=n % 2; d= n - 1 /*create expressions; find the primes.*/
- do k=3 to nh while @.n.k//d == 0 /*are coefficients divisible by N-1 ? */
- end /*k*/ /* [↑] skip the 1st & 2nd coefficients*/
- if k>nh then if q.d then #= # d /*add a number to the prime list. */
- if \tell then iterate /*Don't tell? Don't show expressions.*/
- y= '(x-1)^'right(d, L)":" /*define the 1st part of the expression*/
- s=1 /*S: is the sign indicator (-1│+1).*/
- do j=n for n-1 by -1 /*create the higher powers first. */
- if j==2 then xp= 'x' /*if power=1, then don't show the power*/
- else xp= 'x^' || j-1 /* ··· else show power with ^ */
- if j==n then y=y xp /*no sign (+│-) for the 1st expression.*/
- else y=y $.s || @.n.j'∙'xp /*build the expression with sign (+|-).*/
- s= \s /*flip the sign for the next expression*/
- end /*j*/ /* [↑] the sign (now) is either 0 │ 1,*/
- say y $.s'1' /*just show the first N expressions, */
- end /*n*/ /* [↑] ··· but only for negative Z. */
- if #=='' then #= "none"; return # /*if null, return "none"; else return #*/
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-isAKSp: if z==word(#,words(#)) then return ' is a prime.'; else return " isn't a prime."
+-- 22 Mar 2025
+include Settings
+
+say 'AKS TEST FOR PRIMES'
+say version
+say
+arg p
+if p = '' then
+ p = 10
+numeric digits Max(10,Abs(p)%3)
+call Combis p
+call Polynomials p
+call Showprimes p
+exit
+
+Combis:
+procedure expose comb.
+arg p
+call Time('r')
+if p > 0 then
+ say 'Combinations up to' p'...'
+else
+ say 'Combinations for' Abs(p)'...'
+say Combinations(p) 'combinations generated'
+say Format(Time('e'),,3) 'seconds'
+say
+return
+
+Polynomials:
+procedure expose poly. comb. work. prim.
+arg p
+call Time('r')
+say 'Polynomials...'
+if p < 0 then
+ b = Abs(p)
+else
+ b = 0
+p = Abs(p); prim. = 0; n = 0
+do i = b to p
+ a = Ppow('1 -1',i)
+ if i < 11 then
+ say '(x-1)^'i '=' Plst2form(Parr2lst())
+ s = 1
+ do j = 2 to poly.0-1
+ a = poly.coef.j
+ if a//i > 0 then do
+ s = 0
+ leave j
+ end
+ end
+ if s = 1 then do
+ if i > 1 then do
+ n = n+1
+ prim.n = i
+ end
+ end
+end
+prim.0 = n
+say Format(Time('e'),,3) 'seconds'
+say
+return
+
+Showprimes:
+procedure expose prim.
+arg p
+call Time('r')
+say 'Primes...'
+if p < 0 then do
+ p = Abs(p)
+ if prim.0 > 0 then
+ say p 'is prime'
+ else
+ say p 'is not prime'
+end
+else do
+ do i = 1 to prim.0
+ call Charout ,Right(prim.i,5)
+ if i//20 = 0 then
+ say
+ end
+ say
+end
+say Format(Time('e'),,3) 'seconds'
+say
+return
+
+include Functions
+include Numbers
+include Polynomial
+include Sequences
+include Abend
diff --git a/Task/AKS-test-for-primes/REXX/aks-test-for-primes-3.rexx b/Task/AKS-test-for-primes/REXX/aks-test-for-primes-3.rexx
deleted file mode 100644
index 77862e7896..0000000000
--- a/Task/AKS-test-for-primes/REXX/aks-test-for-primes-3.rexx
+++ /dev/null
@@ -1,89 +0,0 @@
-include Settings
-
-say version
-say 'AKS-test for primes'; say
-arg p
-if p = '' then
- p = 10
-numeric digits Max(10,Abs(p)%3)
-call Combis p
-call Polynomials p
-call Showprimes p
-exit
-
-Combis:
-procedure expose comb.
-arg p
-call Time('r')
-if p > 0 then
- say 'Combinations up to' p'...'
-else
- say 'Combinations for' Abs(p)'...'
-say Combinations(p) 'combinations generated'
-say Format(Time('e'),,3) 'seconds'
-say
-return
-
-Polynomials:
-procedure expose poly. comb. work. prim.
-arg p
-call Time('r')
-say 'Polynomials...'
-if p < 0 then
- b = Abs(p)
-else
- b = 0
-p = Abs(p); prim. = 0; n = 0
-do i = b to p
- a = Ppow('1 -1',i)
- if i < 11 then
- say '(x-1)^'i '=' Plst2form(Parr2lst())
- s = 1
- do j = 2 to poly.0-1
- a = poly.coef.j
- if a//i > 0 then do
- s = 0
- leave j
- end
- end
- if s = 1 then do
- if i > 1 then do
- n = n+1
- prim.n = i
- end
- end
-end
-prim.0 = n
-say Format(Time('e'),,3) 'seconds'
-say
-return
-
-Showprimes:
-procedure expose prim.
-arg p
-call Time('r')
-say 'Primes...'
-if p < 0 then do
- p = Abs(p)
- if prim.0 > 0 then
- say p 'is prime'
- else
- say p 'is not prime'
-end
-else do
- do i = 1 to prim.0
- call Charout ,Right(prim.i,5)
- if i//20 = 0 then
- say
- end
- say
-end
-say Format(Time('e'),,3) 'seconds'
-say
-return
-
-include Functions
-include Numbers
-include Polynomial
-include Sequences
-include Abend
diff --git a/Task/ASCII-art-diagram-converter/C-sharp/ascii-art-diagram-converter-1.cs b/Task/ASCII-art-diagram-converter/C-sharp/ascii-art-diagram-converter-1.cs
new file mode 100644
index 0000000000..003dbde2f0
--- /dev/null
+++ b/Task/ASCII-art-diagram-converter/C-sharp/ascii-art-diagram-converter-1.cs
@@ -0,0 +1,190 @@
+using System.CodeDom.Compiler;
+using System.Diagnostics;
+
+var format = @"+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+| ID |
++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+| QDCOUNT |
++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+| ANCOUNT |
++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+| NSCOUNT |
++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+| ARCOUNT |
++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+";
+
+var lines = format.Split('\n')
+ .Select(line => line.Trim())
+ .Where(s => s.Length > 0)
+ .ToArray();
+
+var first = lines[0];
+var ll = first.Length;
+
+if (lines.Any(line => line.Length != ll))
+ throw new Exception("Lines are not the same length.");
+
+if (first[0] != '+' || first[^1] != '+')
+ throw new Exception("First line does not start and end with '+'.");
+
+var bits = first.Split('+')[1..^1];
+
+if (bits.Any(bit => bit != "--"))
+ throw new Exception("Not all bits on first line match '+--+'.");
+
+if (lines.Length % 2 == 0)
+ throw new Exception("Expected an odd number of definition lines.");
+
+var rows = lines.Length / 2;
+
+if (Enumerable.Range(0, rows).Any(row => lines[2 * row + 2] != first))
+ throw new Exception("Not all line separators match first line.");
+
+var width = bits.Length;
+
+if (width != 8 && width != 16 && width != 32 && width != 64)
+ throw new Exception("Bit width is not 8, 16, 32, or 64.");
+
+var ftype = width switch
+{
+ 8 => "byte",
+ 16 => "ushort",
+ 32 => "uint",
+ _ => "ulong"
+};
+
+const string filename = "Header.cs";
+const string structName = "Header";
+List<(string Name, int Width)> fieldList = [];
+List backing = [];
+
+using (var file = File.CreateText(filename))
+using (var code = new IndentedTextWriter(file))
+{
+ code.WriteLine("using System.Buffers.Binary;");
+ code.WriteLine("using System.Runtime.InteropServices;");
+ code.WriteLine();
+ code.WriteLine("[StructLayout(LayoutKind.Sequential, Pack = 0)]");
+ code.WriteLine($"public struct {structName}");
+ code.WriteLine("{");
+ code.Indent++;
+ code.WriteLine($"public static readonly int MarshalledSize = Marshal.SizeOf<{structName}>();");
+
+ for (var row = 0; row < rows; row++)
+ {
+ var def = lines[row * 2 + 1];
+
+ if (def[0] != '|' || def[^1] != '|')
+ throw new Exception($"Row {row} doesn't start and end with '|'.");
+
+ var fields = def.Split('|')[1..^1];
+
+ if (fields.Length > 1)
+ {
+ code.WriteLine();
+ code.WriteLine($"{ftype} data{row};");
+ backing.Add($"data{row}");
+ }
+
+ var offset = width;
+
+ foreach (var field in fields)
+ {
+ if (field.Length % 3 != 2)
+ throw new Exception($"Field '{field.Trim()}' delimiters misaligned.");
+
+ var fname = field.Trim();
+
+ if (fname.Length == 0)
+ throw new Exception($"Field name is missing.");
+
+ var fwidth = (field.Length + 1) / 3;
+ offset -= fwidth;
+ fieldList.Add((fname, fwidth));
+ var mask = "0b" + new string('1', fwidth);
+ var nmask = "0b" + new string('1', width - fwidth - offset) + new string('0', fwidth) + new string('1', offset);
+ code.WriteLine();
+ code.WriteLine($"public {ftype} {fname}");
+ code.WriteLine("{");
+ code.Indent++;
+
+ if (fields.Length == 1)
+ {
+ code.WriteLine("readonly get;");
+ code.WriteLine("set;");
+ backing.Add(fname);
+ }
+ else
+ {
+ code.WriteLine($"readonly get {{ return ({ftype})((data{row} >> {offset}) & {mask});}}");
+ code.WriteLine($"set {{ data{row} = ({ftype})((data{row} & {nmask}) | ((value & {mask}) << {offset})); }}");
+ }
+
+ code.Indent--;
+ code.WriteLine("}");
+ }
+ }
+
+ code.WriteLine();
+ code.WriteLine($"public static {structName} FromArray(byte[] bytes)");
+ code.WriteLine("{");
+ code.Indent++;
+ code.WriteLine("var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);");
+ code.WriteLine($"var result = Marshal.PtrToStructure<{structName}>(handle.AddrOfPinnedObject());");
+ code.WriteLine("handle.Free();");
+
+ if (width > 8)
+ {
+ code.WriteLine();
+ code.WriteLine("if (BitConverter.IsLittleEndian)");
+ code.WriteLine("{");
+ code.Indent++;
+
+ foreach (var f in backing)
+ {
+ code.WriteLine($"result.{f} = BinaryPrimitives.ReverseEndianness(result.{f});");
+ }
+
+ code.Indent--;
+ code.WriteLine("}");
+ code.WriteLine();
+ }
+
+ code.WriteLine("return result;");
+ code.Indent--;
+ code.WriteLine("}");
+ code.WriteLine();
+ code.WriteLine("public readonly byte[] ToArray()");
+ code.WriteLine("{");
+ code.Indent++;
+ code.WriteLine($"var bytes = new byte[Marshal.SizeOf<{structName}>()];");
+ code.WriteLine("var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);");
+ code.WriteLine("Marshal.StructureToPtr(this, handle.AddrOfPinnedObject(), false);");
+ code.WriteLine("handle.Free();");
+
+ if (width > 8)
+ {
+ code.WriteLine();
+ code.WriteLine("if (BitConverter.IsLittleEndian)");
+ code.WriteLine("{");
+ code.Indent++;
+ code.WriteLine($"for (var i = 0; i < MarshalledSize; i += sizeof({ftype}))");
+ code.WriteLine("{");
+ code.Indent++;
+ code.WriteLine($"Array.Reverse(bytes, i, sizeof({ftype}));");
+ code.Indent--;
+ code.WriteLine("}");
+ code.Indent--;
+ code.WriteLine("}");
+ code.WriteLine();
+ }
+
+ code.WriteLine("return bytes;");
+ code.Indent--;
+ code.WriteLine("}");
+
+ code.Indent--;
+ code.WriteLine("}");
+}
diff --git a/Task/ASCII-art-diagram-converter/C-sharp/ascii-art-diagram-converter-2.cs b/Task/ASCII-art-diagram-converter/C-sharp/ascii-art-diagram-converter-2.cs
new file mode 100644
index 0000000000..9fb3e832ae
--- /dev/null
+++ b/Task/ASCII-art-diagram-converter/C-sharp/ascii-art-diagram-converter-2.cs
@@ -0,0 +1,15 @@
+var bytes = new byte[Header.MarshalledSize];
+Random.Shared.NextBytes(bytes);
+var header = Header.FromArray(bytes);
+var bytes2 = header.ToArray();
+Debug.Assert(Enumerable.SequenceEqual(bytes, bytes2));
+Console.WriteLine($"Struct size: {Header.MarshalledSize} bytes");
+Console.WriteLine($"Binary data: {string.Join(" ", bytes.Select(b => b.ToString("B8")))}");
+Console.WriteLine($"Fields");
+
+foreach (var (fname, fwidth) in fieldList)
+{
+ var value = typeof(Header).GetProperty(fname)!.GetValue(header);
+ var vstr = $"{value!:B}".PadLeft(fwidth, '0');
+ Console.WriteLine($" {fname} = {vstr}");
+}
diff --git a/Task/Abbreviations-automatic/EasyLang/abbreviations-automatic.easy b/Task/Abbreviations-automatic/EasyLang/abbreviations-automatic.easy
new file mode 100644
index 0000000000..4953f45b97
--- /dev/null
+++ b/Task/Abbreviations-automatic/EasyLang/abbreviations-automatic.easy
@@ -0,0 +1,30 @@
+proc abbrev s$ .
+ d$[] = strtok s$ " "
+ repeat
+ lng += 1
+ for i to len d$[] - 1
+ a$ = substr d$[i] 1 lng
+ for j = i + 1 to len d$[]
+ if substr d$[j] 1 lng = a$ : break 2
+ .
+ .
+ until i = len d$[]
+ .
+ print lng & ": " & s$
+.
+repeat
+ s$ = input
+ if s$ = ""
+ print s$
+ s$ = input
+ .
+ until s$ = ""
+ abbrev s$
+.
+#
+input_data
+Sunday Monday Tuesday Wednesday Thursday Friday Saturday
+Sondag Maandag Dinsdag Woensdag Donderdag Vrydag Saterdag
+E_djelë E_hënë E_martë E_mërkurë E_enjte E_premte E_shtunë
+Ehud Segno Maksegno Erob Hamus Arbe Kedame
+Al_Ahad Al_Ithinin Al_Tholatha'a Al_Arbia'a Al_Kamis Al_Gomia'a Al_Sabit
diff --git a/Task/Abbreviations-easy/Crystal/abbreviations-easy.cr b/Task/Abbreviations-easy/Crystal/abbreviations-easy.cr
new file mode 100644
index 0000000000..ddf3b6a402
--- /dev/null
+++ b/Task/Abbreviations-easy/Crystal/abbreviations-easy.cr
@@ -0,0 +1,17 @@
+abbrevs = Hash(String, String).new
+
+" Add ALTer BAckup Bottom CAppend Change SCHANGE CInsert CLAst COMPress COpy
+ COUnt COVerlay CURsor DELete CDelete Down DUPlicate Xedit EXPand EXTract Find
+ NFind NFINDUp NFUp CFind FINdup FUp FOrward GET Help HEXType Input POWerinput
+ Join SPlit SPLTJOIN LOAD Locate CLocate LOWercase UPPercase LPrefix MACRO
+ MErge MODify MOve MSG Next Overlay PARSE PREServe PURge PUT PUTD Query QUIT
+ READ RECover REFRESH RENum REPeat Replace CReplace RESet RESTore RGTLEFT
+ RIght LEft SAVE SET SHift SI SORT SOS STAck STATus TOP TRAnsfer Type Up
+".scan(/([A-Z]+)([a-z]*)/) do |m|
+ command, minimal_abbrev, extra_letters = m[0].upcase, m[1], m[2].upcase
+ extra_letters.chars.accumulate(minimal_abbrev).each do |k| abbrevs[k] = command end
+end
+
+puts "riG rePEAT copies put mo rest types fup. 6 poweRin".split.map {|w|
+ abbrevs[w.upcase]? || "*error*"
+}.join(" ")
diff --git a/Task/Abbreviations-easy/EasyLang/abbreviations-easy.easy b/Task/Abbreviations-easy/EasyLang/abbreviations-easy.easy
new file mode 100644
index 0000000000..17497ce6cb
--- /dev/null
+++ b/Task/Abbreviations-easy/EasyLang/abbreviations-easy.easy
@@ -0,0 +1,42 @@
+a$ = "Add ALTer BAckup Bottom CAppend Change SCHANGE CInsert CLAst COMPress COpy"
+a$ &= " COUnt COVerlay CURsor DELete CDelete Down DUPlicate Xedit EXPand EXTract Find"
+a$ &= " NFind NFINDUp NFUp CFind FINdup FUp FOrward GET Help HEXType Input POWerinput"
+a$ &= " Join SPlit SPLTJOIN LOAD Locate CLocate LOWercase UPPercase LPrefix MACRO"
+a$ &= " MErge MODify MOve MSG Next Overlay PARSE PREServe PURge PUT PUTD Query QUIT"
+a$ &= " READ RECover REFRESH RENum REPeat Replace CReplace RESet RESTore RGTLEFT"
+a$ &= " RIght LEft SAVE SET SHift SI SORT SOS STAck STATus TOP TRAnsfer Type Up"
+cmd$[] = strtok a$ " "
+#
+func$ toupper s$ .
+ for c$ in strchars s$
+ c = strcode c$
+ if c >= 97 : c -= 32
+ r$ &= strchar c
+ .
+ return r$
+.
+for i to len cmd$[]
+ h$ = ""
+ for c$ in strchars cmd$[i]
+ if strcode c$ > strcode "Z" : break 1
+ h$ &= c$
+ .
+ abbr$[] &= h$
+ cmd$[i] = toupper cmd$[i]
+.
+func$ getabbr in$ .
+ in$ = toupper in$
+ for i to len cmd$[]
+ if strpos cmd$[i] in$ = 1 and strpos in$ abbr$[i] = 1
+ return cmd$[i]
+ .
+ .
+ return "*error*"
+.
+in$[] = strtok input " "
+for s$ in in$[]
+ write getabbr s$ & " "
+.
+#
+input_data
+riG rePEAT copies put mo rest types fup. 6 poweRin
diff --git a/Task/Abbreviations-simple/EasyLang/abbreviations-simple.easy b/Task/Abbreviations-simple/EasyLang/abbreviations-simple.easy
new file mode 100644
index 0000000000..ffbc7cc06f
--- /dev/null
+++ b/Task/Abbreviations-simple/EasyLang/abbreviations-simple.easy
@@ -0,0 +1,42 @@
+a$ = "add 1 alter 3 backup 2 bottom 1 Cappend 2 change 1 Schange Cinsert 2 Clast 3"
+a$ &= " compress 4 copy 2 count 3 Coverlay 3 cursor 3 delete 3 Cdelete 2 down 1 duplicate"
+a$ &= " 3 xEdit 1 expand 3 extract 3 find 1 Nfind 2 Nfindup 6 NfUP 3 Cfind 2 findUP 3 fUP 2"
+a$ &= " forward 2 get help 1 hexType 4 input 1 powerInput 3 join 1 split 2 spltJOIN load"
+a$ &= " locate 1 Clocate 2 lowerCase 3 upperCase 3 Lprefix 2 macro merge 2 modify 3 move 2"
+a$ &= " msg next 1 overlay 1 parse preserve 4 purge 3 put putD query 1 quit read recover 3"
+a$ &= " refresh renum 3 repeat 3 replace 1 Creplace 2 reset 3 restore 4 rgtLEFT right 2 left"
+a$ &= " 2 save set shift 2 si sort sos stack 3 status 4 top transfer 3 type 1 up 1"
+toks$[] = strtok a$ " "
+#
+func$ toupper s$ .
+ for c$ in strchars s$
+ c = strcode c$
+ if c >= 97 : c -= 32
+ r$ &= strchar c
+ .
+ return r$
+.
+for tok$ in toks$[]
+ if number tok$ <> 0
+ cnt[$] = number tok$
+ else
+ cmd$[] &= toupper tok$
+ cnt[] &= 999
+ .
+.
+func$ getabbr in$ .
+ in$ = toupper in$
+ for i to len cmd$[]
+ if cmd$[i] = in$ or len in$ >= cnt[i] and strpos cmd$[i] in$ = 1
+ return cmd$[i]
+ .
+ .
+ return "*error*"
+.
+in$[] = strtok input " "
+for s$ in in$[]
+ write getabbr s$ & " "
+.
+#
+input_data
+riG rePEAT copies put mo rest types fup. 6 poweRin
diff --git a/Task/Abelian-sandpile-model-Identity/EasyLang/abelian-sandpile-model-identity.easy b/Task/Abelian-sandpile-model-Identity/EasyLang/abelian-sandpile-model-identity.easy
index 3e0c4d008f..df68c01fac 100644
--- a/Task/Abelian-sandpile-model-Identity/EasyLang/abelian-sandpile-model-identity.easy
+++ b/Task/Abelian-sandpile-model-Identity/EasyLang/abelian-sandpile-model-identity.easy
@@ -1,13 +1,11 @@
-proc out s[] . .
+proc out s[] .
for r = 0 to 2
- for c to 3
- write s[c + 3 * r] & " "
- .
+ for c to 3 : write s[c + 3 * r] & " "
print ""
.
print ""
.
-proc stab . m[] .
+proc stab &m[] .
n = sqrt len m[]
repeat
stable = 1
@@ -15,27 +13,17 @@ proc stab . m[] .
if m[p] >= 4
stable = 0
m[p] -= 4
- if p > n
- m[p - n] += 1
- .
- if p mod n <> 0
- m[p + 1] += 1
- .
- if p <= len m[] - n
- m[p + n] += 1
- .
- if p mod n <> 1
- m[p - 1] += 1
- .
+ if p > n : m[p - n] += 1
+ if p mod n <> 0 : m[p + 1] += 1
+ if p <= len m[] - n : m[p + n] += 1
+ if p mod n <> 1 : m[p - 1] += 1
.
.
until stable = 1
.
.
func[] add s1[] s2[] .
- for i to len s1[]
- r[] &= s1[i] + s2[i]
- .
+ for i to len s1[] : r[] &= s1[i] + s2[i]
stab r[]
return r[]
.
diff --git a/Task/Abelian-sandpile-model/EasyLang/abelian-sandpile-model.easy b/Task/Abelian-sandpile-model/EasyLang/abelian-sandpile-model.easy
index c77b7a2530..12ff7d05c0 100644
--- a/Task/Abelian-sandpile-model/EasyLang/abelian-sandpile-model.easy
+++ b/Task/Abelian-sandpile-model/EasyLang/abelian-sandpile-model.easy
@@ -2,19 +2,18 @@ n = 77
len m[] n * n
m[n * n div 2 + 1] = 10000
#
-proc show . .
+proc show .
sc = 100 / n
for r range0 n
for c range0 n
- move c * sc r * sc
p = r * n + c + 1
- color 222 * m[p]
- rect sc sc
+ gcolor 222 * m[p]
+ grect c * sc r * sc sc sc
.
.
sleep 0
.
-proc run . .
+proc run .
repeat
mp[] = m[]
stable = 1
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/Ballerina/abundant-deficient-and-perfect-number-classifications-1.ballerina b/Task/Abundant-deficient-and-perfect-number-classifications/Ballerina/abundant-deficient-and-perfect-number-classifications-1.ballerina
new file mode 100644
index 0000000000..4b63fb03d5
--- /dev/null
+++ b/Task/Abundant-deficient-and-perfect-number-classifications/Ballerina/abundant-deficient-and-perfect-number-classifications-1.ballerina
@@ -0,0 +1,46 @@
+import ballerina/io;
+
+function divisors(int n) returns int[] {
+ if n < 1 { return []; }
+ int[] divisors = [];
+ int[] divisors2 = [];
+ int i = 1;
+ int k = n % 2 == 0 ? 1 : 2;
+ while i * i <= n {
+ if n % i == 0 {
+ divisors.push(i);
+ int j = n / i;
+ if j != i { divisors2.push(j); }
+ }
+ i += k;
+ }
+ if divisors2.length() > 0 {
+ divisors.push(...divisors2.reverse());
+ }
+ return divisors;
+}
+
+function properDivisors(int n) returns int[] {
+ int[] d = divisors(n);
+ int c = d.length();
+ return c <= 1 ? [] : d.slice(0, c - 1);
+}
+
+public function main() {
+ int d = 0;
+ int a = 0;
+ int p = 0;
+ foreach int i in 1...20000 {
+ int j = int:sum(...properDivisors(i));
+ if j < i {
+ d += 1;
+ } else if j == i {
+ p += 1;
+ } else {
+ a += 1;
+ }
+ }
+ io:println("There are ", d, " deficient numbers between 1 and 20000");
+ io:println("There are ", a, " abundant numbers between 1 and 20000");
+ io:println("There are ", p, " perfect numbers between 1 and 20000");
+}
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/Ballerina/abundant-deficient-and-perfect-number-classifications-2.ballerina b/Task/Abundant-deficient-and-perfect-number-classifications/Ballerina/abundant-deficient-and-perfect-number-classifications-2.ballerina
new file mode 100644
index 0000000000..a96bb0a4a1
--- /dev/null
+++ b/Task/Abundant-deficient-and-perfect-number-classifications/Ballerina/abundant-deficient-and-perfect-number-classifications-2.ballerina
@@ -0,0 +1,36 @@
+import ballerina/io;
+
+public function main() {
+ final int maxNumber = 20000;
+ int abundantCount = 0;
+ int deficientCount = 0;
+ int perfectCount = 0;
+
+ int[] pds = [];
+ pds.push(0); // element 0
+ pds.push(0); // element 1
+ foreach int i in 2...maxNumber {
+ pds.push(1);
+ }
+ foreach int i in 2...maxNumber {
+ int j = i + i;
+ while j <= maxNumber {
+ pds[j] += i;
+ j += i;
+ }
+ }
+ foreach int n in 1...maxNumber {
+ int pdSum = pds[n];
+ if pdSum < n {
+ deficientCount += 1;
+ } else if pdSum == n {
+ perfectCount += 1;
+ } else { // pdSum > n
+ abundantCount += 1;
+ }
+ }
+
+ io:println("Abundant : ", abundantCount);
+ io:println("Deficient: ", deficientCount);
+ io:println("Perfect : ", perfectCount);
+}
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/Elena/abundant-deficient-and-perfect-number-classifications.elena b/Task/Abundant-deficient-and-perfect-number-classifications/Elena/abundant-deficient-and-perfect-number-classifications.elena
index 90f65ae3e7..7523b4abd7 100644
--- a/Task/Abundant-deficient-and-perfect-number-classifications/Elena/abundant-deficient-and-perfect-number-classifications.elena
+++ b/Task/Abundant-deficient-and-perfect-number-classifications/Elena/abundant-deficient-and-perfect-number-classifications.elena
@@ -47,5 +47,5 @@ public program()
int deficient := 0;
int perfect := 0;
classifyNumbers(20000, ref abundant, ref deficient, ref perfect);
- console.printLine("Abundant: ",abundant,", Deficient: ",deficient,", Perfect: ",perfect)
+ Console.printLine("Abundant: ",abundant,", Deficient: ",deficient,", Perfect: ",perfect)
}
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-1.rexx b/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-1.rexx
index 076015bcfb..e2df0a6f1f 100644
--- a/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-1.rexx
+++ b/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-1.rexx
@@ -1,23 +1,51 @@
-/*REXX program counts the number of abundant/deficient/perfect numbers within a range.*/
-parse arg low high . /*obtain optional arguments from the CL*/
-high=word(high low 20000,1); low= word(low 1,1) /*obtain the LOW and HIGH values.*/
-say center('integers from ' low " to " high, 45, "═") /*display a header.*/
-!.= 0 /*define all types of sums to zero. */
- do j=low to high; $= sigma(j) /*get sigma for an integer in a range. */
- if $j then !.a= !.a + 1 /*Greater? " " abundant " */
- else !.p= !.p + 1 /*Equal? " " perfect " */
- end /*j*/ /* [↑] IFs are coded as per likelihood*/
+/* REXX */
+Call time 'R'
+cnt.=0
+Do x=1 To 20000
+ pd=proper_divisors(x)
+ sumpd=sum(pd)
+ Select
+ When xhi Then Do
+ list.npd=x
+ hi=npd
+ End
+ When npd=hi Then
+ list.hi=list.hi x
+ Otherwise
+ Nop
+ End
+ End
-say ' the number of perfect numbers: ' right(!.p, length(high) )
-say ' the number of abundant numbers: ' right(!.a, length(high) )
-say ' the number of deficient numbers: ' right(!.d, length(high) )
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-sigma: procedure; parse arg x; if x<2 then return 0; odd=x // 2 /* // ◄──remainder.*/
- s= 1 /* [↓] only use EVEN or ODD integers.*/
- do k=2+odd by 1+odd while k*kj then !.a= !.a + 1 /*Greater? " " abundant " */
- else !.p= !.p + 1 /*Equal? " " perfect " */
- end /*j*/ /* [↑] IFs are coded as per likelihood*/
+-- 8 May 2025
+include Settings
-say ' the number of perfect numbers: ' right(!.p, length(high) )
-say ' the number of abundant numbers: ' right(!.a, length(high) )
-say ' the number of deficient numbers: ' right(!.d, length(high) )
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-sigma: procedure; parse arg x 1 z; if x<5 then return max(0, x-1) /*sets X&Z to arg1.*/
- q=1; do while q<=z; q= q * 4; end /* ◄──↓ compute integer sqrt of Z (=R)*/
- r=0; do while q>1; q=q%4; _=z-r-q; r=r%2; if _>=0 then do; z=_; r=r+q; end; end
- odd= x//2 /* [↓] only use EVEN | ODD ints. ___*/
- s= 1; do k=2+odd by 1+odd to r /*divide by all integers up to √ x */
- if x//k==0 then s=s + k + x%k /*add the two divisors to (sigma) sum. */
- end /*k*/ /* [↑] % is the REXX integer division*/
- if r*r==x then return s - k /*Was X a square? If so, subtract √ x */
- return s /*return (sigma) sum of the divisors. */
+say 'ABUNDANT, DEFICIENT AND PERFECT NUMBER CLASSIFICATIONS'
+say version
+say
+parse value 0 0 0 with a p d
+do x = 1 to 20000
+ sum = Aliquot(x)
+ select
+ when x < sum then
+ a = a+1
+ when x = sum then
+ p = p+1
+ otherwise
+ d = d+1
+ end
+end
+
+say 'In the range 1 - 20000'
+say Format(a,5) 'numbers are abundant '
+say Format(p,5) 'numbers are perfect '
+say Format(d,5) 'numbers are deficient '
+say Time('e') 'seconds'
+exit
+
+include Numbers
+include Functions
+include Special
+include Abend
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-3.rexx b/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-3.rexx
deleted file mode 100644
index e2df0a6f1f..0000000000
--- a/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-3.rexx
+++ /dev/null
@@ -1,51 +0,0 @@
-/* REXX */
-Call time 'R'
-cnt.=0
-Do x=1 To 20000
- pd=proper_divisors(x)
- sumpd=sum(pd)
- Select
- When xhi Then Do
- list.npd=x
- hi=npd
- End
- When npd=hi Then
- list.hi=list.hi x
- Otherwise
- Nop
- End
- End
-
-Say 'In the range 1 - 20000'
-Say format(cnt.abundant ,5) 'numbers are abundant '
-Say format(cnt.perfect ,5) 'numbers are perfect '
-Say format(cnt.deficient,5) 'numbers are deficient '
-Say time('E') 'seconds elapsed'
-Exit
-
-proper_divisors: Procedure
-Parse Arg n
-Pd=''
-If n=1 Then Return ''
-If n//2=1 Then /* odd number */
- delta=2
-Else /* even number */
- delta=1
-Do d=1 To n%2 By delta
- If n//d=0 Then
- pd=pd d
- End
-Return space(pd)
-
-sum: Procedure
-Parse Arg list
-sum=0
-Do i=1 To words(list)
- sum=sum+word(list,i)
- End
-Return sum
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-4.rexx b/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-4.rexx
deleted file mode 100644
index 488aede163..0000000000
--- a/Task/Abundant-deficient-and-perfect-number-classifications/REXX/abundant-deficient-and-perfect-number-classifications-4.rexx
+++ /dev/null
@@ -1,27 +0,0 @@
-/* REXX */
-Call time 'R'
-cnt.=0
-Do x=1 to 20000
- sumpd=Sigma(x)-x
- Select
- When x 2n''',
-
or, equivalently, the ''sum of proper divisors'' (or aliquot sum) '''s(n) > n'''.
+An [[wp:Abundant_number|Abundant number]] is a number '''n''' for which the ''sum of divisors'' '''''',
+
or, equivalently, the ''sum of proper divisors'' (or aliquot sum) ''''''.
;E.G.:
-'''12''' is abundant, it has the proper divisors '''1,2,3,4 & 6''' which sum to '''16''' ( > '''12''' or '''n''');
-
or alternately, has the sigma sum of '''1,2,3,4,6 & 12''' which sum to '''28''' ( > '''24''' or '''2n''').
+'''12''' is abundant, it has the proper divisors '''1, 2, 3, 4 & 6''' which sum to '''16''' ( > '''12''' or '''n''');
+
or alternately, has the sigma sum of '''1, 2, 3, 4, 6 & 12''' which sum to '''28''' ( > '''24''' or '''2n''').
Abundant numbers are common, though '''even''' abundant numbers seem to be much more common than '''odd''' abundant numbers.
@@ -15,7 +15,7 @@ To make things more interesting, this task is specifically about finding
;Task
*Find and display here: at least the first 25 abundant odd numbers and either their proper divisor sum or sigma sum.
*Find and display here: the one thousandth abundant odd number and either its proper divisor sum or sigma sum.
-*Find and display here: the first abundant odd number greater than one billion (109) and either its proper divisor sum or sigma sum.
+*Find and display here: the first abundant odd number greater than one billion () and either its proper divisor sum or sigma sum.
;References:
diff --git a/Task/Abundant-odd-numbers/Ballerina/abundant-odd-numbers.ballerina b/Task/Abundant-odd-numbers/Ballerina/abundant-odd-numbers.ballerina
new file mode 100644
index 0000000000..42e8483b29
--- /dev/null
+++ b/Task/Abundant-odd-numbers/Ballerina/abundant-odd-numbers.ballerina
@@ -0,0 +1,73 @@
+import ballerina/io;
+
+function divisors(int n) returns int[] {
+ if n < 1 { return []; }
+ int[] divisors = [];
+ int[] divisors2 = [];
+ int i = 1;
+ int k = n % 2 == 0 ? 1 : 2;
+ while i * i <= n {
+ if n % i == 0 {
+ divisors.push(i);
+ int j = n / i;
+ if j != i { divisors2.push(j); }
+ }
+ i += k;
+ }
+ if divisors2.length() > 0 {
+ divisors.push(...divisors2.reverse());
+ }
+ return divisors;
+}
+
+function properDivisors(int n) returns int[] {
+ int[] d = divisors(n);
+ int c = d.length();
+ return c <= 1 ? [] : d.slice(0, c - 1);
+}
+
+function sumStr(int[] divs) returns string {
+ var f = function(string acc, int div) returns string {
+ return acc + div.toString() + " + ";
+ };
+ string sum = divs.reduce(f, "");
+ int len = sum.length();
+ return sum.substring(0, len - 3);
+}
+
+function abundantOdd(int searchFrom, int countFrom, int countTo, boolean printOne)
+ returns int {
+ int count = countFrom;
+ int n = searchFrom;
+ while count < countTo {
+ int[] divs = properDivisors(n);
+ int tot = int:sum(...divs);
+ if tot > n {
+ count += 1;
+ if !printOne || count >= countTo {
+ string s = sumStr(divs);
+ if !printOne {
+ string s1 = count.toString().padStart(2);
+ string s2 = n.toString().padStart(5);
+ io:println(`${s1}. ${s2} < ${s} = ${tot}`);
+ } else {
+ io:println(`${n} < ${s} = ${tot}`);
+ }
+ }
+ }
+ n += 2;
+ }
+ return n;
+}
+
+public function main() {
+ final int max = 25;
+ io:println("The first ", max, " abundant odd numbers are:");
+ int n = abundantOdd(1, 0, 25, false);
+
+ io:println("\nThe one thousandth abundant odd number is:");
+ _ = abundantOdd(n, 25, 1000, true);
+
+ io:println("\nThe first abundant odd number above one billion is:");
+ _ = abundantOdd(1e9+1, 0, 1, true);
+}
diff --git a/Task/Abundant-odd-numbers/EasyLang/abundant-odd-numbers.easy b/Task/Abundant-odd-numbers/EasyLang/abundant-odd-numbers.easy
index 5cfb14b7e7..8092c07c7d 100644
--- a/Task/Abundant-odd-numbers/EasyLang/abundant-odd-numbers.easy
+++ b/Task/Abundant-odd-numbers/EasyLang/abundant-odd-numbers.easy
@@ -14,7 +14,7 @@ fastfunc sumdivs n .
return sum
.
n = 1
-numfmt 0 6
+numfmt 6 0
while cnt < 1000
sum = sumdivs n
if sum > n
diff --git a/Task/Accumulator-factory/Ballerina/accumulator-factory.ballerina b/Task/Accumulator-factory/Ballerina/accumulator-factory.ballerina
new file mode 100644
index 0000000000..a8f8252dea
--- /dev/null
+++ b/Task/Accumulator-factory/Ballerina/accumulator-factory.ballerina
@@ -0,0 +1,38 @@
+import ballerina/io;
+
+type numeric int|float|decimal;
+
+function accumulator(numeric acc) returns (function(numeric) returns numeric) {
+ numeric sum = acc;
+ return function(numeric n) returns numeric {
+ numeric sum2 = sum;
+ if sum2 is int && n is int {
+ sum2 += n;
+ } else if sum2 is float && n is float {
+ sum2 += n;
+ } else if sum2 is decimal && n is decimal {
+ sum2 += n;
+ } else if sum2 is int && n is float {
+ sum2 = sum2 + n;
+ } else if sum2 is int && n is decimal {
+ sum2 = sum2 + n;
+ } else if sum2 is float && n is int {
+ sum2 += n;
+ } else if sum2 is float && n is decimal {
+ sum2 = sum2 + n;
+ } else if sum2 is decimal && n is int {
+ sum2 += n;
+ } else if sum2 is decimal && n is float {
+ sum2 += n;
+ }
+ sum = sum2;
+ return sum;
+ };
+}
+
+public function main() {
+ var x = accumulator(1);
+ _ = x(5);
+ _ = accumulator(2);
+ io:println(x(2.3));
+}
diff --git a/Task/Accumulator-factory/Elena/accumulator-factory.elena b/Task/Accumulator-factory/Elena/accumulator-factory.elena
index be112e0585..ca3b64dd19 100644
--- a/Task/Accumulator-factory/Elena/accumulator-factory.elena
+++ b/Task/Accumulator-factory/Elena/accumulator-factory.elena
@@ -12,5 +12,5 @@ public program()
var y := accumulator(3);
- console.write(x(2.3r))
+ Console.write(x(2.3r))
}
diff --git a/Task/Achilles-numbers/Ballerina/achilles-numbers.ballerina b/Task/Achilles-numbers/Ballerina/achilles-numbers.ballerina
new file mode 100644
index 0000000000..ff31e0dfeb
--- /dev/null
+++ b/Task/Achilles-numbers/Ballerina/achilles-numbers.ballerina
@@ -0,0 +1,92 @@
+import ballerina/io;
+
+map pps = {};
+
+function getPerfectPowers(int maxExp) {
+ int upper = 10.0.pow(maxExp);
+ int upper2 = 10.0.pow(maxExp).sqrt().floor();
+ foreach int i in 2...upper2 {
+ int p = i;
+ while true {
+ if p > int:MAX_VALUE / i { break; }
+ p *= i;
+ if p >= upper { break; }
+ pps[p.toString()] = 1;
+ }
+ }
+}
+
+function getAchilles(int minExp, int maxExp) returns map {
+ int lower = 10.0.pow(minExp);
+ int upper = 10.0.pow(maxExp);
+ int upper2 = 10.0.pow(maxExp).cbrt().floor();
+ int upper3 = 10.0.pow(maxExp).sqrt().floor();
+ map achilles = {};
+ foreach int b in 1...upper2 {
+ int b3 = b * b * b;
+ foreach int a in 1...upper3 {
+ int p = b3 * a * a;
+ if p >= upper { break; }
+ if p >= lower {
+ string ps = p.toString();
+ if !pps.hasKey(ps) {
+ achilles[ps] = 1;
+ }
+ }
+ }
+ }
+ return achilles;
+}
+
+function totient(int m) returns int {
+ if m < 1 { return 0; }
+ int tot = m;
+ int n = m;
+ int i = 2;
+ while i * i <= n {
+ if (n % i) == 0 {
+ while (n % i) == 0 { n /= i; }
+ tot -= tot / i;
+ }
+ if i == 2 { i = 1; }
+ i += 2;
+ }
+ if n > 1 { tot -= tot / n; }
+ return tot;
+}
+
+public function main() returns error? {
+ final int maxDigits = 14;
+ getPerfectPowers(maxDigits);
+ map achillesSet = getAchilles(1, 5); // enough for first 2 parts
+ int[] achilles = achillesSet.keys().map(s => check int:fromString(s)).sort();
+ io:println("First 50 Achilles numbers:");
+ foreach int i in 0..<50 {
+ string s = achilles[i].toString().padStart(4);
+ io:print(s, " ");
+ if (i + 1) % 10 == 0 { io:println(); }
+ }
+ io:println("\nFirst 30 strong Achilles numbers:");
+ int[] strongAchilles = [];
+ int count = 0;
+ int n = 0;
+ while count < 30 {
+ int tot = totient(achilles[n]);
+ if achillesSet.hasKey(tot.toString()) {
+ strongAchilles.push(achilles[n]);
+ count += 1;
+ }
+ n += 1;
+ }
+ foreach int j in 0..<30 {
+ string t = strongAchilles[j].toString().padStart(5);
+ io:print(t, " ");
+ if (j + 1) % 10 == 0 { io:println(); }
+ }
+
+ io:println("\nNumber of Achilles numbers with:");
+ foreach int d in 2...maxDigits {
+ int ac = getAchilles(d - 1, d).length();
+ io:println(d.toString().padStart(2), " digits: ", ac);
+ }
+}
diff --git a/Task/Achilles-numbers/EasyLang/achilles-numbers.easy b/Task/Achilles-numbers/EasyLang/achilles-numbers.easy
index ec0935dde9..fda73a8936 100644
--- a/Task/Achilles-numbers/EasyLang/achilles-numbers.easy
+++ b/Task/Achilles-numbers/EasyLang/achilles-numbers.easy
@@ -1,14 +1,10 @@
func gcd n d .
- if d = 0
- return n
- .
+ if d = 0 : return n
return gcd d (n mod d)
.
func totient n .
for m = 1 to n
- if gcd m n = 1
- tot += 1
- .
+ if gcd m n = 1 : tot += 1
.
return tot
.
@@ -16,41 +12,29 @@ func isPowerful m .
n = m
f = 2
l = sqrt m
- if m <= 1
- return 0
- .
+ if m <= 1 : return 0
while 1 = 1
q = n div f
if n mod f = 0
- if m mod (f * f) <> 0
- return 0
- .
+ if m mod (f * f) <> 0 : return 0
n = q
- if f > n
- return 1
- .
+ if f > n : return 1
else
f += 1
if f > l
- if m mod (n * n) <> 0
- return 0
- .
+ if m mod (n * n) <> 0 : return 0
return 1
.
.
.
.
func isAchilles n .
- if isPowerful n = 0
- return 0
- .
+ if isPowerful n = 0 : return 0
m = 2
a = m * m
repeat
repeat
- if a = n
- return 0
- .
+ if a = n : return 0
a *= m
until a > n
.
@@ -91,9 +75,7 @@ b = 100
for i = 2 to 5
num = 0
for n = a to b - 1
- if isAchilles n = 1
- num += 1
- .
+ num += isAchilles n
.
write num & " "
a = b
diff --git a/Task/Ackermann-function/Ballerina/ackermann-function.ballerina b/Task/Ackermann-function/Ballerina/ackermann-function.ballerina
new file mode 100644
index 0000000000..95e0bc7de0
--- /dev/null
+++ b/Task/Ackermann-function/Ballerina/ackermann-function.ballerina
@@ -0,0 +1,14 @@
+import ballerina/io;
+
+function ackermann(int m, int n) returns int {
+ if m == 0 { return n + 1; }
+ if n == 0 { return ackermann(m - 1, 1); }
+ return ackermann(m - 1, ackermann(m, n - 1));
+}
+
+public function main() {
+ int[][] pairs = [ [1, 3], [2, 3], [3, 3], [1, 5], [2, 5], [3, 5] ];
+ foreach var p in pairs {
+ io:println(`A[${p[0]}, ${p[1]}] = ${ackermann(p[0], p[1])}`);
+ }
+}
diff --git a/Task/Ackermann-function/Elena/ackermann-function.elena b/Task/Ackermann-function/Elena/ackermann-function.elena
index fc46c62750..c8a0ec4580 100644
--- a/Task/Ackermann-function/Elena/ackermann-function.elena
+++ b/Task/Ackermann-function/Elena/ackermann-function.elena
@@ -1,5 +1,7 @@
import extensions;
+// --- Ackermann function ---
+
ackermann(m,n)
{
if(n < 0 || m < 0)
@@ -8,11 +10,11 @@ ackermann(m,n)
};
m =>
- 0 { ^n + 1 }
- ! {
+ 0 : { ^n + 1 }
+ ! : {
n =>
- 0 { ^ackermann(m - 1,1) }
- ! { ^ackermann(m - 1,ackermann(m,n-1)) }
+ 0 : { ^ackermann(m - 1,1) }
+ ! : { ^ackermann(m - 1,ackermann(m,n-1)) }
}
}
@@ -22,9 +24,9 @@ public program()
{
for(int j := 0; j <= 5; j += 1)
{
- console.printLine("A(",i,",",j,")=",ackermann(i,j))
+ Console.printLine("A(",i,",",j,")=",ackermann(i,j))
}
};
- console.readChar()
+ Console.readChar()
}
diff --git a/Task/Add-a-variable-to-a-class-instance-at-runtime/Ballerina/add-a-variable-to-a-class-instance-at-runtime.ballerina b/Task/Add-a-variable-to-a-class-instance-at-runtime/Ballerina/add-a-variable-to-a-class-instance-at-runtime.ballerina
new file mode 100644
index 0000000000..a4d319d761
--- /dev/null
+++ b/Task/Add-a-variable-to-a-class-instance-at-runtime/Ballerina/add-a-variable-to-a-class-instance-at-runtime.ballerina
@@ -0,0 +1,23 @@
+import ballerina/io;
+
+// Person is an 'open' record type which allows fields of 'anydata' type
+// to be added at runtime.
+type Person record {
+ string name;
+ int age;
+};
+
+public function main() {
+ // Create an instance of Person with an additional 'town' field.
+ Person p = {
+ name: "Fred",
+ age: 40,
+ "town": "Boston" // extra field name needs to be in quotes
+ };
+
+ // Print name and age fields - using standard '.' syntax.
+ io:print(p.name, " is ", p.age);
+
+ // Print the additional field - using a map-like syntax.
+ io:println(" and lives in ", p["town"], ".");
+}
diff --git a/Task/Add-a-variable-to-a-class-instance-at-runtime/Elena/add-a-variable-to-a-class-instance-at-runtime.elena b/Task/Add-a-variable-to-a-class-instance-at-runtime/Elena/add-a-variable-to-a-class-instance-at-runtime.elena
index 9634046d11..229abebea3 100644
--- a/Task/Add-a-variable-to-a-class-instance-at-runtime/Elena/add-a-variable-to-a-class-instance-at-runtime.elena
+++ b/Task/Add-a-variable-to-a-class-instance-at-runtime/Elena/add-a-variable-to-a-class-instance-at-runtime.elena
@@ -19,7 +19,7 @@ public program()
object.foo := "bar";
- console.printLine(object,".foo=",object.foo);
+ Console.printLine(object,".foo=",object.foo);
- console.readChar()
+ Console.readChar()
}
diff --git a/Task/Additive-primes/ALGOL-60/additive-primes.alg b/Task/Additive-primes/ALGOL-60/additive-primes.alg
new file mode 100644
index 0000000000..177adf1e20
--- /dev/null
+++ b/Task/Additive-primes/ALGOL-60/additive-primes.alg
@@ -0,0 +1,60 @@
+begin
+
+integer procedure sumdigits(n);
+ value n; integer n;
+begin
+ integer q, sum;
+ sum := 0;
+ for sum := sum while n > 0 do
+ begin
+ q := entier(n / 10);
+ sum := sum + (n - q * 10);
+ n := q;
+ end;
+ sumdigits := sum;
+end;
+
+boolean procedure isprime(n);
+value n; integer n;
+begin
+ if n < 2 then
+ isprime := false
+ else if n = entier(n / 2) * 2 then
+ isprime := (n = 2)
+ else
+ begin
+ comment - check odd divisors up to sqrt(n);
+ integer i, limit;
+ boolean divisible;
+ i := 3;
+ limit := entier(sqrt(n));
+ divisible := false;
+ for i := i while i <= limit and not divisible do
+ begin
+ if entier(n / i) * i = n then
+ divisible := true;
+ i := i + 2
+ end;
+ isprime := not divisible;
+ end;
+end;
+
+integer i, count;
+outstring(1,"Looking up to 500 for additive primes\n");
+count := 0;
+for i := 2 step 1 until 500 do
+ if isprime(i) then
+ begin
+ if isprime(sumdigits(i)) then
+ begin
+ outinteger(1,i);
+ count := count + 1;
+ if count = entier(count / 10) * 10 then
+ outstring(1,"\n");
+ end;
+ end;
+outstring(1,"\n");
+outinteger(1,count);
+outstring(1,"were found\n");
+
+end
diff --git a/Task/Additive-primes/ALGOL-M/additive-primes.alg b/Task/Additive-primes/ALGOL-M/additive-primes.alg
new file mode 100644
index 0000000000..54334dd123
--- /dev/null
+++ b/Task/Additive-primes/ALGOL-M/additive-primes.alg
@@ -0,0 +1,64 @@
+BEGIN
+
+% RETURN N MOD M %
+INTEGER FUNCTION MOD(N, M);
+INTEGER N, M;
+BEGIN
+ MOD := N - (N / M) * M;
+END;
+
+% RETURN 1 IF N IS PRIME, OTHERWISE 0 %
+INTEGER FUNCTION ISPRIME(N);
+INTEGER N;
+BEGIN
+ IF N = 2 THEN
+ ISPRIME := 1
+ ELSE IF (N < 2) OR (MOD(N,2) = 0) THEN
+ ISPRIME := 0
+ ELSE % TEST ODD DIVISORS UP TO SQRT OF N %
+ BEGIN
+ INTEGER I, DIVISIBLE;
+ I := 3;
+ DIVISIBLE := 0;
+ WHILE (I * I <= N) AND (DIVISIBLE = 0) DO
+ BEGIN
+ IF MOD(N,I) = 0 THEN DIVISIBLE := 1;
+ I := I + 2;
+ END;
+ ISPRIME := 1 - DIVISIBLE;
+ END;
+END;
+
+% RETURN THE SUM OF THE DIGITS OF N %
+INTEGER FUNCTION SUMDIGITS(N);
+INTEGER N;
+BEGIN
+ INTEGER SUM;
+ SUM := 0;
+ WHILE N > 0 DO
+ BEGIN
+ SUM := SUM + MOD(N, 10);
+ N := N / 10;
+ END;
+ SUMDIGITS := SUM;
+END;
+
+% LOOK FOR ADDITIVE PRIMES IN RANGE 1 TO 500 %
+INTEGER I, S, COUNT;
+COUNT := 0;
+FOR I := 1 STEP 1 UNTIL 500 DO
+ BEGIN
+ IF ISPRIME(I)=1 THEN
+ BEGIN
+ S := SUMDIGITS(I);
+ IF ISPRIME(S)=1 THEN
+ BEGIN
+ WRITEON(I);
+ COUNT := COUNT + 1;
+ IF MOD(COUNT,8) = 0 THEN WRITE("");
+ END;
+ END;
+ END;
+WRITE(COUNT," ADDITIVE PRIMES WERE FOUND");
+
+END
diff --git a/Task/Additive-primes/Ballerina/additive-primes.ballerina b/Task/Additive-primes/Ballerina/additive-primes.ballerina
new file mode 100644
index 0000000000..f4d3373ce4
--- /dev/null
+++ b/Task/Additive-primes/Ballerina/additive-primes.ballerina
@@ -0,0 +1,67 @@
+import ballerina/io;
+
+function sumDigits(int m) returns int {
+ int n = m; // make mutable
+ int sum = 0;
+ while n > 0 {
+ sum += n % 10;
+ n /= 10;
+ }
+ return sum;
+}
+
+function isPrime(int n) returns boolean {
+ if n < 2 { return false; }
+ if n % 2 == 0 { return n == 2; }
+ if n % 3 == 0 { return n == 3; }
+ int d = 5;
+ while d * d <= n {
+ if n % d == 0 { return false; }
+ d += 2;
+ if n % d == 0 { return false; }
+ d += 4;
+ }
+ return true;
+}
+
+function getPrimes(int n) returns int[] {
+ if n < 2 { return []; }
+ if n == 2 { return [2]; }
+ int k = (n - 3) / 2 + 1;
+ boolean[] marked = [];
+ marked.setLength(k);
+ foreach int i in 0..n).sqrt().floor();
+ int lim = (f - 3) / 2 + 1;
+ foreach int i in 0.. 2
- return 0
- .
+ if n mod 2 = 0 and n > 2 : return 0
i = 3
sq = sqrt n
while i <= sq
- if n mod i = 0
- return 0
- .
+ if n mod i = 0 : return 0
i += 2
.
return 1
@@ -22,9 +18,6 @@ func digsum n .
for i = 2 to 500
if prime i = 1
s = digsum i
- if prime s = 1
- write i & " "
- .
+ if prime s = 1 : write i & " "
.
.
-print ""
diff --git a/Task/Additive-primes/PL-I-80/additive-primes.pli b/Task/Additive-primes/PL-I-80/additive-primes.pli
new file mode 100644
index 0000000000..cbb1259113
--- /dev/null
+++ b/Task/Additive-primes/PL-I-80/additive-primes.pli
@@ -0,0 +1,52 @@
+additive_primes: procedure options (main);
+ %replace
+ search_limit by 500,
+ true by '1'b,
+ false by '0'b;
+ dcl (i, count) fixed bin;
+ put skip edit('Searching up to ', search_limit,
+ ' for additive primes') (a,f(3),a);
+ put skip;
+ count = 0;
+ do i = 2 to search_limit;
+ if isprime(i) then
+ do;
+ if isprime(sumdigits(i)) then
+ do;
+ put edit(i) (f(5));
+ count = count + 1;
+ if mod(count,8) = 0 then put skip;
+ end;
+ end;
+ end;
+ put skip edit(count, ' were found') (f(3), a);
+
+/* return true if n is prime */
+isprime: proc(n) returns (bit(1));
+ dcl
+ (n, i, limit) fixed bin;
+ if n < 2 then return (false);
+ if mod(n, 2) = 0 then return (n = 2);
+ limit = floor(sqrt(n));
+ i = 3;
+ do while ((i <= limit) & (mod(n, i) ^= 0));
+ i = i + 2;
+ end;
+ return (i > limit);
+end isprime;
+
+/* return the sum of the digits of n */
+sumdigits: proc(n) returns (fixed bin);
+ dcl
+ (n, nn, sum) fixed bin;
+ /* use copy, since n is passed by reference */
+ nn = n;
+ sum = 0;
+ do while (nn > 0);
+ sum = sum + mod(nn, 10);
+ nn = nn / 10;
+ end;
+ return (sum);
+end sumdigits;
+
+end additive_primes;
diff --git a/Task/Additive-primes/PascalABC.NET/additive-primes.pas b/Task/Additive-primes/PascalABC.NET/additive-primes.pas
new file mode 100644
index 0000000000..c8f11a6506
--- /dev/null
+++ b/Task/Additive-primes/PascalABC.NET/additive-primes.pas
@@ -0,0 +1,4 @@
+## uses School;//поиск аддитивных простых чисел
+var AdditivePrimes := Primes(500).Where(n -> n.Digits.Sum.IsPrime).ToArray;
+Print('Additive Primes:'); AdditivePrimes.Println;
+Println('Additive Primes Count:', AdditivePrimes.Count);
diff --git a/Task/Additive-primes/REXX/additive-primes-2.rexx b/Task/Additive-primes/REXX/additive-primes-2.rexx
index d7524b90f3..398faf76e3 100644
--- a/Task/Additive-primes/REXX/additive-primes-2.rexx
+++ b/Task/Additive-primes/REXX/additive-primes-2.rexx
@@ -1,61 +1,28 @@
+-- 22 Mar 2025
include Settings
-say version; say 'Additive primes'; say
+say 'ADDITIVE PRIMES'
+say version
+say
arg n
numeric digits 16
if n = '' then
- n = -500
+ n = 500
show = (n > 0); n = Abs(n)
-a = Additiveprimes(n)
+a = Additives(n)
if show then do
do i = 1 to a
- call Charout ,Right(addi.additiveprime.i,8)' '
+ call Charout ,Right(addi.i,8)' '
if i//10 = 0 then
say
end
say
end
-say a 'additive Primes found below' n
-say Time('e') 'seconds'
+say a 'additive primes found below' n
+say Time('e')/1 'seconds'
exit
-Additiveprimes:
-/* Additive prime numbers */
-procedure expose addi. prim.
-arg x
-/* Init */
-addi. = 0
-/* Fast values */
-if x < 2 then
- return 0
-if x < 101 then do
- a = '2 3 5 7 11 23 29 41 43 47 61 67 83 89 999'
- do n = 1 to Words(a)
- w = Word(a,n)
- if w > x then
- leave
- addi.additiveprime.n = w
- end
- n = n-1; addi.0 = n
- return n
-end
-/* Get primes */
-p = Primes(x)
-/* Collect additive primes */
-n = 0
-do i = 1 to p
- q = prim.Prime.i; s = 0
- do j = 1 to Length(q)
- s = s+Substr(q,j,1)
- end
- if Prime(s) then do
- n = n+1; addi.additiveprime.n = q
- end
-end
-/* Return number of additive primes */
-return n
-
-include Functions
-include Numbers
include Sequences
+include Numbers
+include Functions
include Abend
diff --git a/Task/Additive-primes/Raku/additive-primes.raku b/Task/Additive-primes/Raku/additive-primes.raku
index 7497ffbb89..24abe19684 100644
--- a/Task/Additive-primes/Raku/additive-primes.raku
+++ b/Task/Additive-primes/Raku/additive-primes.raku
@@ -1,3 +1,3 @@
unit sub MAIN ($limit = 500);
say "{+$_} additive primes < $limit:\n{$_».fmt("%" ~ $limit.chars ~ "d").batch(10).join("\n")}",
- with ^$limit .grep: { .is-prime and .comb.sum.is-prime }
+ with ^$limit .grep: { .is-prime && .comb.sum.is-prime }
diff --git a/Task/Additive-primes/S-BASIC/additive-primes.basic b/Task/Additive-primes/S-BASIC/additive-primes.basic
new file mode 100644
index 0000000000..1ca0da2c9a
--- /dev/null
+++ b/Task/Additive-primes/S-BASIC/additive-primes.basic
@@ -0,0 +1,55 @@
+$constant true = 0FFFFH
+$constant false = 0
+$constant limit = 500
+
+function sum.of.digits(n = integer) = integer
+ var i, sum = integer
+ var s = string
+ var ch = char
+ s = str$(n)
+ sum = 0
+ for i = 2 to len(s)
+ ch = mid(s,i,1)
+ sum = sum + (ch - '0')
+ next i
+end = sum
+
+function mod(n, m = integer) = integer
+end = n - (n / m) * m
+
+comment
+ build a table of prime numbers using
+ the classic sieve of Erathosthenes
+end
+dim integer prime(limit)
+var i, j, count = integer
+prime(1) = false
+for i = 2 to limit
+ prime(i) = true
+next i
+rem - strike out multiples of each prime found
+for i = 2 to sqr(limit)
+ if prime(i) then
+ begin
+ for j = i + i to limit step i
+ prime(j) = false
+ next j
+ end
+next i
+
+rem - use the table for the search
+print "Searching up to"; limit; " for additive primes"
+count = 0
+for i = 2 to limit
+ if prime(i) then
+ if prime(sum.of.digits(i)) then
+ begin
+ print using "### "; i;
+ count = count + 1
+ if mod(count, 10) = 0 then print
+ end
+next i
+print
+print count;" were found"
+
+end
diff --git a/Task/Additive-primes/TypeScript/additive-primes.ts b/Task/Additive-primes/TypeScript/additive-primes.ts
new file mode 100644
index 0000000000..d3008744d2
--- /dev/null
+++ b/Task/Additive-primes/TypeScript/additive-primes.ts
@@ -0,0 +1,29 @@
+function isPrime(n: number): boolean {
+ if (n < 2) return false;
+ if (n < 4) return true;
+ if (n % 2 == 0 || n % 3 == 0) return false;
+ for (let i = 5; i <= n ** 0.5; i += 6) {
+ if (n % i == 0 || n % (i+2) == 0) return false;
+ }
+ return true;
+}
+
+function sumDigits(x: number): number {
+ let sum = 0;
+ while (x > 0) {
+ sum = sum + (x % 10);
+ x = Math.floor(x / 10);
+ }
+ return sum;
+}
+
+const additivePrimes: number[] = [];
+
+for (let i = 2; i < 10**7; i++) {
+ if (isPrime(i) && isPrime(sumDigits(i))) {
+ additivePrimes.push(i);
+ }
+}
+
+console.log(additivePrimes);
+console.log(`Found ${additivePrimes.length} values`);
diff --git a/Task/Address-of-a-variable/Ballerina/address-of-a-variable.ballerina b/Task/Address-of-a-variable/Ballerina/address-of-a-variable.ballerina
new file mode 100644
index 0000000000..9e682fb12b
--- /dev/null
+++ b/Task/Address-of-a-variable/Ballerina/address-of-a-variable.ballerina
@@ -0,0 +1,8 @@
+import ballerina/io;
+
+public function main() {
+ int[] a = [1, 2, 3, 4];
+ int[] b = [1, 2, 3, 4];
+ io:println(a == b); // 'true' as values are the same
+ io:println(a === b); // 'false' as stored at different addresses
+}
diff --git a/Task/Align-columns/EasyLang/align-columns.easy b/Task/Align-columns/EasyLang/align-columns.easy
index 8bac81bda5..3058394bc3 100644
--- a/Task/Align-columns/EasyLang/align-columns.easy
+++ b/Task/Align-columns/EasyLang/align-columns.easy
@@ -1,5 +1,5 @@
global width inp$[] .
-proc read . .
+proc read .
repeat
inp$ = input
until inp$ = ""
@@ -12,7 +12,7 @@ proc read . .
.
read
#
-proc out mode . .
+proc out mode .
for inp$ in inp$[]
ar$[] = strsplit inp$ "$"
for s$ in ar$[]
diff --git a/Task/Align-columns/Emacs-Lisp/align-columns.l b/Task/Align-columns/Emacs-Lisp/align-columns.l
index a073ab13c1..3588e6e422 100644
--- a/Task/Align-columns/Emacs-Lisp/align-columns.l
+++ b/Task/Align-columns/Emacs-Lisp/align-columns.l
@@ -1,246 +1,129 @@
-(defun rob-even-p (integer)
- "Test if INTEGER is even."
- (= (% integer 2) 0))
+(defun prepare-data ()
+ "Process data into list of lists."
+ (let ((all-lines)
+ (processed-line))
+ (dolist (one-line (split-string "Given$a$text$file$of$many$lines,$where$fields$within$a$line$
+are$delineated$by$a$single$'dollar'$character,$write$a$program
+that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
+column$are$separated$by$at$least$one$space.
+Further,$allow$for$each$word$in$a$column$to$be$either$left$
+justified,$right$justified,$or$center$justified$within$its$column." "[\n\r]" :OMIT-NULLS))
+ (dolist (one-word (split-string one-line "\\$"))
+ (push one-word processed-line))
+ (push (nreverse processed-line) all-lines)
+ (setq processed-line nil))
+ (nreverse all-lines)))
-(defun rob-odd-p (integer)
- "Test if INTEGER is odd."
- (not (rob-even-p integer)))
+(defun get-column (column-number data)
+ "Get words from COLUMN-NUMBER column in DATA."
+ (let ((column-result))
+ (setq column-number (- column-number 1))
+ (dolist (line data)
+ (if (nth column-number line)
+ (push (nth column-number line) column-result)
+ (push "" column-result)))
+ column-result))
-(defun both-odd-or-both-even-p (x y)
- "Test if X and Y are both even or both odd."
- (or (and (rob-even-p x) (rob-even-p y))
- (and (rob-odd-p x) (rob-odd-p y))))
+(defun calc-column-width (column-number data)
+ "Calculate padded width for COLUMN-NUMBER in DATA."
+ (let ((column-words (get-column column-number data)))
+ (+ 2 (apply #'max (mapcar #'length column-words)))))
-(defun word-lengths (words)
- "Convert WORDS into list of lengths of each word."
- (mapcar 'length words))
+(defun get-last-column (data)
+ "Find the last column in DATA."
+ (apply #'max (mapcar #'length data)))
-(defun get-one-row (row-number rows-columns-words)
- "Get ROW-NUMBER row from ROWS-COLUMNS-WORDS.
-ROWS-COLUMNS-WORDS is list of lists in form of row, column, word."
- (seq-filter
- (lambda (element)
- (= row-number (car element)))
- rows-columns-words))
+(defun get-column-widths (data)
+ "Get a list of column widths from DATA."
+ (let ((current-column 1)
+ (last-column (get-last-column data))
+ (column-widths))
+ (while (<= current-column last-column)
+ (push (calc-column-width current-column data) column-widths)
+ (setq current-column (1+ current-column)))
+ (nreverse column-widths)))
-(defun get-one-word (row-number column-number rows-columns-words)
- "Get one word from ROWS-COLUMNS-WORDS at ROW-NUMBER and COLUMN-NUMBER.
-ROWS-COLUMNS-WORDS is list of lists in form of row, column, word."
- (delq nil
- (mapcar
- (lambda (element)
- (when (= column-number (nth 1 element))
- (nth 2 element)))
- (get-one-row row-number rows-columns-words))))
+(defun get-one-column-width (column-number data)
+ "Get column width of COLUMN-NUMBER from DATA."
+ (let ((column-widths (get-column-widths data)))
+ (nth (- column-number 1) column-widths)))
-(defun get-last-row (rows-columns-words)
- "Get the number of the last row of ROWS-COLUMNS-WORDS.
-ROWS-COLUMNS-WORDS is a list of lists, each list in the form of
-row, column, word."
- (apply 'max (mapcar 'car rows-columns-words)))
+(defun center-align-one-word (word column-width)
+ "Center align WORD in space of COLUMN-WIDTH."
+ (let* ((word-width (length word))
+ (total-padding (- column-width word-width))
+ (pre-padding-length (/ total-padding 2))
+ (post-padding-length (- column-width (+ pre-padding-length word-width)))
+ (pre-padding (make-string pre-padding-length ? ))
+ (post-padding (make-string post-padding-length ? )))
+ (insert (format "%s%s%s" pre-padding word post-padding))))
-(defun list-nth-column (column rows-columns-words)
- "List the words in column COLUMN of ROWS-COLUMNS-WORDS.
-ROWS-COLUMNS-WORDS is a list of lists, each list in the form of row, column,
-word."
- (let ((row 1)
- (column-word)
- (last-row (get-last-row rows-columns-words ))
- (matches nil))
- (while (and (<= row last-row)
- (<= column (get-last-column rows-columns-words)))
- (setq column-word (get-one-word row column rows-columns-words))
- (when (null column-word)
- (setq column-word ""))
- (push column-word matches)
- (setq row (1+ row)))
- (flatten-tree (nreverse matches))))
+(defun center-align-one-line (one-line column-widths)
+ "Center align ONE-LINE using COLUMN-WIDTHS."
+ (let ((word-position 0))
+ (dolist (word one-line)
+ (center-align-one-word word (nth word-position column-widths))
+ (setq word-position (1+ word-position)))))
-(defun get-widest-in-column (column)
- "Get the widest word in COLUMN, which is a list of words."
- (apply #'max (word-lengths column)))
+(defun center-align-lines (data)
+ "Center align columns of words in DATA."
+ (let ((column-widths (get-column-widths data)))
+ (dolist (one-line data)
+ (center-align-one-line one-line column-widths)
+ (insert (format "%s" "\n")))))
-(defun get-column-width (column)
- "Calculate the width of COLUMN, which is a list of words."
- (+ (get-widest-in-column column) 2))
+(defun left-align-one-word (word column-width)
+ "Left align WORD in space of COLUMN-WIDTH."
+ (let* ((word-width (length word))
+ (total-padding (- column-width word-width))
+ (pre-padding-length 1)
+ (post-padding-length (- column-width (+ pre-padding-length word-width)))
+ (pre-padding (make-string pre-padding-length ? ))
+ (post-padding (make-string post-padding-length ? )))
+ (insert (format "%s%s%s" pre-padding word post-padding))))
-(defun get-column-widths (rows-columns-words)
- "Make a list of the column widths in ROWS-COLUMNS-WORDS.
-ROWS-COLUMNS-WORDS is list of lists, with each list in the form of row, column,
-word."
- (let ((last-column (get-last-column rows-columns-words))
- (column 1)
- (columns))
- (while (<= column last-column)
- (push (get-column-width (list-nth-column column rows-columns-words)) columns)
- (setq column (1+ column)))
- (reverse columns)))
+(defun left-align-one-line (one-line column-widths)
+ "Left align ONE-LINE using COLUMN-WIDTHS."
+ (let ((word-position 0))
+ (dolist (word one-line)
+ (left-align-one-word word (nth word-position column-widths))
+ (setq word-position (1+ word-position)))))
-(defun add-column-widths (widths rows-columns-words)
- "Add WIDTHS to ROWS-COLUMNS-WORDS.
-ROWS-COLUMNS-WORDS is a list of lists, with each list in the form of row,
-column, word. WIDTHS are the widths of each column. Output is a
-list of lists, with each list in the form of column-width, row,
-column, word."
- (let ((new-data)
- (new-database)
- (column)
- (width))
- (dolist (data rows-columns-words)
- (setq column (cadr data))
- (setq width (nth (- column 1) widths))
- (setq new-data (push width data))
- (push new-data new-database))
- (nreverse new-database)))
+(defun left-align-lines (data)
+ "Left align columns of words in DATA."
+ (let ((column-widths (get-column-widths data)))
+ (dolist (one-line data)
+ (left-align-one-line one-line column-widths)
+ (insert (format "%s" "\n")))))
-(defun get-last-column (rows-columns-words)
- "Get the number of the last column in ROWS-COLUMNS-WORDS."
- (apply 'max (mapcar 'cadr rows-columns-words)))
+(defun right-align-one-word (word column-width)
+ "Right align WORD in space of COLUMN-WIDTH."
+ (let* ((word-width (length word))
+ (total-padding (- column-width word-width))
+ (post-padding-length 1)
+ (pre-padding-length (- column-width (+ post-padding-length word-width)))
+ (pre-padding (make-string pre-padding-length ? ))
+ (post-padding (make-string post-padding-length ? )))
+ (insert (format "%s%s%s" pre-padding word post-padding))))
-(defun create-rows-columns-words ()
- "Put text from column-data.txt file in lists.
-Each list consists of a row number, a column number, and a word."
- (let ((lines)
- (line-number 0)
- (word-number)
- (words))
- (with-temp-buffer
- (insert-file-contents "~/Documents/Elisp/column_data.txt")
- (beginning-of-buffer)
- (dolist (line (split-string (buffer-string) "[\r\n]" :no-nulls))
- (push line lines))
- (setq lines (nreverse lines)))
- (dolist (line lines)
- (setq line-number (1+ line-number))
- (setq word-number 0)
- (dolist (word (split-string line "\\$" :no-nulls))
- (setq word-number (1+ word-number))
- (push (list line-number word-number word) words)))
- (setq words (nreverse words))))
+(defun right-align-one-line (one-line column-widths)
+ "Right align ONE-LINE using COLUMN-WIDTHS."
+ (let ((word-position 0))
+ (dolist (word one-line)
+ (right-align-one-word word (nth word-position column-widths))
+ (setq word-position (1+ word-position)))))
-(defun pad-for-center-align (column-width text)
- "Pad TEXT to center in space of COLUMN-WIDTH."
- (let* ((text-width (length text))
- (total-padding-length (- column-width text-width))
- (pre-padding-length)
- (post-padding-length)
- (pre-padding)
- (post-padding))
- (if (both-odd-or-both-even-p text-width column-width)
- (progn
- (setq pre-padding-length (/ total-padding-length 2))
- (setq post-padding-length pre-padding-length))
- (setq pre-padding-length (+ (/ total-padding-length 2) 1))
- (setq post-padding-length (- pre-padding-length 1)))
- (setq pre-padding (make-string pre-padding-length ? ))
- (setq post-padding (make-string post-padding-length ? ))
- (format "%s%s%s" pre-padding text post-padding)))
+(defun right-align-lines (data)
+ "Right align columns of words in DATA."
+ (let ((column-widths (get-column-widths data)))
+ (dolist (one-line data)
+ (right-align-one-line one-line column-widths)
+ (insert (format "%s" "\n")))))
-(defun create-a-center-aligned-line (widths-1row-columns-words)
- "Create a centered line based on WIDTHS-1ROW-COLUMNS-WORDS.
-WIDTHS-1ROW-COLUMNS-WORDS is a list of lists. Each list consists
-of the column-width, the row number, the column number, and the
-word. The row number is the same in all lists."
- (let ((full-line "")
- (next-section))
- (insert "\n")
- (dolist (word-data widths-1row-columns-words)
- ;; below, nth 0 is the column width, nth 3 is the word
- (setq next-section (pad-for-center-align (nth 0 word-data) (nth 3 word-data)))
- (setq full-line (concat full-line next-section)))
- (insert full-line)))
-
-(defun pad-for-left-align (column-width text)
- "Pad TEXT to left-align in space of COLUMN-WIDTH."
- (let* ((text-width (length text))
- (post-padding-length (- column-width text-width)))
- (setq post-padding (make-string post-padding-length ? ))
- (format "%s%s" text post-padding)))
-
-(defun create-a-left-aligned-line (widths-1row-columns-words)
- "Create a left-aligned line based on WIDTHS-1ROW-COLUMNS-WORDS.
-Each element of WIDTHS-1ROW-COLUMNS-WORDS consists of the column
-width, the row number, the column number, and the word. The row
-number is the same in every case."
- (let ((full-line "")
- (next-section))
- (insert "\n")
- (dolist (one-item widths-1row-columns-words)
- (setq next-section (pad-for-left-align (nth 0 one-item) (nth 3 one-item)))
- (setq full-line (concat full-line next-section)))
- (insert full-line)))
-
-(defun pad-for-right-align (column-width text)
- "Pad TEXT to right-align in space of COLUMN-WIDTH."
- (let* ((text-width (length text))
- (pre-padding-length (- column-width text-width)))
- (setq pre-padding (make-string pre-padding-length ? ))
- (format "%s%s" pre-padding text)))
-
-(defun create-a-right-aligned-line (widths-1row-columns-words)
- "Create a right-aligned line based on WIDTHS-1ROW-COLUMNS-WORDS.
-Each element of WIDTHS-1ROW-COLUMNS-WORDS consists of the column
-width, the row number, the column number, and the word. The row
-number is the same in every case."
- (let ((full-line "")
- (next-section))
- (insert "\n")
- (dolist (one-item widths-1row-columns-words)
- (setq next-section (pad-for-right-align (nth 0 one-item) (nth 3 one-item)))
- (setq full-line (concat full-line next-section)))
- (insert full-line)))
-
-(defun left-align-lines (rows-columns-words)
- "Write ROWS-COLUMNS-WORDS in left-aligned columns.
-ROWS-COLUMNS-WORDS is a list of lists. Each list consists of the
-row number, the column number, and the word."
- (let* ((row-number 1)
- (column-widths (get-column-widths rows-columns-words))
- (last-row (get-last-row rows-columns-words))
- (one-row)
- (width-place 0))
- (while (<= row-number last-row)
- (setq one-row (get-one-row row-number rows-columns-words))
- (setq one-row (add-column-widths column-widths one-row))
- (create-a-left-aligned-line one-row)
- (setq row-number (1+ row-number))
- (setq width-place (1+ width-place)))))
-
-(defun right-align-lines (rows-columns-words)
- "Write ROWS-COLUMNS-WORDS in right-aligned columns.
-ROWS-COLUMNS-WORDS is a list of lists. Each list consists of the
-row number, the column number, and the word."
- (let* ((row-number 1)
- (column-widths (get-column-widths rows-columns-words))
- (last-row (get-last-row rows-columns-words))
- (one-row)
- (width-place 0))
- (while (<= row-number last-row)
- (setq one-row (get-one-row row-number rows-columns-words))
- (setq one-row (add-column-widths column-widths one-row))
- (create-a-right-aligned-line one-row)
- (setq row-number (1+ row-number))
- (setq width-place (1+ width-place)))))
-
-(defun center-align-lines (rows-columns-words)
- "Write ROWS-COLUMNS-WORDS in center-aligned columns.
-ROWS-COLUMNS-WORDS is a list of lists. Each list consists of the
-row number, the column number, and the word."
- (let* ((row-number 1)
- (column-widths (get-column-widths rows-columns-words))
- (last-row (get-last-row rows-columns-words))
- (one-row)
- (width-place 0))
- (while (<= row-number last-row)
- (setq one-row (get-one-row row-number rows-columns-words))
- (setq one-row (add-column-widths column-widths one-row))
- (create-a-center-aligned-line one-row)
- (setq row-number (1+ row-number))
- (setq width-place (1+ width-place)))))
-
-(defun align-lines (alignment rows-columns-words)
- "Write ROWS-COLUMNS-WIDTHS with given ALIGNMENT.
-ROWS-COLUMNS-WIDTHS consists of a list of lists. Each internal list contains width of column, row number, column number, and a word."
+(defun align-lines (alignment data)
+ "Write DATA with given ALIGNMENT.
+DATA consists of a list of lists. Each internal list conists of a list
+of words."
(let ((align-function (pcase alignment
('left 'left-align-lines)
("left" 'left-align-lines)
@@ -248,4 +131,4 @@ ROWS-COLUMNS-WIDTHS consists of a list of lists. Each internal list contains wid
("center" 'center-align-lines)
('right 'right-align-lines)
("right" 'right-align-lines))))
- (funcall align-function rows-columns-words)))
+ (funcall align-function data)))
diff --git a/Task/Aliquot-sequence-classifications/EasyLang/aliquot-sequence-classifications.easy b/Task/Aliquot-sequence-classifications/EasyLang/aliquot-sequence-classifications.easy
index e25f92c48c..40a22a8833 100644
--- a/Task/Aliquot-sequence-classifications/EasyLang/aliquot-sequence-classifications.easy
+++ b/Task/Aliquot-sequence-classifications/EasyLang/aliquot-sequence-classifications.easy
@@ -1,7 +1,5 @@
fastfunc sumprop num .
- if num = 1
- return 0
- .
+ if num = 1 : return 0
sum = 1
root = sqrt num
i = 2
@@ -16,60 +14,36 @@ fastfunc sumprop num .
.
return sum
.
-func$ tostr ar[] .
- for v in ar[]
- s$ &= " " & v
- .
- return s$
-.
func$ class k .
oldk = k
newk = sumprop oldk
oldk = newk
seq[] &= newk
- if newk = 0
- return "terminating " & tostr seq[]
- .
- if newk = k
- return "perfect " & tostr seq[]
- .
+ if newk = 0 : return "terminating " & seq[]
+ if newk = k : return "perfect " & seq[]
newk = sumprop oldk
oldk = newk
seq[] &= newk
- if newk = 0
- return "terminating " & tostr seq[]
- .
- if newk = k
- return "amicable " & tostr seq[]
- .
+ if newk = 0 : return "terminating " & seq[]
+ if newk = k : return "amicable " & seq[]
for t = 4 to 16
newk = sumprop oldk
seq[] &= newk
- if newk = 0
- return "terminating " & tostr seq[]
- .
- if newk = k
- return "sociable (period " & t - 1 & ") " & tostr seq[]
- .
- if newk = oldk
- return "aspiring " & tostr seq[]
- .
+ if newk = 0 : return "terminating " & seq[]
+ if newk = k : return "sociable (period " & t - 1 & ") " & seq[]
+ if newk = oldk : return "aspiring " & seq[]
for i to len seq[] - 1
- if newk = seq[i]
- return "cyclic (at " & newk & ") " & tostr seq[]
- .
- .
- if newk > 140737488355328
- return "non-terminating (term > 140737488355328) " & tostr seq[]
+ if newk = seq[i] : return "cyclic (at " & newk & ") " & seq[]
.
+ if newk > 140737488355328 : return "non-terminating (term > 140737488355328) " & seq[]
oldk = newk
.
- return "non-terminating (after 16 terms) " & tostr seq[]
+ return "non-terminating (after 16 terms) " & seq[]
.
print "Number classification sequence"
for j = 1 to 12
- print j & " " & class j
+ print j & ": " & class j
.
for j in [ 28 496 220 1184 12496 1264460 790 909 562 1064 1488 15355717786080 ]
- print j & " " & class j
+ print j & ": " & class j
.
diff --git a/Task/Almkvist-Giullera-formula-for-pi/00-TASK.txt b/Task/Almkvist-Giullera-formula-for-pi/00-TASK.txt
index b3424c960c..9dd91723eb 100644
--- a/Task/Almkvist-Giullera-formula-for-pi/00-TASK.txt
+++ b/Task/Almkvist-Giullera-formula-for-pi/00-TASK.txt
@@ -1,27 +1,27 @@
-The Almkvist-Giullera formula for calculating 1/π2 is based on the Calabi-Yau
+The Almkvist-Giullera formula for calculating is based on the Calabi-Yau
differential equations of order 4 and 5, which were originally used to describe certain manifolds
in string theory.
The formula is:
-::::: 1/π2 = (25/3) ∑0∞ ((6n)! / (n!6))(532n2 + 126n + 9) / 10002n+1
+:
-This formula can be used to calculate the constant π-2, and thus to calculate π.
+This formula can be used to calculate the constant , and thus to calculate .
Note that, because the product of all terms but the power of 1000 can be calculated as an integer,
the terms in the series can be separated into a large integer term:
-::::: (25) (6n)! (532n2 + 126n + 9) / (3(n!)6) (***)
+:
multiplied by a negative integer power of 10:
-::::: 10-(6n + 3)
+:
;Task:
:* Print the integer portions (the starred formula, which is without the power of 1000 divisor) of the first 10 terms of the series.
-:* Use the complete formula to calculate and print π to 70 decimal digits of precision.
+:* Use the complete formula to calculate and print to 70 decimal digits of precision.
;Reference:
diff --git a/Task/Almost-prime/00-TASK.txt b/Task/Almost-prime/00-TASK.txt
index c607041068..adb7f91ccd 100644
--- a/Task/Almost-prime/00-TASK.txt
+++ b/Task/Almost-prime/00-TASK.txt
@@ -7,7 +7,7 @@ A [[wp:Almost prime|k-Almost-prime]] is a natural number 1 <= K <= 5.
+Write a function/method/subroutine/... that generates k-almost primes and use it to create a table here of the first ten members of k-Almost primes for .
;Related tasks:
diff --git a/Task/Almost-prime/Ballerina/almost-prime.ballerina b/Task/Almost-prime/Ballerina/almost-prime.ballerina
new file mode 100644
index 0000000000..4591f6997f
--- /dev/null
+++ b/Task/Almost-prime/Ballerina/almost-prime.ballerina
@@ -0,0 +1,32 @@
+import ballerina/io;
+
+function kPrime(int m, int k) returns boolean {
+ int n = m; // make mutable
+ int nf = 0;
+ foreach int i in 2...n {
+ while (n % i) == 0 {
+ if nf == k { return false; }
+ nf += 1;
+ n /= i;
+ }
+ }
+ return nf == k;
+}
+
+function gen(int k, int m) returns int[] {
+ int[] r = [];
+ r.setLength(m);
+ int n = 2;
+ foreach int i in 0 ..< r.length() {
+ while !kPrime(n, k) { n += 1; }
+ r[i] = n;
+ n += 1;
+ }
+ return r;
+}
+
+public function main() {
+ foreach int k in 1...5 {
+ io:println(k, " ", gen(k, 10));
+ }
+}
diff --git a/Task/Almost-prime/Clojure/almost-prime.clj b/Task/Almost-prime/Clojure/almost-prime.clj
index c35a61bd6b..3adf67d1cc 100644
--- a/Task/Almost-prime/Clojure/almost-prime.clj
+++ b/Task/Almost-prime/Clojure/almost-prime.clj
@@ -19,5 +19,3 @@
(println (for [k (range 1 6)]
(println "k:" k (divisors-k k 10))))
-
-}
diff --git a/Task/Almost-prime/EasyLang/almost-prime.easy b/Task/Almost-prime/EasyLang/almost-prime.easy
index 67e268e1f0..72cd4d8d65 100644
--- a/Task/Almost-prime/EasyLang/almost-prime.easy
+++ b/Task/Almost-prime/EasyLang/almost-prime.easy
@@ -2,27 +2,23 @@ func kprime n k .
i = 2
while i <= n
while n mod i = 0
- if f = k
- return 0
- .
+ if f = k : return 0
f += 1
n /= i
.
i += 1
.
- if f = k
- return 1
- .
+ if f = k : return 1
return 0
.
for k = 1 to 5
write "k=" & k & " : "
i = 2
- c = 0
- while c < 10
+ cnt = 0
+ while cnt < 10
if kprime i k = 1
write i & " "
- c += 1
+ cnt += 1
.
i += 1
.
diff --git a/Task/Almost-prime/Forth/almost-prime.fth b/Task/Almost-prime/Forth/almost-prime.fth
new file mode 100644
index 0000000000..77210f5046
--- /dev/null
+++ b/Task/Almost-prime/Forth/almost-prime.fth
@@ -0,0 +1,38 @@
+: multiplicity ( n1 n2 -- n1 n2 n3 )
+ 0 >r
+ begin
+ 2dup mod 0=
+ while
+ r> 1+ >r
+ tuck / swap
+ repeat
+ r> ;
+
+: k-prime? ( n k -- ? )
+ >r 0 >r 2
+ begin
+ 2dup dup * >= if 2r@ > else false then
+ while
+ multiplicity r> + >r 1+
+ repeat
+ drop
+ 1 > if 1 else 0 then r> + r> = ;
+
+: next-k-prime ( n k -- n )
+ begin
+ swap 1+ swap
+ 2dup k-prime?
+ until drop ;
+
+: main
+ 6 1 do
+ ." k = " i 1 .r ." :"
+ 1 10 0 do
+ j next-k-prime
+ dup 3 .r space
+ loop
+ drop cr
+ loop ;
+
+main
+bye
diff --git a/Task/Almost-prime/REXX/almost-prime-1.rexx b/Task/Almost-prime/REXX/almost-prime-1.rexx
deleted file mode 100644
index e5652afb7c..0000000000
--- a/Task/Almost-prime/REXX/almost-prime-1.rexx
+++ /dev/null
@@ -1,35 +0,0 @@
-/*REXX program computes and displays the first N K─almost primes from 1 ──► K. */
-parse arg N K . /*get optional arguments from the C.L. */
-if N=='' | N=="," then N=10 /*N not specified? Then use default.*/
-if K=='' | K=="," then K= 5 /*K " " " " " */
- /*W: is the width of K, used for output*/
- do m=1 for K; $=2**m; fir=$ /*generate & assign 1st K─almost prime.*/
- #=1; if #==N then leave /*#: K─almost primes; Enough are found?*/
- #=2; $=$ 3*(2**(m-1)) /*generate & append 2nd K─almost prime.*/
- if #==N then leave /*#: K─almost primes; Enough are found?*/
- if m==1 then _=fir + fir /* [↓] gen & append 3rd K─almost prime*/
- else do; _=9 * (2**(m-2)); #=3; $=$ _; end
- do j=_ + m - 1 until #==N /*process an K─almost prime N times.*/
- if factr()\==m then iterate /*not the correct K─almost prime? */
- #=# + 1; $=$ j /*bump K─almost counter; append it to $*/
- end /*j*/ /* [↑] generate N K─almost primes.*/
- say right(m, length(K))"─almost ("N') primes:' $
- end /*m*/ /* [↑] display a line for each K─prime*/
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-factr: z=j; do f=0 while z// 2==0; z=z% 2; end /*divisible by 2.*/
- do f=f while z// 3==0; z=z% 3; end /*divisible " 3.*/
- do f=f while z// 5==0; z=z% 5; end /*divisible " 5.*/
- do f=f while z// 7==0; z=z% 7; end /*divisible " 7.*/
- do f=f while z//11==0; z=z%11; end /*divisible " 11.*/
- do f=f while z//13==0; z=z%13; end /*divisible " 13.*/
- do p=17 by 6 while p<=z /*insure P isn't divisible by three. */
- parse var p '' -1 _ /*obtain the right─most decimal digit. */
- /* [↓] fast check for divisible by 5. */
- if _\==5 then do; do f=f+1 while z//p==0; z=z%p; end; f=f-1; end /*÷ by P? */
- if _ ==3 then iterate /*fast check for X divisible by five.*/
- x=p+2; do f=f+1 while z//x==0; z=z%x; end; f=f-1 /*÷ by X? */
- end /*i*/ /* [↑] find all the factors in Z. */
-
- if f==0 then return 1 /*if prime (f==0), then return unity.*/
- return f /*return to invoker the number of divs.*/
diff --git a/Task/Almost-prime/REXX/almost-prime-2.rexx b/Task/Almost-prime/REXX/almost-prime-2.rexx
deleted file mode 100644
index d0dbbe54d6..0000000000
--- a/Task/Almost-prime/REXX/almost-prime-2.rexx
+++ /dev/null
@@ -1,66 +0,0 @@
-/*REXX program computes and displays the first N K─almost primes from 1 ──► K. */
-parse arg N K . /*obtain optional arguments from the CL*/
-if N=='' | N==',' then N=10 /*N not specified? Then use default.*/
-if K=='' | K==',' then K= 5 /*K " " " " " */
-nn=N; N=abs(N); w=length(K) /*N positive? Then show K─almost primes*/
-limit= (2**K) * N / 2 /*this is the limit for most K-primes. */
-if N==1 then limit=limit * 2 /* " " " " " a N of 1.*/
-if K==1 then limit=limit * 4 /* " " " " " a K─prime " 2.*/
-if K==2 then limit=limit * 2 /* " " " " " " " " 4.*/
-if K==3 then limit=limit * 3 % 2 /* " " " " " " " " 8.*/
-call genPrimes limit + 1 /*generate primes up to the LIMIT + 1.*/
-say 'The highest prime computed: ' @.# " (under the limit of " limit').'
-say /* [↓] define where 1st K─prime is odd*/
-d.=0; d.2= 2; d.3 = 4; d.4 = 7; d.5 = 13; d.6 = 22; d.7 = 38; d.8=63
- d.9=102; d.10=168; d.11=268; d.12=426; d.13=673; d.14=1064
-d!=0
- do m=1 for K; d!=max(d!,d.m) /*generate & assign 1st K─almost prime.*/
- mr=right(m,w); mm=m-1
-
- $=; do #=1 to min(N, d!) /*assign some doubled K─almost primes. */
- $=$ d.mm.# * 2
- end /*#*/
- #=#-1
- if m==1 then from=2
- else from=1 + word($, words($) )
-
- do j=from until #==N /*process an K─almost prime N times.*/
- if factr()\==m then iterate /*not the correct K─almost prime? */
- #=#+1; $=$ j /*bump K─almost counter; append it to $*/
- end /*j*/ /* [↑] generate N K─almost primes.*/
-
- if nn>0 then say mr"─almost ("N') primes:' $
- else say ' the last' mr "K─almost prime: " word($, words($))
- /* [↓] assign K─almost primes.*/
- do q=1 for #; d.m.q=word($,q) ; end /*q*/
- do q=1 for #; if d.m.q\==d.mm.q*2 then leave; end /*q*/
- /* [↑] count doubly-duplicates*/
-/*──── say copies('─',40) 'for ' m", " q-1 'numbers were doubly─duplicated.' ────*/
-/*──── say ────*/
- end /*m*/ /* [↑] display a line for each K─prime*/
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-factr: if #.j\==. then return #.j
- z=j; do f=0 while z// 2==0; z=z% 2; end /*÷ by 2*/
- do f=f while z// 3==0; z=z% 3; end /*÷ " 3*/
- do f=f while z// 5==0; z=z% 5; end /*÷ " 5*/
- do f=f while z// 7==0; z=z% 7; end /*÷ " 7*/
- do f=f while z//11==0; z=z%11; end /*÷ " 11*/
- do f=f while z//13==0; z=z%13; end /*÷ " 13*/
- do f=f while z//17==0; z=z%17; end /*÷ " 17*/
- do f=f while z//19==0; z=z%19; end /*÷ " 19*/
-
- do i=9 while @.i<=z; d=@.i /*divide by some higher primes. */
- do f=f while z//d==0; z=z%d; end /*is Z divisible by the prime D ? */
- end /*i*/ /* [↑] find all factors in Z. */
-
- if f==0 then f=1; #.j=f; return f /*Is prime (f≡0)? Then return unity. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-genPrimes: arg x; @.=; @.1=2; @.2=3; #.=.; #=2; s.#=@.#**2
- do j=@.# +2 by 2 to x /*only find odd primes from here on. */
- do p=2 while s.p<=j /*divide by some known low odd primes. */
- if j//@.p==0 then iterate j /*Is J divisible by X? Then ¬ prime.*/
- end /*p*/ /* [↓] a prime (J) has been found. */
- #=#+1; @.#=j; #.j=1; s.#=j*j /*bump prime count, and also assign ···*/
- end /*j*/ /* ··· the # of factors, prime, prime².*/
- return /* [↑] not an optimal prime generator.*/
diff --git a/Task/Almost-prime/REXX/almost-prime-3.rexx b/Task/Almost-prime/REXX/almost-prime.rexx
similarity index 92%
rename from Task/Almost-prime/REXX/almost-prime-3.rexx
rename to Task/Almost-prime/REXX/almost-prime.rexx
index 2c8d9e5b73..69046a42f9 100644
--- a/Task/Almost-prime/REXX/almost-prime-3.rexx
+++ b/Task/Almost-prime/REXX/almost-prime.rexx
@@ -1,6 +1,8 @@
include Settings
-say version; say 'k-Almost primes'; say
+say 'ALMOST PRIME - 3 Mar 2025'
+say version
+say
arg n k m
say 'Direct approach using Factors'
numeric digits 16
diff --git a/Task/Amb/Ballerina/amb.ballerina b/Task/Amb/Ballerina/amb.ballerina
new file mode 100644
index 0000000000..3f0fdce8b4
--- /dev/null
+++ b/Task/Amb/Ballerina/amb.ballerina
@@ -0,0 +1,35 @@
+import ballerina/io;
+
+string[] finalRes = [];
+
+function amb(string[][] wordsets, string[] res) returns boolean {
+ if wordsets.length() == 0 {
+ finalRes.push(...res);
+ return true;
+ }
+ string s = "";
+ int l = res.length();
+ if l > 0 { s = res[l - 1]; }
+ res.push("");
+ foreach string word in wordsets[0] {
+ res[l] = word;
+ if l > 0 && s[s.length() - 1] != res[l][0] { continue; }
+ if amb(wordsets.slice(1), [...res]) { return true; }
+ }
+ return false;
+}
+
+public function main() {
+ var wordsets = [
+ [ "the", "that", "a" ],
+ [ "frog", "elephant", "thing" ],
+ [ "walked", "treaded", "grows" ],
+ [ "slowly", "quickly" ]
+ ];
+
+ if amb(wordsets, []) {
+ io:println(string:'join(" ", ...finalRes));
+ } else {
+ io:println("No amb found");
+ }
+}
diff --git a/Task/Amb/EasyLang/amb.easy b/Task/Amb/EasyLang/amb.easy
new file mode 100644
index 0000000000..4c3e80dd21
--- /dev/null
+++ b/Task/Amb/EasyLang/amb.easy
@@ -0,0 +1,31 @@
+func ambtest a$ b$ .
+ if substr a$ len a$ 1 = substr b$ 1 1 : return 1
+ return 0
+.
+proc amb &opts$[][] pos prev$ &res$[] &found .
+ if pos = 0
+ found = 1
+ res$[] = [ ]
+ return
+ .
+ for curr$ in opts$[pos][]
+ if prev$ = "" or ambtest curr$ prev$ = 1
+ amb opts$[][] (pos - 1) curr$ res$[] found
+ if found = 1
+ res$[] &= curr$
+ return
+ .
+ .
+ .
+ found = 0
+ return
+.
+proc main .
+ sets$[][] = [ [ "the" "that" "a" ] [ "frog" "elephant" "thing" ] [ "walked" "treaded" "grows" ] [ "slowly" "quickly" ] ]
+ h = len sets$[][]
+ amb sets$[][] h "" res$[] found
+ if found = 1
+ print res$[]
+ .
+.
+main
diff --git a/Task/Amb/Elena/amb.elena b/Task/Amb/Elena/amb.elena
index 158379a738..2627185b46 100644
--- a/Task/Amb/Elena/amb.elena
+++ b/Task/Amb/Elena/amb.elena
@@ -82,12 +82,12 @@ public program()
new object[]{"walked", "treaded", "grows"},
new object[]{"slowly", "quickly"})
.seek::(a,b,c,d => joinable(a,b) && joinable(b,c) && joinable(c,d) )
- .do::(a,b,c,d) { console.printLine(a," ",b," ",c," ",d) }
+ .do::(a,b,c,d) { Console.printLine(a," ",b," ",c," ",d) }
}
catch(Exception e)
{
- console.printLine("AMB is angry")
+ Console.printLine("AMB is angry")
};
- console.readChar()
+ Console.readChar()
}
diff --git a/Task/Amb/Langur/amb.langur b/Task/Amb/Langur/amb.langur
index 7f047193bb..a2a6dca16f 100644
--- a/Task/Amb/Langur/amb.langur
+++ b/Task/Amb/Langur/amb.langur
@@ -6,7 +6,7 @@ val wordsets = [
]
val alljoin = fn words: for[=true] i of len(words)-1 {
- if words[i][-1] != words[i+1][1]: break = false
+ if words[i][-1] != words[i+1][1]: break val=false
}
# amb expects 2 or more arguments
diff --git a/Task/Amicable-pairs/EasyLang/amicable-pairs.easy b/Task/Amicable-pairs/EasyLang/amicable-pairs.easy
index 648a0ba8ce..dc3d7e0186 100644
--- a/Task/Amicable-pairs/EasyLang/amicable-pairs.easy
+++ b/Task/Amicable-pairs/EasyLang/amicable-pairs.easy
@@ -1,17 +1,13 @@
func sumdivs n .
sum = 1
for d = 2 to sqrt n
- if n mod d = 0
- sum += d + n div d
- .
+ if n mod d = 0 : sum += d + n div d
.
return sum
.
for n = 1 to 20000
m = sumdivs n
- if m > n
- if sumdivs m = n
- print n & " " & m
- .
+ if m > n and sumdivs m = n
+ print n & " " & m
.
.
diff --git a/Task/Amicable-pairs/Elena/amicable-pairs-1.elena b/Task/Amicable-pairs/Elena/amicable-pairs-1.elena
index 62814d6243..06a9bfd320 100644
--- a/Task/Amicable-pairs/Elena/amicable-pairs-1.elena
+++ b/Task/Amicable-pairs/Elena/amicable-pairs-1.elena
@@ -31,6 +31,6 @@ public program()
{
N.AmicablePairs.forEach::(pair)
{
- console.printLine(pair.Item1, " ", pair.Item2)
+ Console.printLine(pair.Item1, " ", pair.Item2)
}
}
diff --git a/Task/Amicable-pairs/Elena/amicable-pairs-2.elena b/Task/Amicable-pairs/Elena/amicable-pairs-2.elena
index 8ac6072f0d..a7d4a255ca 100644
--- a/Task/Amicable-pairs/Elena/amicable-pairs-2.elena
+++ b/Task/Amicable-pairs/Elena/amicable-pairs-2.elena
@@ -27,7 +27,7 @@ extension op : IntNumber
public program()
{
- N.AmicablePairs.forEach::(var Tuple pair)
+ (N.AmicablePairs)::forEach>::(pair)
{
console.printLine(pair.Item1, " ", pair.Item2)
}
diff --git a/Task/Amicable-pairs/Elena/amicable-pairs-3.elena b/Task/Amicable-pairs/Elena/amicable-pairs-3.elena
index ede0ca6ccd..90b88b9964 100644
--- a/Task/Amicable-pairs/Elena/amicable-pairs-3.elena
+++ b/Task/Amicable-pairs/Elena/amicable-pairs-3.elena
@@ -19,7 +19,7 @@ public sealed AmicablePairs
this max := max
}
- yieldable Tuple next()
+ yield Enumerator> enumerator()
{
List divsums := Range.new(0, max + 1).selectBy::(int i => ProperDivisors(i).summarize(0));
@@ -27,19 +27,17 @@ public sealed AmicablePairs
{
int sum := divsums[i];
if(i < sum && sum <= divsums.Length && divsums[sum] == i) {
- $yield new Tuple(i, sum);
+ :yield new Tuple(i, sum);
}
};
-
- ^ nil
}
}
public program()
{
- auto e := new AmicablePairs(Limit);
- for(auto pair := e.next(); pair != nil)
- {
- console.printLine(pair.Item1, " ", pair.Item2)
+ auto e := new AmicablePairs(Limit).enumerator();
+ while (e.next()) {
+ auto pair := *e;
+ console.printLine(pair.Item1, " ", pair.Item2)
}
}
diff --git a/Task/Amicable-pairs/PascalABC.NET/amicable-pairs.pas b/Task/Amicable-pairs/PascalABC.NET/amicable-pairs.pas
new file mode 100644
index 0000000000..e6b4e2cd91
--- /dev/null
+++ b/Task/Amicable-pairs/PascalABC.NET/amicable-pairs.pas
@@ -0,0 +1,9 @@
+function k(n : Integer) := 1.to(n div 2).where(d->n mod d=0).sum;
+begin
+1.to(20000).Where(n->n=k(k(n)))
+.Select(n->
+ begin var m:=k(n);
+Result:=(min(n,m),max(n,m));
+ end).where(v->v[0]$'{v[0]}-{v[1]}').Printlines;
+end.
diff --git a/Task/Amicable-pairs/REXX/amicable-pairs-2.rexx b/Task/Amicable-pairs/REXX/amicable-pairs-2.rexx
index 6c7c579692..0df72c5809 100644
--- a/Task/Amicable-pairs/REXX/amicable-pairs-2.rexx
+++ b/Task/Amicable-pairs/REXX/amicable-pairs-2.rexx
@@ -1,28 +1,26 @@
-/*REXX program calculates and displays all amicable pairs up to a given number. */
-parse arg H .; if H=='' | H=="," then H= 20000 /*get optional arguments (high limit).*/
-w= length(H) ; low= 220 /*W: used for columnar output alignment*/
-@.=. /* [↑] LOW is lowest amicable number. */
- do k=low for H-low; _= sigma(k) /*generate sigma sums for a range of #s*/
- if _>=low then @.k= _ /*only keep the pertinent sigma sums. */
- end /*k*/ /* [↑] process a range of integers. */
-#= 0 /*number of amicable pairs found so far*/
- do m=low to H; n= @.m /*start the search at the lowest number*/
- if m==@.n then do /*If equal, might be an amicable number*/
- if m==n then iterate /*Is this a perfect number? Then skip.*/
- #= # + 1 /*bump the amicable pair counter. */
- say right(m,w) ' and ' right(n,w) " are an amicable pair."
- m= n /*start M (DO index) from N. */
- end
- end /*m*/
+-- 8 May 2025
+include Settings
+
+say 'AMICABLE PAIRS'
+say version
say
-say # ' amicable pairs found up to ' H /*display count of the amicable pairs. */
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-sigma: procedure; parse arg x; od= x // 2 /*use either EVEN or ODD integers. */
- s= 1 /*set initial sigma sum to unity. ___*/
- do j=2+od by 1+od while j*j 0); n = Abs(n)
+a = Amicables(n)
+say time('e') a 'amicable pairs collected'
+if show then do
+ do i = 1 to a
+ say time('e') amic.1.i 'and' amic.2.i 'are an amicable pair'
+ end
+end
+say time('e') 'seconds'
+exit
+
+include Sequences
+include Numbers
+include Functions
+include Special
+include Abend
diff --git a/Task/Amicable-pairs/REXX/amicable-pairs-3.rexx b/Task/Amicable-pairs/REXX/amicable-pairs-3.rexx
deleted file mode 100644
index 5ceabf3e71..0000000000
--- a/Task/Amicable-pairs/REXX/amicable-pairs-3.rexx
+++ /dev/null
@@ -1,30 +0,0 @@
-/*REXX program calculates and displays all amicable pairs up to a given number. */
-parse arg H .; if H=='' | H=="," then H=20000 /*get optional arguments (high limit).*/
-w=length(H) ; low=220 /*W: used for columnar output alignment*/
-x= 220 34765731 6232 87633 284 12285 10856 36939357 6368 5684679 /*S minimums.*/
- do i=0 for 10; $.i= word(x, i + 1); end /*minimum amicable #s for last dec dig.*/
-@.= /* [↑] LOW is lowest amicable number. */
-#= 0 /*number of amicable pairs found so far*/
- do k=low for H-low /*generate sigma sums for a range of #s*/
- parse var k '' -1 D /*obtain last decimal digit of K. */
- if k<$.D then iterate /*if no need to compute, then skip it. */
- _= sigma(k) /*generate sigma sum for the number K.*/
- @.k= _ /*only keep the pertinent sigma sums. */
- if k==@._ then do /*is it a possible amicable number ? */
- if _==k then iterate /*Is it a perfect number? Then skip it*/
- #= # + 1 /*bump the amicable pair counter. */
- say right(_, w) ' and ' right(k, w) " are an amicable pair."
- end
- end /*k*/ /* [↑] process a range of integers. */
-say
-say # 'amicable pairs found up to' H /*display the count of amicable pairs. */
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-sigma: procedure; parse arg x; od= x // 2 /*use either EVEN or ODD integers. */
- s= 1 /*set initial sigma sum to unity. ___*/
- do j=2+od by 1+od while j*j1; q=q%4; _=x-r-q; r=r%2; if _>=0 then do;x=_;r=r+q; end; end
- return r
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-sigma: procedure; parse arg x; od= x // 2 /*use either EVEN or ODD integers. */
- s= 1 /*set initial sigma sum to unity. ___*/
- do j=2+od by 1+od to iSqrt(x) /*divide by all integers up to the √ x */
- if x//j==0 then s= s + j + x%j /*add the two divisors to the sum. */
- end /*j*/ /* [↑] % is the REXX integer division.*/
- /* ___ */
- if j*j==x then return s + j /*Was X a square? If so, add √ X */
- return s /*return (sigma) sum of the divisors. */
diff --git a/Task/Amicable-pairs/REXX/amicable-pairs-5.rexx b/Task/Amicable-pairs/REXX/amicable-pairs-5.rexx
deleted file mode 100644
index 5ee02d6498..0000000000
--- a/Task/Amicable-pairs/REXX/amicable-pairs-5.rexx
+++ /dev/null
@@ -1,34 +0,0 @@
-/*REXX program calculates and displays all amicable pairs up to a given number. */
-parse arg H .; if H=='' | H=="," then H=20000 /*get optional arguments (high limit).*/
-w= length(H) ; low= 220 /*W: used for columnar output alignment*/
-x= 220 34765731 6232 87633 284 12285 10856 36939357 6368 5684679 /*S minimums.*/
- do i=0 for 10; $.i= word(x, i + 1); end /*minimum amicable #s for last dec dig.*/
-@.= /* [↑] LOW is lowest amicable number. */
-#= 0 /*number of amicable pairs found so far*/
- do k=low for H-low /*generate sigma sums for a range of #s*/
- parse var k '' -1 D /*obtain last decimal digit of K. */
- if k<$.D then iterate /*if no need to compute, then skip it. */
- _= sigma(k) /*generate sigma sum for the number K.*/
- @.k= _ /*only keep the pertinent sigma sums. */
- if k==@._ then do /*is it a possible amicable number ? */
- if _==k then iterate /*Is it a perfect number? Then skip it*/
- #= # + 1 /*bump the amicable pair counter. */
- say right(_, w) ' and ' right(k, w) " are an amicable pair."
- end
- end /*k*/ /* [↑] process a range of integers. */
-say
-say # 'amicable pairs found up to' H /*display the count of amicable pairs. */
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-iSqrt: procedure; parse arg x; r= 0; q= 1; do while q<=x; q= q * 4; end
- do while q>1; q=q%4; _=x-r-q; r=r%2; if _>=0 then do;x=_;r=r+q; end; end
- return r
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-sigma: procedure; parse arg x; od= x // 2 /*use either EVEN or ODD integers. */
- s= 1 /*set initial sigma sum to unity. ___*/
- do j=2+od by 1+od to iSqrt(x) /*divide by all integers up to the √ x */
- if x//j==0 then s= s + j + x%j /*add the two divisors to the sum. */
- end /*j*/ /* [↑] % is the REXX integer division.*/
- /* ___ */
- if j*j==x then return s + j /*Was X a square? If so, add √ X */
- return s /*return (sigma) sum of the divisors. */
diff --git a/Task/Amicable-pairs/REXX/amicable-pairs-6.rexx b/Task/Amicable-pairs/REXX/amicable-pairs-6.rexx
deleted file mode 100644
index cec5b774eb..0000000000
--- a/Task/Amicable-pairs/REXX/amicable-pairs-6.rexx
+++ /dev/null
@@ -1,43 +0,0 @@
-include Settings
-
-say version; say 'Amicable pairs'; say
-arg n
-numeric digits 16
-if n = '' then
- n = 20000
-show = (n > 0); n = Abs(n)
-/* Get amicable pairs */
-a = Amicables(n)
-say time('e') a 'amicable pairs collected'
-/* Show amical pairs */
-if show then do
- do i = 1 to a
- say time('e') amic.amicable.1.i 'and' amic.amicable.2.i 'are an amicable pair'
- end
-end
-say time('e') 'seconds'
-exit
-
-Amicables:
-/* Amicable number pairs */
-procedure expose glob. amic.
-arg x
-/* Init */
-amic. = 0
-/* Scan for amicable pairs */
-n = 0
-do i = 1 to x
- s = Sigma(i)-i; glob.sigma.i = s
- if i = glob.sigma.s then do
- if s = i then
- iterate
- n = n+1
- amic.amicable.1.n = s; amic.amicable.2.n = i
- end
-end
-amic.0 = n
-return n
-
-include Numbers
-include Functions
-include Abend
diff --git a/Task/Anagrams-Deranged-anagrams/Crystal/anagrams-deranged-anagrams.cr b/Task/Anagrams-Deranged-anagrams/Crystal/anagrams-deranged-anagrams.cr
new file mode 100644
index 0000000000..0e8a15fdbb
--- /dev/null
+++ b/Task/Anagrams-Deranged-anagrams/Crystal/anagrams-deranged-anagrams.cr
@@ -0,0 +1,19 @@
+def deranged? (a, b)
+ a.chars.zip(b.chars).all? {|char_a, char_b| char_a != char_b}
+end
+
+def find_derangements (list)
+ list.each_combination(2) {|(a, b)| return a, b if deranged?(a, b)}
+ nil
+end
+
+anagram = File.read_lines("unixdict.txt").group_by {|s| s.chars.sort}
+
+anagram = anagram.select {|k,list| list.size>1}.to_a.sort_by! {|k, list| -k.size}
+
+anagram.each do |k, list|
+ if derangements = find_derangements(list)
+ puts "Longest derangement anagram: #{derangements}"
+ break
+ end
+end
diff --git a/Task/Anagrams-Deranged-anagrams/EasyLang/anagrams-deranged-anagrams.easy b/Task/Anagrams-Deranged-anagrams/EasyLang/anagrams-deranged-anagrams.easy
new file mode 100644
index 0000000000..f9b6445b1f
--- /dev/null
+++ b/Task/Anagrams-Deranged-anagrams/EasyLang/anagrams-deranged-anagrams.easy
@@ -0,0 +1,74 @@
+proc norm s$ &name$[] &cnt[] &id .
+ d$[] = strchars s$
+ for i = 1 to len d$[] - 1
+ for j = i + 1 to len d$[]
+ if strcode d$[j] < strcode d$[i] : swap d$[j] d$[i]
+ .
+ .
+ n$ = strjoin d$[] ""
+ for id to len name$[] : if name$[id] = n$ : break 1
+ if id > len name$[]
+ name$[] &= n$
+ cnt[] &= 0
+ .
+ cnt[id] += 1
+.
+func deranged a$ b$ .
+ for i to len a$
+ if substr a$ i 1 = substr b$ i 1 : return 0
+ .
+ return 1
+.
+global maxlng w$[] .
+proc read .
+ repeat
+ s$ = input
+ until s$ = ""
+ w$[] &= s$
+ maxlng = higher maxlng len s$
+ .
+.
+read
+#
+len wid[] len w$[]
+done = 0
+proc search a b .
+ for i = a to b
+ norm w$[i] name$[] cnt[] id
+ wid[i] = id
+ .
+ for id to len name$[] : if cnt[id] > 1
+ h[] = [ ]
+ for i = a to b : if wid[i] = id : h[] &= i
+ for i to len h[] - 1 : for j = i + 1 to len h[]
+ if deranged w$[h[i]] w$[h[j]] = 1
+ print w$[h[i]] & " " & w$[h[j]]
+ done = 1
+ .
+ .
+ .
+.
+b = len w$[]
+while done = 0 and maxlng >= 2
+ a = b
+ for i = b downto 1 : if len w$[i] = maxlng
+ swap w$[i] w$[a]
+ a -= 1
+ .
+ search a + 1 b
+ maxlng -= 1
+.
+#
+# a few lines of unixdict.txt, also works with all
+input_data
+ancestor
+ancestral
+ancestry
+anchor
+lana
+lancashire
+lancaster
+lance
+zucchini
+zurich
+zygote
diff --git a/Task/Anagrams/EasyLang/anagrams.easy b/Task/Anagrams/EasyLang/anagrams.easy
new file mode 100644
index 0000000000..2e5fcff599
--- /dev/null
+++ b/Task/Anagrams/EasyLang/anagrams.easy
@@ -0,0 +1,46 @@
+global name$[] cnt[] .
+func n2id n$ .
+ for id to len name$[] : if name$[id] = n$ : return id
+ name$[] &= n$
+ cnt[] &= 0
+ return id
+.
+func norm s$ .
+ d$[] = strchars s$
+ for i = 1 to len d$[] - 1
+ for j = i + 1 to len d$[]
+ if strcode d$[j] < strcode d$[i] : swap d$[j] d$[i]
+ .
+ .
+ n$ = strjoin d$[] ""
+ return n2id n$
+.
+repeat
+ s$ = input
+ until s$ = ""
+ id = norm s$
+ cnt[id] += 1
+ max = higher max cnt[id]
+ w$[] &= s$
+ wid[] &= id
+.
+for id to len name$[]
+ if cnt[id] = max
+ for i to len w$[]
+ if wid[i] = id : write w$[i] & " "
+ .
+ print ""
+ .
+.
+#
+# a few lines of unixdict.txt, also works with all
+input_data
+abe
+abed
+abel
+ablaze
+able
+ablution
+angel
+angle
+angles
diff --git a/Task/Anagrams/Elena/anagrams.elena b/Task/Anagrams/Elena/anagrams.elena
index 65bb59e28f..a98ee663ba 100644
--- a/Task/Anagrams/Elena/anagrams.elena
+++ b/Task/Anagrams/Elena/anagrams.elena
@@ -15,7 +15,7 @@ extension op
public program()
{
- var start := now;
+ var start := Now;
auto dictionary := new Map();
@@ -35,13 +35,13 @@ public program()
dictionary.Values
.quickSort::(former,later => former.Item2.Length > later.Item2.Length )
.top(20)
- .forEach::(pair){ console.printLine(pair.Item2) };
+ .forEach::(pair){ Console.printLine(pair.Item2) };
- var end := now;
+ var end := Now;
var diff := end - start;
- console.printLine("Time elapsed in msec:",diff.Milliseconds);
+ Console.printLine("Time elapsed in msec:",diff.Milliseconds);
- console.readChar()
+ Console.readChar()
}
diff --git a/Task/Angle-difference-between-two-bearings/Ballerina/angle-difference-between-two-bearings.ballerina b/Task/Angle-difference-between-two-bearings/Ballerina/angle-difference-between-two-bearings.ballerina
new file mode 100644
index 0000000000..213bb46d14
--- /dev/null
+++ b/Task/Angle-difference-between-two-bearings/Ballerina/angle-difference-between-two-bearings.ballerina
@@ -0,0 +1,34 @@
+import ballerina/io;
+
+function subtract(float b1, float b2) returns float {
+ float d = (b2 - b1) % 360.0;
+ if d < -180.0 { d += 360.0; }
+ if d >= 180.0 { d -= 360.0; }
+ return d.round(4);
+}
+
+public function main() {
+ float[][] pairs = [
+ [ 20, 45],
+ [-45, 45],
+ [-85, 90],
+ [-95, 90],
+ [-45, 125],
+ [-45, 145],
+ [ 29.4803, -88.6381],
+ [-78.3251, -159.036],
+ [-70099.74233810938, 29840.67437876723],
+ [-165313.6666297357, 33693.9894517456],
+ [1174.8380510598456, -154146.66490124757],
+ [60175.77306795546, 42213.07192354373]
+ ];
+
+ io:println("Differences (to 4dp) between these bearings:");
+ foreach var pair in pairs {
+ float p0 = pair[0];
+ float p1 = pair[1];
+ float diff = subtract(p0, p1);
+ string offset = p0 < 0.0 ? " " : " ";
+ io:println(`${offset}${p0} and ${p1} -> ${diff}`);
+ }
+}
diff --git a/Task/Angle-difference-between-two-bearings/EasyLang/angle-difference-between-two-bearings.easy b/Task/Angle-difference-between-two-bearings/EasyLang/angle-difference-between-two-bearings.easy
index fbe96a9106..052ea0af48 100644
--- a/Task/Angle-difference-between-two-bearings/EasyLang/angle-difference-between-two-bearings.easy
+++ b/Task/Angle-difference-between-two-bearings/EasyLang/angle-difference-between-two-bearings.easy
@@ -7,7 +7,7 @@ func angdiff a b .
.
return r
.
-proc pd a b . .
+proc pd a b .
print b & " " & a & " -> " & angdiff a b
.
pd 20 45
diff --git a/Task/Angles-geometric-normalization-and-conversion/EasyLang/angles-geometric-normalization-and-conversion.easy b/Task/Angles-geometric-normalization-and-conversion/EasyLang/angles-geometric-normalization-and-conversion.easy
index 546d276c89..2a63ef3ad8 100644
--- a/Task/Angles-geometric-normalization-and-conversion/EasyLang/angles-geometric-normalization-and-conversion.easy
+++ b/Task/Angles-geometric-normalization-and-conversion/EasyLang/angles-geometric-normalization-and-conversion.easy
@@ -27,7 +27,7 @@ func$ fmt s$ .
#
scales$[] = [ "degree" "gradian" "mil" "radian" ]
values[] = [ -2 -1 0 1 2 6.2831853 16 57.2957795 359 399 6399 1000000 ]
-numfmt 3 10
+numfmt 10 3
for f$ in scales$[]
write fmt f$
for t$ in scales$[]
diff --git a/Task/Animate-a-pendulum/EasyLang/animate-a-pendulum.easy b/Task/Animate-a-pendulum/EasyLang/animate-a-pendulum.easy
index f295faf12e..1f2b4d30c3 100644
--- a/Task/Animate-a-pendulum/EasyLang/animate-a-pendulum.easy
+++ b/Task/Animate-a-pendulum/EasyLang/animate-a-pendulum.easy
@@ -1,12 +1,11 @@
ang = 45
on animate
- clear
- move 50 50
- circle 1
- x = 50 + 40 * sin ang
- y = 50 + 40 * cos ang
- line x y
- circle 6
- vel += sin ang / 5
- ang += vel
+ gclear
+ gcircle 50 50 1
+ x = 50 + 40 * sin ang
+ y = 50 + 40 * cos ang
+ gline 50 50 x y
+ gcircle x y 6
+ vel += sin ang / 5
+ ang += vel
.
diff --git a/Task/Animation/EasyLang/animation.easy b/Task/Animation/EasyLang/animation.easy
index 82c5470808..575b1619dc 100644
--- a/Task/Animation/EasyLang/animation.easy
+++ b/Task/Animation/EasyLang/animation.easy
@@ -1,13 +1,11 @@
s$ = "Hello world! "
-textsize 14
+gtextsize 14
lg = len s$
on timer
- color 333
- move 10 20
- rect 80 20
- color 999
- move 12 24
- text substr s$ 1 9
+ gcolor 333
+ grect 10 20 80 20
+ gcolor 999
+ gtext 12 24 substr s$ 1 9
if forw = 1
s$ = substr s$ lg 1 & substr s$ 1 (lg - 1)
else
diff --git a/Task/Anonymous-recursion/Elena/anonymous-recursion.elena b/Task/Anonymous-recursion/Elena/anonymous-recursion.elena
index f8f6bcd578..2845fb591f 100644
--- a/Task/Anonymous-recursion/Elena/anonymous-recursion.elena
+++ b/Task/Anonymous-recursion/Elena/anonymous-recursion.elena
@@ -21,16 +21,16 @@ public program()
{
for (int i := -1; i <= 10; i += 1)
{
- console.print("fib(",i,")=");
+ Console.print("fib(",i,")=");
try
{
- console.printLine(fib(i))
+ Console.printLine(fib(i))
}
catch(Exception e)
{
- console.printLine("invalid")
+ Console.printLine("invalid")
}
};
- console.readChar()
+ Console.readChar()
}
diff --git a/Task/Anti-primes/Ballerina/anti-primes.ballerina b/Task/Anti-primes/Ballerina/anti-primes.ballerina
new file mode 100644
index 0000000000..c8e5cf3088
--- /dev/null
+++ b/Task/Anti-primes/Ballerina/anti-primes.ballerina
@@ -0,0 +1,42 @@
+import ballerina/io;
+
+function divisorCount(int x) returns int {
+ int n = x;
+ if n < 1 { return 0; }
+ int count = 0;
+ int prod = 1;
+ while n % 2 == 0 {
+ count += 1;
+ n /= 2;
+ }
+ prod *= 1 + count;
+ int i = 3;
+ while i * i <= n {
+ count = 0;
+ while n % i == 0 {
+ count += 1;
+ n /= i;
+ }
+ prod *= 1 + count;
+ i += 2;
+ }
+ if n > 2 { prod *= 2; }
+ return prod;
+}
+
+public function main() {
+ io:println("The first 20 anti-primes are:");
+ int maxDiv = 0;
+ int count = 0;
+ int n = 1;
+ while count < 20 {
+ int d = divisorCount(n);
+ if d > maxDiv {
+ io:print(n, " ");
+ maxDiv = d;
+ count += 1;
+ }
+ n += 1;
+ }
+ io:println();
+}
diff --git a/Task/Anti-primes/EasyLang/anti-primes.easy b/Task/Anti-primes/EasyLang/anti-primes.easy
index d5099ac863..fba9fdd79b 100644
--- a/Task/Anti-primes/EasyLang/anti-primes.easy
+++ b/Task/Anti-primes/EasyLang/anti-primes.easy
@@ -11,16 +11,14 @@ func divcnt v .
p += 1
tot *= cnt
.
- if n > 1
- tot *= 2
- .
+ if n > 1 : tot *= 2
return tot
.
while count < 20
n += 1
divs = divcnt n
if divs > max
- print n
+ write n & " "
max = divs
count += 1
.
diff --git a/Task/Anti-primes/OCaml/anti-primes.ml b/Task/Anti-primes/OCaml/anti-primes.ml
new file mode 100644
index 0000000000..aeb3bab8ae
--- /dev/null
+++ b/Task/Anti-primes/OCaml/anti-primes.ml
@@ -0,0 +1,18 @@
+let num_divisors (n : int) : int =
+ if n = 0 || n = 1 then 1 else if n = 2 then 2 else
+ List.init (n / 2) ((+) 1) (* O(n) *)
+ |> List.filter (fun i -> n mod i = 0)
+ |> List.length
+
+let first_n_antiprimes (n : int) : int list =
+ let rec loop = function
+ | i, record, antis when List.length antis = n -> antis
+ | i, record, antis -> let nd = num_divisors i in
+ if nd > record then loop (i + 1, nd, i :: antis) else
+ loop (i + 1, record, antis)
+ in loop (2, 1, [1]) |> List.rev
+
+let () = first_n_antiprimes 19
+ |> List.map string_of_int
+ |> String.concat ", "
+ |> Printf.printf "[%s]\n"
diff --git a/Task/Anti-primes/REXX/anti-primes-1.rexx b/Task/Anti-primes/REXX/anti-primes-1.rexx
index 1e20a7931e..814dcd4d22 100644
--- a/Task/Anti-primes/REXX/anti-primes-1.rexx
+++ b/Task/Anti-primes/REXX/anti-primes-1.rexx
@@ -1,40 +1,32 @@
-/*REXX program finds and displays N number of anti-primes (highly-composite) numbers.*/
-Parse Arg N . /* obtain optional argument from the CL. */
-If N=='' | N=="," Then N=20 /* Not specified? Then use the default. */
-maxD=0 /* the maximum number of divisors so far */
-Say '-index- --anti-prime--' /* display a title For the numbers shown */
-nn=0 /* the count of anti-primes found " " */
-Do i=1 For 59 While nnmaxD Then Do /* found an anti-prime nn set new maxD */
- maxD=d
- nn=nn+1
- Say center(nn,7) right(i,10) /* display the index and the anti-prime. */
- End
- End /*i*/
+-- 8 May 2025
+include Settings
+arg xx
+if xx = '' then
+ xx = 1500000
-Do i=60 by 20 While nnmaxD Then Do /* found an anti-prime nn set new maxD */
- maxD=d
- nn=nn+1
- Say center(nn,7) right(i,10) /* display the index and the anti-prime. */
- End
- End /*i*/
-Exit /* stick a fork in it, we're all done. */
-/*-----------------------------------------------------------------------------------*/
-nndivs: Procedure /* compute the number of proper divisors */
- Parse Arg x
- If x<2 Then
- Return 1
- odd=x//2
- n=1 /* 1 is a proper divisor */
- Do j=2+odd by 1+odd While j*j h then do
+ n = n+1
+ call Charout ,Left(i' ['c'] ',16)
+ if n//5 = 0 then
+ say
+ h = c
+ end
+end
+say n 'found'
+say
+call Timer
+exit
+
+include Numbers
+include Functions
+include Special
+include Helper
+include Abend
diff --git a/Task/Anti-primes/REXX/anti-primes-2.rexx b/Task/Anti-primes/REXX/anti-primes-2.rexx
index 25e3818e7a..33c855c408 100644
--- a/Task/Anti-primes/REXX/anti-primes-2.rexx
+++ b/Task/Anti-primes/REXX/anti-primes-2.rexx
@@ -1,38 +1,33 @@
-/*REXX program finds and displays N number of anti─primes or highly─composite numbers.*/
-parse arg N . /*obtain optional argument from the CL.*/
-if N=='' | N=="," then N= 20 /*Not specified? Then use the default.*/
- @.= .; @.1= 1; @.2= 2; @.4= 3; @.5= 2; @.6= 4
-say '─index─ ──anti─prime──' /*display a title for the numbers shown*/
-#= 1 /*the count of anti─primes found " " */
-maxD= 1 /*the maximum number of divisors so far*/
-say center(#, 7) right(1, 10) /*display the index and the anti─prime.*/
- do once=1 for 1
- do i=2 by 2 to 59 /*step through possible numbers by twos*/
- d= #divs(i); if d<=maxD then iterate /*get # divisors; Is too small? Skip.*/
- #= # + 1; maxD= d /*found an anti─prime #; set new minD.*/
- say center(#, 7) right(i, 10) /*display the index and the anti─prime.*/
- if #>=N then leave once /*if we have enough anti─primes, done. */
- end /*i*/
+-- 8 May 2025
+include Settings
+arg xx
+if xx = '' then
+ xx = 1500000
- do j=60 by 20 /*step through possible numbers by 20. */
- d= #divs(j); if d<=maxD then iterate /*get # divisors; Is too small? Skip.*/
- #= # + 1; maxD= d /*found an anti─prime #; set new minD.*/
- say center(#, 7) right(j, 10) /*display the index and the anti─prime.*/
- if #>=N then leave once /*if we have enough anti─primes, done. */
- L= length(j) /*obtain the length of the index (J). */
- if L>3 then j= j + left(4, L-2, 0) - 20 /*Length>3? Then calculate a long jump*/
- end /*j*/
- end /*once*/
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-#divs: parse arg x; if @.x\==. then return @.x /*if pre─computed, then return shortcut*/
- $= 3; y= x % 2
- /* [↑] start with known num of Pdivs.*/
- do k=3 for x%2-3 while k=y then do; $= $ - 1; leave; end /*limit?*/
- end /* ___ */
- else if k*k>x then leave /*only divide up to √ x */
- end /*k*/ /* [↑] this form of DO loop is faster.*/
- return $+1 /*bump "proper divisors" to "divisors".*/
+say 'ANTI-PRIMES'
+say version
+say 'Cheating'
+say
+say 'Anti-primes below' xx'...'
+numeric digits 16
+s = (xx > 0); xx = Abs(xx)
+h = Highcomposites(xx)
+if s then do
+ do i = 1 to high.0
+ c = Divisor(high.i)
+ call Charout ,Left(high.i' ['c'] ',20)
+ if i//5 = 0 then
+ say
+ end
+end
+say h 'found'
+say
+call Timer
+exit
+
+include Numbers
+include Functions
+include Special
+include Sequences
+include Helper
+include Abend
diff --git a/Task/Anti-primes/REXX/anti-primes-3.rexx b/Task/Anti-primes/REXX/anti-primes-3.rexx
deleted file mode 100644
index 1fd8eab5dc..0000000000
--- a/Task/Anti-primes/REXX/anti-primes-3.rexx
+++ /dev/null
@@ -1,44 +0,0 @@
-include Settings
-
-say version; say 'Anti-prims'; say
-arg n
-numeric digits 16
-if n = '' then
- n = 10000
-show = (n > 0); n = Abs(n)
-h = Highcomposites(n)
-say h 'anti-primes found below' n
-if show then do
- do i = 1 to high.0
- say i high.highcomposite.i
- end
-end
-say time('e') 'seconds'
-exit
-
-Highcomposites:
-/* Highly composite sequence */
-procedure expose high.
-arg x
-/* Thresholds and increments */
-a = '1 2 6 60 840 55440 720720 61261200 2327925600 321253732800 9999999999999'
-b = '1 2 6 60 420 27720 360360 12252240 232792560 80313433200 9999999999999'
-c = Words(a)-1; m = 0; n = 0
-/* Colllect cf definition */
-do i = 1 to c
- do j = Word(a,i) by Word(b,i) to Min(x,Word(a,i+1)-1)
- d = Divisors(j)
- if d > m then do
- n = n+1; high.highcomposite.n = j
- m = d
- end
- end
-end
-high.0 = n
-/* Return count */
-return n
-
-include Numbers
-include Functions
-include Sequences
-include Abend
diff --git a/Task/Anti-primes/Zig/anti-primes.zig b/Task/Anti-primes/Zig/anti-primes.zig
new file mode 100644
index 0000000000..055b8a243e
--- /dev/null
+++ b/Task/Anti-primes/Zig/anti-primes.zig
@@ -0,0 +1,160 @@
+const std = @import("std");
+
+fn sieve(allocator: std.mem.Allocator, n: usize) ![]i32 {
+ var is_prime = try allocator.alloc(i32, n);
+ var primes = std.ArrayList(i32).init(allocator);
+ defer allocator.free(is_prime);
+ for (is_prime) |*p| {
+ p.* = 1;
+ }
+ is_prime[0] = 0;
+ is_prime[1] = 0;
+ for (2..n) |i| {
+ if (is_prime[i] == 1) {
+ var j = i * i;
+ while (j < n) : (j += i) {
+ is_prime[j] = 0;
+ }
+ }
+ }
+ for (2..n) |i| {
+ if (is_prime[i] == 1) {
+ try primes.append(@intCast(i));
+ }
+ }
+ return primes.toOwnedSlice();
+}
+
+const AntiPrime = struct {
+ value: i32,
+ divisors_count: i32,
+ factorization: std.ArrayList(i32),
+
+ pub fn init(allocator: std.mem.Allocator, value: i32, divisors_count: i32, factors: []i32) !AntiPrime {
+ var factorization = try std.ArrayList(i32).initCapacity(allocator, factors.len);
+ errdefer factorization.deinit();
+ try factorization.appendSlice(factors);
+ return AntiPrime{
+ .value = value,
+ .divisors_count = divisors_count,
+ .factorization = factorization,
+ };
+ }
+
+ pub fn deinit(self: *AntiPrime) void {
+ self.factorization.deinit();
+ }
+
+ pub fn asc(context: void, a: AntiPrime, b: AntiPrime) bool {
+ _ = context;
+ if (a.value < b.value) return true;
+ if (a.value > b.value) return false;
+ if (a.divisors_count < b.divisors_count) return true;
+ if (a.divisors_count > b.divisors_count) return false;
+ if (a.factorization.items.len < b.factorization.items.len) return true;
+ if (a.factorization.items.len > b.factorization.items.len) return false;
+ for (a.factorization.items, b.factorization.items) |a_factor, b_factor| {
+ if (a_factor < b_factor) return true;
+ if (a_factor > b_factor) return false;
+ }
+ return false;
+ }
+
+ pub fn clone(self: *AntiPrime) !AntiPrime {
+ var new_factorization = try std.ArrayList(i32).initCapacity(self.factorization.allocator, self.factorization.items.len);
+ errdefer new_factorization.deinit();
+ try new_factorization.appendSlice(self.factorization.items);
+ return AntiPrime{
+ .value = self.value,
+ .divisors_count = self.divisors_count,
+ .factorization = new_factorization,
+ };
+ }
+};
+const MAXN = 100000000;
+fn generate_anti_primes(allocator: std.mem.Allocator) ![]AntiPrime {
+ var anti_primes = std.ArrayList(AntiPrime).init(allocator);
+ try anti_primes.append(try AntiPrime.init(allocator, 1, 1, &[_]i32{}));
+ const primes = try (sieve(allocator, 1000));
+ defer allocator.free(primes);
+
+ for (primes, 0..) |prime, i| {
+ var new_anti_primes = std.ArrayList(AntiPrime).init(allocator);
+ defer {
+ for (new_anti_primes.items) |*new_anti_prime| {
+ new_anti_prime.*.deinit();
+ }
+ new_anti_primes.deinit();
+ }
+ for (anti_primes.items) |*el| {
+ try new_anti_primes.append(try el.*.clone());
+ if (el.*.factorization.items.len < i) continue;
+ const e_max = if (i >= 1) el.*.factorization.items[i - 1] else @as(i32, @intCast(std.math.log2(MAXN)));
+ var n1 = el.*.value;
+ var e: i32 = 1;
+ while (e <= e_max) : (e += 1) {
+ n1 *= prime;
+ if (n1 > MAXN) break;
+ const div = el.*.divisors_count * (e + 1);
+ var exponents = std.ArrayList(i32).init(allocator);
+ defer exponents.deinit();
+ try exponents.appendSlice(el.*.factorization.items);
+ try exponents.append(e);
+ try new_anti_primes.append(try AntiPrime.init(
+ allocator,
+ @as(i32, n1),
+ div,
+ exponents.items,
+ ));
+ }
+ }
+ std.mem.sort(AntiPrime, new_anti_primes.items, {}, AntiPrime.asc);
+ for (anti_primes.items) |*anti_prime| {
+ anti_prime.*.deinit();
+ }
+ try anti_primes.resize(0);
+ try anti_primes.append(try AntiPrime.init(
+ allocator,
+ 1,
+ 1,
+ &[_]i32{},
+ ));
+
+ for (new_anti_primes.items) |*el| {
+ if (el.divisors_count > anti_primes.getLast().divisors_count) {
+ try anti_primes.append(try el.*.clone());
+ }
+ }
+ }
+
+ return anti_primes.toOwnedSlice();
+}
+
+pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ const allocator = gpa.allocator();
+ defer {
+ const result = gpa.deinit();
+ if (result == .leak) {
+ std.debug.panic("Memory leak detected in GeneralPurposeAllocator deinit", .{});
+ }
+ }
+ const stdout = std.io.getStdOut().writer();
+ const n = 20;
+
+ const anti_primes = try generate_anti_primes(allocator);
+ defer {
+ for (anti_primes) |*anti_prime| {
+ anti_prime.*.deinit();
+ }
+ allocator.free(anti_primes);
+ }
+
+ try stdout.print("The first 20 anti-primes:\n", .{});
+ for (anti_primes[0..n], 0..) |anti_prime, index| {
+ try stdout.print("{} ", .{anti_prime.value});
+ if (index % 10 == 9) {
+ try stdout.print("\n", .{});
+ }
+ }
+}
diff --git a/Task/Apply-a-callback-to-an-array/Ballerina/apply-a-callback-to-an-array.ballerina b/Task/Apply-a-callback-to-an-array/Ballerina/apply-a-callback-to-an-array.ballerina
new file mode 100644
index 0000000000..a2d7fd5818
--- /dev/null
+++ b/Task/Apply-a-callback-to-an-array/Ballerina/apply-a-callback-to-an-array.ballerina
@@ -0,0 +1,9 @@
+import ballerina/io;
+
+public function main() {
+ int[] a = from int i in 1...10 select i;
+ var square = function(int i) returns int {
+ return i * i;
+ };
+ io:println(a.map(i => square(i)));
+}
diff --git a/Task/Apply-a-digital-filter-direct-form-II-transposed-/Fortran/apply-a-digital-filter-direct-form-ii-transposed-.f b/Task/Apply-a-digital-filter-direct-form-II-transposed-/Fortran/apply-a-digital-filter-direct-form-ii-transposed-.f
new file mode 100644
index 0000000000..82aef332a6
--- /dev/null
+++ b/Task/Apply-a-digital-filter-direct-form-II-transposed-/Fortran/apply-a-digital-filter-direct-form-ii-transposed-.f
@@ -0,0 +1,42 @@
+module df2_filter
+ implicit none
+ real, parameter :: a(4) = [1.00000000, -2.77555756e-16, 3.33333333e-01, -1.85037171e-17]
+ real, parameter :: b(4) = [0.16666667, 0.5, 0.5, 0.16666667]
+ real :: w(4) = 0.0 ! State vector
+
+contains
+ function filter(x) result(y)
+ real, intent(in) :: x
+ real :: y
+ integer :: i
+
+ y = x * b(1) + w(1)
+
+ do i = 2, 4
+ w(i-1) = x * b(i) - y * a(i) + w(i)
+ end do
+ end function filter
+end module df2_filter
+
+program apply_filter
+ use df2_filter
+ implicit none
+ real, dimension(20) :: input = [ &
+ -0.917843918645, 0.141984778794, 1.20536903482, 0.190286794412, &
+ -0.662370894973, -1.00700480494, -0.404707073677, 0.800482325044, &
+ 0.743500089861, 1.01090520172, 0.741527555207, 0.277841675195, &
+ 0.400833448236, -0.2085993586, -0.172842103641, -0.134316096293, &
+ 0.0259303398477, 0.490105989562, 0.549391221511, 0.9047198589 ]
+ real, dimension(20) :: output
+ integer :: i
+
+ do i = 1, 20
+ output(i) = filter(input(i))
+ end do
+
+ print *, "Filtered signal:"
+ do i = 1,20
+ write(*, '(f12.9,2x)',advance='no') output(i)
+ if(mod(i,5)==0)write(*,*)
+ end do
+end program apply_filter
diff --git a/Task/Apply-a-digital-filter-direct-form-II-transposed-/M2000-Interpreter/apply-a-digital-filter-direct-form-ii-transposed-.m2000 b/Task/Apply-a-digital-filter-direct-form-II-transposed-/M2000-Interpreter/apply-a-digital-filter-direct-form-ii-transposed-.m2000
new file mode 100644
index 0000000000..7cc823c84a
--- /dev/null
+++ b/Task/Apply-a-digital-filter-direct-form-II-transposed-/M2000-Interpreter/apply-a-digital-filter-direct-form-ii-transposed-.m2000
@@ -0,0 +1,49 @@
+module Checkit {
+ locale 1033 ' use of dot for decimals
+ window 12, window ' set 12pt for current display monitor
+ form 60 ' 60 chars width, any for heigh
+ Print $("0.00000000",12) ' 12 chars per tab
+ ' all data push to end of stack, so we use the stack of values as FIFO
+ Flush
+ ' a()
+ Data 1, -2.77555756e-16, 3.33333333e-01, -1.85037171e-17
+ ' b()
+ Data 0.16666667, 0.5, 0.5, 0.16666667
+ ' signal()
+ Data -0.917843918645, 0.141984778794, 1.20536903482, 0.190286794412
+ Data -0.662370894973, -1.00700480494, -0.404707073677, 0.800482325044
+ Data 0.743500089861, 1.01090520172, 0.741527555207, 0.277841675195
+ Data 0.400833448236, -0.2085993586, -0.172842103641, -0.134316096293
+ Data 0.0259303398477, 0.490105989562, 0.549391221511, 0.9047198589
+ Dim Base 0, a(4) as Double , b(4) as Double , signal(20) as Double
+ Integer i
+ For i = 0 To 3 : Read a(i) : Next i
+ For i = 0 To 3 : Read b(i) : Next i
+ For i = 0 To 19 : Read signal(i) : Next i
+ dim resp()
+ resp()=@Filter_a_b(&signal())
+ k=each(resp())
+ while k
+ Print array(k),
+ if pos>0 then if (k^+1) mod 5=0 then Print
+ end while
+ Function Filter_a_b(&c())
+ Local Integer j, k
+ Local Double tmp
+ Local result(0 to len(c())-1) as Double
+ For j = 0 To Len(c())-1
+ tmp = 0
+ For k = 0 To Len(b())-1
+ If (j-k < 0) Then Continue For
+ tmp += b(k) * c(j-k)
+ Next k
+ For k = 0 To Len(a())-1
+ If (j-k < 0) Then Continue For
+ tmp -= a(k) * result(j-k)
+ Next k
+ result(j) = tmp/a(0)
+ Next j
+ =result()
+ End Function
+}
+Checkit
diff --git a/Task/Approximate-equality/Ballerina/approximate-equality.ballerina b/Task/Approximate-equality/Ballerina/approximate-equality.ballerina
new file mode 100644
index 0000000000..83ba4b25e0
--- /dev/null
+++ b/Task/Approximate-equality/Ballerina/approximate-equality.ballerina
@@ -0,0 +1,22 @@
+import ballerina/io;
+
+public function main() {
+ float[][] pairs = [
+ [100000000000000.01, 100000000000000.011],
+ [100.01, 100.011],
+ [10000000000000.001 / 10000.0, 1000000000.0000001000],
+ [0.001, 0.0010000001],
+ [0.000000000000000000000101, 0.0],
+ [2.0.sqrt() * 2.0.sqrt(), 2.0],
+ [-2.0.sqrt() * 2.0.sqrt(), -2.0],
+ [3.14159265358979323846, 3.14159265358979324]
+ ];
+ io:println("Approximate equality of test cases with a tolerance of 1 bit:");
+ int i = 0;
+ foreach float[] pair in pairs {
+ i += 1;
+ int bi0 = pair[0].toBitsInt();
+ int bi1 = pair[1].toBitsInt();
+ io:println(` ${i} -> ${(bi0 - bi1).abs() <= 1}`);
+ }
+}
diff --git a/Task/Approximate-equality/EasyLang/approximate-equality.easy b/Task/Approximate-equality/EasyLang/approximate-equality.easy
index 910f89b4d4..5384fbce38 100644
--- a/Task/Approximate-equality/EasyLang/approximate-equality.easy
+++ b/Task/Approximate-equality/EasyLang/approximate-equality.easy
@@ -1,7 +1,7 @@
func aeq a b .
return if abs (a - b) <= abs a * 1e-14
.
-proc test a b . .
+proc test a b .
write a & " " & b & " -> "
if aeq a b = 1
print "true"
@@ -9,7 +9,7 @@ proc test a b . .
print "false"
.
.
-numfmt 10 0
+numfmt 0 10
test 100000000000000.01 100000000000000.011
test 100.01 100.011
test 10000000000000.001 / 10000 1000000000.0000001
diff --git a/Task/Archimedean-spiral/EasyLang/archimedean-spiral.easy b/Task/Archimedean-spiral/EasyLang/archimedean-spiral.easy
index 6f648c90fb..4fc2177a04 100644
--- a/Task/Archimedean-spiral/EasyLang/archimedean-spiral.easy
+++ b/Task/Archimedean-spiral/EasyLang/archimedean-spiral.easy
@@ -1,8 +1,12 @@
-linewidth 0.4
-x = 50
-y = 50
+glinewidth 0.4
+x0 = 50
+y0 = 50
while r < 50
- line r * cos t + x r * sin t + y
+ xp = x
+ yp = y
+ x = r * cos t + x0
+ y = r * sin t + y0
+ if r > 0 : gline xp yp x y
r += 0.05
t += 3
.
diff --git a/Task/Arithmetic-Complex/ALGOL-68/arithmetic-complex.alg b/Task/Arithmetic-Complex/ALGOL-68/arithmetic-complex.alg
index 0e4466402d..d1c920b389 100644
--- a/Task/Arithmetic-Complex/ALGOL-68/arithmetic-complex.alg
+++ b/Task/Arithmetic-Complex/ALGOL-68/arithmetic-complex.alg
@@ -1,27 +1,29 @@
-main:(
- FORMAT compl fmt = $g(-7,5)"⊥"g(-7,5)$;
+BEGIN
PROC compl operations = VOID: (
- LONG COMPL a = 1.0 ⊥ 1.0;
- LONG COMPL b = 3.14159 ⊥ 1.2;
+ COMPL a = 1.0 I 1.0;
+ COMPL b = 3.14159 I 1.2;
- LONG COMPL c;
+ COMPL c;
- printf(($x"a="f(compl fmt)l$,a));
- printf(($x"b="f(compl fmt)l$,b));
+ PROC show compl = ( STRING legend, COMPL v )VOID:
+ print( ( legend, fixed( re OF v, -8, 5 ), " I ", fixed( im OF v, -8, 5 ), newline ) );
+
+ show compl(" a=",a);
+ show compl(" b=",b);
# addition #
c := a + b;
- printf(($x"a+b="f(compl fmt)l$,c));
+ show compl("a+b=",c);
# multiplication #
c := a * b;
- printf(($x"a*b="f(compl fmt)l$,c));
+ show compl("a*b=",c);
# inversion #
c := 1.0 / a;
- printf(($x"1/c="f(compl fmt)l$,c));
+ show compl("1/c=",c);
# negation #
c := -a;
- printf(($x"-a="f(compl fmt)l$,c))
+ show compl(" -a=",c)
);
compl operations
-)
+END
diff --git a/Task/Arithmetic-Complex/Ballerina/arithmetic-complex.ballerina b/Task/Arithmetic-Complex/Ballerina/arithmetic-complex.ballerina
new file mode 100644
index 0000000000..a17cb192ef
--- /dev/null
+++ b/Task/Arithmetic-Complex/Ballerina/arithmetic-complex.ballerina
@@ -0,0 +1,67 @@
+import ballerina/io;
+
+class Complex {
+ float re;
+ float im;
+
+ function init(float re, float im) {
+ self.re = re;
+ self.im = im;
+ }
+
+ function neg() returns Complex {
+ return new Complex(-self.re, -self.im);
+ }
+
+ function inv() returns Complex {
+ float denom = self.re * self.re + self.im * self.im;
+ return new Complex(self.re / denom, -self.im / denom);
+ }
+
+ function add(Complex other) returns Complex {
+ return new Complex(self.re + other.re, self.im + other.im);
+ }
+
+ function sub(Complex other) returns Complex {
+ return self.add(other.neg());
+ }
+
+ function mul(Complex other) returns Complex {
+ return new Complex(
+ self.re * other.re - self.im * other.im,
+ self.re * other.im + self.im * other.re
+ );
+ }
+
+ function div(Complex other) returns Complex {
+ return self.mul(other.inv());
+ }
+
+ function conj() returns Complex {
+ return new Complex(self.re, -self.im);
+ }
+
+ function toString() returns string {
+ if self.re === -0.0 { self.re = 0.0; }
+ if self.im === -0.0 { self.im = 0.0; }
+ if self.im >= 0.0 {
+ return string `${self.re} + ${self.im}i`;
+ } else {
+ return string `${self.re} - ${-self.im}i`;
+ }
+ }
+}
+
+public function main() {
+ var x = new Complex(1, 3);
+ var y = new Complex(5, 2);
+ io:println("x = ", x);
+ io:println("y = ", y);
+ io:println("x + y = ", x.add(y));
+ io:println("x - y = ", x.sub(y));
+ io:println("x * y = ", x.mul(y));
+ io:println("x / y = ", x.div(y));
+ io:println("-x = ", x.neg());
+ io:println("1 / x = ", x.inv());
+ io:println("x* = ", x.conj());
+}
diff --git a/Task/Arithmetic-Complex/Crystal/arithmetic-complex.cr b/Task/Arithmetic-Complex/Crystal/arithmetic-complex.cr
new file mode 100644
index 0000000000..bb024b95a6
--- /dev/null
+++ b/Task/Arithmetic-Complex/Crystal/arithmetic-complex.cr
@@ -0,0 +1,15 @@
+require "complex"
+
+a = Complex.new(1, 2)
+b = 3 + 4.i
+
+puts "a = #{a}, b = #{b}"
+puts
+puts "a + b = #{a + b}"
+puts "a - b = #{a - b}"
+puts "a * b = #{a * b}"
+puts "a / b = #{a / b}"
+puts
+puts "-a = #{-a}"
+puts "1/a = #{a.inv}"
+puts "ā = #{a.conj}"
diff --git a/Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex.m2000 b/Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex-1.m2000
similarity index 100%
rename from Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex.m2000
rename to Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex-1.m2000
diff --git a/Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex-2.m2000 b/Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex-2.m2000
new file mode 100644
index 0000000000..2b527fe51b
--- /dev/null
+++ b/Task/Arithmetic-Complex/M2000-Interpreter/arithmetic-complex-2.m2000
@@ -0,0 +1,35 @@
+module tstComplex {
+ // Var one as complex=(1,0i), A as complex=(8, -3i)
+ one=(1,0i)
+ A=(8, -3i)
+ Print "A=";A
+ Print " r=";Abs(A);" θ=";Arg(A);" rad"
+ B=one/A
+ Print "B=";B
+ Print " r=";Abs(B);" θ=";Arg(B);" rad"
+ Print A;"*";B;"=";A*B
+ Print one;"/";B;"=";one/B
+ Print A;"/";A;"=";A/A
+ Print A;"+";A;"=";A+A
+ Print A;"-";A;"=";A-A
+ Print "-"+A+"=";-A
+ Print "(round exp to 13th decimal)"
+ I=round(exp((0, pi i)),13)+1
+ Print "e^(πi)+1=";i
+ Print "(without rounding)"
+ I=exp((0, pi i))+1
+ Print "e^(πi)+1=";i
+ Print type$(i) = "Complex"
+ Dim a(10) as Complex=(1,0i)
+ Print (a(3)+a(3))^2=(4, 0i)
+ Print (a(3)+a(3))^2=4
+
+ Print cos(a)
+ Print sin(a)
+ Print atn(tan(a))
+ Print tan(atn(a))
+ Print Polar(abs(a), arg(a))=(8, -3i)
+ Print str$(a ,"0.00")
+ Print str$((8,-3i) ,"0.00")
+}
+ tstComplex
diff --git a/Task/Arithmetic-Complex/REXX/arithmetic-complex.rexx b/Task/Arithmetic-Complex/REXX/arithmetic-complex.rexx
index fd21689cfc..7c72a01f37 100644
--- a/Task/Arithmetic-Complex/REXX/arithmetic-complex.rexx
+++ b/Task/Arithmetic-Complex/REXX/arithmetic-complex.rexx
@@ -1,38 +1,53 @@
+-- 19 May 2025
include Settings
-say version; say 'Arithmetic numbers'; say
-numeric digits 9
-divi. = 0; a = 0; c = 0
-do i = 1
-/* Is the number arithmetic? */
- if Arithmetic(i) then do
- a = a+1
-/* Is the number composite? */
- if divi.0 > 2 then
- c = c+1
-/* Output control */
- if a <= 100 then do
- if a = 1 then
- say 'First 100 arithmetic numbers are'
- call Charout ,Right(i,4)
- if a//10 = 0 then
- say
- if a = 100 then
- say
- end
- if a = 100 | a = 1000 | a = 10000 | a = 100000 | a = 1000000 then do
- say 'The' a'th arithmetic number is' i
- say 'Of the first' a 'numbers' c 'are composite'
- say
- end
-/* Max 1m, higher takes too long */
- if a = 1000000 then
- leave
- end
-end
-say Format(Time('e'),,3) 'seconds'
+say 'COMPLEX ARITHMETIC'
+say version
+say
+a = '1 2'; b = '3 4'; c = '5 6'; d = '7 8'; i = I()
+say 'VALUES'
+say 'a =' crec2form(a)
+say 'b =' crec2form(b)
+say 'c =' crec2form(c)
+say 'd =' crec2form(d)
+say
+say 'BASICS'
+say 'i*i =' crec2form(Csquare(i()))
+say 'a+b =' crec2form(Cadd(a,b))
+say 'a-b =' crec2form(Csub(a,b))
+say 'a*b =' crec2form(Cmul(a,b))
+say 'a/b =' crec2form(Cdiv(a,b))
+say 'a^2 =' crec2form(Csquare(a,2))
+say 'a^5 =' crec2form(Cpow(a,5))
+say '-a =' crec2form(Cneg(a))
+say '1/a =' crec2form(Cinv(a))
+say 'a+b+c+d =' crec2form(Cadd(a,b,c,d))
+say 'a-b-c-d =' crec2form(Csub(a,b,c,d))
+say 'a*b*c*d =' crec2form(Cmul(a,b,c,d))
+say 'a/b/c/d =' crec2form(Cnormal(Cdiv(a,b,c,d)))
+say
+say 'FORMULA'
+say 'a^2-2ab+3c-4ad^4+5 =' ,
+crec2form(Cadd(Csquare(a),Cmul(-2,a,b),Cmul(3,c),Cmul(-4,a,Cpower(d,4)),5))
+say
+say 'BONUS'
+say 'Argument(a) =' Carg(a)+0
+say 'Conjugate(a) =' crec2form(Cconj(a))
+say 'Imag(a) =' Cim(a)
+say 'Modulus(a) =' Cmod(a)+0
+say 'Polar(a) =' Cpol2form(Cnormal(Crec2pol(a)))
+say 'Real(a) =' Cre(a)
+say
+say 'MORE'
+say 'Arcsin(a) =' crec2form(Cnormal(Carcsin(a)))
+say 'Exp(a) =' crec2form(Cnormal(Cexp(a)))
+say 'Ln(a) =' crec2form(Cnormal(Cln(a)))
+say 'Sin(a) =' crec2form(Cnormal(Csin(a)))
+say 'Sqrt(a) =' crec2form(Cnormal(Csqrt(a)))
+say 'i^i =' crec2form(Cnormal(Cpower(i,i)))
exit
-include Numbers
+include Complex
include Functions
+include Constants
include Abend
diff --git a/Task/Arithmetic-Integer/Ballerina/arithmetic-integer.ballerina b/Task/Arithmetic-Integer/Ballerina/arithmetic-integer.ballerina
new file mode 100644
index 0000000000..0ab61725c4
--- /dev/null
+++ b/Task/Arithmetic-Integer/Ballerina/arithmetic-integer.ballerina
@@ -0,0 +1,24 @@
+import ballerina/io;
+
+function divmod(int a, int b) returns [int, int] {
+ return [a / b, a % b];
+}
+
+function pow(int n, int e) returns int {
+ if e < 1 { return 1; }
+ int prod = 1;
+ foreach int i in 1...e { prod *= n; }
+ return prod;
+}
+
+public function main() returns error? {
+ int a = check int:fromString(io:readln("first number: "));
+ int b = check int:fromString(io:readln("second number: "));
+ io:println("sum: ", a + b);
+ io:println("difference: ", a - b);
+ io:println("product: ", a * b);
+ io:println("integer quotient: ", a / b); // rounds towards zero
+ io:println("remainder: ", a % b); // sign matches sign of first operand
+ io:println("exponentiation: ", pow(a, b));
+ io:println("divmod ", divmod(a, b));
+}
diff --git a/Task/Arithmetic-Integer/OPL/arithmetic-integer.opl b/Task/Arithmetic-Integer/OPL/arithmetic-integer.opl
new file mode 100644
index 0000000000..57f4ee3106
--- /dev/null
+++ b/Task/Arithmetic-Integer/OPL/arithmetic-integer.opl
@@ -0,0 +1,14 @@
+PROC main:
+ LOCAL a%,b%
+ PRINT "Please enter a number:",
+ INPUT a%
+ PRINT "Please enter another number:",
+ INPUT b%
+ PRINT a%;"+";b%;"=";a%+b%
+ PRINT a%;"-";b%;"=";a%-b%
+ PRINT a%;"×";b%;"=";a%*b%
+ PRINT a%;"÷";b%;"=";a%/b%
+ PRINT a%;"%";b%;"=";a%-a%/b%*b%
+ PRINT a%;"^";b%;"=";a%**b%
+ GET
+ENDP
diff --git a/Task/Arithmetic-Integer/Wren/arithmetic-integer.wren b/Task/Arithmetic-Integer/Wren/arithmetic-integer.wren
index df5b65f478..5e19a436e2 100644
--- a/Task/Arithmetic-Integer/Wren/arithmetic-integer.wren
+++ b/Task/Arithmetic-Integer/Wren/arithmetic-integer.wren
@@ -1,13 +1,13 @@
-import "io" for Stdin, Stdout
-System.write("first number: ")
-Stdout.flush()
-var a = Num.fromString(Stdin.readLine())
-System.write("second number: ")
-Stdout.flush()
-var b = Num.fromString(Stdin.readLine())
+import "./ioutil" for Input, Stdin
+
+var divmod = Fn.new { |a, b| [(a / b).floor, a % b] }
+
+var a = Input.integer("first number: ")
+var b = Input.integer("second number: ")
System.print("sum: %(a + b)")
System.print("difference: %(a - b)")
System.print("product: %(a * b)")
System.print("integer quotient: %((a / b).floor)")
System.print("remainder: %(a % b)")
System.print("exponentiation: %(a.pow(b))")
+System.print("divmod: %(divmod.call(a, b))")
diff --git a/Task/Arithmetic-Rational/Ballerina/arithmetic-rational.ballerina b/Task/Arithmetic-Rational/Ballerina/arithmetic-rational.ballerina
new file mode 100644
index 0000000000..7c6dc57fb6
--- /dev/null
+++ b/Task/Arithmetic-Rational/Ballerina/arithmetic-rational.ballerina
@@ -0,0 +1,156 @@
+import ballerina/io;
+
+function gcd(int num, int den) returns int {
+ int n = num; // make mutable
+ int d = den; // ditto
+ while d != 0 {
+ int t = d;
+ d = n % d;
+ n = t;
+ }
+ return n;
+}
+
+class Frac {
+ int num;
+ int den;
+
+ function init(int num, int den) {
+ int n = num; // make mutable
+ int d = den; // ditto
+ if n == 0 {
+ d = 1;
+ } else if d < 0 {
+ n = -n;
+ d = -d;
+ }
+ int g = gcd(n, d).abs();
+ if g > 1 {
+ n /= g;
+ d /= g;
+ }
+ self.num = n;
+ self.den = d;
+ }
+
+ function fromInt(int i) returns Frac {
+ return new Frac(i, 1);
+ }
+
+ function neg() returns Frac {
+ return new Frac(-self.num, self.den);
+ }
+
+ function inv() returns Frac {
+ return new Frac(self.den, self.num);
+ }
+
+ function copy() returns Frac {
+ return new Frac(self.num, self.den);
+ }
+
+ function abs() returns Frac {
+ if self.num >= 0 { return self.copy(); }
+ return self.neg();
+ }
+
+ function add(Frac other) returns Frac {
+ return new Frac(self.num * other.den + self.den * other.num, self.den * other.den);
+ }
+
+ function sub(Frac other) returns Frac {
+ return self.add(other.neg());
+ }
+
+ function mul(Frac other) returns Frac {
+ return new Frac(self.num * other.num, self.den * other.den);
+ }
+
+ function div(Frac other) returns Frac {
+ return new Frac(self.num * other.den, self.den * other.num);
+ }
+
+ function toFloat() returns float {
+ return self.num / self.den;
+ }
+
+ function toInt() returns int {
+ float f = self.toFloat();
+ f = f >= 0.0 ? f.floor() : f.ceiling();
+ return f;
+ }
+
+ function idiv(Frac other) returns Frac {
+ return new Frac(self.toInt(), 1);
+ }
+
+ function mod(Frac other) returns Frac {
+ return self.sub(self.idiv(other).mul(other));
+ }
+
+ function lt(Frac other) returns boolean {
+ return self.toFloat() < other.toFloat();
+ }
+
+ function le(Frac other) returns boolean {
+ return self.toFloat() <= other.toFloat();
+ }
+
+ function gt(Frac other) returns boolean {
+ return self.toFloat() > other.toFloat();
+ }
+
+ function ge(Frac other) returns boolean {
+ return self.toFloat() >= other.toFloat();
+ }
+
+ function eq(Frac other) returns boolean {
+ return self.toFloat() == other.toFloat();
+ }
+
+ function ne(Frac other) returns boolean {
+ return self.toFloat() != other.toFloat();
+ }
+
+ function toString() returns string {
+ return string `${self.num} / ${self.den}`;
+ }
+}
+
+function divisors(int n) returns int[] {
+ if n < 1 { return []; }
+ int[] divisors = [];
+ int[] divisors2 = [];
+ int i = 1;
+ int k = n % 2 == 0 ? 1 : 2;
+ while i * i <= n {
+ if n % i == 0 {
+ divisors.push(i);
+ int j = n / i;
+ if j != i { divisors2.push(j); }
+ }
+ i += k;
+ }
+ if divisors2.length() > 0 {
+ divisors.push(...divisors2.reverse());
+ }
+ return divisors;
+}
+
+function properDivisors(int n) returns int[] {
+ int[] d = divisors(n);
+ int c = d.length();
+ return c <= 1 ? [] : d.slice(0, c - 1);
+}
+
+public function main() {
+ final Frac one = new Frac(1, 1);
+ io:println("The following numbers (less than 2^19) are perfect:");
+ foreach int i in 2..<(1<<19) {
+ var sum = new Frac(1, i);
+ foreach int j in properDivisors(i).slice(1) {
+ sum = sum.add(new Frac(1, j));
+ }
+ if sum.eq(one) { io:println(" ", i); }
+ }
+}
diff --git a/Task/Arithmetic-Rational/REXX/arithmetic-rational.rexx b/Task/Arithmetic-Rational/REXX/arithmetic-rational.rexx
index 16e57b5dcc..a7f3438a50 100644
--- a/Task/Arithmetic-Rational/REXX/arithmetic-rational.rexx
+++ b/Task/Arithmetic-Rational/REXX/arithmetic-rational.rexx
@@ -1,6 +1,8 @@
include Settings
-say version; say 'Rational arithmetic'; say
+say 'RATIONAL ARITHMETIC - 2 Mar 2025'
+say version
+say
a = '1 2'; b = '-3 4'; c = '5 -6'; d = '-7 -8'; e = 3; f = 1.666666666
say 'VALUES'
say 'a =' Rlst2form(a)
diff --git a/Task/Arithmetic-derivative/00-TASK.txt b/Task/Arithmetic-derivative/00-TASK.txt
index 7e36aa263c..6335ba8b8f 100644
--- a/Task/Arithmetic-derivative/00-TASK.txt
+++ b/Task/Arithmetic-derivative/00-TASK.txt
@@ -4,21 +4,21 @@ factorization, by analogy with the product rule for the derivative of a function
used in mathematical analysis. Accordingly, for natural numbers n, the arithmetic
derivative D(n) is defined as follows:
-;*D(0) = D(1) = 0.
-;*D(p) = 1 for any prime p.
-;*D(mn) = D(m)n + mD(n) for any m,n ∈ N. (Leibniz rule for derivatives).
+;*.
+;*.
+;*. (Leibniz rule for derivatives).
-Additionally, for negative integers the arithmetic derivative may be defined as -D(-n) (n < 0).
+Additionally, for negative integers the arithmetic derivative may be defined as .
; Examples
-D(2) = 1 and D(3) = 1 (both are prime) so if mn = 2 * 3, D(6) = (1)(3) + (1)(2) = 5.
+ and (both are prime) so if , then .
-D(9) = D(3)(3) + D(3)(3) = 6
+
-D(27) = D(3)*9 + D(9)*3 = 9 + 18 = 27
+
-D(30) = D(5)(6) + D(6)(5) = 6 + 5 * 5 = 31.
+.
; Task
@@ -26,7 +26,7 @@ Find and show the arithmetic derivatives for -99 through 100.
; Stretch task
-Find (the arithmetic derivative of 10^m) then divided by 7, where m is from 1 to 20.
+Find (the arithmetic derivative of ) then divided by 7, where m is from 1 to 20.
; See also
diff --git a/Task/Arithmetic-derivative/Arturo/arithmetic-derivative.arturo b/Task/Arithmetic-derivative/Arturo/arithmetic-derivative.arturo
new file mode 100644
index 0000000000..38ff353852
--- /dev/null
+++ b/Task/Arithmetic-derivative/Arturo/arithmetic-derivative.arturo
@@ -0,0 +1,20 @@
+D: $[x][
+ when [
+ x < 0 -> neg D neg x
+ x = 0 -> 0
+ x = 1 -> 0
+ prime? x -> 1
+ any [
+ m: 2
+ while [0 <> x % m] -> inc 'm
+ n: x / m
+ (n * D m) + m * D n
+ ]
+ ]
+]
+
+(neg 99)..100 | map => D
+ | split.every:10
+ | loop => [loop & 'n -> prints pad to :string n 5 print ""]
+print ""
+loop 20 'n -> print ~"D(10^|n|)/7 = |div D 10^n 7|"
diff --git a/Task/Arithmetic-derivative/C-sharp/arithmetic-derivative.cs b/Task/Arithmetic-derivative/C-sharp/arithmetic-derivative.cs
new file mode 100644
index 0000000000..bdfc86296d
--- /dev/null
+++ b/Task/Arithmetic-derivative/C-sharp/arithmetic-derivative.cs
@@ -0,0 +1,30 @@
+using System.Numerics;
+
+static BigInteger Derivative(BigInteger k)
+{
+ if (k < 0) return -Derivative(-k);
+ if (k < 2) return 0;
+ if (k.IsEven) return 2 * Derivative(k / 2) + k / 2;
+ BigInteger m = 3;
+
+ while (m * m <= k && (k % m) != 0)
+ m += 2;
+
+ var n = k / m;
+ if (m * n != k || m == 1 || n == 1) return 1;
+ return n * Derivative(m) + m * Derivative(n);
+}
+
+for (var i = -99; i <= 100; i++)
+{
+ Console.Write($"{Derivative(i),6}");
+ if (i % 10 == 0) Console.WriteLine();
+}
+
+BigInteger p = 1;
+
+for (var n = 1; n <= 20; n++)
+{
+ p *= 10;
+ Console.WriteLine($"⅐ D(10^{n}) = {Derivative(p) / 7}");
+}
diff --git a/Task/Arithmetic-derivative/EasyLang/arithmetic-derivative.easy b/Task/Arithmetic-derivative/EasyLang/arithmetic-derivative.easy
index e7f21eef65..32e17c547e 100644
--- a/Task/Arithmetic-derivative/EasyLang/arithmetic-derivative.easy
+++ b/Task/Arithmetic-derivative/EasyLang/arithmetic-derivative.easy
@@ -1,18 +1,12 @@
func lagarias n .
- if n < 0
- return -lagarias -n
- .
- if n = 0 or n = 1
- return 0
- .
+ if n < 0 : return -lagarias -n
+ if n = 0 or n = 1 : return 0
f = 2
while n mod f <> 0
f += 1
.
q = n / f
- if q = 1
- return 1
- .
+ if q = 1 : return 1
return q * lagarias f + f * lagarias q
.
for n = -99 to 100
diff --git a/Task/Arithmetic-evaluation/EasyLang/arithmetic-evaluation.easy b/Task/Arithmetic-evaluation/EasyLang/arithmetic-evaluation.easy
index f8bbf4ec53..bf0629bde2 100644
--- a/Task/Arithmetic-evaluation/EasyLang/arithmetic-evaluation.easy
+++ b/Task/Arithmetic-evaluation/EasyLang/arithmetic-evaluation.easy
@@ -9,9 +9,7 @@ subr nch
.
#
subr ntok
- while ch$ = " "
- nch
- .
+ while ch$ = " " : nch
if ch >= 48 and ch <= 58
tok$ = "n"
s$ = ""
@@ -33,14 +31,14 @@ subr init0
astright[] = [ ]
err = 0
.
-proc init s$ . .
+proc init s$ .
inp$[] = strchars s$
inp_ind = 1
nch
ntok
init0
.
-proc ast_print nd . .
+proc ast_print nd .
write "AST:"
for i to len astop$[]
write " ( "
diff --git a/Task/Arithmetic-geometric-mean-Calculate-Pi/EasyLang/arithmetic-geometric-mean-calculate-pi.easy b/Task/Arithmetic-geometric-mean-Calculate-Pi/EasyLang/arithmetic-geometric-mean-calculate-pi.easy
index 0ebe1a31ba..3993aa60d6 100644
--- a/Task/Arithmetic-geometric-mean-Calculate-Pi/EasyLang/arithmetic-geometric-mean-calculate-pi.easy
+++ b/Task/Arithmetic-geometric-mean-Calculate-Pi/EasyLang/arithmetic-geometric-mean-calculate-pi.easy
@@ -11,5 +11,5 @@ while pn <= 5
pn *= 2
.
mypi = (an + bn) * (an + bn) / (tn * 4)
-numfmt 15 0
+numfmt 0 15
print mypi
diff --git a/Task/Arithmetic-geometric-mean/C++/arithmetic-geometric-mean.cpp b/Task/Arithmetic-geometric-mean/C++/arithmetic-geometric-mean.cpp
index e72ad24f16..71033b0d1f 100644
--- a/Task/Arithmetic-geometric-mean/C++/arithmetic-geometric-mean.cpp
+++ b/Task/Arithmetic-geometric-mean/C++/arithmetic-geometric-mean.cpp
@@ -1,28 +1,22 @@
-#include
-using namespace std;
-#define _cin ios_base::sync_with_stdio(0); cin.tie(0);
-#define rep(a, b) for(ll i =a;i<=b;++i)
+#include
+#include
-double agm(double a, double g) //ARITHMETIC GEOMETRIC MEAN
-{ double epsilon = 1.0E-16,a1,g1;
- if(a*g<0.0)
- { cout<<"Couldn't find arithmetic-geometric mean of these numbers\n";
- exit(1);
- }
- while(fabs(a-g)>epsilon)
- { a1 = (a+g)/2.0;
- g1 = sqrt(a*g);
- a = a1;
- g = g1;
- }
- return a;
+double agm(double a, double g, double tolerance = 1e-16) {
+ double an = a;
+ double gn = g;
+
+ an = (a + g) / 2.0;
+ gn = std::sqrt(a*g);
+ while (std::abs(an-gn) > tolerance) {
+ an = (an + gn) / 2.0;
+ gn = std::sqrt(an*gn);
+ }
+
+ return an;
}
-int main()
-{ _cin; //fast input-output
- double x, y;
- cout<<"Enter X and Y: "; //Enter two numbers
- cin>>x>>y;
- cout<<"\nThe Arithmetic-Geometric Mean of "<= Float64::EPSILON
+ a, g = (a + g) / 2, Math.sqrt(a * g)
+ end
+ g
+end
+
+p agm(1, 1 / Math.sqrt(2))
diff --git a/Task/Arithmetic-geometric-mean/EasyLang/arithmetic-geometric-mean.easy b/Task/Arithmetic-geometric-mean/EasyLang/arithmetic-geometric-mean.easy
index 5f7ce66faf..978c4034e4 100644
--- a/Task/Arithmetic-geometric-mean/EasyLang/arithmetic-geometric-mean.easy
+++ b/Task/Arithmetic-geometric-mean/EasyLang/arithmetic-geometric-mean.easy
@@ -7,5 +7,5 @@ func agm a g .
.
return a
.
-numfmt 16 0
+numfmt 0 16
print agm 1 sqrt 0.5
diff --git a/Task/Arithmetic-numbers/Ballerina/arithmetic-numbers.ballerina b/Task/Arithmetic-numbers/Ballerina/arithmetic-numbers.ballerina
new file mode 100644
index 0000000000..30f7f08c8e
--- /dev/null
+++ b/Task/Arithmetic-numbers/Ballerina/arithmetic-numbers.ballerina
@@ -0,0 +1,98 @@
+import ballerina/io;
+
+function divisors(int n) returns int[] {
+ if n < 1 { return []; }
+ int[] divisors = [];
+ int[] divisors2 = [];
+ int i = 1;
+ int k = n % 2 == 0 ? 1 : 2;
+ while i * i <= n {
+ if n % i == 0 {
+ divisors.push(i);
+ int j = n / i;
+ if j != i { divisors2.push(j); }
+ }
+ i += k;
+ }
+ if divisors2.length() > 0 {
+ divisors.push(...divisors2.reverse());
+ }
+ return divisors;
+}
+
+function findNearest(int[] a, int value) returns int {
+ int count = a.length();
+ int low = 0;
+ int high = count - 1;
+ while low <= high {
+ int mid = (low + high) / 2;
+ if a[mid] >= value {
+ high = mid - 1;
+ } else {
+ low = mid + 1;
+ }
+ }
+ return low < count ? low : count;
+}
+
+function commatize(int n) returns string {
+ string s = n.toString();
+ if n < 0 { s = s.substring(1); }
+ int le = s.length();
+ foreach int i in int:range(le - 3, 0, -3) {
+ s = s.substring(0, i) + "," + s.substring(i);
+ }
+ if n >= 0 { return s; }
+ return "-" + s;
+}
+
+function isPrime(int n) returns boolean {
+ if n < 2 { return false; }
+ if n % 2 == 0 { return n == 2; }
+ if n % 3 == 0 { return n == 3; }
+ int d = 5;
+ while d * d <= n {
+ if n % d == 0 { return false; }
+ d += 2;
+ if n % d == 0 { return false; }
+ d += 4;
+ }
+ return true;
+}
+
+public function main() {
+ int[] arithmetic = [1];
+ int[] primes = [];
+ final int lim = 1e6;
+ int n = 3;
+ while arithmetic.length() < lim {
+ int[] divs = divisors(n);
+ int len = divs.length();
+ if len == 2 {
+ primes.push(n);
+ arithmetic.push(n);
+ } else {
+ int sum = int:sum(...divs);
+ if sum % len == 0 { arithmetic.push(n); }
+ }
+ n += 1;
+ }
+ io:println("The first 100 arithmetic numbers are:");
+ foreach int i in 0...99 {
+ io:print(arithmetic[i].toString().padStart(4));
+ if (i + 1) % 10 == 0 { io:println(); }
+ }
+
+ foreach float f in [1e3, 1e4, 1e5, 1e6] {
+ int x = f;
+ int last = arithmetic[x - 1];
+ string xc = commatize(x);
+ string lastc = commatize(last);
+ io:println("\nThe ", xc, "th arithmetic number is: ", lastc);
+ int pcount = findNearest(primes, last) + 1;
+ if !isPrime(last) { pcount -= 1; }
+ int comp = x - pcount - 1; // 1 is not composite
+ string compc = commatize(comp);
+ io:println(`"The count of such numbers <= ${lastc} which are composite is ${compc}.`);
+ }
+}
diff --git a/Task/Arithmetic-numbers/EasyLang/arithmetic-numbers.easy b/Task/Arithmetic-numbers/EasyLang/arithmetic-numbers.easy
index cd8dc13f35..659573ce77 100644
--- a/Task/Arithmetic-numbers/EasyLang/arithmetic-numbers.easy
+++ b/Task/Arithmetic-numbers/EasyLang/arithmetic-numbers.easy
@@ -1,8 +1,5 @@
-print "The first 100 arithmetic numbers are:"
-numfmt 0 3
-n = 1
-while aricnt <= 1e5
- divi = 1 ; divcnt = 0 ; sum = 0
+proc arith n &ari &comp .
+ divi = 1
repeat
quot = n div divi
until quot < divi
@@ -17,20 +14,29 @@ while aricnt <= 1e5
.
divi += 1
.
- if sum mod divcnt = 0
- aricnt += 1
- if aricnt <= 100
- write n & " "
- if aricnt mod 10 = 0
- print ""
- .
- .
- if divcnt > 2
- compcnt += 1
- .
- if aricnt = 1e3 or aricnt = 1e4 or aricnt = 1e5
+ ari = if sum mod divcnt = 0
+ comp = if divcnt > 2
+.
+print "The first 100 arithmetic numbers are:"
+n = 1
+while cnt < 100
+ arith n ari comp
+ if ari = 1
+ write n & " "
+ cnt += 1
+ compcnt += comp
+ .
+ n += 1
+.
+print ""
+while cnt < 1e5
+ arith n ari comp
+ if ari = 1
+ cnt += 1
+ compcnt += comp
+ if cnt = 1e3 or cnt = 1e4 or cnt = 1e5
print ""
- print aricnt & "th arithmetic number: " & n
+ print cnt & "th arithmetic number: " & n
print "Composite arithmetic numbers: " & compcnt
.
.
diff --git a/Task/Arithmetic-numbers/REXX/arithmetic-numbers.rexx b/Task/Arithmetic-numbers/REXX/arithmetic-numbers.rexx
index fd21689cfc..72dfe03689 100644
--- a/Task/Arithmetic-numbers/REXX/arithmetic-numbers.rexx
+++ b/Task/Arithmetic-numbers/REXX/arithmetic-numbers.rexx
@@ -1,16 +1,16 @@
+-- 8 May 2025
include Settings
-say version; say 'Arithmetic numbers'; say
+say 'ARITHMETIC NUMBERS'
+say version
+say
numeric digits 9
-divi. = 0; a = 0; c = 0
-do i = 1
-/* Is the number arithmetic? */
+a = 0; c = 0
+do i = 1 to 1e6
if Arithmetic(i) then do
a = a+1
-/* Is the number composite? */
- if divi.0 > 2 then
+ if Composite(i) then
c = c+1
-/* Output control */
if a <= 100 then do
if a = 1 then
say 'First 100 arithmetic numbers are'
@@ -25,14 +25,12 @@ do i = 1
say 'Of the first' a 'numbers' c 'are composite'
say
end
-/* Max 1m, higher takes too long */
- if a = 1000000 then
- leave
end
end
say Format(Time('e'),,3) 'seconds'
-exit
+return
include Numbers
include Functions
+include Special
include Abend
diff --git a/Task/Arithmetic-numbers/TypeScript/arithmetic-numbers.ts b/Task/Arithmetic-numbers/TypeScript/arithmetic-numbers.ts
new file mode 100644
index 0000000000..617654bb18
--- /dev/null
+++ b/Task/Arithmetic-numbers/TypeScript/arithmetic-numbers.ts
@@ -0,0 +1,32 @@
+function divisors(n: number): number[] {
+ const divs = [1, n];
+ const sqr = Math.sqrt(n);
+ for (let d = 2; d <= sqr; d++) {
+ if (n % d == 0) {
+ divs.push(d);
+ if (d != sqr) divs.push(n / d);
+ }
+ } // We don't really need to sort them for this task but it's nice to make
+ return divs.toSorted(function(a, b) {return a - b}); // functions reusable
+}
+
+let count = 0;
+let val = 0;
+let composites = 0;
+const arithList: number[] =[];
+const printValues = [1000, 10000, 100000, 1000000];
+while (count < 10**6) {
+ val += 1;
+ const divList = divisors(val);
+ const average = divList.reduce((a, b) => a + b) / divList.length;
+ if (Number.isInteger(average)) {
+ count += 1;
+ if (divList.length > 2) composites++;
+ if (count <= 100) arithList.push(val);
+ if (count == 100) console.log(arithList);
+ if (printValues.includes(count)) {
+ console.log("The " + count + "th arithmetic number is " + val);
+ console.log(composites + " of the first " + count + " are composite\n");
+ }
+ }
+}
diff --git a/Task/Array-concatenation/Ballerina/array-concatenation.ballerina b/Task/Array-concatenation/Ballerina/array-concatenation.ballerina
new file mode 100644
index 0000000000..3b036efa33
--- /dev/null
+++ b/Task/Array-concatenation/Ballerina/array-concatenation.ballerina
@@ -0,0 +1,7 @@
+import ballerina/io;
+
+public function main() {
+ int[3] a = [1, 2, 3];
+ int[3] b = [4, 5, 6];
+ io:println([...a, ...b]);
+}
diff --git a/Task/Array-concatenation/EasyLang/array-concatenation.easy b/Task/Array-concatenation/EasyLang/array-concatenation.easy
index 80e53eb819..4776b79390 100644
--- a/Task/Array-concatenation/EasyLang/array-concatenation.easy
+++ b/Task/Array-concatenation/EasyLang/array-concatenation.easy
@@ -1,7 +1,5 @@
a[] = [ 1 2 3 ]
b[] = [ 4 5 6 ]
c[] = a[]
-for h in b[]
- c[] &= h
-.
+for h in b[] : c[] &= h
print c[]
diff --git a/Task/Array-concatenation/REXX/array-concatenation-1.rexx b/Task/Array-concatenation/REXX/array-concatenation-1.rexx
deleted file mode 100644
index fe578fd7ad..0000000000
--- a/Task/Array-concatenation/REXX/array-concatenation-1.rexx
+++ /dev/null
@@ -1,3 +0,0 @@
-a.1 = 10
-a.2 = 22.7
-a.7 = -12
diff --git a/Task/Array-concatenation/REXX/array-concatenation-2.rexx b/Task/Array-concatenation/REXX/array-concatenation-2.rexx
deleted file mode 100644
index c3441e86c0..0000000000
--- a/Task/Array-concatenation/REXX/array-concatenation-2.rexx
+++ /dev/null
@@ -1,9 +0,0 @@
-fact.0=8
-fact.1= 1
-fact.2= 2
-fact.3= 6
-fact.4= 24
-fact.5= 120
-fact.6= 720
-fact.7= 5040
-fact.8=40320
diff --git a/Task/Array-concatenation/REXX/array-concatenation-3.rexx b/Task/Array-concatenation/REXX/array-concatenation-3.rexx
deleted file mode 100644
index ebea33a02e..0000000000
--- a/Task/Array-concatenation/REXX/array-concatenation-3.rexx
+++ /dev/null
@@ -1,22 +0,0 @@
-/*REXX program to demonstrates how to perform array concatenation.*/
-
-p.= /*(below) a short list of primes.*/
-p.1=2; p.2=3; p.3=5; p.4=7; p.5=11; p.6=13
-p.7=17; p.8=19; p.9=23; p.10=27; p.11=31; p.12=37
-
-f.= /*(below) a list of Fibonacci #s.*/
-f.0=0;f.1=1;f.2=1;f.3=2;f.4=3;f.5=5;f.6=8;f.7=13;f.8=21;f.9=34;f.10=55
-
- do j=1 while p.j\==''
- c.j=p.j /*assign C array with some primes*/
- end /*j*/
-n=j-1
- do k=0 while f.k\==''; n=n+1
- c.n=f.k /*assign C array with fib numbers*/
- end /*k*/
-say 'elements=' n
-say
- do m=1 for n
- say 'c.'m"="c.m /*show a "merged" C array nums.*/
- end /*m*/
- /*stick a fork in it, we're done.*/
diff --git a/Task/Array-concatenation/REXX/array-concatenation.rexx b/Task/Array-concatenation/REXX/array-concatenation.rexx
new file mode 100644
index 0000000000..bed9e4bebc
--- /dev/null
+++ b/Task/Array-concatenation/REXX/array-concatenation.rexx
@@ -0,0 +1,21 @@
+-- 1 Jun 2025
+include Settings
+
+say 'ARRAY CONCATENATION'
+say version
+say
+say 'Two numbered arrays concatenated...'
+a.1=1; a.2=4; a.3=9
+b.1=16; b.2=25; b.3=36
+a.0=3; b.0=3
+j=a.0
+do i = 1 to 3
+ j=j+1; a.j=b.i
+end
+a.0=j
+do i = 1 to a.0
+ say i a.i
+end
+exit
+
+include Abend
diff --git a/Task/Array-length/Ballerina/array-length.ballerina b/Task/Array-length/Ballerina/array-length.ballerina
new file mode 100644
index 0000000000..527b36cba6
--- /dev/null
+++ b/Task/Array-length/Ballerina/array-length.ballerina
@@ -0,0 +1,6 @@
+import ballerina/io;
+
+public function main() {
+ string[2] fruits = ["apple", "orange"];
+ io:println(fruits.length());
+}
diff --git a/Task/Array-length/Uxntal/array-length.uxnatl b/Task/Array-length/Uxntal/array-length.uxnatl
new file mode 100644
index 0000000000..8eea52095c
--- /dev/null
+++ b/Task/Array-length/Uxntal/array-length.uxnatl
@@ -0,0 +1,18 @@
+%\0 { 00 }
+%DBG { [ LIT2 01 -System/debug ] DEO }
+
+|0e @System/debug
+
+|100
+
+;array len-arr DBG
+
+BRK
+
+@len-arr ( {array}* -- length* )
+ LDA2k SWP2 INC2 INC2 SUB2 #01 SFT2
+ JMP2r
+
+@array ={ =apple =orange }
+@apple "apple \0
+@orange "orange \0
diff --git a/Task/Arrays/Ballerina/arrays.ballerina b/Task/Arrays/Ballerina/arrays.ballerina
new file mode 100644
index 0000000000..4ee9e82094
--- /dev/null
+++ b/Task/Arrays/Ballerina/arrays.ballerina
@@ -0,0 +1,15 @@
+import ballerina/io;
+
+public function main() {
+ // fixed length array
+ int[4] a = [1, 4, 9, 16];
+ // retrieve and print element at index 1 (zero indexing)
+ io:println(a[1]);
+
+ // dynamic array
+ int[] b = [];
+ // push an element into it
+ b.push(42);
+ // retrieve and print last element added
+ io:println(b[b.length() - 1]);
+}
diff --git a/Task/Arrays/EasyLang/arrays.easy b/Task/Arrays/EasyLang/arrays.easy
index a501a7a5e3..e336b8b6d3 100644
--- a/Task/Arrays/EasyLang/arrays.easy
+++ b/Task/Arrays/EasyLang/arrays.easy
@@ -1,8 +1,4 @@
len f[] 4
-for i = 1 to len f[]
- f[i] = i
-.
-f[] &= 5
-for i = 1 to len f[]
- print f[i]
-.
+for i = 1 to len f[] : f[i] = i
+f[] &= 55
+print f[]
diff --git a/Task/Arrays/Excel/arrays-1.excel b/Task/Arrays/Excel/arrays-1.excel
new file mode 100644
index 0000000000..c183eeacbf
--- /dev/null
+++ b/Task/Arrays/Excel/arrays-1.excel
@@ -0,0 +1,15 @@
+=LET(
+ ARRAY, LAMBDA(dim, [init], LET(
+ Y, LAMBDA(SELF, arr,
+ LAMBDA([a], [b],
+ IF(ISOMITTED(b),
+ INDEX(arr, a),
+ SELF(SELF, IF(SEQUENCE(ROWS(arr)) = a, b, arr))
+ )
+ )
+ ),
+ Y(Y, IF(SEQUENCE(dim), IF(ISOMITTED(init), "", init)))
+ )),
+ my_arr, ARRAY(5, 0),
+ ...
+ )
diff --git a/Task/Arrays/Excel/arrays-2.excel b/Task/Arrays/Excel/arrays-2.excel
new file mode 100644
index 0000000000..98da06bedd
--- /dev/null
+++ b/Task/Arrays/Excel/arrays-2.excel
@@ -0,0 +1 @@
+ new_arr, my_arr(1, "val1")(4, "val4")
diff --git a/Task/Arrays/Excel/arrays-3.excel b/Task/Arrays/Excel/arrays-3.excel
new file mode 100644
index 0000000000..19305e3c6e
--- /dev/null
+++ b/Task/Arrays/Excel/arrays-3.excel
@@ -0,0 +1,16 @@
+=LET(
+ ARRAY, LAMBDA(dim, [init], LET(
+ Y, LAMBDA(SELF, arr,
+ LAMBDA([a], [b],
+ IF(ISOMITTED(b),
+ INDEX(arr, a),
+ SELF(SELF, IF(SEQUENCE(ROWS(arr)) = a, b, arr))
+ )
+ )
+ ),
+ Y(Y, IF(SEQUENCE(dim), IF(ISOMITTED(init), "", init)))
+ )),
+ my_arr, ARRAY(5, 0),
+ new_arr, my_arr(1, "val1")(4, "val4"),
+ new_arr()
+ )
diff --git a/Task/Arrays/OPL/arrays.opl b/Task/Arrays/OPL/arrays.opl
new file mode 100644
index 0000000000..74a007f56c
--- /dev/null
+++ b/Task/Arrays/OPL/arrays.opl
@@ -0,0 +1,9 @@
+PROC main:
+ REM Declare an integer array of 10 elements and a string array of 10 elements, each up to 12 characters long.
+ LOCAL array1%(10),array2$(10,12)
+ REM Array element count starts at 1.
+ array1%(1)=128
+ array2$(10)="Rosetta Code"
+ PRINT array1%(1),array2$(10)
+ GET
+ENDP
diff --git a/Task/Arrays/REXX/arrays-1.rexx b/Task/Arrays/REXX/arrays-1.rexx
deleted file mode 100644
index d3a6e4d897..0000000000
--- a/Task/Arrays/REXX/arrays-1.rexx
+++ /dev/null
@@ -1,9 +0,0 @@
-/*REXX program demonstrates a simple array usage. */
-a.='not found' /*value for all a.xxx (so far).*/
- do j=1 to 100 /*start at 1, define 100 elements*/
- a.j=-j*1000 /*define as negative J thousand. */
- end /*j*/ /*the above defines 100 elements.*/
-
-say 'element 50 is:' a.50
-say 'element 3000 is:' a.3000
- /*stick a fork in it, we're done.*/
diff --git a/Task/Arrays/REXX/arrays-2.rexx b/Task/Arrays/REXX/arrays-2.rexx
deleted file mode 100644
index 83f0292649..0000000000
--- a/Task/Arrays/REXX/arrays-2.rexx
+++ /dev/null
@@ -1,11 +0,0 @@
-/*REXX program demonstrates array usage with mimicry. */
-a. = 'not found' /*value for all a.xxx (so far). */
- do j=1 to 100 /*start at 1, define 100 elements*/
- a.j = -j * 100 /*define element as -J hundred. */
- end /*j*/ /*the above defines 100 elements.*/
-
-say 'element 50 is:' a(50)
-say 'element 3000 is:' a(3000)
-exit /*stick a fork in it, we're done.*/
-/*──────────────────────────────────A subroutine────────────────────────*/
-a: _a_ = arg(1); return a._a_
diff --git a/Task/Arrays/REXX/arrays-3.rexx b/Task/Arrays/REXX/arrays-3.rexx
deleted file mode 100644
index cbcaccf54b..0000000000
--- a/Task/Arrays/REXX/arrays-3.rexx
+++ /dev/null
@@ -1,11 +0,0 @@
-/*REXX program demonstrates array usage with mimicry. */
-a. = 00 /*value for all a.xxx (so far). */
- do j=1 to 100 /*start at 1, define 100 elements*/
- a.j = -j * 100 /*define element as -J hundred. */
- end /*j*/ /*the above defines 100 elements.*/
-
-say 'element 50 is:' a(50)
-say 'element 3000 is:' a(3000)
-exit /*stick a fork in it, we're done.*/
-/*──────────────────────────────────A subroutine────────────────────────*/
-a: _a_ = arg(1); return a._a_
diff --git a/Task/Arrays/REXX/arrays-4.rexx b/Task/Arrays/REXX/arrays-4.rexx
deleted file mode 100644
index 6f976ce2ad..0000000000
--- a/Task/Arrays/REXX/arrays-4.rexx
+++ /dev/null
@@ -1,10 +0,0 @@
-/*REXX program demonstrates array usage (with elements out-of-range).*/
-array. = 'out of range' /*define ALL elements to this. */
-
- do j=-3000 to 3000 /*start at -3k, going up to +3k.*/
- array.j=j**2 /*define element as its square. */
- end /*j*/ /* [↑] defines 6,001 elements. */
-g=-7
-say g "squared is:" array.g
-say 7000 "squared is:" array.7000
- /*stick a fork in it, we're done.*/
diff --git a/Task/Arrays/REXX/arrays-5.rexx b/Task/Arrays/REXX/arrays-5.rexx
deleted file mode 100644
index 9daf6ca54b..0000000000
--- a/Task/Arrays/REXX/arrays-5.rexx
+++ /dev/null
@@ -1,17 +0,0 @@
-/*REXX program demonstrates disjointed array usage. */
-yr. = 'year not supported' /*value for all yr.xxx (so far).*/
-
- do k=600 to 1100 /*a bunch of years prior to 1800.*/
- yr.k=k "AD" /*Kth element as the year itself.*/
- end /*k*/ /* [↑] defines 501 elements.*/
-
- do j=1800 to 2100 /*start at 1800, define a bunch. */
- yr.j=j 'AD' /*Jth element as the year itself.*/
- end /*j*/ /* [↑] defines 301 elements.*/
-
-year=1946
-say 'DOB' year "is:" yr.year
-
-year=1744
-say 'DOB' year "is:" yr.year
- /*stick a fork in it, we're done.*/
diff --git a/Task/Arrays/REXX/arrays-6.rexx b/Task/Arrays/REXX/arrays-6.rexx
deleted file mode 100644
index 0d2e52addd..0000000000
--- a/Task/Arrays/REXX/arrays-6.rexx
+++ /dev/null
@@ -1,27 +0,0 @@
-/*REXX program demonstrates array usage: sparse and disjointed. */
- yyy = -55 /*REXX must use this mechanism···*/
-a.yyy = 1e9 /*··· when assigning neg indices.*/
-
-a.1 = 1000
-a.2 = 2000.0001
-a.7 = 7000
-a.2012 = 'out here in left field.'
-a.cat = 'civet, but not a true cat ─── belonging to the family Viverridae'
-a.civet = "A.K.A.: toddycats"
-/*┌────────────────────────────────────────────────────────────────────┐
- │ Array elements need not be continuous (nor even defined). They │
- │ can hold any manner of numbers, or strings (which can include any │
- │ characters, including null or '00'x characters). │
- │ │
- │ Array elements need not be numeric, as the above code demonstrates.│
- │ Indeed, the element "name" can be ANYTHING, even non-displayable │
- │ characters. To illustrate [↓]: │
- └────────────────────────────────────────────────────────────────────┘*/
-stuff=')g.u.t.s( or ½ of an intestine!'
-a.stuff=44
-/*┌────────────────────────────────────────────────────────────────────┐
- │ where the element name has special characters: blanks, and the │
- │ glyph of one-half (½), as well as the symbol used in REXX to │
- │ identify stemmed arrays (the period). │
- └────────────────────────────────────────────────────────────────────┘*/
- /*stick a fork in it, we're done.*/
diff --git a/Task/Arrays/REXX/arrays.rexx b/Task/Arrays/REXX/arrays.rexx
new file mode 100644
index 0000000000..74e20f3ddc
--- /dev/null
+++ b/Task/Arrays/REXX/arrays.rexx
@@ -0,0 +1,67 @@
+-- 1 Jun 2025
+include Settings
+
+say 'ARRAYS'
+say version
+say
+say 'A simple array...'
+do i = 1 to 100
+ a.i=i*i
+end
+say 'Square of' 5 'is' a.5
+say 'Square of' 55 'is' a.55
+say
+say 'Mimic indexing...'
+say 'Square of' 5 'is' a(5)
+say 'Square of' 55 'is' a(55)
+say
+say 'A default value...'
+b. = 'Out of range'
+do i = 1 to 100
+ b.i=1/i
+end
+say 'Inverse of' 5 'is' b.5
+say 'Inverse of' 55 'is' b.55
+say 'Inverse of' 555 'is' b.555
+say
+say 'An other index range...'
+do i = -100 to 100
+ c.i=i*i*i
+end
+j=-55; say 'Cube of' j 'is' c.j
+j=-5; say 'Cube of' j 'is' c.j
+j=5; say 'Cube of' j 'is' c.j
+j=55; say 'Cube of' j 'is' c.j
+say
+say 'A sparse array...'
+d.='Not calculated'
+do i = 2 by 2 to 100
+ d.i=-i
+end
+say 'Negative of' 55 'is' d.55
+say 'Negative of' 56 'is' d.56
+say
+say 'Special indices...'
+e.cat='civet'; say 'e.cat =' e.cat
+a1='dog'; e.a1='pitbull'
+a2=a1; say 'e.'a2 '=' e.a2
+a1='x.y.z'; e.a1='periods'
+a2=a1; say 'e.'a2 '=' e.a2
+a1='x y z'; e.a1='spaces'
+a2=a1; say 'e.'a2 '=' e.a2
+a1='└┴┬├─┼'; e.a1='specials'
+a2=a1; say 'e.'a2 '=' e.a2
+say
+say 'Element has no value...'
+signal off novalue
+say 'f.notassigned =' f.notassigned
+signal on novalue name Abend
+say 'f.notassigned =' f.notassigned
+exit
+
+A:
+procedure expose a.
+arg xx
+return a.xx
+
+include Abend
diff --git a/Task/Arrays/Tcl/arrays-1.tcl b/Task/Arrays/Tcl/arrays-1.tcl
index 9d450d0cad..2c767014ca 100644
--- a/Task/Arrays/Tcl/arrays-1.tcl
+++ b/Task/Arrays/Tcl/arrays-1.tcl
@@ -1,8 +1,11 @@
-set ary {}
+# empty list
+set arr {}
-lappend ary 1
-lappend ary 3
+# 10 integers
+set arr [list 1 2 3 4 5 6 7 8 9 10 ]
-lset ary 0 2
-puts [lindex $ary 0]
+lappend arr 11
+lappend arr 12
+
+puts stdout "$arr"
diff --git a/Task/Arrays/Tcl/arrays-2.tcl b/Task/Arrays/Tcl/arrays-2.tcl
index 89bc0d8cab..b899713d2a 100644
--- a/Task/Arrays/Tcl/arrays-2.tcl
+++ b/Task/Arrays/Tcl/arrays-2.tcl
@@ -1 +1,8 @@
-puts $ary; # Print the whole array
+set x [lindex $arr 4] ; # x <= 5
+
+foreach n $arr {
+ set idx [expr n -1]
+ lset arr $idx [expr $n * $n]
+}
+
+puts stdout "$arr"
diff --git a/Task/Arrays/Tcl/arrays-3.tcl b/Task/Arrays/Tcl/arrays-3.tcl
new file mode 100644
index 0000000000..0348b27759
--- /dev/null
+++ b/Task/Arrays/Tcl/arrays-3.tcl
@@ -0,0 +1,2 @@
+set slice [lrange $arr 5 10]
+puts stdout "$slice"
diff --git a/Task/Arrays/Tcl/arrays-4.tcl b/Task/Arrays/Tcl/arrays-4.tcl
new file mode 100644
index 0000000000..fb66cb8f7d
--- /dev/null
+++ b/Task/Arrays/Tcl/arrays-4.tcl
@@ -0,0 +1,2 @@
+puts stdout "arr has [llength $arr] items."
+puts stdout "slice has [llength $slice] items."
diff --git a/Task/Arrays/Tcl/arrays-5.tcl b/Task/Arrays/Tcl/arrays-5.tcl
new file mode 100644
index 0000000000..12cd8f0080
--- /dev/null
+++ b/Task/Arrays/Tcl/arrays-5.tcl
@@ -0,0 +1,4 @@
+set r [lreverse $arr]
+set s [lsort -integer $r]
+puts stdout $r
+puts stdout $s
diff --git a/Task/Arrays/Tcl/arrays-6.tcl b/Task/Arrays/Tcl/arrays-6.tcl
new file mode 100644
index 0000000000..57c697ab42
--- /dev/null
+++ b/Task/Arrays/Tcl/arrays-6.tcl
@@ -0,0 +1,10 @@
+set term "calico"
+set fd [open "cats.txt" "r"]
+set contents [read $fd]
+set lines [split $contents "\n"]
+
+foreach line $lines {
+ if { [lsearch $line $term] > 0 } {
+ puts "found $term in \"$line\""
+ }
+}
diff --git a/Task/Ascending-primes/Ballerina/ascending-primes.ballerina b/Task/Ascending-primes/Ballerina/ascending-primes.ballerina
new file mode 100644
index 0000000000..0134c472ca
--- /dev/null
+++ b/Task/Ascending-primes/Ballerina/ascending-primes.ballerina
@@ -0,0 +1,38 @@
+import ballerina/io;
+
+function isPrime(int n) returns boolean {
+ if n < 2 { return false; }
+ if n % 2 == 0 { return n == 2; }
+ if n % 3 == 0 { return n == 3; }
+ int d = 5;
+ while d * d <= n {
+ if n % d == 0 { return false; }
+ d += 2;
+ if n % d == 0 { return false; }
+ d += 4;
+ }
+ return true;
+}
+
+map ascPrimesSet = {}; // value will always be 1 to simulate a set
+
+function generate(int first, int cand, int digits) {
+ if digits == 0 {
+ if isPrime(cand) { ascPrimesSet[cand.toString()] = 1; }
+ return;
+ }
+ foreach int i in first...9 {
+ int next = cand * 10 + i;
+ generate(i + 1, next, digits - 1);
+ }
+}
+
+public function main() returns error? {
+ foreach int digits in 1...9 { generate(1, 0, digits); }
+ int[] ascPrimes = ascPrimesSet.keys().map(k => check int:fromString(k)).sort();
+ io:println("There are ", ascPrimes.length(), " ascending primes, namely:");
+ foreach int i in 0 ..< ascPrimes.length() {
+ io:print(ascPrimes[i].toString().padStart(8), " ");
+ if (i + 1) % 10 == 0 { io:println(); }
+ }
+}
diff --git a/Task/Ascending-primes/EasyLang/ascending-primes.easy b/Task/Ascending-primes/EasyLang/ascending-primes.easy
index 499d11769c..6f497f5811 100644
--- a/Task/Ascending-primes/EasyLang/ascending-primes.easy
+++ b/Task/Ascending-primes/EasyLang/ascending-primes.easy
@@ -1,25 +1,25 @@
-func isprim num .
- if num < 2
- return 0
+proc sort &d[] .
+ for i = 1 to len d[] - 1 : for j = i + 1 to len d[]
+ if d[j] < d[i] : swap d[j] d[i]
.
+.
+func isprim num .
+ if num < 2 : return 0
i = 2
while i <= sqrt num
- if num mod i = 0
- return 0
- .
+ if num mod i = 0 : return 0
i += 1
.
return 1
.
-proc nextasc n . .
- if isprim n = 1
- write n & " "
- .
- if n > 123456789
- return
- .
+p[] = [ ]
+proc nextasc n .
+ if isprim n = 1 : p[] &= n
+ if n > 123456789 : return
for d = n mod 10 + 1 to 9
nextasc n * 10 + d
.
.
nextasc 0
+sort p[]
+print p[]
diff --git a/Task/Ascending-primes/Rust/ascending-primes-1.rs b/Task/Ascending-primes/Rust/ascending-primes-1.rs
new file mode 100644
index 0000000000..1342be405e
--- /dev/null
+++ b/Task/Ascending-primes/Rust/ascending-primes-1.rs
@@ -0,0 +1,36 @@
+/// Call depth-first recursive function to generate increasing sizes of powerset integers whose
+/// digits are strictly increasing.
+///
+/// We then apply a primality test to each number (512 primality tests in total)
+fn powerset_from_recursion() -> Vec {
+ let ps = powerset(123456789);
+
+ ps.into_iter().filter(|n| is_prime(*n)).collect()
+}
+
+/// Depth-first powerset integers generated through passed-in digits in base-10
+///
+/// Each returning `powerset` doubles its size, incorporating a new digit through each pass
+///
+/// Ex: `rem = 3` and our `powerset = [0, 1, 2, 12]`
+///
+/// `3` is "pushed back" to each value
+///
+/// `[03, 13, 23, 123]`
+///
+/// Which is then appended to the back of the original `powerset`
+fn powerset(digits: u32) -> Vec {
+ let (rem, quo) = (digits % 10, digits / 10);
+
+ // Base case
+ if rem == 0 {
+ // Having 0 allows adding `rem` as single digit to `new`
+ return vec![0];
+ }
+
+ let mut powerset = powerset(quo);
+ let new = powerset.clone().into_iter().map(|n| n * 10 + rem);
+ powerset.extend(new);
+
+ powerset
+}
diff --git a/Task/Ascending-primes/Rust/ascending-primes-2.rs b/Task/Ascending-primes/Rust/ascending-primes-2.rs
new file mode 100644
index 0000000000..798985fc37
--- /dev/null
+++ b/Task/Ascending-primes/Rust/ascending-primes-2.rs
@@ -0,0 +1,30 @@
+/// Uses a queue to calculate and store the next integer sequences to generate.
+///
+/// The next sequence has the next power of 10 generated in lock-step from the front value
+///
+/// Ex: `[1, 2, 3, 4, 5, 6, 7, 8, 9]`
+///
+/// The front value `1` produces the next sequence
+///
+/// `[12, 13, 14, 15, 16, 17, 18, 19]`
+///
+/// Which is then appended to the back of the queue
+///
+/// Due to the nature of this algorithm, no sorting is required but iteration is implemented in a
+/// more procedural style
+fn powerset_from_queue() -> Vec {
+ let mut dq = std::collections::VecDeque::from_iter(1..=9);
+ let mut primes = Vec::new();
+
+ while let Some(n) = dq.pop_front() {
+ if is_prime_v(n) {
+ primes.push(n);
+ }
+
+ for rem in (n % 10 + 1)..=9 {
+ dq.push_back(n * 10 + rem);
+ }
+ }
+
+ primes
+}
diff --git a/Task/Ascending-primes/Rust/ascending-primes-3.rs b/Task/Ascending-primes/Rust/ascending-primes-3.rs
new file mode 100644
index 0000000000..e1a6b68a8b
--- /dev/null
+++ b/Task/Ascending-primes/Rust/ascending-primes-3.rs
@@ -0,0 +1,43 @@
+/// Primality test by trial division.
+///
+/// This algorithm avoids using hardware `div`s for 0-24 and from then on only checks with odd
+/// factors that aren't themselves divisible by 3 up until √n
+fn is_prime(n: u32) -> bool {
+ match n {
+ 0 | 1 => false,
+ _ if n % 2 == 0 => n == 2,
+ _ if n % 3 == 0 => n == 3,
+ _ => {
+ let mut factor = 5;
+ while factor * factor <= n {
+ if n % factor == 0 {
+ return false;
+ }
+ factor += 2;
+ if n % factor == 0 {
+ return false;
+ }
+ factor += 4;
+ }
+
+ true
+ }
+ }
+}
+
+fn main() {
+ let mut ps1 = powerset_from_recursion();
+ let ps2 = powerset_from_queue();
+
+ ps1.sort();
+
+ assert_eq!(ps1, ps2);
+
+ println!("There are {} ascending primes.", ps2.len());
+ for row in ps2.chunks(10) {
+ for col in row {
+ print!("{:>9} ", col);
+ }
+ println!();
+ }
+}
diff --git a/Task/Associative-array-Creation/Ballerina/associative-array-creation.ballerina b/Task/Associative-array-Creation/Ballerina/associative-array-creation.ballerina
new file mode 100644
index 0000000000..6561149822
--- /dev/null
+++ b/Task/Associative-array-Creation/Ballerina/associative-array-creation.ballerina
@@ -0,0 +1,22 @@
+import ballerina/io;
+
+public function main() {
+ map fruit = {}; // creates an empty map
+ fruit["1"] = "orange"; // associates a key of "1" with "orange"
+ fruit["2"] = "apple"; // associates a key of "2" with "apple"
+ io:println(fruit["1"]); // retrieves the value with a key of "1" and prints it out
+ _ = fruit.remove("1"); // removes the entry with a key of "1" from the map
+ io:println(fruit); // prints the rest of the map
+ io:println();
+ map capitals = { // creates a new map with three entries
+ "France": "Paris",
+ "Germany": "Berlin",
+ "Spain": "Madrid"
+ };
+ capitals["Russia"] = "Moscow"; // adds another entry
+ io:println(capitals["France"]); // retrieves the "France" entry and prints out its capital
+ _ = capitals.remove("France"); // removes the "France" entry
+ io:println(capitals); // prints all remaining entries
+ io:println(capitals.length()); // prints the number of remaining entries
+ io:println(capitals["Sweden"]); // prints the entry for Sweden (nothing as there isn't one)
+}
diff --git a/Task/Associative-array-Creation/EasyLang/associative-array-creation.easy b/Task/Associative-array-Creation/EasyLang/associative-array-creation.easy
index 5753f9d6ac..17858cd138 100644
--- a/Task/Associative-array-Creation/EasyLang/associative-array-creation.easy
+++ b/Task/Associative-array-Creation/EasyLang/associative-array-creation.easy
@@ -1,25 +1,22 @@
# use array of array for this
-proc hashGet ind$ . ar$[][] item$ .
- for i to len ar$[][]
- if ar$[i][1] = ind$
- item$ = ar$[i][2]
- return
- .
+func$ hget &arr$[][] ind$ .
+ for i to len arr$[][]
+ if arr$[i][1] = ind$ : return arr$[i][2]
.
- item$ = ""
+ return ""
.
-proc hashSet ind$ val$ . ar$[][] .
- for i to len ar$[][]
- if ar$[i][1] = ind$
- ar$[i][2] = val$
+proc hset &arr$[][] ind$ val$ .
+ for i to len arr$[][]
+ if arr$[i][1] = ind$
+ arr$[i][2] = val$
return
.
.
- ar$[][] &= [ ind$ val$ ]
+ arr$[][] &= [ ind$ val$ ]
.
clothing$[][] = [ [ "type" "t-shirt" ] [ "color" "red" ] ]
clothing$[][] &= [ "size" "xl" ]
#
-hashSet "color" "green" clothing$[][]
-hashGet "color" clothing$[][] col$
-print col$
+print hget clothing$[][] "color"
+hset clothing$[][] "color" "green"
+print hget clothing$[][] "color"
diff --git a/Task/Associative-array-Iteration/Ballerina/associative-array-iteration.ballerina b/Task/Associative-array-Iteration/Ballerina/associative-array-iteration.ballerina
new file mode 100644
index 0000000000..8281152635
--- /dev/null
+++ b/Task/Associative-array-Iteration/Ballerina/associative-array-iteration.ballerina
@@ -0,0 +1,22 @@
+import ballerina/io;
+
+public function main() {
+ // create a new map with four entries
+ map capitals = {
+ "France": "Paris",
+ "Germany": "Berlin",
+ "Russia": "Moscow",
+ "Spain": "Madrid"
+ };
+
+ // iterate through the map and print out the key/value pairs
+ foreach var e in capitals.entries() { io:println(e); }
+ io:println();
+
+ // iterate though the map and print out just the keys
+ foreach var k in capitals.keys() { io:println(k); }
+ io:println();
+
+ // iterate through the map and print out just the values
+ foreach var v in capitals { io:println(v); }
+}
diff --git a/Task/Associative-array-Merging/Ballerina/associative-array-merging.ballerina b/Task/Associative-array-Merging/Ballerina/associative-array-merging.ballerina
new file mode 100644
index 0000000000..5f836afb1f
--- /dev/null
+++ b/Task/Associative-array-Merging/Ballerina/associative-array-merging.ballerina
@@ -0,0 +1,15 @@
+import ballerina/io;
+
+function mergeMaps(map m1, map m2) returns map {
+ map m3 = {};
+ foreach string key in m1.keys() { m3[key] = m1.get(key); }
+ foreach string key in m2.keys() { m3[key] = m2.get(key); }
+ return m3;
+}
+
+public function main() {
+ map base = { "name": "Rocket Skates" , "price": 12.75, "color": "yellow" };
+ map update = { "price": 15.25, "color": "red", "year": 1974 };
+ map merged = mergeMaps(base, update);
+ io:println(re `,`.replaceAll(merged.toString(), ", "));
+}
diff --git a/Task/Associative-array-Merging/Common-Lisp/associative-array-merging-3.lisp b/Task/Associative-array-Merging/Common-Lisp/associative-array-merging-3.lisp
new file mode 100644
index 0000000000..f39c68a072
--- /dev/null
+++ b/Task/Associative-array-Merging/Common-Lisp/associative-array-merging-3.lisp
@@ -0,0 +1,28 @@
+(defun merge-hash-tables (hashtable &rest other-hashtables)
+ (let ((result (make-hash-table :test (hash-table-test hashtable))))
+ (dolist (ht (list* hashtable other-hashtables))
+ (maphash #'(lambda (k v) (setf (gethash k result) v)) ht))
+ result))
+
+;; aux functions
+(defun make-hash-table-from-alist (alist &key (test 'equal))
+ (let ((result (make-hash-table :test test)))
+ (loop for (k . v) in alist
+ do (setf (gethash k result) v))
+ result))
+(defun make-alist-from-hash-table (hashtable)
+ (let ((result ()))
+ (maphash #'(lambda (k v) (setf result (acons k v result))) hashtable)
+ (nreverse result)))
+
+;; solving the task
+(let ((base (make-hash-table-from-alist '(("name" . "Rocket Skates")
+ ("price" . 12.75)
+ ("color" . "yellow"))))
+ (update (make-hash-table-from-alist '(("price" . 15.25)
+ ("color" . "red")
+ ("year" . 1974)))))
+ (format t "base: ~a~%update: ~a~%merged: ~a~%"
+ (make-alist-from-hash-table base)
+ (make-alist-from-hash-table update)
+ (make-alist-from-hash-table (merge-hash-tables base update))))
diff --git a/Task/Associative-array-Merging/EasyLang/associative-array-merging.easy b/Task/Associative-array-Merging/EasyLang/associative-array-merging.easy
index 7c929e84fc..9f95724e21 100644
--- a/Task/Associative-array-Merging/EasyLang/associative-array-merging.easy
+++ b/Task/Associative-array-Merging/EasyLang/associative-array-merging.easy
@@ -1,6 +1,6 @@
base$[][] = [ [ "name" "Rocket Skates" ] [ "price" 12.75 ] [ "color" "yellow" ] ]
update$[][] = [ [ "price" 15.25 ] [ "color" "red" ] [ "year" 1974 ] ]
-proc update . a$[][] b$[][] .
+proc update &a$[][] &b$[][] .
for b to len b$[][]
for a to len a$[][]
if a$[a][1] = b$[b][1]
@@ -8,9 +8,7 @@ proc update . a$[][] b$[][] .
break 1
.
.
- if a > len a$[][]
- a$[][] &= b$[b][]
- .
+ if a > len a$[][] : a$[][] &= b$[b][]
.
.
update base$[][] update$[][]
diff --git a/Task/Associative-array-Merging/JavaScript/associative-array-merging.js b/Task/Associative-array-Merging/JavaScript/associative-array-merging.js
index 763232ea62..93ff25c9ef 100644
--- a/Task/Associative-array-Merging/JavaScript/associative-array-merging.js
+++ b/Task/Associative-array-Merging/JavaScript/associative-array-merging.js
@@ -1,18 +1,19 @@
-(() => {
- 'use strict';
+const base = {
+ "name": "Rocket Skates",
+ "price": 12.75,
+ "color": "yellow"
+};
- console.log(JSON.stringify(
- Object.assign({}, // Fresh dictionary.
- { // Base.
- "name": "Rocket Skates",
- "price": 12.75,
- "color": "yellow"
- }, { // Update.
- "price": 15.25,
- "color": "red",
- "year": 1974
- }
- ),
- null, 2
- ))
-})();
+const update = {
+ "price": 15.25,
+ "color": "red",
+ "year": 1974
+};
+
+// While ES6 destructuring may be cleaner, using Object.assign (provided in the original answer) instead is about 15-20% faster.
+// source: https://jsbench.me/jom7uh9o1t/1
+
+const final = Object.assign(base, update);
+// Using ES6 destructuring method: const final = { ...base, ...update };
+
+console.log(JSON.stringify(final, null, 4));
diff --git a/Task/Attractive-numbers/EasyLang/attractive-numbers.easy b/Task/Attractive-numbers/EasyLang/attractive-numbers.easy
index 6128796beb..b4f08ed64a 100644
--- a/Task/Attractive-numbers/EasyLang/attractive-numbers.easy
+++ b/Task/Attractive-numbers/EasyLang/attractive-numbers.easy
@@ -1,12 +1,8 @@
func isprim num .
- if num < 2
- return 0
- .
+ if num < 2 : return 0
i = 2
while i <= sqrt num
- if num mod i = 0
- return 0
- .
+ if num mod i = 0 : return 0
i += 1
.
return 1
@@ -26,7 +22,5 @@ func count n .
.
for i = 2 to 120
n = count i
- if isprim n = 1
- write i & " "
- .
+ if isprim n = 1 : write i & " "
.
diff --git a/Task/Attractive-numbers/OCaml/attractive-numbers.ml b/Task/Attractive-numbers/OCaml/attractive-numbers.ml
new file mode 100644
index 0000000000..ea8520abef
--- /dev/null
+++ b/Task/Attractive-numbers/OCaml/attractive-numbers.ml
@@ -0,0 +1,26 @@
+let is_prime (n : int) : bool =
+ if n = 2 then true else if n < 2 || n mod 2 = 0 then false else
+ let lim = (n |> float_of_int |> sqrt |> int_of_float) + 1 in
+ let rec loop = function
+ | i when i > lim -> true
+ | i when n mod i = 0 -> false
+ | i -> loop (i + 2)
+ in loop 3
+
+let prime_factors (n : int) : int list =
+ let rec loop = function
+ | factors, i, r when r = 1 -> factors
+ | factors, i, r when is_prime i && r mod i = 0
+ -> loop (i :: factors, i, r / i)
+ | factors, i, r -> loop (factors, i+1, r)
+ in loop ([], 2, n)
+
+let is_attractive (n : int) : bool =
+ n |> prime_factors |> List.length |> is_prime
+
+let () =
+ List.init 120 ((+) 1)
+ |> List.filter is_attractive
+ |> List.map string_of_int
+ |> String.concat ","
+ |> Printf.printf "[%s]"
diff --git a/Task/Attractive-numbers/PARI-GP/attractive-numbers-1.parigp b/Task/Attractive-numbers/PARI-GP/attractive-numbers-1.parigp
new file mode 100644
index 0000000000..73068e2021
--- /dev/null
+++ b/Task/Attractive-numbers/PARI-GP/attractive-numbers-1.parigp
@@ -0,0 +1 @@
+select(n->isprime(bigomega(n)), [1..120])
diff --git a/Task/Attractive-numbers/PARI-GP/attractive-numbers-2.parigp b/Task/Attractive-numbers/PARI-GP/attractive-numbers-2.parigp
new file mode 100644
index 0000000000..0a6b81ede0
--- /dev/null
+++ b/Task/Attractive-numbers/PARI-GP/attractive-numbers-2.parigp
@@ -0,0 +1 @@
+forfactored(n=1,120, if(isprime(bigomega(n)), print1(n[1]", ")))
diff --git a/Task/Average-loop-length/EasyLang/average-loop-length.easy b/Task/Average-loop-length/EasyLang/average-loop-length.easy
index 664aba7a05..a0d216ea9d 100644
--- a/Task/Average-loop-length/EasyLang/average-loop-length.easy
+++ b/Task/Average-loop-length/EasyLang/average-loop-length.easy
@@ -1,9 +1,7 @@
func average n reps .
for r to reps
f[] = [ ]
- for i to n
- f[] &= random n
- .
+ for i to n : f[] &= random n
seen[] = [ ]
len seen[] n
x = 1
@@ -30,8 +28,8 @@ for n to 20
avg = average n 1e6
ana = analytical n
err = (avg - ana) / ana * 100
- numfmt 0 2
+ numfmt 2 0
write n
- numfmt 4 9
+ numfmt 9 4
print avg & ana & err & "%"
.
diff --git a/Task/Average-loop-length/JavaScript/average-loop-length.js b/Task/Average-loop-length/JavaScript/average-loop-length.js
new file mode 100644
index 0000000000..68e1ae0b93
--- /dev/null
+++ b/Task/Average-loop-length/JavaScript/average-loop-length.js
@@ -0,0 +1,49 @@
+const MAX_N = 20
+const TIMES = 1000000
+
+function factorial(n) {
+ let prod = 1;
+ for (let i = n; i > 1; i--) {
+ prod *= i;
+ }
+ return prod;
+}
+
+function getRandomInt(min, max) {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+
+function analytical(n) {
+ let items = [];
+
+ for (let i = 1; i < n+1; i++) {
+ items.push(factorial(n) / Math.pow(n, i) / factorial(n - i));
+ }
+
+ return items.reduce((p, v) => p + v, 0);
+}
+
+function test(n, times) {
+ let count = 0;
+ for (let i = 0; i < times; i++) {
+ let x = 1, bits = 0;
+
+ while (!(bits & x)) {
+ count += 1;
+ bits |= x;
+ x = 1 << getRandomInt(0, n-1);
+ }
+ }
+ return count / times;
+}
+
+console.log(" n\tavg\texp.\tdiff\n-------------------------------");
+for(let n = 1; n < MAX_N+1; n++) {
+ const avg = test(n, TIMES);
+ const theory = analytical(n);
+ const diff = (avg / theory - 1) * 100;
+ console.log(`${n.toString().padStart(2)} ${avg.toFixed(4).padStart(8)} ${theory.toFixed(4).padStart(8)} ${diff.toFixed(3).padStart(6)}%`);
+}
diff --git a/Task/Averages-Arithmetic-mean/Ballerina/averages-arithmetic-mean.ballerina b/Task/Averages-Arithmetic-mean/Ballerina/averages-arithmetic-mean.ballerina
new file mode 100644
index 0000000000..cc6dc8d288
--- /dev/null
+++ b/Task/Averages-Arithmetic-mean/Ballerina/averages-arithmetic-mean.ballerina
@@ -0,0 +1,22 @@
+import ballerina/io;
+
+function average(decimal[] a) returns decimal {
+ decimal sum = 0;
+ if a.length() == 0 { return 0d; }
+ foreach decimal i in a { sum += i; }
+ return sum / a.length();
+}
+
+public function main() {
+ // fixed length array
+ decimal[6] a = [1, 2, 3, 4, 5, 6];
+ io:println(decimal:avg(...a));
+
+ // variable length array
+ decimal[] b = a;
+ io:println(average(b));
+
+ // empty variable length array
+ decimal[] c = [];
+ io:println(average(c));
+}
diff --git a/Task/Averages-Arithmetic-mean/EasyLang/averages-arithmetic-mean.easy b/Task/Averages-Arithmetic-mean/EasyLang/averages-arithmetic-mean.easy
index e14e43c02e..4e9bb83c20 100644
--- a/Task/Averages-Arithmetic-mean/EasyLang/averages-arithmetic-mean.easy
+++ b/Task/Averages-Arithmetic-mean/EasyLang/averages-arithmetic-mean.easy
@@ -1,9 +1,6 @@
-proc mean . f[] r .
- for i = 1 to len f[]
- s += f[i]
- .
- r = s / len f[]
+func mean &f[] .
+ for i = 1 to len f[] : s += f[i]
+ return s / len f[]
.
f[] = [ 1 2 3 4 5 6 7 8 ]
-mean f[] r
-print r
+print mean f[]
diff --git a/Task/Averages-Mean-angle/Ballerina/averages-mean-angle.ballerina b/Task/Averages-Mean-angle/Ballerina/averages-mean-angle.ballerina
new file mode 100644
index 0000000000..c654d6721f
--- /dev/null
+++ b/Task/Averages-Mean-angle/Ballerina/averages-mean-angle.ballerina
@@ -0,0 +1,27 @@
+import ballerina/io;
+
+function meanAngle(float[] angles) returns float {
+ int n = angles.length();
+ float sinSum = 0.0;
+ float cosSum = 0.0;
+ foreach float angle in angles {
+ float radians = angle * float:PI / 180.0;
+ sinSum += radians.sin();
+ cosSum += radians.cos();
+ }
+ return float:atan2(sinSum / n, cosSum / n) * 180.0 / float:PI;
+}
+
+public function main() {
+ var angles = [
+ [350.0, 10.0],
+ [90.0, 180.0, 270.0, 360.0],
+ [10.0, 20.0, 30.0]
+ ];
+ int i = 1;
+ foreach var a in angles {
+ string mean = meanAngle(a).round(1).toString().padStart(5);
+ io:println("Mean for angles ", i, " is : ", mean);
+ i += 1;
+ }
+}
diff --git a/Task/Averages-Mean-time-of-day/Ballerina/averages-mean-time-of-day.ballerina b/Task/Averages-Mean-time-of-day/Ballerina/averages-mean-time-of-day.ballerina
new file mode 100644
index 0000000000..382b905a35
--- /dev/null
+++ b/Task/Averages-Mean-time-of-day/Ballerina/averages-mean-time-of-day.ballerina
@@ -0,0 +1,42 @@
+import ballerina/io;
+
+function timeToDegs(string time) returns float|error {
+ var t = re `:`.split(time);
+ int h = check int:fromString(t[0]) * 3600;
+ int m = check int:fromString(t[1]) * 60;
+ int s = check int:fromString(t[2]);
+ return (h + m + s) / 240.0;
+}
+
+function padInt(int i, int len) returns string {
+ return i.toString().padZero(len);
+}
+
+function degsToTime(float degs) returns string {
+ float d = degs;
+ while d < 0.0 { d = d + 360.0; }
+ int s = (d * 240.00).round();
+ int h = s / 3600;
+ int m = s % 3600;
+ s = m % 60;
+ m /= 60;
+ return padInt(h, 2) + ":" + padInt(m, 2) + ":" + padInt(s, 2);
+}
+
+function meanAngle(float[] angles) returns float {
+ int n = angles.length();
+ float sinSum = 0.0;
+ float cosSum = 0.0;
+ foreach float angle in angles {
+ float radians = angle * float:PI / 180.0;
+ sinSum += radians.sin();
+ cosSum += radians.cos();
+ }
+ return float:atan2(sinSum / n, cosSum / n) * 180.0 / float:PI;
+}
+
+public function main() returns error? {
+ var times = ["23:00:17", "23:40:20", "00:12:45", "00:17:19"];
+ var angles = times.map(t => check timeToDegs(t));
+ io:println("Mean time of day is : ", degsToTime(meanAngle(angles)));
+}
diff --git a/Task/Averages-Median/Ballerina/averages-median.ballerina b/Task/Averages-Median/Ballerina/averages-median.ballerina
new file mode 100644
index 0000000000..7b24c1ffa5
--- /dev/null
+++ b/Task/Averages-Median/Ballerina/averages-median.ballerina
@@ -0,0 +1,20 @@
+import ballerina/io;
+
+function median(float[] floats) returns float {
+ var fs = floats.sort();
+ int len = fs.length();
+ if (len % 2 == 1) {
+ return fs[len / 2];
+ }
+ return (fs[len / 2 - 1] + fs[len / 2]) / 2.0;
+}
+
+public function main() {
+ float[][] lists = [
+ [5.0, 3.0, 4.0],
+ [3.0, 4.0, 1.0, -8.4, 7.2, 4.0, 1.0, 1.2]
+ ];
+ foreach var list in lists {
+ io:println(median(list));
+ }
+}
diff --git a/Task/Averages-Median/EasyLang/averages-median.easy b/Task/Averages-Median/EasyLang/averages-median.easy
index 51e508db90..63c7dcaa3b 100644
--- a/Task/Averages-Median/EasyLang/averages-median.easy
+++ b/Task/Averages-Median/EasyLang/averages-median.easy
@@ -1,5 +1,4 @@
-proc quickselect k . list[] res .
- #
+func quickselect &list[] k .
subr partition
mid = left
for i = left + 1 to right
@@ -22,19 +21,16 @@ proc quickselect k . list[] res .
left = right
.
.
- res = list[k]
+ return list[k]
.
-proc median . list[] res .
+func median &list[] .
h = len list[] div 2 + 1
- quickselect h list[] res
- if len list[] mod 2 = 0
- quickselect h - 1 list[] h
- res = (res + h) / 2
- .
+ r1 = quickselect list[] h
+ if len list[] mod 2 = 1 : return r1
+ r2 = quickselect list[] (h - 1)
+ return (r1 + r2) / 2
.
test[] = [ 4.1 5.6 7.2 1.7 9.3 4.4 3.2 ]
-median test[] med
-print med
+print median test[]
test[] = [ 4.1 7.2 1.7 9.3 4.4 3.2 ]
-median test[] med
-print med
+print median test[]
diff --git a/Task/Averages-Mode/Ballerina/averages-mode.ballerina b/Task/Averages-Mode/Ballerina/averages-mode.ballerina
new file mode 100644
index 0000000000..cfea56d7ed
--- /dev/null
+++ b/Task/Averages-Mode/Ballerina/averages-mode.ballerina
@@ -0,0 +1,27 @@
+import ballerina/io;
+
+function mode(int[] arr) returns int[]|error {
+ map m = {};
+ foreach int e in arr {
+ string k = e.toString();
+ if !m.hasKey(k) { m[k] = 0; }
+ m[k] = m.get(k) + 1;
+ }
+ int max = int:MIN_VALUE;
+ int[] modes = [];
+ foreach string k in m.keys() {
+ int v = m.get(k);
+ if v > max {
+ max = v;
+ modes.removeAll();
+ }
+ if v >= max {
+ modes.push(check int:fromString(k));
+ }
+ }
+ return modes;
+}
+
+public function main() {
+ io:println(mode([1, 2, 3, 4, 5, 5, 51, 2, 3]));
+}
diff --git a/Task/Averages-Mode/Crystal/averages-mode.cr b/Task/Averages-Mode/Crystal/averages-mode.cr
new file mode 100644
index 0000000000..f8f01672a8
--- /dev/null
+++ b/Task/Averages-Mode/Crystal/averages-mode.cr
@@ -0,0 +1,6 @@
+def mode (seq)
+ seq.tally.group_by {|n, count| count }.max[1].map {|n, count| n }
+end
+
+p mode([1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17])
+p mode([1, 1, 2, 4, 4])
diff --git a/Task/Averages-Mode/EasyLang/averages-mode.easy b/Task/Averages-Mode/EasyLang/averages-mode.easy
index 5824a333b4..79a069b46a 100644
--- a/Task/Averages-Mode/EasyLang/averages-mode.easy
+++ b/Task/Averages-Mode/EasyLang/averages-mode.easy
@@ -1,4 +1,4 @@
-proc modes . in[] r[] .
+proc modes &in[] &r[] .
r[] = [ ]
for v in in[]
for i to len vals[]
@@ -12,9 +12,7 @@ proc modes . in[] r[] .
cnt[] &= 0
.
for i to len cnt[]
- if cnt[i] = max
- r[] &= vals[i]
- .
+ if cnt[i] = max : r[] &= vals[i]
.
.
in[] = [ 1 3 6 6 6 6 7 7 12 12 17 ]
diff --git a/Task/Averages-Pythagorean-means/Ballerina/averages-pythagorean-means.ballerina b/Task/Averages-Pythagorean-means/Ballerina/averages-pythagorean-means.ballerina
new file mode 100644
index 0000000000..352cc79d99
--- /dev/null
+++ b/Task/Averages-Pythagorean-means/Ballerina/averages-pythagorean-means.ballerina
@@ -0,0 +1,21 @@
+import ballerina/io;
+
+public function main() {
+ final int n = 10;
+ var arr = from int i in 1...n select i;
+ float len = arr.length();
+
+ var sum = function(float total, float next) returns float => total + next;
+ var prod = function(float total, float next) returns float => total * next;
+ var rsum = function(float total, float next) returns float => total + 1.0 / next;
+
+ var am = arr.reduce(sum, 0.0) / len;
+ var gm = arr.reduce(prod, 1.0).pow(1.0 / len);
+ var hm = arr.reduce(rsum, 0.0).pow(-1.0) * len;
+
+ io:println("For the numbers 1 to ", n, ":");
+ io:println(" Arithmetic mean = ", am);
+ io:println(" Geometric mean = ", gm);
+ io:println(" Harmonic mean = ", hm);
+ io:println(" A >= G >= H = ", am >= gm && gm >= hm);
+}
diff --git a/Task/Averages-Pythagorean-means/Crystal/averages-pythagorean-means.cr b/Task/Averages-Pythagorean-means/Crystal/averages-pythagorean-means.cr
new file mode 100644
index 0000000000..508bb911fb
--- /dev/null
+++ b/Task/Averages-Pythagorean-means/Crystal/averages-pythagorean-means.cr
@@ -0,0 +1,24 @@
+module Mean
+ def self.arithmetic (seq)
+ seq.sum / seq.size
+ end
+
+ def self.geometric (seq)
+ seq.product ** (1/seq.size)
+ end
+
+ def self.harmonic (seq)
+ seq.size / seq.sum {|x| 1/x }
+ end
+end
+
+seq = (1..10)
+
+a = Mean.arithmetic(seq)
+g = Mean.geometric(seq)
+h = Mean.harmonic(seq)
+
+puts "A = #{a}"
+puts "G = #{g}"
+puts "H = #{h}"
+puts "A >= G >= H = #{a >= g >= h}"
diff --git a/Task/Averages-Pythagorean-means/EasyLang/averages-pythagorean-means.easy b/Task/Averages-Pythagorean-means/EasyLang/averages-pythagorean-means.easy
index 3c7c1af491..f9aa5a43e0 100644
--- a/Task/Averages-Pythagorean-means/EasyLang/averages-pythagorean-means.easy
+++ b/Task/Averages-Pythagorean-means/EasyLang/averages-pythagorean-means.easy
@@ -1,4 +1,4 @@
-proc mean . v[] a g h .
+proc mean &v[] &a &g &h .
prod = 1
for v in v[]
sum += v
diff --git a/Task/Averages-Root-mean-square/Ballerina/averages-root-mean-square.ballerina b/Task/Averages-Root-mean-square/Ballerina/averages-root-mean-square.ballerina
new file mode 100644
index 0000000000..6253aff98f
--- /dev/null
+++ b/Task/Averages-Root-mean-square/Ballerina/averages-root-mean-square.ballerina
@@ -0,0 +1,8 @@
+import ballerina/io;
+
+public function main() {
+ int[] a = from int i in 1...10 select i;
+ var sumSq = function(int total, int i) returns int => total + i * i;
+ float rms = (a.reduce(sumSq, 0) / 10.0).sqrt();
+ io:println(rms);
+}
diff --git a/Task/Averages-Simple-moving-average/Ballerina/averages-simple-moving-average.ballerina b/Task/Averages-Simple-moving-average/Ballerina/averages-simple-moving-average.ballerina
new file mode 100644
index 0000000000..07c801246b
--- /dev/null
+++ b/Task/Averages-Simple-moving-average/Ballerina/averages-simple-moving-average.ballerina
@@ -0,0 +1,33 @@
+import ballerina/io;
+
+function sma(int period) returns (function(float) returns float) {
+ int i = 0;
+ float sum = 0.0;
+ float[] storage = [];
+
+ return function(float input) returns float {
+ if storage.length() < period {
+ sum += input;
+ storage.push(input);
+ }
+ sum += input - storage[i];
+ storage[i] = input;
+ i = (i + 1) % period;
+ return sum / storage.length();
+ };
+}
+
+function F(float f, int size, int prec) returns string {
+ string s = f.toFixedString(prec);
+ return size >= 0 ? s.padStart(size) : s.padEnd(size);
+}
+
+public function main() {
+ var sma3 = sma(3);
+ var sma5 = sma(5);
+ io:println(" x sma3 sma5");
+ float[] rng = [1, 2, 3, 4, 5, 5, 4, 3, 2, 1];
+ foreach float x in rng {
+ io:println(`${F(x, 5, 3)} ${F(sma3(x), 5, 3)} ${F(sma5(x), 5, 3)}`);
+ }
+}
diff --git a/Task/Averages-Simple-moving-average/EasyLang/averages-simple-moving-average.easy b/Task/Averages-Simple-moving-average/EasyLang/averages-simple-moving-average.easy
index e9bdc2bb67..7d437b97f3 100644
--- a/Task/Averages-Simple-moving-average/EasyLang/averages-simple-moving-average.easy
+++ b/Task/Averages-Simple-moving-average/EasyLang/averages-simple-moving-average.easy
@@ -23,7 +23,7 @@ prefix
#
sma5 = sma_new 5
sma3 = sma_new 3
-numfmt 2 4
+numfmt 4 2
for v in [ 1 2 3 4 5 5 4 3 2 1 ]
print sma_get sma3 v & " " & sma_get sma5 v
.
diff --git a/Task/B-zier-curves-Intersections/Fortran/b-zier-curves-intersections.f b/Task/B-zier-curves-Intersections/Fortran/b-zier-curves-intersections.f
new file mode 100644
index 0000000000..418fb69093
--- /dev/null
+++ b/Task/B-zier-curves-Intersections/Fortran/b-zier-curves-intersections.f
@@ -0,0 +1,286 @@
+program bezier_intersections
+ ! This program does not do any subdivision, but instead takes
+ ! advantage of monotonicity.
+ !
+ ! It is possible for points accidentally to be counted twice, for
+ ! instance if they lie right on an interval boundary. We will avoid
+ ! that by the crude (but likely satisfactory) mechanism of requiring
+ ! a minimum max norm between intersections.
+ implicit none
+
+ ! Constants
+ integer, parameter :: max_intersections = 4
+ integer, parameter :: max_start_interv = 4
+ integer, parameter :: max_workload = 1000 ! Maximum size for workload stack
+ double precision, parameter :: px0 = -1.0, px1 = 0.0, px2 = 1.0
+ double precision, parameter :: py0 = 0.0, py1 = 10.0, py2 = 0.0
+ double precision, parameter :: qx0 = 2.0, qx1 = -8.0, qx2 = 2.0
+ double precision, parameter :: qy0 = 1.0, qy1 = 2.0, qy2 = 3.0
+ double precision, parameter :: tol = 0.0000001
+ double precision, parameter :: spacing = 100.0 * tol
+
+ ! Variables
+ logical :: px_has_extreme_pt, py_has_extreme_pt
+ logical :: qx_has_extreme_pt, qy_has_extreme_pt
+ double precision :: px_extreme_pt, py_extreme_pt
+ double precision :: qx_extreme, qy_extreme
+ integer :: p_num_start_interv, q_num_start_interv
+ double precision :: p_start_interv(max_start_interv)
+ double precision :: q_start_interv(max_start_interv)
+ double precision :: workload(4, max_workload) ! tp0, tp1, tq0, tq1
+ integer :: workload_size
+ integer :: num_intersections
+ double precision :: intersections_x(max_intersections)
+ double precision :: intersections_y(max_intersections)
+ integer :: i, j, k
+ double precision :: tp0, tp1, tq0, tq1
+ double precision :: xp0, xp1, xq0, xq1
+ double precision :: yp0, yp1, yq0, yq1
+ logical :: exclude, accept
+ double precision :: x, y
+ double precision :: tp_middle, tq_middle
+
+! Main program logic
+ ! Find monotonic sections of the curves, and use those as the
+ ! starting jobs.
+ p_num_start_interv = 2
+ p_start_interv(1) = 0.0
+ p_start_interv(2) = 1.0
+ call possibly_insert_extreme_point(px0, px1, px2, p_num_start_interv, p_start_interv)
+ call possibly_insert_extreme_point(py0, py1, py2, p_num_start_interv, p_start_interv)
+ q_num_start_interv = 2
+ q_start_interv(1) = 0.0
+ q_start_interv(2) = 1.0
+ call possibly_insert_extreme_point(qx0, qx1, qx2, q_num_start_interv, q_start_interv)
+ call possibly_insert_extreme_point(qy0, qy1, qy2, q_num_start_interv, q_start_interv)
+
+ workload_size = 0
+ do i = 2, p_num_start_interv
+ do j = 2, q_num_start_interv
+ call defer_work(p_start_interv(i - 1), p_start_interv(i), &
+ q_start_interv(j - 1), q_start_interv(j))
+ end do
+ end do
+
+ ! Go through the workload, deferring work as necessary.
+ num_intersections = 0
+ do while (.not. work_is_done())
+ ! The following code recomputes values of the splines
+ ! sometimes. You may wish to store such values in the work pile,
+ ! to avoid recomputing them.
+ call do_some_work(tp0, tp1, tq0, tq1)
+ xp0 = schumaker_volk(px0, px1, px2, tp0)
+ yp0 = schumaker_volk(py0, py1, py2, tp0)
+ xp1 = schumaker_volk(px0, px1, px2, tp1)
+ yp1 = schumaker_volk(py0, py1, py2, tp1)
+ xq0 = schumaker_volk(qx0, qx1, qx2, tq0)
+ yq0 = schumaker_volk(qy0, qy1, qy2, tq0)
+ xq1 = schumaker_volk(qx0, qx1, qx2, tq1)
+ yq1 = schumaker_volk(qy0, qy1, qy2, tq1)
+ call test_intersection(xp0, xp1, yp0, yp1, xq0, xq1, yq0, yq1, tol, exclude, accept, x, y)
+ if (accept) then
+ call maybe_add_intersection(x, y, spacing)
+ else if (.not. exclude) then
+ tp_middle = 0.5 * (tp0 + tp1)
+ tq_middle = 0.5 * (tq0 + tq1)
+ call defer_work(tp0, tp_middle, tq0, tq_middle)
+ call defer_work(tp0, tp_middle, tq_middle, tq1)
+ call defer_work(tp_middle, tp1, tq0, tq_middle)
+ call defer_work(tp_middle, tp1, tq_middle, tq1)
+ end if
+ end do
+
+ if (num_intersections == 0) then
+ print *, 'no intersections'
+ else
+ do k = 1, num_intersections
+ write (*, '(A, F12.8, A, F12.8, A)') '(', intersections_x(k), ', ', intersections_y(k), ')'
+ end do
+ end if
+
+contains
+
+ ! Schumaker's and Volk's algorithm for evaluating a Bezier spline in
+ ! Bernstein basis. This is faster than de Casteljau, though not quite
+ ! as numerical stable.
+ double precision function schumaker_volk(c0, c1, c2, t)
+ double precision, intent(IN) :: c0, c1, c2, t
+ double precision :: s, u, v
+ s = 1.0 - t
+ if (t <= 0.5) then
+ ! Horner form in the variable u = t/s, taking into account the
+ ! binomial coefficients = 1,2,1.
+ u = t / s
+ v = c0 + (u * (c1 + c1 + (u * c2)))
+ ! Multiply by s raised to the degree of the spline.
+ v = v * s * s
+ else
+ ! Horner form in the variable u = s/t, taking into account the
+ ! binomial coefficients = 1,2,1.
+ u = s / t
+ v = c2 + (u * (c1 + c1 + (u * c0)))
+ ! Multiply by t raised to the degree of the spline.
+ v = v * t * t
+ end if
+ schumaker_volk = v
+ end function schumaker_volk
+
+ ! Find extreme point of a quadratic Bezier spline
+ subroutine find_extreme_point(c0, c1, c2, lies_inside_01, extreme_point)
+ double precision, intent(IN) :: c0, c1, c2
+ logical, intent(OUT) :: lies_inside_01
+ double precision, intent(OUT) :: extreme_point
+ double precision :: numer, denom
+ ! If the spline has c0=c2 but not c0=c1=c2, then treat it as having
+ ! an extreme point at 0.5.
+ if (c0 == c2 .and. c0 /= c1) then
+ lies_inside_01 = .true.
+ extreme_point = 0.5
+ else
+ ! Find the root of the derivative of the spline.
+ lies_inside_01 = .false.
+ numer = c0 - c1
+ denom = c2 - c1 - c1 + c0
+ if (denom /= 0.0 .and. numer * denom >= 0.0 .and. numer <= denom) then
+ lies_inside_01 = .true.
+ extreme_point = numer / denom
+ end if
+ end if
+ end subroutine find_extreme_point
+
+ ! Insert extreme point into start intervals if it lies in (0,1)
+ subroutine possibly_insert_extreme_point(c0, c1, c2, num_start_interv, start_interv)
+ double precision, intent(IN) :: c0, c1, c2
+ integer, intent(INOUT) :: num_start_interv
+ double precision, intent(INOUT) :: start_interv(max_start_interv)
+ logical :: lies_inside_01
+ double precision :: extreme_pt
+ call find_extreme_point(c0, c1, c2, lies_inside_01, extreme_pt)
+ if (lies_inside_01 .and. extreme_pt > 0.0 .and. extreme_pt < 1.0) then
+ if (num_start_interv == 2) then
+ start_interv(3) = 1.0
+ start_interv(2) = extreme_pt
+ num_start_interv = 3
+ else if (extreme_pt < start_interv(2)) then
+ start_interv(4) = 1.0
+ start_interv(3) = start_interv(2)
+ start_interv(2) = extreme_pt
+ num_start_interv = 4
+ else if (extreme_pt > start_interv(2)) then
+ start_interv(4) = 1.0
+ start_interv(3) = extreme_pt
+ num_start_interv = 4
+ end if
+ end if
+ end subroutine possibly_insert_extreme_point
+
+ ! Minimum of two values
+ double precision function minimum2(x, y)
+ double precision, intent(IN) :: x, y
+ minimum2 = min(x, y)
+ end function minimum2
+
+ ! Maximum of two values
+ double precision function maximum2(x, y)
+ double precision, intent(IN) :: x, y
+ maximum2 = max(x, y)
+ end function maximum2
+
+ ! Check if two rectangles overlap
+ logical function rectangles_overlap(xa0, ya0, xa1, ya1, xb0, yb0, xb1, yb1)
+ double precision, intent(IN) :: xa0, ya0, xa1, ya1, xb0, yb0, xb1, yb1
+ ! It is assumed that xa0<=xa1, ya0<=ya1, xb0<=xb1, and yb0<=yb1.
+ rectangles_overlap = (xb0 <= xa1 .and. xa0 <= xb1 .and. yb0 <= ya1 .and. ya0 <= yb1)
+ end function rectangles_overlap
+
+ ! Test for intersection between two line segments
+ subroutine test_intersection(xp0, xp1, yp0, yp1, xq0, xq1, yq0, yq1, tol, exclude, accept, x, y)
+ double precision, intent(IN) :: xp0, xp1, yp0, yp1, xq0, xq1, yq0, yq1, tol
+ logical, intent(OUT) :: exclude, accept
+ double precision, intent(OUT) :: x, y
+ double precision :: xpmin, ypmin, xpmax, ypmax
+ double precision :: xqmin, yqmin, xqmax, yqmax
+ double precision :: xmin, xmax, ymin, ymax
+ xpmin = minimum2(xp0, xp1)
+ ypmin = minimum2(yp0, yp1)
+ xpmax = maximum2(xp0, xp1)
+ ypmax = maximum2(yp0, yp1)
+ xqmin = minimum2(xq0, xq1)
+ yqmin = minimum2(yq0, yq1)
+ xqmax = maximum2(xq0, xq1)
+ yqmax = maximum2(yq0, yq1)
+ exclude = .true.
+ accept = .false.
+ if (rectangles_overlap(xpmin, ypmin, xpmax, ypmax, xqmin, yqmin, xqmax, yqmax)) then
+ exclude = .false.
+ xmin = maximum2(xpmin, xqmin)
+ xmax = minimum2(xpmax, xqmax)
+ if (xmax < xmin) stop 'Assertion failed: xmax >= xmin'
+ if (xmax - xmin <= tol) then
+ ymin = maximum2(ypmin, yqmin)
+ ymax = minimum2(ypmax, yqmax)
+ if (ymax < ymin) stop 'Assertion failed: ymax >= ymin'
+ if (ymax - ymin <= tol) then
+ accept = .true.
+ x = 0.5 * (xmin + xmax)
+ y = 0.5 * (ymin + ymax)
+ end if
+ end if
+ end if
+ end subroutine test_intersection
+
+ ! Check if workload is empty
+ logical function work_is_done()
+ work_is_done = (workload_size == 0)
+ end function work_is_done
+
+ ! Add work to the workload stack
+ subroutine defer_work(tp0, tp1, tq0, tq1)
+ double precision, intent(IN) :: tp0, tp1, tq0, tq1
+ if (workload_size >= max_workload) stop 'Error: Workload stack overflow'
+ workload_size = workload_size + 1
+ workload(1, workload_size) = tp0
+ workload(2, workload_size) = tp1
+ workload(3, workload_size) = tq0
+ workload(4, workload_size) = tq1
+ end subroutine defer_work
+
+ ! Remove and return work from the workload stack
+ subroutine do_some_work(tp0, tp1, tq0, tq1)
+ double precision, intent(OUT) :: tp0, tp1, tq0, tq1
+ if (work_is_done()) stop 'Assertion failed: Workload is empty'
+ tp0 = workload(1, workload_size)
+ tp1 = workload(2, workload_size)
+ tq0 = workload(3, workload_size)
+ tq1 = workload(4, workload_size)
+ workload_size = workload_size - 1
+ end subroutine do_some_work
+
+ ! Add intersection point if it's not too close to existing ones
+ subroutine maybe_add_intersection(x, y, spacing)
+ double precision, intent(IN) :: x, y, spacing
+ integer :: i
+ logical :: too_close
+ if (num_intersections == 0) then
+ intersections_x(1) = x
+ intersections_y(1) = y
+ num_intersections = 1
+ else
+ too_close = .false.
+ do i = 1, num_intersections
+ if (abs(x - intersections_x(i)) < spacing .and. &
+ abs(y - intersections_y(i)) < spacing) then
+ too_close = .true.
+ exit
+ end if
+ end do
+ if (.not. too_close) then
+ if (num_intersections >= max_intersections) stop 'Too many intersections'
+ num_intersections = num_intersections + 1
+ intersections_x(num_intersections) = x
+ intersections_y(num_intersections) = y
+ end if
+ end if
+ end subroutine maybe_add_intersection
+
+end program bezier_intersections
diff --git a/Task/B-zier-curves-Intersections/Mathematica/b-zier-curves-intersections.math b/Task/B-zier-curves-Intersections/Mathematica/b-zier-curves-intersections.math
new file mode 100644
index 0000000000..62d124f937
--- /dev/null
+++ b/Task/B-zier-curves-Intersections/Mathematica/b-zier-curves-intersections.math
@@ -0,0 +1,7 @@
+ClearAll[BezierFunc]
+BezierFunc[pts_List, \[Alpha]_] := Nest[BlockMap[Apply[(1 - \[Alpha]) #1 + \[Alpha] #2 &], #, 2, 1] &, pts, Length[pts] - 1][[1]]
+b1 = BezierFunc[{{-1, 0}, {0, 10}, {1, 0}}, s];
+b2 = BezierFunc[{{2, 1}, {-8, 2}, {2, 3}}, t];
+eqs = Thread[b1 == b2];
+{s, t, b1} /. Solve[%, {s, t}];
+Grid[N[%]]
diff --git a/Task/B-zier-curves-Intersections/Rust/b-zier-curves-intersections.rs b/Task/B-zier-curves-Intersections/Rust/b-zier-curves-intersections.rs
new file mode 100644
index 0000000000..44e656af33
--- /dev/null
+++ b/Task/B-zier-curves-Intersections/Rust/b-zier-curves-intersections.rs
@@ -0,0 +1,198 @@
+use std::f64;
+
+const TOLERANCE: f64 = 0.000_000_1;
+const SPACING: f64 = 10.0 * TOLERANCE;
+
+// Replaces std::pair
+#[derive(Debug, Clone, Copy, PartialEq, Default)]
+struct Point {
+ x: f64,
+ y: f64,
+}
+
+impl Point {
+ fn new(x: f64, y: f64) -> Self {
+ Point { x, y }
+ }
+}
+
+// Replaces quad_spline class
+#[derive(Debug, Clone, Copy, Default)]
+struct QuadSpline {
+ c0: f64,
+ c1: f64,
+ c2: f64,
+}
+
+impl QuadSpline {
+ fn new(c0: f64, c1: f64, c2: f64) -> Self {
+ QuadSpline { c0, c1, c2 }
+ }
+
+ /// de Casteljau's algorithm for 1D spline subdivision
+ /// Returns two new splines, representing the curve from 0->t and t->1
+ fn subdivide(&self, t: f64) -> (QuadSpline, QuadSpline) {
+ let s = 1.0 - t;
+ let u_c0 = self.c0;
+ let v_c2 = self.c2;
+ let u_c1 = s * self.c0 + t * self.c1;
+ let v_c1 = s * self.c1 + t * self.c2;
+ let u_c2 = s * u_c1 + t * v_c1;
+ let v_c0 = u_c2;
+
+ let u = QuadSpline::new(u_c0, u_c1, u_c2);
+ let v = QuadSpline::new(v_c0, v_c1, v_c2);
+ (u, v)
+ }
+
+ // Helper to get min/max control points for bounding box
+ fn min_max(&self) -> (f64, f64) {
+ let min_val = self.c0.min(self.c1).min(self.c2);
+ let max_val = self.c0.max(self.c1).max(self.c2);
+ (min_val, max_val)
+ }
+}
+
+// Replaces quad_curve class
+#[derive(Debug, Clone, Copy, Default)]
+struct QuadCurve {
+ x: QuadSpline,
+ y: QuadSpline,
+}
+
+impl QuadCurve {
+ fn new(x: QuadSpline, y: QuadSpline) -> Self {
+ QuadCurve { x, y }
+ }
+
+ /// de Casteljau's algorithm for 2D curve subdivision
+ /// Returns two new curves, representing the curve from 0->t and t->1
+ fn subdivide(&self, t: f64) -> (QuadCurve, QuadCurve) {
+ let (ux, vx) = self.x.subdivide(t);
+ let (uy, vy) = self.y.subdivide(t);
+ (QuadCurve::new(ux, uy), QuadCurve::new(vx, vy))
+ }
+
+ /// Calculate the axis-aligned bounding box (AABB)
+ fn bounding_box(&self) -> (f64, f64, f64, f64) {
+ let (px_min, px_max) = self.x.min_max();
+ let (py_min, py_max) = self.y.min_max();
+ (px_min, py_min, px_max, py_max)
+ }
+}
+
+/// Checks if two axis-aligned rectangles overlap
+fn rectangles_overlap(
+ xa0: f64, ya0: f64, xa1: f64, ya1: f64,
+ xb0: f64, yb0: f64, xb1: f64, yb1: f64,
+) -> bool {
+ // Ensure coordinates are ordered min -> max if necessary, although bounding_box should handle this.
+ // let (xa0, xa1) = if xa0 > xa1 { (xa1, xa0) } else { (xa0, xa1) };
+ // let (ya0, ya1) = if ya0 > ya1 { (ya1, ya0) } else { (ya0, ya1) };
+ // let (xb0, xb1) = if xb0 > xb1 { (xb1, xb0) } else { (xb0, xb1) };
+ // let (yb0, yb1) = if yb0 > yb1 { (yb1, yb0) } else { (yb0, yb1) };
+
+ xb0 <= xa1 && xa0 <= xb1 && yb0 <= ya1 && ya0 <= yb1
+}
+
+/// Test intersection candidacy based on bounding box overlap and size.
+/// Returns: (accepted, excluded, potential_intersect_point)
+fn test_intersection(p: &QuadCurve, q: &QuadCurve) -> (bool, bool, Point) {
+ let (px_min, py_min, px_max, py_max) = p.bounding_box();
+ let (qx_min, qy_min, qx_max, qy_max) = q.bounding_box();
+
+ let mut accepted = false;
+ let mut excluded = true;
+ let mut intersect = Point::default(); // Default point (0.0, 0.0)
+
+ if rectangles_overlap(px_min, py_min, px_max, py_max, qx_min, qy_min, qx_max, qy_max) {
+ excluded = false;
+ // Calculate overlap region
+ let x_min = px_min.max(qx_min);
+ let x_max = px_max.min(qx_max); // Corrected from C++ possible typo px_max.min(px_max)
+ if x_max - x_min <= TOLERANCE {
+ let y_min = py_min.max(qy_min);
+ let y_max = py_max.min(qy_max);
+ if y_max - y_min <= TOLERANCE {
+ accepted = true;
+ // Use midpoint of the tiny overlap box as the intersection point
+ intersect = Point::new(0.5 * (x_min + x_max), 0.5 * (y_min + y_max));
+ }
+ }
+ }
+ (accepted, excluded, intersect)
+}
+
+/// Check if a point is too close to existing intersection points
+fn seems_to_be_duplicate(intersects: &[Point], pt: Point) -> bool {
+ for &intersect in intersects {
+ if (intersect.x - pt.x).abs() < SPACING && (intersect.y - pt.y).abs() < SPACING {
+ return true;
+ }
+ }
+ false
+}
+
+/// Find intersection points between two quadratic Bezier curves using recursive subdivision.
+fn find_intersects(p: &QuadCurve, q: &QuadCurve) -> Vec {
+ let mut result: Vec = Vec::new();
+ // Use a Vec as a stack, storing pairs of curves to check
+ // Pushing/popping individual curves to mimic C++ stack behavior exactly
+ let mut stack: Vec = Vec::new();
+ stack.push(*q); // Push q first (will be popped as qq)
+ stack.push(*p); // Push p second (will be popped as pp)
+
+ while stack.len() >= 2 {
+ // Pop in the order that matches the C++ version's stack processing
+ let pp = stack.pop().unwrap(); // Pop p-curve segment
+ let qq = stack.pop().unwrap(); // Pop q-curve segment
+
+ let (accepted, excluded, intersect) = test_intersection(&pp, &qq);
+
+ if accepted {
+ if !seems_to_be_duplicate(&result, intersect) {
+ result.push(intersect);
+ }
+ } else if !excluded {
+ // Bounding boxes overlap significantly, subdivide both curves
+ let (p0, p1) = pp.subdivide(0.5);
+ let (q0, q1) = qq.subdivide(0.5);
+
+ // Push the 4 pairs of sub-curves onto the stack for further testing.
+ // Order matches the C++ version's push order { p0, q0, p0, q1, p1, q0, p1, q1 }
+ // Processed pairs will be (p0,q0), (p0,q1), (p1,q0), (p1,q1) eventually.
+ // Push in reverse order of desired processing:
+ stack.push(q1); stack.push(p1); // For pair (p1, q1)
+ stack.push(q0); stack.push(p1); // For pair (p1, q0)
+ stack.push(q1); stack.push(p0); // For pair (p0, q1)
+ stack.push(q0); stack.push(p0); // For pair (p0, q0)
+ }
+ // If excluded, do nothing, this pair of segments cannot intersect.
+ }
+ result
+}
+
+fn main() {
+ // QuadCurve vertical represents the Bezier curve having control points (-1, 0), (0, 10) and (1, 0)
+ let vertical = QuadCurve::new(
+ QuadSpline::new(-1.0, 0.0, 1.0),
+ QuadSpline::new(0.0, 10.0, 0.0),
+ );
+ // QuadCurve horizontal represents the Bezier curve having control points (2, 1), (-8, 2) and (2, 3)
+ let horizontal = QuadCurve::new(
+ QuadSpline::new(2.0, -8.0, 2.0),
+ QuadSpline::new(1.0, 2.0, 3.0),
+ );
+
+ println!("The points of intersection are:");
+ let intersects = find_intersects(&vertical, &horizontal);
+
+ if intersects.is_empty() {
+ println!("No intersections found.");
+ } else {
+ for intersect in intersects {
+ // Format output similar to C++ version
+ println!("( {:9.6}, {:9.6} )", intersect.x, intersect.y);
+ }
+ }
+}
diff --git a/Task/Babylonian-spiral/EasyLang/babylonian-spiral.easy b/Task/Babylonian-spiral/EasyLang/babylonian-spiral.easy
new file mode 100644
index 0000000000..888e9c378e
--- /dev/null
+++ b/Task/Babylonian-spiral/EasyLang/babylonian-spiral.easy
@@ -0,0 +1,70 @@
+fastfunc findj a norm .
+ j = floor sqrt norm + 1
+ repeat
+ b = j * j
+ if a + b < norm : return -1
+ if a + b = norm : return j
+ until j = 0
+ j -= 1
+ .
+ return -1
+.
+proc babylon_spiral nsteps &pts[][] .
+ pts[][] = [ [ 0 0 ] [ 0 1 ] ]
+ norm = 1
+ last[] = pts[$][]
+ for k to nsteps - 2
+ theta = atan2 last[2] last[1]
+ cands[][] = [ ]
+ while len cands[][] = 0
+ norm += 1
+ for i = 0 to nsteps
+ a = i * i
+ if a > norm div 2 : break 1
+ j = findj a norm
+ if j <> -1
+ cands[][] &= [ i, j ]
+ cands[][] &= [ -i, j ]
+ cands[][] &= [ i, -j ]
+ cands[][] &= [ -i, -j ]
+ cands[][] &= [ j, i ]
+ cands[][] &= [ -j, i ]
+ cands[][] &= [ j, -i ]
+ cands[][] &= [ -j, -i ]
+ .
+ .
+ .
+ min = 1 / 0
+ for i to len cands[][]
+ h = (theta - atan2 cands[i][2] cands[i][1]) mod 360
+ if h < min
+ min = h
+ mini = i
+ .
+ .
+ last[] = cands[mini][]
+ pts[][] &= pts[$][]
+ pts[$][1] += last[1]
+ pts[$][2] += last[2]
+ .
+.
+babylon_spiral 40 pts[][]
+print pts[][]
+#
+babylon_spiral 10000 pts[][]
+for i to len pts[][]
+ minx = lower minx pts[i][1]
+ maxx = higher maxx pts[i][1]
+ miny = lower miny pts[i][2]
+ maxy = higher maxy pts[i][2]
+.
+scx = 100 / (maxx - minx) * 0.96
+scy = 100 / (maxy - miny) * 0.96
+ty = -miny * scy + 2
+tx = -minx * scx + 2
+glinewidth 0.1
+for i to len pts[][] - 1
+ gline 0 ty 100 ty
+ gline tx 0 tx 100
+ gline pts[i][1] * scx + tx, pts[i][2] * scy + ty, pts[i + 1][1] * scx + tx, pts[i + 1][2] * scy + ty
+.
diff --git a/Task/Balanced-brackets/Ballerina/balanced-brackets.ballerina b/Task/Balanced-brackets/Ballerina/balanced-brackets.ballerina
new file mode 100644
index 0000000000..bbae2976c8
--- /dev/null
+++ b/Task/Balanced-brackets/Ballerina/balanced-brackets.ballerina
@@ -0,0 +1,34 @@
+import ballerina/io;
+import ballerina/random;
+
+function isBalanced(string s) returns boolean {
+ if s == "" { return true; }
+ int countLeft = 0; // number of left brackets so far unmatched
+ foreach var c in s {
+ if c == "[" {
+ countLeft += 1;
+ } else if countLeft > 0 {
+ countLeft -= 1;
+ } else {
+ return false;
+ }
+ }
+ return countLeft == 0;
+}
+
+public function main() {
+ io:println("Checking examples in task description:");
+ var brackets = ["", "[]", "][", "[][]", "][][", "[[][]]", "[]][[]"];
+ foreach string b in brackets {
+ io:print((b != "") ? b : "(empty)");
+ io:println("\t ", isBalanced(b) ? "OK" : "NOT OK");
+ }
+ io:println("\nChecking 7 random strings of brackets of length 8:");
+ foreach int i in 1...7 {
+ string s = "";
+ foreach int j in 1...8 {
+ s += random:createIntInRange(0, 2) == 0 ? "[" : "]";
+ }
+ io:println(s, " ", isBalanced(s) ? "OK" : "NOT OK");
+ }
+}
diff --git a/Task/Balanced-brackets/Excel/balanced-brackets-3.excel b/Task/Balanced-brackets/Excel/balanced-brackets-3.excel
new file mode 100644
index 0000000000..6a039e391e
--- /dev/null
+++ b/Task/Balanced-brackets/Excel/balanced-brackets-3.excel
@@ -0,0 +1 @@
+=REDUCE(A2, SEQUENCE(MAX(1, LEN(A2))), LAMBDA(a, _, SUBSTITUTE(a, "[]", ))) = ""
diff --git a/Task/Balanced-brackets/Excel/balanced-brackets-4.excel b/Task/Balanced-brackets/Excel/balanced-brackets-4.excel
new file mode 100644
index 0000000000..64246d94af
--- /dev/null
+++ b/Task/Balanced-brackets/Excel/balanced-brackets-4.excel
@@ -0,0 +1 @@
+=REDUCE(REGEXREPLACE(A2, "[^\[\]]", ), SEQUENCE(MAX(1, LEN(A2))), LAMBDA(a, _, SUBSTITUTE(a, "[]", ))) = ""
diff --git a/Task/Balanced-ternary/00-TASK.txt b/Task/Balanced-ternary/00-TASK.txt
index 6b6f6bb48f..f548e4c8c0 100644
--- a/Task/Balanced-ternary/00-TASK.txt
+++ b/Task/Balanced-ternary/00-TASK.txt
@@ -10,13 +10,13 @@ Decimal 6 = 32 − 31 + 0 × 30, thus it can b
;Task:
Implement balanced ternary representation of integers with the following:
# Support arbitrarily large integers, both positive and negative;
-# Provide ways to convert to and from text strings, using digits '+', '-' and '0' (unless you are already using strings to represent balanced ternary; but see requirement 5).
+# Provide ways to convert to and from text strings, using digits '+', '−' and '0' (unless you are already using strings to represent balanced ternary; but see requirement 5).
# Provide ways to convert to and from native integer type (unless, improbably, your platform's native integer type ''is'' balanced ternary). If your native integers can't support arbitrary length, overflows during conversion must be indicated.
# Provide ways to perform addition, negation and multiplication directly on balanced ternary integers; do ''not'' convert to native integers first.
# Make your implementation efficient, with a reasonable definition of "efficient" (and with a reasonable definition of "reasonable").
-'''Test case''' With balanced ternaries ''a'' from string "+-0++0+", ''b'' from native integer -436, ''c'' "+-++-":
+'''Test case''' With balanced ternaries ''a'' from string "+−0++0+", ''b'' from native integer −436, ''c'' "+−++−":
* write out ''a'', ''b'' and ''c'' in decimal notation;
* calculate ''a'' × (''b'' − ''c''), write out the result in both ternary and decimal notations.
diff --git a/Task/Barnsley-fern/EasyLang/barnsley-fern.easy b/Task/Barnsley-fern/EasyLang/barnsley-fern.easy
index 3d5e535c80..4176e236d7 100644
--- a/Task/Barnsley-fern/EasyLang/barnsley-fern.easy
+++ b/Task/Barnsley-fern/EasyLang/barnsley-fern.easy
@@ -1,21 +1,20 @@
-color 060
+gcolor 060
for i = 1 to 200000
- r = randomf
- if r < 0.01
- nx = 0
- ny = 0.16 * y
- elif r < 0.08
- nx = 0.2 * x - 0.26 * y
- ny = 0.23 * x + 0.22 * y + 1.6
- elif r < 0.15
- nx = -0.15 * x + 0.28 * y
- ny = 0.26 * x + 0.24 * y + 0.44
- else
- nx = 0.85 * x + 0.04 * y
- ny = -0.04 * x + 0.85 * y + 1.6
- .
- x = nx
- y = ny
- move 50 + x * 15 y * 10
- rect 0.3 0.3
+ r = randomf
+ if r < 0.01
+ nx = 0
+ ny = 0.16 * y
+ elif r < 0.08
+ nx = 0.2 * x - 0.26 * y
+ ny = 0.23 * x + 0.22 * y + 1.6
+ elif r < 0.15
+ nx = -0.15 * x + 0.28 * y
+ ny = 0.26 * x + 0.24 * y + 0.44
+ else
+ nx = 0.85 * x + 0.04 * y
+ ny = -0.04 * x + 0.85 * y + 1.6
+ .
+ x = nx
+ y = ny
+ grect 50 + x * 15 y * 10 0.3 0.3
.
diff --git a/Task/Bell-numbers/C-sharp/bell-numbers.cs b/Task/Bell-numbers/C-sharp/bell-numbers-1.cs
similarity index 100%
rename from Task/Bell-numbers/C-sharp/bell-numbers.cs
rename to Task/Bell-numbers/C-sharp/bell-numbers-1.cs
diff --git a/Task/Bell-numbers/C-sharp/bell-numbers-2.cs b/Task/Bell-numbers/C-sharp/bell-numbers-2.cs
new file mode 100644
index 0000000000..f2da84e2ba
--- /dev/null
+++ b/Task/Bell-numbers/C-sharp/bell-numbers-2.cs
@@ -0,0 +1,25 @@
+using System.Numerics;
+
+foreach (var row in BellTriangle().Take(15))
+{
+ Console.WriteLine(row[0]);
+}
+
+Console.WriteLine(BellTriangle().ElementAt(49)[0]);
+
+foreach (var row in BellTriangle().Take(10))
+{
+ Console.WriteLine(string.Join(", ", row));
+}
+
+IEnumerable> BellTriangle()
+{
+ List row = [1];
+
+ while (true)
+ {
+ yield return row;
+ var scan = row[^1];
+ row = [scan, .. row.Select(r => scan += r) ];
+ }
+}
diff --git a/Task/Benfords-law/EasyLang/benfords-law.easy b/Task/Benfords-law/EasyLang/benfords-law.easy
index 56624832fb..3a1d767aa2 100644
--- a/Task/Benfords-law/EasyLang/benfords-law.easy
+++ b/Task/Benfords-law/EasyLang/benfords-law.easy
@@ -6,14 +6,12 @@ func$ add a$ b$ .
c = r div 10
r$ &= r mod 10
.
- if c > 0
- r$ &= c
- .
+ if c > 0 : r$ &= c
return r$
.
#
len fibdist[] 9
-proc mkfibdist . .
+proc mkfibdist .
# generate 1000 fibonacci numbers as
# (reversed) strings, because 53 bit
# integers are too small
@@ -36,14 +34,14 @@ proc mkfibdist . .
mkfibdist
#
len benfdist[] 9
-proc mkbenfdist . .
+proc mkbenfdist .
for i to 9
benfdist[i] = log10 (1 + 1.0 / i)
.
.
mkbenfdist
#
-numfmt 3 0
+numfmt 0 3
print "Actual Expected"
for i to 9
print fibdist[i] & " " & benfdist[i]
diff --git a/Task/Best-shuffle/EasyLang/best-shuffle.easy b/Task/Best-shuffle/EasyLang/best-shuffle.easy
index ef0e2ef7bf..4f6a5e338f 100644
--- a/Task/Best-shuffle/EasyLang/best-shuffle.easy
+++ b/Task/Best-shuffle/EasyLang/best-shuffle.easy
@@ -1,4 +1,4 @@
-proc best_shuffle s$ . r$ diff .
+proc best_shuffle s$ &r$ &diff .
l = len s$
for c$ in strchars s$
s[] &= strcode c$
diff --git a/Task/Bifid-cipher/EasyLang/bifid-cipher.easy b/Task/Bifid-cipher/EasyLang/bifid-cipher.easy
index 0a26b043a8..df84986ae6 100644
--- a/Task/Bifid-cipher/EasyLang/bifid-cipher.easy
+++ b/Task/Bifid-cipher/EasyLang/bifid-cipher.easy
@@ -1,4 +1,4 @@
-proc prepare . s$ .
+proc prepare &s$ .
for e$ in strchars s$
h = strcode e$
if h >= 97
diff --git a/Task/Bifid-cipher/JavaScript/bifid-cipher.js b/Task/Bifid-cipher/JavaScript/bifid-cipher.js
new file mode 100644
index 0000000000..a4f210b4c0
--- /dev/null
+++ b/Task/Bifid-cipher/JavaScript/bifid-cipher.js
@@ -0,0 +1,199 @@
+// ADFGVX Cipher Implementation in JavaScript
+
+// Cipher squares
+const squareRosetta = [ // from Rosetta Code
+ ['A', 'B', 'C', 'D', 'E'],
+ ['F', 'G', 'H', 'I', 'K'],
+ ['L', 'M', 'N', 'O', 'P'],
+ ['Q', 'R', 'S', 'T', 'U'],
+ ['V', 'W', 'X', 'Y', 'Z'],
+ ['J', '1', '2', '3', '4']
+];
+
+const squareWikipedia = [ // from Wikipedia
+ ['B', 'G', 'W', 'K', 'Z'],
+ ['Q', 'P', 'N', 'D', 'S'],
+ ['I', 'O', 'A', 'X', 'E'],
+ ['F', 'C', 'L', 'U', 'M'],
+ ['T', 'H', 'Y', 'V', 'R'],
+ ['J', '1', '2', '3', '4']
+];
+
+// Test text strings
+const textRosetta = "0ATTACKATDAWN";
+const textRosettaEncoded = "DQBDAXDQPDQH"; // only for test
+const textWikipedia = "FLEEATONCE";
+const textWikipediaEncoded = "UAEOLWRINS"; // only for test
+const textTest = "The invasion will start on the first of January";
+const textTestEncoded = "RASOAQXFIOORXESXADETSWLTNIAZQOISBRGBALY"; // only for test
+
+// Coordinate class (equivalent to koord struct in Go)
+class Coord {
+ constructor(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ lessThan(other) {
+ if (this.y > other.y) {
+ return false;
+ }
+ if (this.y < other.y) {
+ return true;
+ }
+ if (this.x < other.x) {
+ return true;
+ }
+ return false;
+ }
+
+ equalTo(other) {
+ return this.x === other.x && this.y === other.y;
+ }
+}
+
+// Convert square to encryption and decryption maps
+function squareToMaps(square) {
+ const encryptMap = new Map();
+ const decryptMap = new Map();
+
+ for (let x = 0; x < square.length; x++) {
+ for (let y = 0; y < square[x].length; y++) {
+ const value = square[x][y];
+ const coord = new Coord(x, y);
+
+ // For encryption map, use character as key
+ encryptMap.set(value, coord);
+
+ // For decryption map, use coordinate string as key
+ // (JavaScript Maps can't use objects as keys directly, so convert to string)
+ decryptMap.set(`${x},${y}`, value);
+ }
+ }
+
+ return { encryptMap, decryptMap };
+}
+
+// Remove spaces and non-valid characters
+function removeSpace(text, encryptMap) {
+ const upper = text.toUpperCase().replace(/\s/g, '');
+ let result = '';
+
+ for (const char of upper) {
+ if (encryptMap.has(char)) {
+ result += char;
+ }
+ }
+
+ return result;
+}
+
+// Replace 'J' with 'I' (for specific Polybius square implementations)
+function removeSpaceI(text) {
+ const upper = text.toUpperCase();
+ let result = '';
+
+ for (const char of upper) {
+ // Use only ASCII characters from A to Z
+ if (char >= 'A' && char <= 'Z') {
+ result += char === 'J' ? 'I' : char;
+ }
+ }
+
+ return result;
+}
+
+// Encrypt using ADFGVX cipher
+function encrypt(text, encryptMap, decryptMap) {
+ text = removeSpace(text, encryptMap);
+
+ const row0 = [];
+ const row1 = [];
+
+ // Get coordinates for each character
+ for (const char of text) {
+ const coord = encryptMap.get(char);
+ row0.push(coord.x);
+ row1.push(coord.y);
+ }
+
+ // Combine coordinates
+ const combined = [...row0, ...row1];
+
+ let result = '';
+ // Convert pairs of coordinates back to characters
+ for (let i = 0; i < combined.length; i += 2) {
+ const key = `${combined[i]},${combined[i+1]}`;
+ result += decryptMap.get(key);
+ }
+
+ return result;
+}
+
+// Decrypt using ADFGVX cipher
+function decrypt(text, encryptMap, decryptMap) {
+ text = removeSpace(text, encryptMap);
+
+ const coords = [];
+
+ // Get coordinates for each character
+ for (const char of text) {
+ coords.push(encryptMap.get(char));
+ }
+
+ // Extract x and y values
+ const flatCoords = [];
+ for (const coord of coords) {
+ flatCoords.push(coord.x);
+ flatCoords.push(coord.y);
+ }
+
+ const half = Math.floor(flatCoords.length / 2);
+ const firstHalf = flatCoords.slice(0, half);
+ const secondHalf = flatCoords.slice(half);
+
+ let result = '';
+
+ // Recombine coordinates to get original text
+ for (let i = 0; i < firstHalf.length; i++) {
+ const key = `${firstHalf[i]},${secondHalf[i]}`;
+ result += decryptMap.get(key);
+ }
+
+ return result;
+}
+
+// Main function to test
+function main() {
+ // Test with Rosetta square
+ let { encryptMap, decryptMap } = squareToMaps(squareRosetta);
+
+ console.log("From Rosetta Code");
+ console.log("original:\t", textRosetta);
+ let encoded = encrypt(textRosetta, encryptMap, decryptMap);
+ console.log("encoded:\t", encoded);
+ let decoded = decrypt(encoded, encryptMap, decryptMap);
+ console.log("and back:\t", decoded);
+
+ // Test with Wikipedia square
+ ({ encryptMap, decryptMap } = squareToMaps(squareWikipedia));
+
+ console.log("\nFrom Wikipedia");
+ console.log("original:\t", textWikipedia);
+ encoded = encrypt(textWikipedia, encryptMap, decryptMap);
+ console.log("encoded:\t", encoded);
+ decoded = decrypt(encoded, encryptMap, decryptMap);
+ console.log("and back:\t", decoded);
+
+ // Test with longer text
+ console.log("\nFrom Rosetta Code (longer text)");
+ console.log("original:\t", textTest);
+ encoded = encrypt(textTest, encryptMap, decryptMap);
+ console.log("encoded:\t", encoded);
+ // Note: If the text has an odd number of letters, the algorithm doesn't work!
+ decoded = decrypt(encoded, encryptMap, decryptMap);
+ console.log("and back:\t", decoded);
+}
+
+// Run the main function
+main();
diff --git a/Task/Bifid-cipher/Rust/bifid-cipher.rs b/Task/Bifid-cipher/Rust/bifid-cipher.rs
new file mode 100644
index 0000000000..57868d8c09
--- /dev/null
+++ b/Task/Bifid-cipher/Rust/bifid-cipher.rs
@@ -0,0 +1,125 @@
+use std::collections::HashMap;
+
+type Point = (i32, i32);
+
+
+struct Bifid {
+ grid: Vec>,
+ coordinates: HashMap,
+ n: i32,
+}
+
+impl Bifid {
+ pub fn new(n: i32, text: &str) -> Result {
+ if (text.len() as i32) != n * n {
+ return Err("Incorrect length of text".to_string());
+ }
+
+ let mut grid = vec![vec!['\0'; n as usize]; n as usize];
+ let mut coordinates: HashMap = HashMap::new();
+
+ let mut row: i32 = 0;
+ let mut col: i32 = 0;
+
+ for ch in text.chars() {
+ grid[row as usize][col as usize] = ch;
+ coordinates.insert(ch, (row, col));
+
+ col += 1;
+ if col == n {
+ col = 0;
+ row += 1;
+ }
+ }
+
+ if n == 5 {
+ if let Some(&i_coords) = coordinates.get(&'I') {
+ coordinates.insert('J', i_coords);
+ }
+ }
+
+ Ok(Bifid {
+ grid,
+ coordinates,
+ n,
+ })
+ }
+
+ pub fn encrypt(&self, text: &str) -> String {
+ let mut row_one: Vec = Vec::new();
+ let mut row_two: Vec = Vec::new();
+
+ for ch in text.chars() {
+ if let Some(coordinate) = self.coordinates.get(&ch) {
+ row_one.push(coordinate.0);
+ row_two.push(coordinate.1);
+ }
+ }
+
+ row_one.extend(row_two.iter());
+ let mut result = String::new();
+ for i in (0..row_one.len() - 1).step_by(2) {
+ result.push(self.grid[row_one[i] as usize][row_one[i + 1] as usize]);
+ }
+ result
+ }
+
+ pub fn decrypt(&self, text: &str) -> String {
+ let mut row: Vec = Vec::new();
+ for ch in text.chars() {
+ if let Some(coordinate) = self.coordinates.get(&ch) {
+ row.push(coordinate.0);
+ row.push(coordinate.1);
+ }
+ }
+
+ let middle = row.len() / 2;
+ let row_one: Vec = row[..middle].to_vec();
+ let row_two: Vec = row[middle..].to_vec();
+
+ let mut result = String::new();
+ for i in 0..middle {
+ result.push(self.grid[row_one[i] as usize][row_two[i] as usize]);
+ }
+ result
+ }
+
+ pub fn display(&self) {
+ for row in &self.grid {
+ for ch in row {
+ print!("{} ", ch);
+ }
+ println!();
+ }
+ }
+}
+
+fn run_test(bifid: &Bifid, message: &str) {
+ println!("Using Polybius square:");
+ bifid.display();
+ println!("Message: {}", message);
+ let encrypted = bifid.encrypt(message);
+ println!("Encrypted: {}", encrypted);
+ let decrypted = bifid.decrypt(&encrypted);
+ println!("Decrypted: {}", decrypted);
+ println!();
+}
+
+fn main() -> Result<(), String> {
+ let message1 = "ATTACKATDAWN";
+ let message2 = "FLEEATONCE";
+ let message3 = "THEINVASIONWILLSTARTONTHEFIRSTOFJANUARY";
+
+ let bifid1 = Bifid::new(5, "ABCDEFGHIKLMNOPQRSTUVWXYZ")?;
+ let bifid2 = Bifid::new(5, "BGWKZQPNDSIOAXEFCLUMTHYVR")?;
+
+ run_test(&bifid1, message1);
+ run_test(&bifid2, message2);
+ run_test(&bifid2, message1);
+ run_test(&bifid1, message2);
+
+ let bifid3 = Bifid::new(6, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")?;
+ run_test(&bifid3, message3);
+
+ Ok(())
+}
diff --git a/Task/Bin-given-limits/AppleScript/bin-given-limits.applescript b/Task/Bin-given-limits/AppleScript/bin-given-limits.applescript
new file mode 100644
index 0000000000..9d4b93c9c4
--- /dev/null
+++ b/Task/Bin-given-limits/AppleScript/bin-given-limits.applescript
@@ -0,0 +1,42 @@
+property bins : {}
+
+local limits, theData, n, i, p, flag, output
+set limits to {14, 18, 249, 312, 389, 392, 513, 591, 634, 720}
+set theData to {445, 814, 519, 697, 700, 130, 255, 889, 481, 122, 932, 77, 323, 525, 570, 219, 367, 523, 442, 933, ¬
+ 416, 589, 930, 373, 202, 253, 775, 47, 731, 685, 293, 126, 133, 450, 545, 100, 741, 583, 763, 306, ¬
+ 655, 267, 248, 477, 549, 238, 62, 678, 98, 534, 622, 907, 406, 714, 184, 391, 913, 42, 560, 247, ¬
+ 346, 860, 56, 138, 546, 38, 985, 948, 58, 213, 799, 319, 390, 634, 458, 945, 733, 507, 916, 123, ¬
+ 345, 110, 720, 917, 313, 845, 426, 9, 457, 628, 410, 723, 354, 895, 881, 953, 677, 137, 397, 97, ¬
+ 854, 740, 83, 216, 421, 94, 517, 479, 292, 963, 376, 981, 480, 39, 257, 272, 157, 5, 316, 395, ¬
+ 787, 942, 456, 242, 759, 898, 576, 67, 298, 425, 894, 435, 831, 241, 989, 614, 987, 770, 384, 692, ¬
+ 698, 765, 331, 487, 251, 600, 879, 342, 982, 527, 736, 795, 585, 40, 54, 901, 408, 359, 577, 237, ¬
+ 605, 847, 353, 968, 832, 205, 838, 427, 876, 959, 686, 646, 835, 127, 621, 892, 443, 198, 988, 791, ¬
+ 466, 23, 707, 467, 33, 670, 921, 180, 991, 396, 160, 436, 717, 918, 8, 374, 101, 684, 727, 749}
+
+repeat (count limits) + 1 times
+ set end of bins to 0
+end repeat
+
+repeat with n in theData
+ set flag to false
+ repeat with i from 1 to count limits
+ if n < item i of limits then
+ set flag to true
+ exit repeat
+ end if
+ end repeat
+ if flag then
+ set item i of bins to (item i of bins) + 1
+ else
+ set item -1 of bins to (item -1 of bins) + 1
+ end if
+end repeat
+set p to item 1 of limits
+set output to "< " & p & " := " & (item 1 of bins) & linefeed
+repeat with i from 2 to count limits
+ set n to item i of limits
+ set output to output & ">= " & p & " .. < " & n & " := " & (item i of bins) & linefeed
+ set p to n
+end repeat
+set output to output & ">= " & p & " := " & (item -1 of bins)
+get output
diff --git a/Task/Bin-given-limits/Crystal/bin-given-limits.cr b/Task/Bin-given-limits/Crystal/bin-given-limits.cr
new file mode 100644
index 0000000000..84f3d18ad5
--- /dev/null
+++ b/Task/Bin-given-limits/Crystal/bin-given-limits.cr
@@ -0,0 +1,43 @@
+def bin (limits, seq)
+ bins = Array.new limits.size+1, 0
+ seq.each do |v|
+ bins[limits.bsearch_index {|l, _| v < l } || -1] += 1
+ end
+ bins
+end
+
+def print_bins (limits, bins)
+ limit_width = limits.values_at(0, -1).map(&.to_s.size).max
+ tally_width = bins.max.to_s.size
+ bins.each_with_index do |n, i|
+ left = if i > 0; limits[i-1] end
+ right = if i < limits.size; limits[i] end
+ printf "%*s %s n %s %*s ⇒ %*s\n",
+ limit_width, left, left ? "≤" : " ",
+ right ? "<" : " ", limit_width, right,
+ tally_width, n
+ end
+end
+
+limits = [23, 37, 43, 53, 67, 83]
+data = [95,21,94,12,99,4,70,75,83,93,52,80,57,5,53,86,65,17,92,83,71,61,54,58,47,
+ 16, 8, 9,32,84,7,87,46,19,30,37,96,6,98,40,79,97,45,64,60,29,49,36,43,55]
+
+puts "P. 1"
+print_bins(limits, bin(limits, data))
+puts
+
+limits = [14, 18, 249, 312, 389, 392, 513, 591, 634, 720]
+data = [445,814,519,697,700,130,255,889,481,122,932, 77,323,525,570,219,367,523,442,933,
+ 416,589,930,373,202,253,775, 47,731,685,293,126,133,450,545,100,741,583,763,306,
+ 655,267,248,477,549,238, 62,678, 98,534,622,907,406,714,184,391,913, 42,560,247,
+ 346,860, 56,138,546, 38,985,948, 58,213,799,319,390,634,458,945,733,507,916,123,
+ 345,110,720,917,313,845,426, 9,457,628,410,723,354,895,881,953,677,137,397, 97,
+ 854,740, 83,216,421, 94,517,479,292,963,376,981,480, 39,257,272,157, 5,316,395,
+ 787,942,456,242,759,898,576, 67,298,425,894,435,831,241,989,614,987,770,384,692,
+ 698,765,331,487,251,600,879,342,982,527,736,795,585, 40, 54,901,408,359,577,237,
+ 605,847,353,968,832,205,838,427,876,959,686,646,835,127,621,892,443,198,988,791,
+ 466, 23,707,467, 33,670,921,180,991,396,160,436,717,918, 8,374,101,684,727,749]
+
+puts "P. 2"
+print_bins(limits, bin(limits, data))
diff --git a/Task/Bin-given-limits/EasyLang/bin-given-limits.easy b/Task/Bin-given-limits/EasyLang/bin-given-limits.easy
index 77d034ea2e..534a7c72d0 100644
--- a/Task/Bin-given-limits/EasyLang/bin-given-limits.easy
+++ b/Task/Bin-given-limits/EasyLang/bin-given-limits.easy
@@ -1,13 +1,10 @@
global limits[] data[] .
#
-proc count . .
+proc count .
len cnt[] len limits[] + 1
- #
for e in data[]
for i to len limits[]
- if e < limits[i]
- break 1
- .
+ if e < limits[i] : break 1
.
cnt[i] += 1
.
diff --git a/Task/Bin-given-limits/XPL0/bin-given-limits.xpl0 b/Task/Bin-given-limits/XPL0/bin-given-limits.xpl0
new file mode 100644
index 0000000000..ad0d939e9f
--- /dev/null
+++ b/Task/Bin-given-limits/XPL0/bin-given-limits.xpl0
@@ -0,0 +1,60 @@
+include xpllib; \for Print
+int Bin(10+1);
+def Marker = 0;
+
+proc PrintBins(Limits, Len);
+int Limits, Len;
+int I;
+[Print(" < %3d:%3d\n", Limits(0), Bin(0));
+for I:= 1 to Len-1 do
+ Print(">= %3d and < %3d:%3d\n", Limits(I-1), Limits(I), Bin(I));
+Print(">= %3d :%3d\n", Limits(Len-1), Bin(Len));
+];
+
+proc TallyBins(Limits, Len, Data);
+int Limits, Len, Data;
+int I, J, D;
+[for I:= 0 to Len do
+ Bin(I):= 0;
+I:= 0;
+loop [D:= Data(I);
+ if D = Marker then quit;
+ I:= I+1;
+ for J:= 0 to Len-1 do \for each limit
+ if D < Limits(J) then
+ [Bin(J):= Bin(J)+1;
+ J:= Len; \exit for loop with J = Len+1
+ ];
+ if J = Len then \>= last limit
+ Bin(J):= Bin(J)+1;
+ ];
+];
+
+int Limits, Data;
+[Limits:= [23, 37, 43, 53, 67, 83];
+Data:= [95, 21, 94, 12, 99, 4, 70, 75, 83, 93, 52, 80, 57,
+ 5, 53, 86, 65, 17, 92, 83, 71, 61, 54, 58, 47, 16,
+ 8, 9, 32, 84, 7, 87, 46, 19, 30, 37, 96, 6, 98,
+ 40, 79, 97, 45, 64, 60, 29, 49, 36, 43, 55, Marker];
+TallyBins(Limits, 6, Data);
+PrintBins(Limits, 6);
+CrLf(0);
+Limits:= [14, 18, 249, 312, 389, 392, 513, 591, 634, 720];
+Data:= [445, 814, 519, 697, 700, 130, 255, 889, 481, 122, 932, 77, 323, 525,
+ 570, 219, 367, 523, 442, 933, 416, 589, 930, 373, 202, 253, 775, 47,
+ 731, 685, 293, 126, 133, 450, 545, 100, 741, 583, 763, 306, 655, 267,
+ 248, 477, 549, 238, 62, 678, 98, 534, 622, 907, 406, 714, 184, 391,
+ 913, 42, 560, 247, 346, 860, 56, 138, 546, 38, 985, 948, 58, 213,
+ 799, 319, 390, 634, 458, 945, 733, 507, 916, 123, 345, 110, 720, 917,
+ 313, 845, 426, 9, 457, 628, 410, 723, 354, 895, 881, 953, 677, 137,
+ 397, 97, 854, 740, 83, 216, 421, 94, 517, 479, 292, 963, 376, 981,
+ 480, 39, 257, 272, 157, 5, 316, 395, 787, 942, 456, 242, 759, 898,
+ 576, 67, 298, 425, 894, 435, 831, 241, 989, 614, 987, 770, 384, 692,
+ 698, 765, 331, 487, 251, 600, 879, 342, 982, 527, 736, 795, 585, 40,
+ 54, 901, 408, 359, 577, 237, 605, 847, 353, 968, 832, 205, 838, 427,
+ 876, 959, 686, 646, 835, 127, 621, 892, 443, 198, 988, 791, 466, 23,
+ 707, 467, 33, 670, 921, 180, 991, 396, 160, 436, 717, 918, 8, 374,
+ 101, 684, 727, 749, Marker];
+TallyBins(Limits, 10, Data);
+PrintBins(Limits, 10);
+]
diff --git a/Task/Binary-digits/C3/binary-digits.c3 b/Task/Binary-digits/C3/binary-digits.c3
new file mode 100644
index 0000000000..9b4073dfff
--- /dev/null
+++ b/Task/Binary-digits/C3/binary-digits.c3
@@ -0,0 +1,8 @@
+import std::io;
+fn void main()
+{
+ io::printfn("%b", 0);
+ io::printfn("%b", 5);
+ io::printfn("%b", 50);
+ io::printfn("%b", 5000);
+}
diff --git a/Task/Binary-digits/EasyLang/binary-digits.easy b/Task/Binary-digits/EasyLang/binary-digits.easy
index 471ba50912..222c41fe5e 100644
--- a/Task/Binary-digits/EasyLang/binary-digits.easy
+++ b/Task/Binary-digits/EasyLang/binary-digits.easy
@@ -1,10 +1,8 @@
func$ bin num .
- while num > 1
- b$ = num mod 2 & b$
- num = num div 2
- .
- return num & b$
+ if num <= 1 : return num
+ return bin (num div 2) & num mod 2
.
+print bin 0
print bin 5
print bin 50
print bin 9000
diff --git a/Task/Binary-search/EasyLang/binary-search.easy b/Task/Binary-search/EasyLang/binary-search.easy
index c9318c5647..243fd82cfb 100644
--- a/Task/Binary-search/EasyLang/binary-search.easy
+++ b/Task/Binary-search/EasyLang/binary-search.easy
@@ -1,18 +1,17 @@
-proc binSearch val . a[] res .
+func binSearch &a[] val .
low = 1
high = len a[]
- res = 0
- while low <= high and res = 0
+ while low <= high
mid = (low + high) div 2
if a[mid] > val
high = mid - 1
elif a[mid] < val
low = mid + 1
else
- res = mid
+ return mid
.
.
+ return 0
.
a[] = [ 2 4 6 8 9 ]
-binSearch 8 a[] r
-print r
+print binSearch a[] 8
diff --git a/Task/Bioinformatics-Global-alignment/FreeBASIC/bioinformatics-global-alignment.basic b/Task/Bioinformatics-Global-alignment/FreeBASIC/bioinformatics-global-alignment.basic
new file mode 100644
index 0000000000..5b43c15039
--- /dev/null
+++ b/Task/Bioinformatics-Global-alignment/FreeBASIC/bioinformatics-global-alignment.basic
@@ -0,0 +1,170 @@
+' Nucleotides
+Dim Shared As Integer A, C, G, T, Total
+
+Sub PrintReport(text As String)
+ A = 0 : C = 0 : G = 0 : T = 0
+ For i As Integer = 1 To Len(text)
+ Select Case Ucase(Mid(text, i, 1))
+ Case "A": A += 1
+ Case "C": C += 1
+ Case "G": G += 1
+ Case "T": T += 1
+ End Select
+ Next
+ Total = Len(text)
+
+ Print "Nucleotide counts for: "; Iif(Len(text) > 50, Chr(10), "");
+ Print text
+ Print "Bases: A"; A; ", C:"; C; ", G:"; G; ", T:"; T; ", total:"; Total
+ Print
+End Sub
+
+Function Concatenate(before As String, after As String) As String
+ For i As Integer = 1 To Len(before)
+ Dim As String suffix = Mid(before, i)
+ If Left(after, Len(suffix)) = suffix Then Return Left(before, i - 1) + after
+ Next
+ Return before + after
+End Function
+
+' Remove duplicates and strings contained within a larger string from a list of strings
+Sub Deduplicate(list() As String, result() As String)
+ Dim As Integer i, j
+ ' Remove duplicates
+ Dim As String unique(0 To Ubound(list))
+ Dim As Integer uniqueCount = 0
+ For i = 0 To Ubound(list)
+ Dim As Boolean exists = False
+ For j = 0 To uniqueCount - 1
+ If list(i) = unique(j) Then exists = True : Exit For
+ Next
+ If Not exists Then
+ unique(uniqueCount) = list(i)
+ uniqueCount += 1
+ End If
+ Next
+
+ ' Remove substrings
+ Dim As String tempRes(0 To uniqueCount - 1)
+ Dim As Integer resCount = 0
+ For i = 0 To uniqueCount - 1
+ Dim As Boolean isSubstring = False
+ For j = 0 To uniqueCount - 1
+ If i <> j And Instr(unique(j), unique(i)) > 0 Then
+ isSubstring = True
+ Exit For
+ End If
+ Next
+ If Not isSubstring Then
+ tempRes(resCount) = unique(i)
+ resCount += 1
+ End If
+ Next
+
+ Redim result(0 To resCount - 1)
+ For i = 0 To resCount - 1
+ result(i) = tempRes(i)
+ Next
+End Sub
+
+' Gets all permutations of a list of strings
+Sub ProcessPermutation(perm() As String, result() As String, Byref minLength As Integer)
+ Dim As String candidate = perm(0)
+ For i As Integer = 1 To Ubound(perm)
+ candidate = Concatenate(candidate, perm(i))
+ Next
+
+ If Len(candidate) < minLength Then
+ Erase result
+ Redim result(0)
+ result(0) = candidate
+ minLength = Len(candidate)
+ Elseif Len(candidate) = minLength Then
+ Dim As Boolean exists = False
+ For s As Integer = 0 To Ubound(result)
+ If result(s) = candidate Then exists = True : Exit For
+ Next
+ If Not exists Then
+ Redim Preserve result(0 To Ubound(result) + 1)
+ result(Ubound(result)) = candidate
+ End If
+ End If
+End Sub
+
+' Returns shortest common superstring of a list of strings
+Sub ShortestCommonSuperstrings(list() As String, result() As String)
+ Dim As String deduplicated()
+ Deduplicate(list(), deduplicated())
+ If Ubound(deduplicated) < 0 Then Exit Sub
+
+ Dim As Integer i, j, minLength = 0
+ For i = 0 To Ubound(list)
+ minLength += Len(list(i))
+ Next
+
+ Dim As Integer n = Ubound(deduplicated) + 1
+ Dim As Integer indexes(n - 1)
+ Dim As String currentPerm(n - 1)
+
+ For i = 0 To n - 1
+ indexes(i) = 0
+ currentPerm(i) = deduplicated(i)
+ Next
+
+ ProcessPermutation(currentPerm(), result(), minLength)
+
+ i = 0
+ While i < n
+ If indexes(i) < i Then
+ j = Iif(i Mod 2 = 0, 0, indexes(i))
+ Swap currentPerm(j), currentPerm(i)
+
+ ProcessPermutation(currentPerm(), result(), minLength)
+
+ indexes(i) += 1
+ i = 0
+ Else
+ indexes(i) = 0
+ i += 1
+ End If
+ Wend
+End Sub
+
+' Test cases
+Dim As String test_sequences(0 To 3, 0 To 12) = { _
+{"TA", "AAG", "TA", "GAA", "TA", "", "", "", "", "", "", "", ""}, _
+{"CATTAGGG", "ATTAG", "GGG", "TA", "", "", "", "", "", "", "", "", ""}, _
+{"AAGAUGGA", "GGAGCGCAUC", "AUCGCAAUAAGGA", "", "", "", "", "", "", "", "", "", ""}, _
+{ "ATGAAATGGATGTTCTGAGTTGGTCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTAT", _
+"GGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATCGAACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGT", _
+"CTATGTTCTTATGAAATGGATGTTCTGAGTTGGTCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTATA", _
+"TGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATC", _
+"AACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTT", _
+"GCGCATCGAACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTC", _
+"CGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTTCGATTCTGCTTATAACACTATGTTCT", _
+"TGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATC", _
+"CGTAAAAAATTACAACGTCCTTTGGCTATCTCTTAAACTCCTGCTAAATGCTCGTGC", _
+"GATGGAGCGCATCGAACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTTCGATT", _
+"TTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATC", _
+"CTATGTTCTTATGAAATGGATGTTCTGAGTTGGTCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTATA", _
+"TCTCTTAAACTCCTGCTAAATGCTCGTGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGA" } _
+}
+
+For i As Integer = 0 To 3
+ Dim As String test_case()
+ For j As Integer = 0 To 12
+ If Len(test_sequences(i, j)) > 0 Then
+ Redim Preserve test_case(Ubound(test_case) + 1)
+ test_case(Ubound(test_case)) = test_sequences(i, j)
+ End If
+ Next
+
+ Dim As String superstrings()
+ ShortestCommonSuperstrings(test_case(), superstrings())
+
+ For s As Integer = 0 To Ubound(superstrings)
+ PrintReport(superstrings(s))
+ Next
+Next
+
+Sleep
diff --git a/Task/Bioinformatics-Global-alignment/Rust/bioinformatics-global-alignment.rs b/Task/Bioinformatics-Global-alignment/Rust/bioinformatics-global-alignment.rs
new file mode 100644
index 0000000000..a33f50c14a
--- /dev/null
+++ b/Task/Bioinformatics-Global-alignment/Rust/bioinformatics-global-alignment.rs
@@ -0,0 +1,132 @@
+use std::collections::{HashMap, HashSet};
+
+// Print a report of the given string to the standard output device.
+fn print_report(text: &str) {
+ let mut bases: HashMap = HashMap::new();
+ for ch in text.chars() {
+ *bases.entry(ch).or_insert(0) += 1;
+ }
+
+ let total: i32 = bases.values().sum();
+
+ println!("Nucleotide counts for: {}", if text.len() > 50 { "\n" } else { "" });
+ println!("{}", text);
+ println!("Bases: A {}, C: {}, G: {}, T: {}, total: {}\n",
+ bases.get(&'A').unwrap_or(&0),
+ bases.get(&'C').unwrap_or(&0),
+ bases.get(&'G').unwrap_or(&0),
+ bases.get(&'T').unwrap_or(&0),
+ total);
+}
+
+// Return all permutations of the given list of strings.
+fn permutations(list: &mut Vec) -> Vec> {
+ let mut indexes: Vec = vec![0; list.len()];
+ let mut result: Vec> = Vec::new();
+ result.push(list.clone());
+ let mut i = 0;
+ while i < list.len() {
+ if indexes[i] < i as i32 {
+ let j = if i % 2 == 0 { 0 } else { indexes[i] as usize };
+ list.swap(i, j);
+ result.push(list.clone());
+ indexes[i] += 1;
+ i = 0;
+ } else {
+ indexes[i] = 0;
+ i += 1;
+ }
+ }
+ result
+}
+
+// Return 'before' concatenated with 'after', removing the longest suffix of 'before' that matches a prefix of 'after'.
+fn concatenate(before: &str, after: &str) -> String {
+ for i in 0..before.len() {
+ let suffix = &before[i..];
+ if after.starts_with(suffix) {
+ return format!("{}{}", &before[0..i], after);
+ }
+ }
+ format!("{}{}", before, after)
+}
+
+// Remove duplicate strings and strings which are substrings of other strings in the given list.
+fn deduplicate(list: &[String]) -> Vec {
+ let mut singletons = list.to_vec();
+ singletons.sort();
+ singletons.dedup();
+
+ let result = singletons.clone();
+ let mut marked_for_removal: HashSet = HashSet::new();
+
+ for test_word in &result {
+ for word in &singletons {
+ if word != test_word && word.contains(test_word) {
+ marked_for_removal.insert(test_word.clone());
+ }
+ }
+ }
+
+ result.into_iter().filter(|word| !marked_for_removal.contains(word)).collect()
+}
+
+// Return a set containing all of the shortest common superstrings of the given list of strings.
+fn shortest_common_superstrings(list: &[String]) -> HashSet {
+ let deduplicated = deduplicate(list);
+ let mut deduplicated_mut = deduplicated.clone();
+
+ let mut shortest: HashSet = HashSet::new();
+ let mut joined = String::new();
+ for word in list {
+ joined.push_str(word);
+ }
+ shortest.insert(joined);
+
+ let mut shortest_length = list.iter().map(|s| s.len()).sum();
+
+ for permutation in permutations(&mut deduplicated_mut) {
+ let mut candidate = String::new();
+ for word in permutation {
+ candidate = concatenate(&candidate, &word);
+ }
+
+ if candidate.len() < shortest_length {
+ shortest.clear();
+ shortest_length = candidate.len();
+ shortest.insert(candidate);
+ } else if candidate.len() == shortest_length {
+ shortest.insert(candidate);
+ }
+ }
+ shortest
+}
+
+fn main() {
+ let test_sequences: Vec> = vec![
+ vec!["TA".to_string(), "AAG".to_string(), "TA".to_string(), "GAA".to_string(), "TA".to_string()],
+ vec!["CATTAGGG".to_string(), "ATTAG".to_string(), "GGG".to_string(), "TA".to_string()],
+ vec!["AAGAUGGA".to_string(), "GGAGCGCAUC".to_string(), "AUCGCAAUAAGGA".to_string()],
+ vec![
+ "ATGAAATGGATGTTCTGAGTTGGTCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTAT".to_string(),
+ "GGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATCGAACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGT".to_string(),
+ "CTATGTTCTTATGAAATGGATGTTCTGAGTTGGTCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTATA".to_string(),
+ "TGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATC".to_string(),
+ "AACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTT".to_string(),
+ "GCGCATCGAACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTC".to_string(),
+ "CGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTTCGATTCTGCTTATAACACTATGTTCT".to_string(),
+ "TGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATC".to_string(),
+ "CGTAAAAAATTACAACGTCCTTTGGCTATCTCTTAAACTCCTGCTAAATGCTCGTGC".to_string(),
+ "GATGGAGCGCATCGAACGCAATAAGGATCATTTGATGGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTTCGATT".to_string(),
+ "TTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGATGGAGCGCATC".to_string(),
+ "CTATGTTCTTATGAAATGGATGTTCTGAGTTGGTCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTATA".to_string(),
+ "TCTCTTAAACTCCTGCTAAATGCTCGTGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTGAGGACAAAGGTCAAGA".to_string(),
+ ],
+ ];
+
+ for test in test_sequences {
+ for superstring in shortest_common_superstrings(&test) {
+ print_report(&superstring);
+ }
+ }
+}
diff --git a/Task/Bioinformatics-Sequence-mutation/EasyLang/bioinformatics-sequence-mutation.easy b/Task/Bioinformatics-Sequence-mutation/EasyLang/bioinformatics-sequence-mutation.easy
index a2743b199b..5ff9a347ef 100644
--- a/Task/Bioinformatics-Sequence-mutation/EasyLang/bioinformatics-sequence-mutation.easy
+++ b/Task/Bioinformatics-Sequence-mutation/EasyLang/bioinformatics-sequence-mutation.easy
@@ -1,21 +1,15 @@
base$[] = [ "A" "C" "T" "G" ]
global seq[] seqnx[] seqpr[] .
-proc prseq . .
+proc prseq .
len cnt[] 4
- numfmt 0 3
+ numfmt 3 0
ind = 1
while seqnx[ind] <> 1
pos += 1
ind = seqnx[ind]
- if pos mod 40 = 1
- print ""
- .
- if pos mod 40 = 1
- write pos & ":"
- .
- if pos mod 4 = 1
- write " "
- .
+ if pos mod 40 = 1 : print ""
+ if pos mod 40 = 1 : write pos & ":"
+ if pos mod 4 = 1 : write " "
cnt[seq[ind]] += 1
write base$[seq[ind]]
.
@@ -29,7 +23,7 @@ proc prseq . .
print " " & sum
print ""
.
-proc init . .
+proc init .
seq[] = [ 0 ]
seqnx[] = [ 2 ]
seqpr[] = [ 0 ]
@@ -41,7 +35,7 @@ proc init . .
seqpr[1] = len seq[]
seqnx[$] = 1
.
-proc delete pos . .
+proc delete pos .
nx = seqnx[pos]
pre = seqpr[pos]
seqnx[pre] = nx
@@ -56,7 +50,7 @@ proc delete pos . .
len seqnx[] -1
len seqpr[] -1
.
-proc insert pos . .
+proc insert pos .
seq[] &= random 4
last = len seq[]
seqnx[] &= pos
@@ -64,7 +58,7 @@ proc insert pos . .
seqnx[seqpr[pos]] = last
seqpr[pos] = last
.
-proc mutate . .
+proc mutate .
op = random 3
pos = random (len seq[] - 1) + 1
if op = 1
@@ -78,8 +72,6 @@ proc mutate . .
init
print "Original:"
prseq
-for i to 10
- mutate
-.
+for i to 10 : mutate
print "Mutated:"
prseq
diff --git a/Task/Bioinformatics-base-count/EasyLang/bioinformatics-base-count.easy b/Task/Bioinformatics-base-count/EasyLang/bioinformatics-base-count.easy
index d7c2cc2230..8e535a0e24 100644
--- a/Task/Bioinformatics-base-count/EasyLang/bioinformatics-base-count.easy
+++ b/Task/Bioinformatics-base-count/EasyLang/bioinformatics-base-count.easy
@@ -1,20 +1,14 @@
len d[] 26
pos = 1
-numfmt 0 4
+numfmt 4 0
repeat
s$ = input
until s$ = ""
for c$ in strchars s$
- if pos mod 40 = 1
- write pos & ":"
- .
- if pos mod 4 = 1
- write " "
- .
+ if pos mod 40 = 1 : write pos & ":"
+ if pos mod 4 = 1 : write " "
write c$
- if pos mod 40 = 0
- print ""
- .
+ if pos mod 40 = 0 : print ""
pos += 1
c = strcode c$
d[c - 64] += 1
diff --git a/Task/Bioinformatics-base-count/Uxntal/bioinformatics-base-count.uxnatl b/Task/Bioinformatics-base-count/Uxntal/bioinformatics-base-count.uxnatl
new file mode 100644
index 0000000000..c40f9b70d9
--- /dev/null
+++ b/Task/Bioinformatics-base-count/Uxntal/bioinformatics-base-count.uxnatl
@@ -0,0 +1,80 @@
+%\n { 0a } %\s { 20 } %\0 { 00 }
+%newline { [ LIT2 \n -Console/write ] DEO }
+
+|18 @Console/write
+
+|100
+
+;data base-count
+
+BRK
+
+@base-count ( data* -- )
+ LDAk
+ DUP #0a NEQ ?{ !/next }
+ DUP [ LIT "A ] NEQ ?{
+ [ LIT2 &adenine $2 ] INC2 ,/adenine STR2 !/resume }
+ DUP [ LIT "C ] NEQ ?{
+ [ LIT2 &cytosine $2 ] INC2 ,/cytosine STR2 !/resume }
+ DUP [ LIT "G ] NEQ ?{
+ [ LIT2 &guanine $2 ] INC2 ,/guanine STR2 !/resume }
+ DUP [ LIT "T ] NEQ ?{
+ [ LIT2 &thymine $2 ] INC2 ,/thymine STR2 }
+
+ &resume
+ [ LIT2 &total $2 ] INC2 ,/total STR2
+
+ &next
+ POP
+ INC2 LDAk ?base-count
+
+ POP2
+
+ ;msgs/sequence print/str
+ ;data print/str
+ ;msgs/header print/str
+ ;msgs/adenine print/str ,/adenine LDR2 print/dec newline
+ ;msgs/cytosine print/str ,/cytosine LDR2 print/dec newline
+ ;msgs/guanine print/str ,/guanine LDR2 print/dec newline
+ ;msgs/thymine print/str ,/thymine LDR2 print/dec newline
+ ;msgs/total print/str ,/total LDR2 print/dec newline
+
+ JMP2r
+
+@print/str ( str* -- )
+ LDAk .Console/write DEO
+ INC2 LDAk ?/str
+ POP2 JMP2r
+
+@print/dec ( short* -- )
+ #000a SWP2 [ LITr ff ]
+
+ &dec/get
+ SWP2k DIV2k MUL2 SUB2 STH
+ POP OVR2 DIV2 ORAk ?/dec/get
+ POP2 POP2
+
+ &dec/put
+ STHr INCk ?{ POP JMP2r }
+ [ LIT "0 ] ADD .Console/write DEO !/dec/put
+
+@data [
+ "CGTAAAAAATTACAACGTCCTTTGG "CTATCTCTTAAACTCCTGCTAAATG \n
+ "CTCGTGCTTTCCAATTATGTAAGCG "TTCCGAGACGGGGTGGTCGATTCTG \n
+ "AGGACAAAGGTCAAGATGGAGCGCA "TCGAACGCAATAAGGATCATTTGAT \n
+ "GGGACGTTTCGTCGACAAAGTCTTG "TTTCGAGAGTAACGGCTACCGTCTT \n
+ "CGATTCTGCTTATAACACTATGTTC "TTATGAAATGGATGTTCTGAGTTGG \n
+ "TCAGTCCCAATGTGCGGGGTTTCTT "TTAGTACGTCGGGAGTGGTATTATA \n
+ "TTTAATTTTTCTATATAGCGATCTG "TATTTAAGCAATTCATTTAGGTTAT \n
+ "CGCCGCGATGCTCGGTTCGGACCGC "CAAGCATCTGGCTCCACTGCTAGTG \n
+ "TCCTAAATTTGAATGGCAAACACAA "ATAAGATTTAGCAATTCGTGTAGAC \n
+ "GACCGGGGACTTGCATGATGGGAGC "AGCTTTGTTAAACTACGAACGTAAT \n \0 ]
+
+@msgs [
+ &header \n "BASE \s "COUNT: \n \0
+ &sequence "SEQUENCE: \n \0
+ &adenine \s \s \s "Adenine: \s \0
+ &cytosine \s \s "Cytosine: \s \0
+ &guanine \s \s \s "Guanine: \s \0
+ &thymine \s \s \s "Thymine: \s \0
+ &total \s \s \s \s \s "Total: \s \0 ]
diff --git a/Task/Biorhythms/EasyLang/biorhythms.easy b/Task/Biorhythms/EasyLang/biorhythms.easy
index ebb822d591..8f9bf9a6c9 100644
--- a/Task/Biorhythms/EasyLang/biorhythms.easy
+++ b/Task/Biorhythms/EasyLang/biorhythms.easy
@@ -8,35 +8,29 @@ func day d$ .
d = number substr d$ 9 2
return 367 * y - 7 * (y + (m + 9) div 12) div 4 + 275 * m div 9 + d - 730530
.
-textsize 4
+gtextsize 4
func init b$ d$ .
- linewidth 0.2
- move 50 0
- line 50 100
- move 0 50
- line 100 50
+ glinewidth 0.2
+ gline 50 0 50 100
+ gline 0 50 100 50
for d = -20 to 20
- move x 50
- circle 0.5
+ gcircle x 50 0.5
x += 2.5
.
- move 4 94
- text b$
- move 4 88
- text d$
+ gtext 4 94 b$
+ gtext 4 88 d$
days = day date$ - day birth$
- move 4 80
- text days & " days"
+ gtext 4 80 days & " days"
return days
.
-proc cycle now cyc t$ col . .
- color col
- move 4 cyc * 1.2 - 20
- text t$
- linewidth 0.5
+proc cycle now cyc t$ col .
+ gcolor col
+ gtext 4 cyc * 1.2 - 20 t$
+ glinewidth 0.5
for d = now - 20 to now + 20
- p = 20 * sin (360 * d / cyc)
- line x 50 + p
+ yp = y
+ y = 50 + 20 * sin (360 * d / cyc)
+ if x > 0 : gline (x - 2.5) yp x y
x += 2.5
.
.
diff --git a/Task/Bitcoin-address-validation/JavaScript/bitcoin-address-validation.js b/Task/Bitcoin-address-validation/JavaScript/bitcoin-address-validation.js
new file mode 100644
index 0000000000..c53ff79496
--- /dev/null
+++ b/Task/Bitcoin-address-validation/JavaScript/bitcoin-address-validation.js
@@ -0,0 +1,53 @@
+const digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
+
+async function hash(bytes) {
+ return new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));
+}
+
+function toBytes(n, length) {
+ const bytes = [];
+
+ for (let i = BigInt(length)-1n; i >= 0; i--) {
+ bytes.push((n >> i * 8n) & 0xffn);
+ }
+
+ return bytes;
+}
+
+function decode_base58(bc, length) {
+ let n = 0n;
+ for (const char of bc) {
+ n = n * 58n + BigInt(digits58.indexOf(char));
+ }
+
+ return toBytes(n, length);
+}
+
+function toUint8Array(bytes) {
+ let nums = []
+
+ for (const byte of bytes) {
+ nums.push(Number(byte));
+ }
+
+ return new Uint8Array(nums);
+}
+
+async function checkBc(bc) {
+ const bcbytes = decode_base58(bc, 25);
+
+ const slice = bcbytes.slice(0, bcbytes.length-4);
+ const first = toUint8Array(slice);
+
+ const firstHash = await hash(first);
+ const secondHash = await hash(firstHash);
+
+ const checksum = toUint8Array(bcbytes.slice(-4));
+
+ return JSON.stringify(checksum) == JSON.stringify(toUint8Array(secondHash.slice(0, 4)));
+}
+
+(async () => {
+ console.log(await checkBc('1AGNa15ZQXAZUgFiqJ3i7Z2DPU2J6hW62i'));
+ console.log(await checkBc("17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j"))
+})();
diff --git a/Task/Bitmap-B-zier-curves-Quadratic/EasyLang/bitmap-b-zier-curves-quadratic.easy b/Task/Bitmap-B-zier-curves-Quadratic/EasyLang/bitmap-b-zier-curves-quadratic.easy
index 2edb8d1510..3aaf5eda4f 100644
--- a/Task/Bitmap-B-zier-curves-Quadratic/EasyLang/bitmap-b-zier-curves-quadratic.easy
+++ b/Task/Bitmap-B-zier-curves-Quadratic/EasyLang/bitmap-b-zier-curves-quadratic.easy
@@ -1,19 +1,18 @@
-proc quadraticbezier x1 y1 x2 y2 x3 y3 nseg . .
+sysconf topleft
+proc quadraticbezier x1 y1 x2 y2 x3 y3 nseg .
for i = 0 to nseg
t = i / nseg
t1 = 1 - t
a = t1 * t1
b = 2 * t * t1
c = t * t
- currx = a * x1 + b * x2 + c * x3 + 0.5
- curry = a * y1 + b * y2 + c * y3 + 0.5
- if i = 0
- move currx curry
- else
- line currx curry
- .
+ px = x
+ py = y
+ x = a * x1 + b * x2 + c * x3 + 0.5
+ y = a * y1 + b * y2 + c * y3 + 0.5
+ if i > 0 : gline px py x y
.
.
-linewidth 0.5
-clear
+glinewidth 0.5
+gclear
quadraticbezier 1 1 30 37 59 1 100
diff --git a/Task/Bitmap-Bresenhams-line-algorithm/EasyLang/bitmap-bresenhams-line-algorithm.easy b/Task/Bitmap-Bresenhams-line-algorithm/EasyLang/bitmap-bresenhams-line-algorithm.easy
index 536d330933..b0a250c7ec 100644
--- a/Task/Bitmap-Bresenhams-line-algorithm/EasyLang/bitmap-bresenhams-line-algorithm.easy
+++ b/Task/Bitmap-Bresenhams-line-algorithm/EasyLang/bitmap-bresenhams-line-algorithm.easy
@@ -1,8 +1,7 @@
-proc pset x y . .
- move x / 4 y / 4
- rect 0.25 0.25
+proc pset x y .
+ grect x / 4 y / 4 0.25 0.25
.
-proc drawline x0 y0 x1 y1 . .
+proc drawline x0 y0 x1 y1 .
dx = abs (x1 - x0)
sx = -1
if x0 < x1
diff --git a/Task/Bitwise-operations/Uxntal/bitwise-operations.uxnatl b/Task/Bitwise-operations/Uxntal/bitwise-operations.uxnatl
index 9e4335844f..695abf3123 100644
--- a/Task/Bitwise-operations/Uxntal/bitwise-operations.uxnatl
+++ b/Task/Bitwise-operations/Uxntal/bitwise-operations.uxnatl
@@ -1,67 +1,73 @@
-|00 @System [ &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1 ]
-|10 @Console [ &vector $2 &read $1 &pad $5 &write $1 &error $1 ]
+%\n { 0a } %\s { 20 } %\0 { 00 }
+%newline { [ LIT2 \n -Console/write ] DEO }
+
+%not { #ff EOR }
+%and { AND }
+%or { ORA }
+%xor { EOR }
+%shl { #40 SFT SFT }
+%shr { SFT }
+%rol { #40 SFT #00 ROT ROT SFT2 ORA }
+%ror { SWP #00 ROT SFT2 ORA }
+
+|18 @Console/write
+
+|100
+
+#0a02
+DUP2 SWP ;msgs/a print/arg ;msgs/b print/arg
+bitwise
-( program )
-|0100 @on-reset ( -> )
- #0a02
- DUP2 SWP ;Labels/a ;Labels/b
- bitwise
- halt
BRK
@bitwise ( a b -- )
- ;Labels/not ;Labels/a ;Labels/equ DUP2 [ POP #ff EOR ]
- ;Labels/and DUP2 [ AND ]
- ;Labels/or DUP2 [ ORA ]
- ;Labels/xor DUP2 [ EOR ]
- ;Labels/shl DUP2 [ #40 SFT SFT ]
- ;Labels/shr DUP2 [ SFT ]
- ;Labels/rol DUP2 [ #40 SFT #00 ROT ROT SFT2 ORA ]
- ;Labels/ror [ SWP #00 ROT SFT2 ORA ]
- JMP2r
+ ;msgs/not print/str ;msgs/a print/str
+ ;msgs/equ print/str OVR not print/result
+ ;msgs/and print/label DUP2 and print/result
+ ;msgs/or print/label DUP2 or print/result
+ ;msgs/xor print/label DUP2 xor print/result
+ ;msgs/shl print/label DUP2 shl print/result
+ ;msgs/shr print/label DUP2 shr print/result
+ ;msgs/rol print/label DUP2 rol print/result
+ ;msgs/ror print/label ror !print/result
-@halt ( -- )
- #01 .System/halt DEO
- BRK
+@print/label ( label* -- )
+ ;msgs/a /str
+ /str
+ ;msgs/b /str
+ ;msgs/equ !/str
-@ ( a name* -- )
- ;Labels/equ
- JMP2r
-
-@ ( a -- )
- ;Labels/newline
- JMP2r
-
-@ ( label* -- )
- ;Labels/a
-
- ;Labels/b
- ;Labels/equ
- JMP2r
-
-@ ( byte -- )
+@print/byte ( byte -- )
[ LIT "$ ] .Console/write DEO
- DUP #04 SFT /l
- &l ( -- )
- #0f AND DUP #09 GTH #27 MUL ADD [ LIT "0 ] ADD .Console/write DEO
- JMP2r
+ DUP #04 SFT /nibble
+ ( >> )
+
+@print/nibble ( -- )
+ #0f AND DUP #09 GTH #27 MUL ADD [ LIT "0 ] ADD .Console/write DEO
+ JMP2r
-@ ( str* -- )
- &while ( -- )
- LDAk .Console/write DEO
- INC2 LDAk ?&while
+@print/arg ( a name* -- )
+ /str ;msgs/equ /str
+ ( >> )
+
+@print/result ( a -- )
+ /byte newline
+ JMP2r
+
+@print/str ( str* -- )
+ LDAk .Console/write DEO
+ INC2 LDAk ?/str
POP2 JMP2r
-@Labels
- &a "a 20 $1
- &b "b 20 $1
- &equ "= 20 $1
- &newline 0a $1
- ¬ "NOT 20 $1
- &and "AND 20 $1
- &or "OR 20 $1
- &xor "XOR 20 $1
- &shl "SHL 20 $1
- &shr "SHR 20 $1
- &rol "ROL 20 $1
- &ror "ROR 20 $1
+@msgs [
+ &a "a \s \0
+ &b "b \s \0
+ &equ "= \s \0
+ ¬ "NOT \s \0
+ &and "AND \s \0
+ &or "OR \s \0
+ &xor "XOR \s \0
+ &shl "SHL \s \0
+ &shr "SHR \s \0
+ &rol "ROL \s \0
+ &ror "ROR \s \0 ]
diff --git a/Task/Blum-integer/EasyLang/blum-integer.easy b/Task/Blum-integer/EasyLang/blum-integer.easy
index 7b73286f92..603f83fb51 100644
--- a/Task/Blum-integer/EasyLang/blum-integer.easy
+++ b/Task/Blum-integer/EasyLang/blum-integer.easy
@@ -2,32 +2,27 @@ fastfunc semiprim n .
d = 3
while d * d <= n
while n mod d = 0
- if c = 2
- return 0
- .
+ if c = 2 : return 0
n /= d
c += 1
.
d += 2
.
- if c = 1
- return n
- .
+ if c = 1 : return n
+ return 0
.
print "The first 50 Blum integers:"
n = 3
-numfmt 0 4
+numfmt 4 0
repeat
prim1 = semiprim n
- if prim1 <> 0
- if prim1 mod 4 = 3
- prim2 = n div prim1
- if prim2 <> prim1 and prim2 mod 4 = 3
- c += 1
- if c <= 50
- write n
- if c mod 10 = 0 ; print "" ; .
- .
+ if prim1 <> 0 and prim1 mod 4 = 3
+ prim2 = n div prim1
+ if prim2 <> prim1 and prim2 mod 4 = 3
+ c += 1
+ if c <= 50
+ write n
+ if c mod 10 = 0 : print ""
.
.
.
diff --git a/Task/Blum-integer/Rust/blum-integer.rs b/Task/Blum-integer/Rust/blum-integer.rs
new file mode 100644
index 0000000000..59feb1041f
--- /dev/null
+++ b/Task/Blum-integer/Rust/blum-integer.rs
@@ -0,0 +1,91 @@
+fn is_prime_mod4(n: u32) -> bool {
+ match n {
+ 0..3 => false,
+ _ if n % 2 == 0 => false,
+ _ if n % 3 == 0 => n == 3,
+ _ if n % 4 == 3 => {
+ for d in (5..).step_by(2).take_while(|&d| d * d <= n) {
+ if n % d == 0 {
+ return false;
+ }
+ }
+
+ true
+ }
+ _ => false,
+ }
+}
+
+fn least_prime_factor(n: u32) -> u32 {
+ match n {
+ 1 => 1,
+ _ if n % 3 == 0 => 3,
+ _ if n % 5 == 0 => 5,
+ _ => {
+ for d in (7..).step_by(2).take_while(|&d| d * d <= n) {
+ if n % d == 0 {
+ return d;
+ }
+ }
+
+ n
+ }
+ }
+}
+
+fn blums() -> Blum {
+ Blum { number: 1 }
+}
+
+struct Blum {
+ number: u32,
+}
+
+impl Iterator for Blum {
+ type Item = u32;
+
+ fn next(&mut self) -> Option {
+ loop {
+ let number = self.number;
+ let p = least_prime_factor(number);
+
+ self.number = number.checked_add(if number % 5 == 3 { 4 } else { 2 })?;
+
+ if p % 4 == 3 {
+ let q = number / p;
+
+ if p != q && is_prime_mod4(q) {
+ return Some(number);
+ }
+ }
+ }
+ }
+}
+
+fn main() {
+ println!("First 50 Blum integers:");
+
+ let last_digit_counts = blums()
+ .zip(1..=400_000)
+ .inspect(|&(blum, i)| match i {
+ 1..=50 => print!("{blum:>3}{}", if i % 10 != 0 { " " } else { "\n" }),
+ 51 => println!(),
+ 26_828 | 100_000 | 200_000 | 300_000 | 400_000 => {
+ println!("The {i:>6}th Blum integer is: {blum:>7}");
+ }
+ _ => {}
+ })
+ .fold([0; 10], |mut acc, (blum, _)| {
+ acc[blum as usize % 10] += 1;
+
+ acc
+ });
+
+ println!("\nPercent distribution of the first 400000 Blum integers:");
+ for i in [1, 3, 7, 9] {
+ println!(
+ "\t{:2.3}% end in {i}",
+ last_digit_counts[i] as f64 / 4_000.0
+ );
+ }
+}
diff --git a/Task/Boolean-values/Ballerina/boolean-values.ballerina b/Task/Boolean-values/Ballerina/boolean-values.ballerina
new file mode 100644
index 0000000000..637f05cfc0
--- /dev/null
+++ b/Task/Boolean-values/Ballerina/boolean-values.ballerina
@@ -0,0 +1,12 @@
+import ballerina/io;
+
+public function main() {
+ boolean markova = true;
+ boolean keys = false;
+ if markova {
+ io:println("Alicia Markova was a famous ballerina.");
+ }
+ if !keys {
+ io:println("Alicia Keys is a famous singer.");
+ }
+}
diff --git a/Task/Box-the-compass/EasyLang/box-the-compass.easy b/Task/Box-the-compass/EasyLang/box-the-compass.easy
index 03c6aa33d7..0bb02b538d 100644
--- a/Task/Box-the-compass/EasyLang/box-the-compass.easy
+++ b/Task/Box-the-compass/EasyLang/box-the-compass.easy
@@ -17,7 +17,7 @@ func$ expand cp$ .
h$ = strchar (strcode substr r$ 1 1 - 32)
return h$ & substr r$ 2 999
.
-proc main . .
+proc main .
cp$[] = [ "N" "NbE" "N-NE" "NEbN" "NE" "NEbE" "E-NE" "EbN" "E" "EbS" "E-SE" "SEbE" "SE" "SEbS" "S-SE" "SbE" "S" "SbW" "S-SW" "SWbS" "SW" "SWbW" "W-SW" "WbS" "W" "WbN" "W-NW" "NWbW" "NW" "NWbN" "N-NW" "NbW" ]
print "Index Degrees Compass point"
print "----- ------- -------------"
diff --git a/Task/Box-the-compass/Standard-ML/box-the-compass.ml b/Task/Box-the-compass/Standard-ML/box-the-compass.ml
new file mode 100644
index 0000000000..a523bcd20a
--- /dev/null
+++ b/Task/Box-the-compass/Standard-ML/box-the-compass.ml
@@ -0,0 +1,29 @@
+local
+ val box = Array.fromList [
+ "North", "North by east", "North-northeast", "Northeast by north",
+ "Northeast", "Northeast by east", "East-northeast", "East by north",
+ "East", "East by south", "East-southeast", "Southeast by east",
+ "Southeast", "Southeast by south", "South-southeast", "South by east",
+ "South", "South by west", "South-southwest", "Southwest by south",
+ "Southwest", "Southwest by west", "West-southwest", "West by south",
+ "West", "West by north", "West-northwest", "Northwest by west",
+ "Northwest", "Northwest by north", "North-northwest", "North by west"]
+
+ val phis = Array.fromList [
+ 0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38,
+ 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75, 185.62,
+ 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0,
+ 286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38
+ ]
+in
+val _ = Array.app (fn phi =>
+ let val i = Real.trunc ((phi * 32.0) / 360.0 + 0.5) mod 32
+ in print (StringCvt.padLeft #" " 3 (Int.toString (i+1))
+ ^ " "
+ ^ StringCvt.padLeft #" " 18 (Array.sub (box, i))
+ ^ " "
+ ^ Real.fmt (StringCvt.FIX (SOME 2)) phi
+ ^ "\n")
+ end)
+ phis
+end
diff --git a/Task/Boyer-Moore-string-search/C-sharp/boyer-moore-string-search.cs b/Task/Boyer-Moore-string-search/C-sharp/boyer-moore-string-search.cs
new file mode 100644
index 0000000000..6064d3eccb
--- /dev/null
+++ b/Task/Boyer-Moore-string-search/C-sharp/boyer-moore-string-search.cs
@@ -0,0 +1,280 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+///
+/// An implementation of the Boyer-Moore string search algorithm.
+/// It finds all occurrences of a pattern in a text, performing a case-insensitive search on ASCII characters.
+///
+/// For all full description of the algorithm visit:
+/// https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm
+///
+public static class BoyerMooreStringSearch
+{
+ public static void Main(string[] args)
+ {
+ List texts = new List
+ {
+ "GCTAGCTCTACGAGTCTA",
+ "GGCTATAATGCGTA",
+ "there would have been a time for such a word",
+ "needle need noodle needle",
+ "DKnuthusesandshowsanimaginarycomputertheMIXanditsassociatedmachinecodeandassemblylanguagestoillustrate",
+ "Farms grew an acre of alfalfa on the dairy's behalf, with bales of that alfalfa exchanged for milk."
+ };
+
+ List patterns = new List { "TCTA", "TAATAAA", "word", "needle", "put", "and", "alfalfa" };
+
+ for (int i = 0; i < texts.Count; i++)
+ {
+ Console.WriteLine("text" + (i + 1) + " = " + texts[i]);
+ }
+ Console.WriteLine();
+
+ for (int i = 0; i < patterns.Count; i++)
+ {
+ int j = (i < 5) ? i : i - 1;
+ Console.WriteLine("Found \"" + patterns[i] + "\" in 'text" + (j + 1) + "' at indexes "
+ + string.Join(", ", StringSearch(texts[j], patterns[i])));
+ }
+ }
+
+ ///
+ /// Return a list of indexes at which the given pattern matches the given text.
+ ///
+ private static List StringSearch(string aText, string aPattern)
+ {
+ if (string.IsNullOrEmpty(aPattern) || string.IsNullOrEmpty(aText) || aText.Length < aPattern.Length)
+ {
+ return new List();
+ }
+
+ List matches = new List();
+
+ // Preprocessing
+ List> R = BadCharacterTable(aPattern);
+ int[] L = GoodSuffixTable(aPattern);
+ int[] F = FullShiftTable(aPattern);
+
+ int k = aPattern.Length - 1; // Represents the alignment of the end of aPattern relative to aText
+ int previousK = -1; // Represents the above alignment in the previous phase
+ while (k < aText.Length)
+ {
+ int i = aPattern.Length - 1; // Index of the character to compare in aPattern
+ int h = k; // Index of the character to compare in aText
+ while (i >= 0 && h > previousK && aPattern[i] == aText[h])
+ {
+ i -= 1;
+ h -= 1;
+ }
+ if (i == -1 || h == previousK)
+ { // Match has been found
+ matches.Add(k - aPattern.Length + 1);
+ k += (aPattern.Length > 1) ? aPattern.Length - F[1] : 1;
+ }
+ else
+ { // No match, shift by the maximum of the bad character and good suffix rules
+ int suffixShift;
+ int charShift = i - R[AlphabetIndex(aText[h])][i];
+ if (i + 1 == aPattern.Length)
+ { // Mismatch occurred on the first character
+ suffixShift = 1;
+ }
+ else if (L[i + 1] == -1)
+ { // Matched suffix does not appear anywhere in aPattern
+ suffixShift = aPattern.Length - F[i + 1];
+ }
+ else
+ { // Matched suffix appears in aPattern
+ suffixShift = aPattern.Length - 1 - L[i + 1];
+ }
+ int shift = Math.Max(charShift, suffixShift);
+ if (shift >= i + 1)
+ { // Galil's rule
+ previousK = k;
+ }
+ k += shift;
+ }
+ }
+ return matches;
+ }
+
+ ///
+ /// Create the shift table, F, for the given text, which is an array such that
+ /// F[i] is the length of the longest suffix of, aText.substring(i), which is also a prefix of the given text.
+ ///
+ /// Use case: If a mismatch occurs at character index i - 1 in the pattern,
+ /// the magnitude of the shift of the pattern, P, relative to the text is: P.length() - F[i].
+ ///
+ private static int[] FullShiftTable(string aText)
+ {
+ int[] F = new int[aText.Length];
+ int[] Z = FundamentalPreprocess(aText);
+ int longest = 0;
+ Array.Reverse(Z);
+ for (int i = 0; i < Z.Length; i++)
+ {
+ int zv = Z[i];
+ if (zv == i + 1)
+ {
+ longest = Math.Max(zv, longest);
+ }
+ F[F.Length - i - 1] = longest;
+ }
+ return F;
+ }
+
+ ///
+ /// Create the good suffix table, L, for the given text, which is an array such that
+ /// L[i] = k, is the largest index in the given text, S,
+ /// such that S.substring(i) matches a suffix of S.substring(0, k).
+ ///
+ /// Use case: If a mismatch of characters occurs at index i - 1 in the pattern, P,
+ /// then a shift of magnitude, P.length() - L[i], is such that no instances of the pattern in the text are omitted.
+ /// Furthermore, a suffix of P.substring(0, L[i]) matches the same substring of the text that was matched by a
+ /// suffix in the pattern on the previous matching attempt.
+ /// In the case that L[i] = -1, the full shift table must be used.
+ ///
+ private static int[] GoodSuffixTable(string aText)
+ {
+ int[] L = Enumerable.Repeat(-1, aText.Length).ToArray();
+ string reversed = new string(aText.Reverse().ToArray());
+ int[] N = FundamentalPreprocess(reversed);
+ Array.Reverse(N);
+ for (int j = 0; j < aText.Length - 1; j++)
+ {
+ int i = aText.Length - N[j];
+ if (i != aText.Length)
+ {
+ L[i] = j;
+ }
+ }
+ return L;
+ }
+
+ ///
+ /// Create the bad character table, R, for the given text,
+ /// which is a list indexed by the ASCII value of a character, C, in the given text.
+ ///
+ /// Use case: The entry at index i of R is a list of size: 1 + length of the given text.
+ /// This inner list gives at each index j the next position at which character C will be found
+ /// while traversing the given text from right to left starting from index j.
+ ///
+ private static List> BadCharacterTable(string aText)
+ {
+ if (string.IsNullOrEmpty(aText))
+ {
+ return new List>();
+ }
+
+ List> R = Enumerable.Range(0, ALPHABET_SIZE)
+ .Select(i => new List(Enumerable.Repeat(-1, 1))).ToList();
+ List alpha = Enumerable.Repeat(-1, ALPHABET_SIZE).ToList();
+
+ for (int i = 0; i < aText.Length; i++)
+ {
+ alpha[AlphabetIndex(aText[i])] = i;
+ for (int j = 0; j < alpha.Count; j++)
+ {
+ R[j].Add(alpha[j]);
+ }
+ }
+ return R;
+ }
+
+ ///
+ /// Create the fundamental preprocess, Z, of the given text, which is an array such that
+ /// Z[i] is the length of the substring of the given text beginning at index i which is also a prefix of the text.
+ ///
+ private static int[] FundamentalPreprocess(string aText)
+ {
+ if (string.IsNullOrEmpty(aText))
+ {
+ return new int[0];
+ }
+ if (aText.Length == 1)
+ {
+ return new int[] { 1 };
+ }
+
+ int[] Z = new int[aText.Length];
+ Z[0] = aText.Length;
+ Z[1] = MatchLength(aText, 0, 1);
+ for (int i = 2; i <= Z[1]; i++)
+ {
+ Z[i] = Z[1] - i + 1;
+ }
+
+ // Define the left and right limits of the z-box
+ int left = 0;
+ int right = 0;
+ for (int i = 2 + Z[1]; i < aText.Length; i++)
+ {
+ if (i <= right)
+ { // i falls within existing z-box
+ int k = i - left;
+ int b = Z[k];
+ int a = right - i + 1;
+ if (b < a)
+ { // b ends within existing z-box
+ Z[i] = b;
+ }
+ else
+ { // b ends at or after the end of the z-box,
+ // an explicit match to the right of the z-box is required
+ Z[i] = a + MatchLength(aText, a, right + 1);
+ left = i;
+ right = i + Z[i] - 1;
+ }
+ }
+ else
+ { // i does not fall within existing z-box
+ Z[i] = MatchLength(aText, 0, i);
+ if (Z[i] > 0)
+ {
+ left = i;
+ right = i + Z[i] - 1;
+ }
+ }
+ }
+ return Z;
+ }
+
+ ///
+ /// Return the length of the match of the two substrings of the given text beginning at each of the given indexes.
+ ///
+ private static int MatchLength(string aText, int aIndexOne, int aIndexTwo)
+ {
+ if (aIndexOne == aIndexTwo)
+ {
+ return aText.Length - aIndexOne;
+ }
+
+ int matchCount = 0;
+ while (aIndexOne < aText.Length && aIndexTwo < aText.Length
+ && aText[aIndexOne] == aText[aIndexTwo])
+ {
+ matchCount += 1;
+ aIndexOne += 1;
+ aIndexTwo += 1;
+ }
+ return matchCount;
+ }
+
+ ///
+ /// Return the ASCII index of the given character, if it is such, otherwise throw an illegal argument exception.
+ ///
+ private static int AlphabetIndex(char aChar)
+ {
+ int result = (int)aChar;
+ if (result >= ALPHABET_SIZE)
+ {
+ throw new ArgumentException("Not an ASCII character:" + aChar);
+ }
+ return result;
+ }
+
+ /* The range of ASCII characters is 0..255, both inclusive. */
+ private const int ALPHABET_SIZE = 256;
+}
diff --git a/Task/Boyer-Moore-string-search/EasyLang/boyer-moore-string-search.easy b/Task/Boyer-Moore-string-search/EasyLang/boyer-moore-string-search.easy
new file mode 100644
index 0000000000..c81b25fa98
--- /dev/null
+++ b/Task/Boyer-Moore-string-search/EasyLang/boyer-moore-string-search.easy
@@ -0,0 +1,67 @@
+# only works with ascii strings
+#
+func is_prefix &needle$[] pos .
+ pos -= 1
+ for i to len needle$[] - pos
+ if needle$[i] <> needle$[pos + i] : return 0
+ .
+ return 1
+.
+func suffix_size &needle$[] pos .
+ i = pos
+ j = len needle$[]
+ while i >= 1 and needle$[i] = needle$[j]
+ i -= 1
+ j -= 1
+ size += 1
+ .
+ return size
+.
+proc mk_good_tbl &needle$[] &tbl[] .
+ nlen = len needle$[]
+ len tbl[] nlen
+ lastpre = nlen + 1
+ for i = nlen downto 1
+ if is_prefix needle$[] i = 1 : lastpre = i
+ tbl[nlen - i + 1] = lastpre - i + nlen
+ .
+ for i to nlen - 1
+ size = suffix_size needle$[] i
+ tbl[size + 1] = nlen - i + size
+ .
+.
+proc mk_bad_tbl &needle$[] &tbl[] .
+ len tbl[] 128
+ for i to 128 : tbl[i] = len needle$[]
+ for i to len needle$[] - 1
+ tbl[strcode needle$[i]] = len needle$[] - i
+ .
+.
+func[] find hayst$ needle$ .
+ if needle$ = "" : return [ ]
+ needle$[] = strchars needle$
+ hayst$[] = strchars hayst$
+ mk_bad_tbl needle$[] bad_tbl[]
+ mk_good_tbl needle$[] good_tbl[]
+ nelen = len needle$[]
+ i = nelen
+ while i <= len hayst$[]
+ j = nelen
+ while j > 1 and needle$[j] = hayst$[i]
+ i -= 1
+ j -= 1
+ .
+ if needle$[j] = hayst$[i]
+ r[] &= i
+ i += nelen
+ else
+ i += higher good_tbl[nelen - j + 1] bad_tbl[strcode hayst$[i]]
+ .
+ .
+ return r[]
+.
+texts$[] = [ "GCTAGCTCTACGAGTCTA" "GGCTATAATGCGTA" "there would have been a time for such a word" "needle need noodle needle" "alfalfa" ]
+pat$[] = [ "TCTA" "TAATAAA" "word" "needle" "alfa" ]
+for i to len texts$[]
+ print pat$[i] & " ? " & texts$[i] & " -> " & find texts$[i] pat$[i]
+.
diff --git a/Task/Boyer-Moore-string-search/Go/boyer-moore-string-search.go b/Task/Boyer-Moore-string-search/Go/boyer-moore-string-search.go
new file mode 100644
index 0000000000..83c6bfb18d
--- /dev/null
+++ b/Task/Boyer-Moore-string-search/Go/boyer-moore-string-search.go
@@ -0,0 +1,65 @@
+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+func display(numbers []int32) {
+ fmt.Print("[")
+ for i, num := range numbers {
+ if i > 0 {
+ fmt.Print(", ")
+ }
+ fmt.Print(num)
+ }
+ fmt.Println("]")
+}
+
+func stringSearchSingle(haystack, needle string) int32 {
+ index := strings.Index(haystack, needle)
+ return int32(index)
+}
+
+func stringSearch(haystack, needle string) []int32 {
+ var result []int32
+ var start int64 = 0
+
+ for start < int64(len(haystack)) {
+ haystackReduced := haystack[start:]
+ index := stringSearchSingle(haystackReduced, needle)
+
+ if index >= 0 {
+ result = append(result, int32(start)+index)
+ start += int64(index) + int64(len(needle))
+ } else {
+ break
+ }
+ }
+
+ return result
+}
+
+func main() {
+ texts := []string{
+ "GCTAGCTCTACGAGTCTA",
+ "GGCTATAATGCGTA",
+ "there would have been a time for such a word",
+ "needle need noodle needle",
+ "DKnuthusesandprogramsanimaginarycomputertheMIXanditsassociatedmachinecodeandassemblylanguages",
+ "Nearby farms grew an acre of alfalfa on the dairy's behalf, with bales of that alfalfa exchanged for milk.",
+ }
+
+ patterns := []string{"TCTA", "TAATAAA", "word", "needle", "and", "alfalfa"}
+
+ for i := 0; i < len(texts); i++ {
+ fmt.Printf("text%d = %s\n", i+1, texts[i])
+ }
+ fmt.Println()
+
+ for i := 0; i < len(texts); i++ {
+ indexes := stringSearch(texts[i], patterns[i])
+ fmt.Printf("Found \"%s\" in 'text%d' at indexes ", patterns[i], i+1)
+ display(indexes)
+ }
+}
diff --git a/Task/Boyer-Moore-string-search/JavaScript/boyer-moore-string-search.js b/Task/Boyer-Moore-string-search/JavaScript/boyer-moore-string-search.js
new file mode 100644
index 0000000000..4f1709739c
--- /dev/null
+++ b/Task/Boyer-Moore-string-search/JavaScript/boyer-moore-string-search.js
@@ -0,0 +1,52 @@
+function display(numbers) {
+ console.log(`[${numbers.join(", ")}]`);
+}
+
+function string_search_single(haystack, needle) {
+ const index = haystack.indexOf(needle);
+ return index;
+}
+
+function string_search(haystack, needle) {
+ const result = [];
+ let start = 0;
+ let index = 0;
+
+ while (index >= 0 && start < haystack.length) {
+ const haystackReduced = haystack.substring(start);
+ index = string_search_single(haystackReduced, needle);
+ if (index >= 0) {
+ result.push(start + index);
+ start += index + needle.length;
+ }
+ }
+ return result;
+}
+
+function main() {
+ const texts = [
+ "GCTAGCTCTACGAGTCTA",
+ "GGCTATAATGCGTA",
+ "there would have been a time for such a word",
+ "needle need noodle needle",
+ "DKnuthusesandprogramsanimaginarycomputertheMIXanditsassociatedmachinecodeandassemblylanguages",
+ "Nearby farms grew an acre of alfalfa on the dairy's behalf, with bales of that alfalfa exchanged for milk.",
+ ];
+
+ const patterns = ["TCTA", "TAATAAA", "word", "needle", "and", "alfalfa"];
+
+ for (let i = 0; i < texts.length; ++i) {
+ console.log(`text${i + 1} = ${texts[i]}`);
+ }
+ console.log();
+
+ for (let i = 0; i < texts.length; ++i) {
+ const indexes = string_search(texts[i], patterns[i]);
+ console.log(
+ `Found "${patterns[i]}" in 'text${i + 1}' at indexes `
+ );
+ display(string_search(texts[i], patterns[i]));
+ }
+}
+
+main();
diff --git a/Task/Boyer-Moore-string-search/Rust/boyer-moore-string-search.rs b/Task/Boyer-Moore-string-search/Rust/boyer-moore-string-search.rs
new file mode 100644
index 0000000000..15cf2485cd
--- /dev/null
+++ b/Task/Boyer-Moore-string-search/Rust/boyer-moore-string-search.rs
@@ -0,0 +1,62 @@
+fn display(numbers: &Vec) {
+ print!("[");
+ for (i, num) in numbers.iter().enumerate() {
+ if i > 0 {
+ print!(", ");
+ }
+ print!("{}", num);
+ }
+ println!("]");
+}
+
+fn string_search_single(haystack: &str, needle: &str) -> i32 {
+ // Rust's standard library doesn't have Boyer-Moore searcher directly,
+ // but we can use the built-in find method which is efficient
+ match haystack.find(needle) {
+ Some(index) => index as i32,
+ None => -1,
+ }
+}
+
+fn string_search(haystack: &str, needle: &str) -> Vec {
+ let mut result: Vec = Vec::new();
+ let mut start: usize = 0;
+
+ while start < haystack.len() {
+ let haystack_reduced = &haystack[start..];
+ let index = string_search_single(haystack_reduced, needle);
+
+ if index >= 0 {
+ result.push((start as i32) + index);
+ start += index as usize + needle.len();
+ } else {
+ break;
+ }
+ }
+
+ result
+}
+
+fn main() {
+ let texts = vec![
+ "GCTAGCTCTACGAGTCTA",
+ "GGCTATAATGCGTA",
+ "there would have been a time for such a word",
+ "needle need noodle needle",
+ "DKnuthusesandprogramsanimaginarycomputertheMIXanditsassociatedmachinecodeandassemblylanguages",
+ "Nearby farms grew an acre of alfalfa on the dairy's behalf, with bales of that alfalfa exchanged for milk."
+ ];
+
+ let patterns = vec!["TCTA", "TAATAAA", "word", "needle", "and", "alfalfa"];
+
+ for i in 0..texts.len() {
+ println!("text{} = {}", i + 1, texts[i]);
+ }
+ println!();
+
+ for i in 0..texts.len() {
+ let indexes = string_search(texts[i], patterns[i]);
+ print!("Found \"{}\" in 'text{}' at indexes ", patterns[i], i + 1);
+ display(&indexes);
+ }
+}
diff --git a/Task/Boyer-Moore-string-search/Scala/boyer-moore-string-search.scala b/Task/Boyer-Moore-string-search/Scala/boyer-moore-string-search.scala
new file mode 100644
index 0000000000..e33f56aa21
--- /dev/null
+++ b/Task/Boyer-Moore-string-search/Scala/boyer-moore-string-search.scala
@@ -0,0 +1,329 @@
+import scala.collection.mutable.ListBuffer
+import scala.collection.immutable.Vector // Using Vector for the bad character table outer structure
+
+/**
+ * An implementation of the Boyer-Moore string search algorithm in Scala.
+ * It finds all occurrences of a pattern in a text, performing a case-sensitive search on ASCII characters.
+ * (Note: The original Java comment mentioned case-insensitive, but the code was case-sensitive ASCII).
+ *
+ * For a full description of the algorithm visit:
+ * https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm
+ */
+object BoyerMooreStringSearch {
+
+ /* The range of ASCII characters is 0..255, both inclusive. */
+ private final val ALPHABET_SIZE = 256
+
+ def main(args: Array[String]): Unit = {
+ val texts = List(
+ "GCTAGCTCTACGAGTCTA",
+ "GGCTATAATGCGTA",
+ "there would have been a time for such a word",
+ "needle need noodle needle",
+ "DKnuthusesandshowsanimaginarycomputertheMIXanditsassociatedmachinecodeandassemblylanguagestoillustrate",
+ "Farms grew an acre of alfalfa on the dairy's behalf, with bales of that alfalfa exchanged for milk."
+ )
+
+ val patterns = List("TCTA", "TAATAAA", "word", "needle", "put", "and", "alfalfa")
+
+ texts.zipWithIndex.foreach { case (text, i) =>
+ println(s"text${i + 1} = $text")
+ }
+ println()
+
+ patterns.zipWithIndex.foreach { case (pattern, i) =>
+ // Replicate the original Java logic for selecting the text index 'j'
+ val j = if (i < 5) i else i - 1
+ if (j >= 0 && j < texts.length) { // Ensure j is a valid index
+ val textToSearch = texts(j)
+ val matches = stringSearch(textToSearch, pattern)
+ // Use mkString for cleaner list output
+ println(s"""Found "$pattern" in 'text${j + 1}' at indexes [${matches.mkString(", ")}]""")
+ } else {
+ println(s"Skipping pattern '$pattern' - calculated text index $j is out of bounds.")
+ }
+ }
+ }
+
+ /**
+ * Return a list of indexes at which the given pattern matches the given text.
+ */
+ private def stringSearch(aText: String, aPattern: String): List[Int] = {
+ if (aPattern.isEmpty || aText.isEmpty || aText.length < aPattern.length) {
+ return List.empty[Int] // Use Scala's immutable empty list
+ }
+
+ val matches = ListBuffer[Int]() // Use mutable ListBuffer for efficient appending
+
+ // Preprocessing
+ val R = badCharacterTable(aPattern) // Returns Vector[Vector[Int]]
+ val L = goodSuffixTable(aPattern) // Returns Array[Int]
+ val F = fullShiftTable(aPattern) // Returns Array[Int]
+
+ val m = aPattern.length
+ val n = aText.length
+
+ var k = m - 1 // Represents the alignment of the end of aPattern relative to aText
+ var previousK = -1 // Represents the above alignment in the previous phase (for Galil's rule)
+
+ while (k < n) {
+ var i = m - 1 // Index of the character to compare in aPattern (from right to left)
+ var h = k // Index of the character to compare in aText (aligned with i)
+
+ // Character comparison loop
+ // Galil's rule optimization: h > previousK avoids re-comparing known matched prefix
+ while (i >= 0 && h > previousK && aPattern(i) == aText(h)) {
+ i -= 1
+ h -= 1
+ }
+
+ if (i == -1 || h == previousK) { // Match has been found OR comparison skipped by Galil's rule up to a previously matched prefix
+ matches.append(k - m + 1) // Add start index of match
+ // Calculate shift based on the full shift table F for the next potential match
+ // F[1] represents the border length of P[1..m-1]
+ val shift = if (m > 1) m - F(1) else 1
+ k += shift
+ // previousK is NOT reset here per original logic; it's related to shifts during *mismatches*
+ } else { // Mismatch occurred at aText(h) and aPattern(i)
+ // Bad Character Rule shift:
+ // R(char code)(index in pattern + 1) gives the index of the previous occurrence
+ // of the mismatched text character `aText(h)` in the pattern `aPattern`
+ // at or before index `i`. The +1 adjusts for the table structure.
+ val charShift = i - R(alphabetIndex(aText(h)))(i + 1)
+
+ // Good Suffix Rule shift:
+ val suffixShift =
+ if (i + 1 == m) { // Mismatch occurred on the first character comparison (rightmost)
+ 1
+ } else {
+ // L(i + 1) stores the starting index of the rightmost occurrence of
+ // the matched suffix P[i+1 .. m-1] in P that is not a suffix of P.
+ // F(i + 1) stores the length of the longest suffix of P[i+1..m-1] that is also a prefix of P.
+ if (L(i + 1) == -1) { // Matched suffix P[i+1..m-1] does not appear elsewhere in P preceded by a different char
+ // Shift based on the longest suffix of P[i+1..m-1] that is also a prefix of P (using F table)
+ m - F(i + 1)
+ } else { // Matched suffix P[i+1..m-1] appears starting at index L(i+1)
+ // Shift to align this previous occurrence with the text
+ m - 1 - L(i + 1)
+ }
+ }
+
+ // Choose the maximum shift from the two rules
+ val shift = math.max(charShift, suffixShift)
+
+ // Galil's rule: If the shift skips over the potential match area entirely,
+ // remember the current alignment `k` to optimize the next comparison loop.
+ if (shift >= i + 1) {
+ previousK = k
+ }
+ // Per original Java code: If Galil's rule does not apply (shift < i + 1), previousK is not modified here.
+
+ k += shift // Apply the calculated shift
+ }
+ } // end while
+
+ matches.toList // Convert mutable buffer to immutable list for the result
+ }
+
+ /**
+ * Create the shift table, F, for the given pattern P, which is an array such that
+ * F[i] is the length of the longest suffix of P[i..m-1] which is also a prefix of P.
+ *
+ * Use case: If a mismatch occurs at character index i - 1 in the pattern, and the
+ * good suffix rule L[i] indicates no earlier occurrence, the shift is P.length() - F[i].
+ */
+ private def fullShiftTable(aPattern: String): Array[Int] = {
+ val m = aPattern.length
+ val F = new Array[Int](m) // Initialize with 0s
+ val Z = fundamentalPreprocess(aPattern) // Z[i] = length of longest substring starting at i that is prefix of pattern
+ val Z_reversed = Z.reverse // Reverse Z array
+
+ var longest = 0
+ // Iterate through the reversed Z array to build F from right-to-left effectively
+ for (i <- 0 until Z_reversed.length) {
+ val zv = Z_reversed(i)
+ // If Z value equals its length from the end, it's a suffix that's also a prefix
+ if (zv == i + 1) {
+ longest = math.max(zv, longest)
+ }
+ // Map the reversed index 'i' back to the original index for F
+ val originalIndex = m - 1 - i
+ if (originalIndex >= 0 && originalIndex < m) { // Bounds check
+ F(originalIndex) = longest
+ }
+ }
+ F
+ }
+
+ /**
+ * Create the good suffix table, L', for the given pattern P (often denoted L' or L[i] in literature).
+ * L'[i] = k, is the largest index k < m such that P[i..m-1] is a suffix of P[0..k-1]
+ * and the character preceding the suffix P[k - (m-i) .. k-1] is different from P[i-1].
+ * If no such k exists, L'[i] = -1.
+ *
+ * Use case: If a mismatch occurs at index i - 1, shift by m - 1 - L'[i].
+ * This implementation calculates a related table L where L[i] stores j such that
+ * P[i..m-1] matches P[j-(m-i)..j].
+ */
+ private def goodSuffixTable(aPattern: String): Array[Int] = {
+ val m = aPattern.length
+ // Initialize L with -1. Size is m.
+ val L = Array.fill(m)(-1)
+ val reversedPattern = aPattern.reverse
+ // N[j] = length of longest substring starting at j that is prefix of reversedPattern
+ // This corresponds to matching suffixes of the original pattern.
+ val N = fundamentalPreprocess(reversedPattern)
+ // Reverse N to align indices with the original pattern's perspective
+ val N_reversed = N.reverse
+
+ // N_reversed[j] = length of longest suffix of P ending at j that is also suffix of P
+ for (j <- 0 until m - 1) {
+ // i = position in P where the suffix match starts (from the right end)
+ val suffixLen = N_reversed(j)
+ val i = m - suffixLen
+ // L[i] should store the end position 'j' of the matching internal suffix.
+ // Condition i != m means the suffix is not the whole pattern itself.
+ if (i != m) {
+ if (i >= 0 && i < m) { // Bounds check for L index
+ L(i) = j
+ }
+ }
+ }
+ L
+ }
+
+ /**
+ * Create the bad character table, R.
+ * R(c)(i) stores the index of the rightmost occurrence of character `c`
+ * in the pattern `P` at or before index `i-1`. If `c` does not occur
+ * before index `i`, it stores -1.
+ * The table is represented as Vector[Vector[Int]], indexed by char code, then pattern index + 1.
+ */
+ private def badCharacterTable(aPattern: String): Vector[Vector[Int]] = {
+ if (aPattern.isEmpty) {
+ return Vector.empty // Return empty structure if pattern is empty
+ }
+ val m = aPattern.length
+
+ // Use ListBuffer internally for efficient construction, then convert to Vector
+ val R_buffers = Array.fill(ALPHABET_SIZE)(ListBuffer(-1)) // Initialize inner lists with -1
+ // 'alpha' tracks the most recent index seen for each character
+ val alpha = Array.fill(ALPHABET_SIZE)(-1)
+
+ for (i <- 0 until m) {
+ val charIndex = alphabetIndex(aPattern(i))
+ alpha(charIndex) = i // Update last seen position for this character
+ // For each character in the alphabet, append its *current* last seen position
+ // This builds the table column by column (for each pattern index i)
+ for (j <- 0 until ALPHABET_SIZE) {
+ R_buffers(j).append(alpha(j))
+ }
+ }
+ // Convert the mutable buffers to immutable Vectors
+ R_buffers.map(_.toVector).toVector
+ }
+
+ /**
+ * Create the fundamental preprocess array, Z, for the given text (or pattern).
+ * Z[i] is the length of the longest substring starting at index i
+ * which is also a prefix of the text. Z[0] is defined as the text length.
+ * This is used in calculating the Good Suffix and Full Shift tables.
+ */
+ private def fundamentalPreprocess(aText: String): Array[Int] = {
+ val n = aText.length
+ if (n == 0) return Array.empty[Int]
+ if (n == 1) return Array(1)
+
+ val Z = new Array[Int](n)
+ Z(0) = n
+ Z(1) = matchLength(aText, 0, 1) // Calculate Z[1] explicitly
+
+ // Optimization for early part based on Z[1]
+ // Use Scala range 'until' for exclusive upper bound
+ var initial_z1_limit = math.min(Z(1) + 1, n) // Limit loop correctly
+ for (i <- 2 until initial_z1_limit) {
+ Z(i) = Z(1) - i + 1
+ }
+
+ // Define the left and right limits of the current Z-box [left, right]
+ var left = 0
+ var right = 0
+ // If Z(1) > 0, the initial Z-box is [1, Z(1)] ? No, Z-box related to previous calculations.
+ // Need to initialize left/right correctly based on Z[1] usage or start fresh.
+ // Let's restart Z-box calculation from where the optimization loop left off.
+
+ val loopStart = if (Z(1) > 0) math.min(2 + Z(1), n) else 2 // Start after initial Z[1] optimization range
+ // Correct initialization of Z-box should be based on the *last* Z calculation that extended right boundary.
+ // Resetting left/right and letting the loop find the first Z-box might be simpler/safer.
+ left = 0
+ right = 0
+
+ // Calculate remaining Z values using Z-box optimization
+ for (i <- loopStart until n) {
+ if (i <= right) { // i falls within existing Z-box [left, right]
+ val k = i - left // Corresponding index within the prefix
+ val b = Z(k) // Length of match starting at k
+ val a = right - i + 1 // Remaining length within the Z-box from i
+
+ if (b < a) { // Match Z[k] is strictly contained within the Z-box suffix
+ Z(i) = b
+ } else { // Match Z[k] extends to or past the end of the Z-box
+ // Need explicit comparison beyond the Z-box
+ // Match length from text[a..] against text[right+1..]
+ val matchLen = matchLength(aText, a, right + 1)
+ Z(i) = a + matchLen
+ left = i // Start a new Z-box
+ right = i + Z(i) - 1
+ }
+ } else { // i is outside the current Z-box
+ Z(i) = matchLength(aText, 0, i) // Calculate Z[i] by explicit comparison with prefix
+ if (Z(i) > 0) { // If a match is found, start a new Z-box
+ left = i
+ right = i + Z(i) - 1
+ }
+ // else: Z[i] is 0, no Z-box formed, left/right remain unchanged
+ }
+ }
+ Z
+ }
+
+ /**
+ * Return the length of the match of the two substrings of the given text
+ * beginning at each of the given indexes.
+ */
+ private def matchLength(aText: String, aIndexOne: Int, aIndexTwo: Int): Int = {
+ if (aIndexOne < 0 || aIndexTwo < 0 || aIndexOne >= aText.length || aIndexTwo >= aText.length) {
+ return 0 // Added boundary checks
+ }
+ if (aIndexOne == aIndexTwo) {
+ // Match length from index to end of string
+ return aText.length - aIndexOne
+ }
+
+ var matchCount = 0
+ var idx1 = aIndexOne
+ var idx2 = aIndexTwo
+ // Use Scala's string indexing aText(idx)
+ while (idx1 < aText.length && idx2 < aText.length && aText(idx1) == aText(idx2)) {
+ matchCount += 1
+ idx1 += 1
+ idx2 += 1
+ }
+ matchCount
+ }
+
+ /**
+ * Return the ASCII index (0-255) of the given character.
+ * Throws IllegalArgumentException if the character code is outside the 0-255 range.
+ */
+ private def alphabetIndex(aChar: Char): Int = {
+ val result = aChar.toInt
+ // Ensure character fits within the expected ASCII range for the table size
+ if (result < 0 || result >= ALPHABET_SIZE) {
+ // Consider if non-ASCII should be handled differently or error is correct.
+ // Sticking to original logic which assumes ASCII range 0-255.
+ throw new IllegalArgumentException(s"Character '$aChar' (code $result) is outside the expected ASCII range [0, ${ALPHABET_SIZE - 1}]")
+ }
+ result
+ }
+}
diff --git a/Task/Boyer-Moore-string-search/Wren/boyer-moore-string-search.wren b/Task/Boyer-Moore-string-search/Wren/boyer-moore-string-search.wren
index f3410aec49..691956df2e 100644
--- a/Task/Boyer-Moore-string-search/Wren/boyer-moore-string-search.wren
+++ b/Task/Boyer-Moore-string-search/Wren/boyer-moore-string-search.wren
@@ -93,20 +93,20 @@ class BoyerMoore {
}
/*
- * Uses the BoyerMoore class to find the indices of ALL non-overlapping matches of the specified substring
- * and return a list of them. Returns an empty list if it's not a substring.
+ * Uses the BoyerMoore class to find the indices of ALL matches (overlapping or not)
+ * of the specified substring and return a list of them.
+ * Returns an empty list if it's not a substring.
*/
var indicesOf = Fn.new { |haystack, needle|
var indices = []
var hc = haystack.bytes.count
- var bc = needle.bytes.count
var start = 0
while (true) {
var haystack2 = haystack[start..-1]
var index = BoyerMoore.indexOf(haystack2, needle)
if (index == -1) return indices
indices.add(start + index)
- start = start + index + bc
+ start = start + index + 1
if (start >= hc) return indices
}
}
@@ -117,9 +117,12 @@ var texts = [
"there would have been a time for such a word",
"needle need noodle needle",
"InhisbookseriesTheArtofComputerProgrammingpublishedbyAddisonWesleyDKnuthusesanimaginarycomputertheMIXanditsassociatedmachinecodeandassemblylanguagestoillustratetheconceptsandalgorithmsastheyarepresented",
- "Nearby farms grew a half acre of alfalfa on the dairy's behalf, with bales of all that alfalfa exchanged for milk."
+ "Nearby farms grew a half acre of alfalfa on the dairy's behalf, with bales of all that alfalfa exchanged for milk.",
+ "Due to a malfunction, alfredo halfheartedly wore calfskin severalfold on behalf of alfa.",
+ "alfalfa",
+ "zzzzzz"
]
-var pats = ["TCTA", "TAATAAA", "word", "needle", "put", "and", "alfalfa"]
+var pats = ["TCTA", "TAATAAA", "word", "needle", "put", "and", "alfalfa", "alfa", "alfa", "zzz"]
for (i in 0...texts.count) System.print("text%(i+1) = %(texts[i])")
System.print()
for (i in 0...pats.count) {
diff --git a/Task/Brace-expansion/EasyLang/brace-expansion.easy b/Task/Brace-expansion/EasyLang/brace-expansion.easy
index e9d898f73e..ef1c473c36 100644
--- a/Task/Brace-expansion/EasyLang/brace-expansion.easy
+++ b/Task/Brace-expansion/EasyLang/brace-expansion.easy
@@ -1,5 +1,5 @@
-procdecl getgroup depth . out$[] s$ ok .
-proc getitem depth . s$ out$[] .
+procdecl getgroup depth &out$[] &s$ &ok .
+proc getitem depth &s$ &out$[] .
out$[] = [ "" ]
while s$ <> ""
c$ = substr s$ 1 1
@@ -34,7 +34,7 @@ proc getitem depth . s$ out$[] .
.
.
.
-proc getgroup depth . out$[] s$ ok .
+proc getgroup depth &out$[] &s$ &ok .
out$[] = [ ]
while s$ <> ""
getitem depth s$ g$[]
diff --git a/Task/Brazilian-numbers/EasyLang/brazilian-numbers.easy b/Task/Brazilian-numbers/EasyLang/brazilian-numbers.easy
index 7fe5b6cc1a..c444438cb9 100644
--- a/Task/Brazilian-numbers/EasyLang/brazilian-numbers.easy
+++ b/Task/Brazilian-numbers/EasyLang/brazilian-numbers.easy
@@ -3,34 +3,23 @@ func sameDigits n b .
repeat
n = n div b
until n = 0
- if n mod b <> f
- return 0
- .
+ if n mod b <> f : return 0
.
return 1
.
func isBrazilian7 n .
# n >= 7
- if n mod 2 = 0
- return 1
- .
+ if n mod 2 = 0 : return 1
for b = 2 to n - 2
- if sameDigits n b = 1
- return 1
- .
+ if sameDigits n b = 1 : return 1
.
return 0
.
func prime n .
- if n mod 2 = 0 and n > 2
- return 0
- .
+ if n mod 2 = 0 and n > 2 : return 0
i = 3
- sq = sqrt n
- while i <= sq
- if n mod i = 0
- return 0
- .
+ while i <= sqrt n
+ if n mod i = 0 : return 0
i += 2
.
return 1
diff --git a/Task/Brilliant-numbers/EasyLang/brilliant-numbers.easy b/Task/Brilliant-numbers/EasyLang/brilliant-numbers.easy
index 410153777f..4c3d4f963c 100644
--- a/Task/Brilliant-numbers/EasyLang/brilliant-numbers.easy
+++ b/Task/Brilliant-numbers/EasyLang/brilliant-numbers.easy
@@ -1,34 +1,24 @@
fastfunc factor num .
if num mod 2 = 0
- if num = 2
- return 1
- .
+ if num = 2 : return 1
return 2
.
i = 3
while i <= sqrt num
- if num mod i = 0
- return i
- .
+ if num mod i = 0 : return i
i += 2
.
return 1
.
func brilliant n .
f1 = factor n
- if f1 = 1
- return 0
- .
+ if f1 = 1 : return 0
f2 = n div f1
- if floor log10 f1 <> floor log10 f2
- return 0
- .
- if factor f1 = 1 and factor f2 = 1
- return 1
- .
+ if floor log10 f1 <> floor log10 f2 : return 0
+ if factor f1 = 1 and factor f2 = 1 : return 1
return 0
.
-proc main . .
+proc main .
i = 2
while cnt < 100
if brilliant i = 1
diff --git a/Task/Brownian-tree/EasyLang/brownian-tree.easy b/Task/Brownian-tree/EasyLang/brownian-tree.easy
index f0c9a26ba3..821e4bcf89 100644
--- a/Task/Brownian-tree/EasyLang/brownian-tree.easy
+++ b/Task/Brownian-tree/EasyLang/brownian-tree.easy
@@ -1,7 +1,6 @@
-color3 0 1 1
+gcolor3 0 1 1
len f[] 200 * 200
-move 50 50
-rect 0.5 0.5
+grect 50 50 0.5 0.5
f[100 * 200 + 100] = 1
n = 9000
while i < n
@@ -19,12 +18,11 @@ while i < n
break 1
.
if f[y * 200 + x + 1] = 1
- move xo / 2 yo / 2
- rect 0.5 0.5
+ grect xo / 2 yo / 2 0.5 0.5
f[yo * 200 + xo + 1] = 1
i += 1
if i mod 16 = 0
- color3 0.2 + i / n 1 1
+ gcolor3 0.2 + i / n 1 1
sleep 0
.
break 1
diff --git a/Task/Bulls-and-cows/APL/bulls-and-cows-1.apl b/Task/Bulls-and-cows/APL/bulls-and-cows-1.apl
index 984eda7a85..fa91aa7235 100644
--- a/Task/Bulls-and-cows/APL/bulls-and-cows-1.apl
+++ b/Task/Bulls-and-cows/APL/bulls-and-cows-1.apl
@@ -6,5 +6,5 @@ guess ← ⍎¨input⍣(valid⊣)
bulls ← +/=
cows ← +/∊∧≠
game ← (output ⊣(bulls,cows) guess)⍣(4 0≡⊣)
-random ← 1+4?9⍨
+random ← 1+4?9
moo ← 'You win!'⊣(random game⊢)
diff --git a/Task/Bulls-and-cows/J/bulls-and-cows-1.j b/Task/Bulls-and-cows/J/bulls-and-cows-1.j
index 74cb5c0578..3384f1c33b 100644
--- a/Task/Bulls-and-cows/J/bulls-and-cows-1.j
+++ b/Task/Bulls-and-cows/J/bulls-and-cows-1.j
@@ -1,5 +1,5 @@
-output=. [ 'Bulls: '&,:@'Cows: ' echo@,. ":@,.
-valid =. *./@e.&'0123456789' *. 4 = #
-guess =. [: ".&> :: ] $:^:(-.@valid)@(1!:1@1)@echo@'Guess:'
-game =. [ $:^:(4 0-.@-:]) [ (+/@:= output@, e.+/@:*.~:) guess
+output=. ['Bulls: '&,:@'Cows: 'echo@,.":@,.
+valid =. *./@e.&Num_j_*.4=#
+guess =. 0 ".&> [: > $:^:(-.@valid)@(1!:1@1)@echo@'Guess:'t.0
+game =. [ $:^:(4 0-.@-:]) [ (+/@:= output@, e. +/@:*. ~:) guess
moo =. 'You win!'[ (1+4?9:) game ]
diff --git a/Task/Bulls-and-cows/J/bulls-and-cows-2.j b/Task/Bulls-and-cows/J/bulls-and-cows-2.j
index 9795e742c7..33fcb7bd55 100644
--- a/Task/Bulls-and-cows/J/bulls-and-cows-2.j
+++ b/Task/Bulls-and-cows/J/bulls-and-cows-2.j
@@ -1,9 +1,9 @@
U =. {{u^:(-.@:v)^:_.}} NB. apply u until v is true
input =. 1!:1@1@echo@'Guess: '
output =. [ ('Bulls: ',:'Cows: ')echo@,.":@,.
-isdigits=. *./@e.&'0123456789'
+isdigits=. *./@e.&Num_j_
valid =. isdigits*.4=#
-guess =. [:".&>input U(valid@])
+guess =. 0".&>input U(valid@])
bulls =. +/@:=
cows =. [:+/e.*.~:
game =. ([:output [(bulls,cows) guess)U(4 0-:])
diff --git a/Task/Burrows-Wheeler-transform/EasyLang/burrows-wheeler-transform.easy b/Task/Burrows-Wheeler-transform/EasyLang/burrows-wheeler-transform.easy
index d3197d271a..2e078b2b25 100644
--- a/Task/Burrows-Wheeler-transform/EasyLang/burrows-wheeler-transform.easy
+++ b/Task/Burrows-Wheeler-transform/EasyLang/burrows-wheeler-transform.easy
@@ -3,7 +3,7 @@
stx$ = "¹"
etx$ = "²"
#
-proc sort . d$[] .
+proc sort &d$[] .
for i = 2 to len d$[]
h$ = d$[i]
j = i - 1
@@ -22,16 +22,12 @@ func$ bwt s$ .
tbl$[] &= b$ & a$
.
sort tbl$[]
- for s$ in tbl$[]
- r$ &= substr s$ len s$ 1
- .
+ for s$ in tbl$[] : r$ &= substr s$ len s$ 1
return r$
.
func$ ibwt r$ .
le = len r$
- for i to le
- tbl$[] &= ""
- .
+ for i to le : tbl$[] &= ""
for j to le
for i to le
tbl$[i] = substr r$ i 1 & tbl$[i]
diff --git a/Task/Burrows-Wheeler-transform/JavaScript/burrows-wheeler-transform.js b/Task/Burrows-Wheeler-transform/JavaScript/burrows-wheeler-transform.js
new file mode 100644
index 0000000000..dc7efff102
--- /dev/null
+++ b/Task/Burrows-Wheeler-transform/JavaScript/burrows-wheeler-transform.js
@@ -0,0 +1,76 @@
+class BWT {
+ static STX = "\u0002";
+ static ETX = "\u0003";
+
+ static bwt(s) {
+ if (s.includes(BWT.STX) || s.includes(BWT.ETX)) {
+ throw new Error("String cannot contain STX or ETX");
+ }
+
+ const ss = BWT.STX + s + BWT.ETX;
+ const table = [];
+ for (let i = 0; i < ss.length; i++) {
+ const before = ss.substring(i);
+ const after = ss.substring(0, i);
+ table.push(before + after);
+ }
+ table.sort();
+
+ let sb = "";
+ for (const str of table) {
+ sb += str.charAt(str.length - 1);
+ }
+ return sb;
+ }
+
+ static ibwt(r) {
+ const len = r.length;
+ const table = [];
+ for (let i = 0; i < len; ++i) {
+ table.push("");
+ }
+ for (let j = 0; j < len; ++j) {
+ for (let i = 0; i < len; ++i) {
+ table[i] = r.charAt(i) + table[i];
+ }
+ table.sort();
+ }
+ for (const row of table) {
+ if (row.endsWith(BWT.ETX)) {
+ return row.substring(1, len - 1);
+ }
+ }
+ return "";
+ }
+
+ static makePrintable(s) {
+ // substitute ^ for STX and | for ETX to print results
+ return s.replace(BWT.STX, "^").replace(BWT.ETX, "|");
+ }
+
+ static main() {
+ const tests = [
+ "banana",
+ "appellee",
+ "dogwood",
+ "TO BE OR NOT TO BE OR WANT TO BE OR NOT?",
+ "SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES",
+ "\u0002ABC\u0003"
+ ];
+ for (const test of tests) {
+ console.log(BWT.makePrintable(test));
+ process.stdout.write(" --> ");
+ let t = "";
+ try {
+ t = BWT.bwt(test);
+ console.log(BWT.makePrintable(t));
+ } catch (e) {
+ console.log("ERROR: " + e.message);
+ }
+ const r = BWT.ibwt(t);
+ console.log(` --> ${r}\n`);
+ }
+ }
+}
+
+BWT.main();
diff --git a/Task/CSV-data-manipulation/M2000-Interpreter/csv-data-manipulation.m2000 b/Task/CSV-data-manipulation/M2000-Interpreter/csv-data-manipulation.m2000
index 7ef687eccb..ebca3c0383 100644
--- a/Task/CSV-data-manipulation/M2000-Interpreter/csv-data-manipulation.m2000
+++ b/Task/CSV-data-manipulation/M2000-Interpreter/csv-data-manipulation.m2000
@@ -1,6 +1,7 @@
+Locale 1032
Module Checkit {
Function Sum {
- Long c=0
+ DECIMAL c=0
while not empty {
c+=number
}
@@ -8,7 +9,7 @@ Module Checkit {
}
Document CSV$ = {C1,C2,C3,C4,C5
1,5,9,13,17
- 2,6,10,14,18
+ 2,6,10.3,14,18
3,7,11,15,19
4,8,12,16,20
}
@@ -19,13 +20,13 @@ Module Checkit {
\\ use standard decimal point char
\\ use standard (non json style string)
\\ True = use bare strings (without "")
- Input With "",,,true
- Write With"",,,true
+ Input With "","",,true
+ Write With chr$(9),locale$(0xE),,true
\\ for excel csv use Input With chr$(9),,true, true
Open "data1.csv" for Wide Input as #M
Open "data2.csv" for Wide Output as #M1
Input #M, h1$, h2$, h3$, h4$, h5$
- Write #M1, h1$, h2$, h3$, h4$, h5$
+ Write #M1, h1$, h2$, h3$, h4$, h5$, "SUM"
Print h1$, h2$, h3$, h4$, h5$
While not Eof(#M) {
@@ -35,13 +36,15 @@ Module Checkit {
}
close #M1
Close #M
+ Input With chr$(9),locale$(0xE),,true
Open "data2.csv" for Wide Input as #M
- Input #M, h1$, h2$, h3$, h4$, h5$
- Print h1$, h2$, h3$, h4$, h5$
+ Input #M, h1$, h2$, h3$, h4$, h5$, h6$
+ Print h1$, h2$, h3$, h4$, h5$, h6$
While not Eof(#M) {
Input #M, A1, A2, A3, A4, A5, Sum
Print A1, A2, A3, A4, A5, Sum
}
Close #M
+ Win "Excel", dir$+"data2.csv"
}
Checkit
diff --git a/Task/CSV-data-manipulation/Nu/csv-data-manipulation-1.nu b/Task/CSV-data-manipulation/Nu/csv-data-manipulation-1.nu
new file mode 100644
index 0000000000..d137dc1b65
--- /dev/null
+++ b/Task/CSV-data-manipulation/Nu/csv-data-manipulation-1.nu
@@ -0,0 +1,5 @@
+open 'test_in.csv' |
+ each { |row|
+ let sum = ($row | values | math sum);
+ $row | insert Sum $sum
+ }
diff --git a/Task/CSV-data-manipulation/Nu/csv-data-manipulation-2.nu b/Task/CSV-data-manipulation/Nu/csv-data-manipulation-2.nu
new file mode 100644
index 0000000000..82640ab976
--- /dev/null
+++ b/Task/CSV-data-manipulation/Nu/csv-data-manipulation-2.nu
@@ -0,0 +1 @@
+open 'test_in.csv' | upsert Sum {|row| $row | values | math sum }
diff --git a/Task/Caesar-cipher/Ballerina/caesar-cipher.ballerina b/Task/Caesar-cipher/Ballerina/caesar-cipher.ballerina
new file mode 100644
index 0000000000..c0061314bf
--- /dev/null
+++ b/Task/Caesar-cipher/Ballerina/caesar-cipher.ballerina
@@ -0,0 +1,32 @@
+import ballerina/io;
+
+function encrypt(string s, int key) returns string {
+ final int offset = key % 26;
+ if offset == 0 { return s; }
+ int d;
+ int[] chars = [];
+ foreach int c in s.toCodePointInts() {
+ if c >= 64 && c <= 90 {
+ d = c + offset;
+ if d > 90 { d -= 26; }
+ } else if c >= 97 && c <= 122 {
+ d = c + offset;
+ if d > 122 { d -= 26; }
+ } else {
+ d = c;
+ }
+ chars.push(d);
+ }
+ return checkpanic string:fromCodePointInts(chars);
+}
+
+function decrypt(string s, int key) returns string {
+ return encrypt(s, 26 - key);
+}
+
+public function main() {
+ string encoded = encrypt("Bright vixens jump; dozy fowl quack.", 8);
+ io:println(encoded);
+ string decoded = decrypt(encoded, 8);
+ io:println(decoded);
+}
diff --git a/Task/Calculating-the-value-of-e/Ballerina/calculating-the-value-of-e.ballerina b/Task/Calculating-the-value-of-e/Ballerina/calculating-the-value-of-e.ballerina
new file mode 100644
index 0000000000..126270884a
--- /dev/null
+++ b/Task/Calculating-the-value-of-e/Ballerina/calculating-the-value-of-e.ballerina
@@ -0,0 +1,17 @@
+import ballerina/io;
+
+const EPSILON = 1e-15;
+
+public function main() {
+ int fact = 1;
+ float e = 2.0;
+ int n = 2;
+ while true {
+ float e0 = e;
+ fact *= n;
+ n += 1;
+ e += 1.0 / fact;
+ if (e - e0).abs() < EPSILON { break; }
+ }
+ io:println("e = ", e);
+}
diff --git a/Task/Calculating-the-value-of-e/EasyLang/calculating-the-value-of-e.easy b/Task/Calculating-the-value-of-e/EasyLang/calculating-the-value-of-e.easy
index d7d8e38d52..2c5eb9d8bf 100644
--- a/Task/Calculating-the-value-of-e/EasyLang/calculating-the-value-of-e.easy
+++ b/Task/Calculating-the-value-of-e/EasyLang/calculating-the-value-of-e.easy
@@ -1,4 +1,4 @@
-numfmt 15 0
+numfmt 0 15
fact = 1
n = 2
e = 2
diff --git a/Task/Calendar---for-REAL-programmers/Rust/calendar---for-real-programmers.rs b/Task/Calendar---for-REAL-programmers/Rust/calendar---for-real-programmers.rs
new file mode 100644
index 0000000000..493487a05c
--- /dev/null
+++ b/Task/Calendar---for-REAL-programmers/Rust/calendar---for-real-programmers.rs
@@ -0,0 +1,216 @@
+struct Months {
+ pub name: String,
+ pub days: i16,
+ pub start_wday: i16,
+ pub at: i16,
+}
+impl Months {
+ fn new_month(name: &str, days: i16) -> Self {
+ Months {
+ name: String::from(name),
+ days,
+ start_wday: 0,
+ at: 0,
+ }
+ }
+}
+struct Calendar {
+ year: i16,
+ width: i16,
+ cols: i16,
+ lead: i16,
+ gap: i16,
+ months: [Months; 12],
+ wdays: [&'static str; 7],
+}
+impl Calendar {
+ fn new_calendar(year: i16, width: i16) -> Self {
+ let mut calendar = Calendar {
+ year,
+ width,
+ cols: 0,
+ lead: 0,
+ gap: 0,
+ months: [
+ Months::new_month("JANUARY", 31),
+ Months::new_month("FEBRUARY", 28),
+ Months::new_month("MARCH", 31),
+ Months::new_month("APRIL", 30),
+ Months::new_month("MAY", 31),
+ Months::new_month("JUNE", 30),
+ Months::new_month("JULY", 31),
+ Months::new_month("AUGUST", 31),
+ Months::new_month("SEPTEMBER", 30),
+ Months::new_month("OCTOBER", 31),
+ Months::new_month("NOVEMBER", 30),
+ Months::new_month("DECEMBER", 31),
+ ],
+ wdays: ["SU", "MO", "TU", "WE", "TH", "FR", "SA"],
+ };
+ calendar.init_months();
+ calendar
+ }
+ fn init_months(&mut self) {
+ // Check for leap year and adjust February
+ if (self.year % 4 == 0 && self.year % 100 != 0) || self.year % 400 == 0 {
+ self.months[1].days = 29;
+ }
+ // Calculate starting weekday for January
+ let y = self.year - 1;
+ let year_days = (y % 7) * (365 % 7) % 7; // (y * 365) % 7
+ let leap_days = ((y >> 2) - y / 100 + y / 400) % 7;
+ self.months[0].start_wday = (year_days + leap_days + 1) % 7;
+ // Calculate starting weekdays for remaining months
+ for i in 1..12 {
+ self.months[i].start_wday =
+ ((self.months[i-1].start_wday as i16 + self.months[i-1].days as i16) % 7) as i16;
+ }
+ // Layout calculations
+ self.cols = (self.width + 2) / 22;
+ while 12 % self.cols != 0 {
+ self.cols -= 1;
+ }
+ self.gap = if self.cols > 1 {
+ let gap = (self.width - 20 * self.cols) / (self.cols - 1);
+ if gap > 4 { 4 } else { gap }
+ }
+ else {
+ 0
+ };
+ // Calculate left margin to center the calendar
+ self.lead = (self.width - (20 + self.gap) * self.cols + self.gap + 1) >> 1;
+ }
+ // Helper method to print N spaces
+ fn print_spaces(&self, n: i16) {
+ print!("{}", " ".repeat(n as usize));
+ }
+ // Print a horizontal row of month grids
+ fn print_row(&mut self, row: i16) {
+ let from = row * self.cols;
+ let to = from + self.cols;
+ // Print month names centered
+ self.print_spaces(self.lead);
+ for c in from..to {
+ let name_len = self.months[c as usize].name.len() as i16;
+ self.print_spaces((20 - name_len) >> 1);
+ print!("{}", self.months[c as usize].name);
+ let extra_spaces = 20 - name_len - ((20 - name_len) >> 1);
+ let gap_spaces = if c == to - 1 { 0 } else { self.gap };
+ self.print_spaces(extra_spaces + gap_spaces);
+ }
+ println!();
+ // Print weekday headers for each month
+ self.print_spaces(self.lead);
+ for c in from..to {
+ for i in 0..7 {
+ print!("{}", self.wdays[i as usize]);
+ if i < 6 {
+ print!(" ");
+ }
+ }
+ if c < to - 1 {
+ self.print_spaces(self.gap);
+ } else {
+ println!();
+ }
+ }
+ // Print the calendar days for all months in this row
+ loop {
+ // Check if we've printed all days for all months in this row
+ let mut all_done = true;
+ for c in from..to {
+ if self.months[c as usize].at < self.months[c as usize].days {
+ all_done = false;
+ break;
+ }
+ }
+ if all_done {
+ break;
+ }
+ self.print_spaces(self.lead);
+ for c in from..to {
+ let c_usize = c as usize;
+ let mut i = 0;
+ // Print spaces for days before the 1st of the month
+ while i < self.months[c_usize].start_wday {
+ self.print_spaces(3);
+ i += 1;
+ }
+ // Print the days of the month
+ while i < 7 && self.months[c_usize].at < self.months[c_usize].days {
+ self.months[c_usize].at += 1;
+ let day = self.months[c_usize].at;
+ // Print day with padding
+ if day < 10 {
+ print!(" {}", day);
+ } else {
+ print!("{}", day);
+ }
+ if i < 6 || c < to - 1 {
+ print!(" ");
+ }
+ i += 1;
+ }
+ // Fill remaining spaces in week if needed
+ while i < 7 && c < to - 1 {
+ self.print_spaces(3);
+ i += 1;
+ }
+ if c < to - 1 {
+ self.print_spaces(self.gap - 1);
+ }
+ self.months[c_usize].start_wday = 0; // Reset for next week
+ }
+ println!();
+ }
+ println!(); // Extra line between rows of months
+ }
+ // Print the entire year's calendar
+ fn print_year(&mut self) {
+ // Print centered year heading
+ let year_str = self.year.to_string();
+ let spaces = (self.width - year_str.len() as i16) >> 1;
+ self.print_spaces(spaces);
+ println!("{}", year_str);
+ println!();
+ // Print each row of months
+ let rows = 12 / self.cols;
+ for row in 0..rows {
+ self.print_row(row);
+ }
+ }
+}
+fn main() -> Result<(), String> {
+ let args: Vec = env::args().collect();
+ let mut year: i16 = 1969; // Default year
+ let mut width: i16 = 80; // Default width
+ let mut year_set = false;
+ // Process command line arguments
+ let mut i = 1;
+ while i < args.len() {
+ if args[i] == "-W" {
+ i += 1;
+ if i < args.len() {
+ width = args[i].parse::().map_err(|_| "Invalid width")?;
+ if width < 20 {
+ return Err("Width must be at least 20".to_string());
+ }
+ } else {
+ return Err("Missing width value after -W".to_string());
+ }
+ } else if !year_set {
+ year = match args[i].parse::() {
+ Ok(y) if y > 0 => y,
+ _ => 1969, // Default to 1969 if year is invalid
+ };
+ year_set = true;
+ } else {
+ return Err(format!("Too many arguments. Usage: {} YEAR [-W WIDTH (>= 20)]", args[0]));
+ }
+ i += 1;
+ }
+ // Generate and print the calendar
+ let mut calendar = Calendar::new_calendar(year, width);
+ calendar.print_year();
+ Ok(())
+}
diff --git a/Task/Calendar/00-TASK.txt b/Task/Calendar/00-TASK.txt
index 2224cf4612..2ae49d8177 100644
--- a/Task/Calendar/00-TASK.txt
+++ b/Task/Calendar/00-TASK.txt
@@ -17,6 +17,8 @@ For further Kudos see task [[Calendar - for "real" programmers|CALENDAR]], where
For economy of size, do not actually include Snoopy generation in either the code or the output, instead just output a place-holder.
+;See Also:
+:* [https://jmvdveer.home.xs4all.nl/en.post.snoopy-calender.html Snoopy calendar 1969-2025 Marcel van der Veer] - The deck is credited as being one of the first FOSS programs.
;Related task:
:* [[Five weekends]]
diff --git a/Task/Calendar/EasyLang/calendar.easy b/Task/Calendar/EasyLang/calendar.easy
index b785fed23d..c5d5c9d0d4 100644
--- a/Task/Calendar/EasyLang/calendar.easy
+++ b/Task/Calendar/EasyLang/calendar.easy
@@ -17,29 +17,21 @@ func$ makewk fst lst day .
.
for i = fst to lst
i$ = i
- if i <= 9
- i$ = " " & i
- .
+ if i <= 9 : i$ = " " & i
wstr$ &= i$ & " "
.
return substr wstr$ & blank$ 1 20
.
-proc dow y . ndow leap .
+proc dow y &ndow &leap .
leap = 0
- if y mod 4 = 0
- leap = 1
- .
- if y mod 100 = 0
- leap = 0
- .
- if y mod 400 = 0
- leap = 1
- .
+ if y mod 4 = 0 : leap = 1
+ if y mod 100 = 0 : leap = 0
+ if y mod 400 = 0 : leap = 1
ndow = y * 365 + y div 4 - y div 100 + y div 400 + 1
ndow = (ndow - leap) mod1 7
.
len lin$[] 8
-proc prmonth nmonth newdow monsize . .
+proc prmonth nmonth newdow monsize .
lin$[1] &= " " & month$[nmonth] & " "
lin$[2] &= wkdays$ & " "
lin$[3] &= makewk 1 (8 - newdow) newdow & " "
@@ -55,17 +47,13 @@ proc prmonth nmonth newdow monsize . .
.
.
.
-for i to pagewide
- blank$ &= " "
-.
+for i to pagewide : blank$ &= " "
dow year newdow leap
print center "[ picture of Snoopy goes here ]"
print center year
for i = 1 to 12
monsize = days[i]
- if i = 2 and leap = 1
- monsize = 29
- .
+ if i = 2 and leap = 1 : monsize = 29
prmonth i newdow monsize
newdow = (monsize + newdow) mod1 7
.
diff --git a/Task/Calkin-Wilf-sequence/C-sharp/calkin-wilf-sequence.cs b/Task/Calkin-Wilf-sequence/C-sharp/calkin-wilf-sequence.cs
new file mode 100644
index 0000000000..c991ef30c3
--- /dev/null
+++ b/Task/Calkin-Wilf-sequence/C-sharp/calkin-wilf-sequence.cs
@@ -0,0 +1,48 @@
+IEnumerable Fusc()
+{
+ yield return 1;
+ var n = 1;
+
+ foreach (var f in Fusc())
+ {
+ yield return n + f;
+ yield return f;
+ n = f;
+ }
+}
+
+IEnumerable ContFrac(int n, int d)
+{
+ while (d != 0)
+ {
+ yield return n / d;
+ (n, d) = (d, n % d);
+ }
+}
+
+Console.WriteLine("First 20 terms of the Calkin-Wilf sequence:");
+var n = 1;
+
+foreach (var f in Fusc().Take(20))
+{
+ Console.Write($"{n}/{f} ");
+ n = f;
+}
+
+Console.WriteLine();
+var bits = 0L;
+var bit = 1L;
+var shift = 0;
+
+foreach (var c in ContFrac(83116, 51639))
+{
+ for (var i = 0; i < c; i++)
+ {
+ bits |= bit << shift;
+ shift++;
+ }
+
+ bit = 1 - bit;
+}
+
+Console.WriteLine($"83116/51639 is at position {bits} in the sequence");
diff --git a/Task/Calkin-Wilf-sequence/EasyLang/calkin-wilf-sequence.easy b/Task/Calkin-Wilf-sequence/EasyLang/calkin-wilf-sequence.easy
index 58bad99625..5ba9c6ad0d 100644
--- a/Task/Calkin-Wilf-sequence/EasyLang/calkin-wilf-sequence.easy
+++ b/Task/Calkin-Wilf-sequence/EasyLang/calkin-wilf-sequence.easy
@@ -1,7 +1,8 @@
subr first
- n = 1 ; d = 1
+ n = 1
+ d = 1
.
-proc next . .
+proc next .
n = 2 * (n div d) * d + d - n
swap n d
.
diff --git a/Task/Call-a-function/EasyLang/call-a-function.easy b/Task/Call-a-function/EasyLang/call-a-function.easy
index 7259ecaad6..08dbf24e42 100644
--- a/Task/Call-a-function/EasyLang/call-a-function.easy
+++ b/Task/Call-a-function/EasyLang/call-a-function.easy
@@ -3,7 +3,7 @@ func sqr n .
.
print sqr 3
#
-proc divmod a b . q r .
+proc divmod a b &q &r .
q = a div b
r = a mod b
.
diff --git a/Task/Camel-case-and-snake-case/JavaScript/camel-case-and-snake-case.js b/Task/Camel-case-and-snake-case/JavaScript/camel-case-and-snake-case.js
new file mode 100644
index 0000000000..73b10c2641
--- /dev/null
+++ b/Task/Camel-case-and-snake-case/JavaScript/camel-case-and-snake-case.js
@@ -0,0 +1,82 @@
+const HYPHEN = '-';
+const SPACE = ' ';
+const UNDERSCORE = '_';
+const WHITESPACE = " \n\r\t\f\v";
+
+function leftTrim(text) {
+ const start = text.search(/\S/); // Find the index of the first non-whitespace character
+ return start === -1 ? "" : text.substring(start);
+}
+
+function rightTrim(text) {
+ const end = text.search(/\S(?![\s\S]*\S)/); // Find the index of the last non-whitespace character
+ return end === -1 ? "" : text.substring(0, end + 1);
+}
+
+function trim(text) {
+ return leftTrim(rightTrim(text));
+}
+
+function prepareForConversion(text) {
+ text = trim(text);
+ text = text.replace(new RegExp(SPACE, 'g'), UNDERSCORE);
+ text = text.replace(new RegExp(HYPHEN, 'g'), UNDERSCORE);
+ return text; // Return the modified text
+}
+
+function toSnakeCase(camel) {
+ camel = prepareForConversion(camel);
+ let snake = "";
+ let first = true;
+ for (const ch of camel) {
+ if (first) {
+ snake += ch;
+ first = false;
+ } else if (!first && ch >= 'A' && ch <= 'Z') {
+ if (snake.slice(-1) === UNDERSCORE) {
+ snake += ch.toLowerCase();
+ } else {
+ snake += UNDERSCORE;
+ snake += ch.toLowerCase();
+ }
+ } else {
+ snake += ch;
+ }
+ }
+ return snake;
+}
+
+function toCamelCase(snake) {
+ snake = prepareForConversion(snake);
+ let camel = "";
+ let underscore = false;
+ for (const ch of snake) {
+ if (ch === UNDERSCORE) {
+ underscore = true;
+ } else if (underscore) {
+ camel += ch.toUpperCase();
+ underscore = false;
+ } else {
+ camel += ch;
+ }
+ }
+ return camel;
+}
+
+function main() {
+ const variableNames = ["snakeCase", "snake_case", "variable_10_case",
+ "variable10Case", "ergo rE tHis", "hurry-up-joe!", "c://my-docs/happy_Flag-Day/12.doc", " spaces "];
+
+ console.log("".padEnd(48, " ") + "=== To snake_case ===");
+ for (const text of variableNames) {
+ console.log("".padEnd(34, " ") + text + " --> " + toSnakeCase(text));
+ }
+
+ console.log("\n");
+ console.log("".padEnd(48, " ") + "=== To camelCase ===");
+ for (const text of variableNames) {
+ console.log("".padEnd(34, " ") + text + " --> " + toCamelCase(text));
+ }
+}
+
+main();
diff --git a/Task/Camel-case-and-snake-case/R/camel-case-and-snake-case.r b/Task/Camel-case-and-snake-case/R/camel-case-and-snake-case.r
new file mode 100644
index 0000000000..bf208f540b
--- /dev/null
+++ b/Task/Camel-case-and-snake-case/R/camel-case-and-snake-case.r
@@ -0,0 +1,56 @@
+library(stringr)
+
+test_strings <- c("snakeCase", "snake_case", "variable_10_case", "variable10Case", "ɛrgo rE tHis",
+ "hurry-up-joe!", "c://my-docs/happy_Flag-Day/12.doc", " spaces ")
+
+#Simple functions
+snake2camel <- function(s){
+ boundaries <- str_extract_all(s, "_+[^_]", simplify=TRUE)
+ boundaries <- str_replace_all(boundaries, "_", "")
+ for(b in boundaries){
+ s <- str_replace_all(s, str_c("_+",b), str_to_upper(b))
+ }
+ return(s)
+}
+
+writeLines(c("Snake to camel case:", sapply(test_strings, camel2snake)))
+
+camel2snake <- function(s){
+ boundaries <- str_extract_all(s, "[A-Z]", simplify=TRUE)
+ for(b in boundaries){
+ s <- str_replace_all(s, b, str_c("_", str_to_lower(b)))
+ }
+ return(s)
+}
+
+writeLines(c("Camel to snake case:", sapply(test_strings, camel2snake)))
+
+#More general functions
+any2camel <- function(s){
+ #strip leading and trailing whitespace
+ s <- str_replace_all(s, "^[\\h]+|[\\h]+$", "")
+ #Deal with specified separators
+ boundaries <- str_extract_all(s, "[ _-]+[^ _-]", simplify=TRUE)
+ boundaries <- str_replace_all(boundaries, "[ _-]", "")
+ for(b in boundaries){
+ s <- str_replace_all(s, str_c("[ _-]+", b), str_to_upper(b))
+ }
+ return(s)
+}
+
+writeLines(c("Any separator to camel case:", sapply(test_strings, any2camel)))
+
+any2snake <- function(s){
+ s <- str_replace_all(s, "^[\\h]+|[\\h]+$", "")
+ boundaries_camel <- str_extract_all(s, "[A-Z]", simplify=TRUE)
+ boundaries_other <- str_extract_all(s, "[ -]+", simplify=TRUE)
+ for(b in boundaries_camel){
+ s <- str_replace_all(s, b, str_c("_", str_to_lower(b)))
+ }
+ for(b in boundaries_other){
+ s <- str_replace_all(s, b, "_")
+ }
+ return(s)
+}
+
+writeLines(c("Any separator to snake case:", sapply(test_strings, any2snake)))
diff --git a/Task/Canonicalize-CIDR/ALGOL-68/canonicalize-cidr.alg b/Task/Canonicalize-CIDR/ALGOL-68/canonicalize-cidr.alg
index 7befa0b1eb..6a3f49135f 100644
--- a/Task/Canonicalize-CIDR/ALGOL-68/canonicalize-cidr.alg
+++ b/Task/Canonicalize-CIDR/ALGOL-68/canonicalize-cidr.alg
@@ -1,22 +1,22 @@
BEGIN # show IPv4 addresses in CIDR notation in canonical form #
# mode to hold an IPv4 address in CIDR notation #
- MODE CIDR = STRUCT( BITS address
- , INT network bits
- , BOOL valid
- , STRING error
+ MODE CIDR = STRUCT( LONG BITS address
+ , INT network bits
+ , BOOL valid
+ , STRING error
);
# returns a CIDR parsed from address #
OP TOCIDR = ( STRING address text )CIDR:
BEGIN
- STRING addr = "." + address text + "$";
- STRING error := "";
- BITS address := 16r0;
- INT bits count := 0;
- INT dot count := 0;
- INT slash count := 0;
- BOOL valid := TRUE;
- INT s pos := LWB addr;
- INT s max = UPB addr;
+ STRING addr = "." + address text + "$";
+ STRING error := "";
+ LONG BITS address := 16r0;
+ INT bits count := 0;
+ INT dot count := 0;
+ INT slash count := 0;
+ BOOL valid := TRUE;
+ INT s pos := LWB addr;
+ INT s max = UPB addr;
WHILE s pos < s max AND valid DO
IF addr[ s pos ] = "." THEN
# must have an octet next #
@@ -70,7 +70,7 @@ BEGIN # show IPv4 addresses in CIDR notation in canonical form #
address
ELSE
# valid address - retain the top most bits #
- CIDR( address OF address AND ( 16rffffffff
+ CIDR( address OF address AND ( LONG 16rffffffff
SHL ( 32 - network bits OF address )
)
, network bits OF address
@@ -82,9 +82,9 @@ BEGIN # show IPv4 addresses in CIDR notation in canonical form #
OP TOSTRING = ( CIDR address )STRING:
BEGIN
[ 1 : 4 ]INT octet;
- BITS addr := address OF address;
+ LONG BITS addr := address OF address;
FOR o pos FROM UPB octet BY -1 TO LWB octet DO
- octet[ o pos ] := ABS ( addr AND 16rff );
+ octet[ o pos ] := SHORTEN ABS ( addr AND 16rff );
addr := addr SHR 8
OD;
STRING result := whole( octet[ LWB octet ], 0 );
diff --git a/Task/Canonicalize-CIDR/Zig/canonicalize-cidr.zig b/Task/Canonicalize-CIDR/Zig/canonicalize-cidr.zig
new file mode 100644
index 0000000000..7d5877d51d
--- /dev/null
+++ b/Task/Canonicalize-CIDR/Zig/canonicalize-cidr.zig
@@ -0,0 +1,70 @@
+const std = @import("std");
+
+const Ipv4Cidr = struct {
+ address: u32,
+ mask_length: u8,
+
+ pub fn parse(s: []const u8) !Ipv4Cidr {
+ var split = std.mem.splitSequence(u8, s, "/");
+ const addr_str = split.first();
+ const mask_str = split.next() orelse return error.InvalidFormat;
+ if (split.next() != null) return error.InvalidFormat;
+
+ var octets: [4]u8 = undefined;
+ var addr_split = std.mem.splitSequence(u8, addr_str, ".");
+ for (0..4) |i| {
+ const part = addr_split.next() orelse return error.InvalidFormat;
+ octets[i] = std.fmt.parseInt(u8, part, 10) catch return error.InvalidFormat;
+ }
+ if (addr_split.next() != null) return error.InvalidFormat;
+
+ const address = (@as(u32, octets[0]) << 24) |
+ (@as(u32, octets[1]) << 16) |
+ (@as(u32, octets[2]) << 8) |
+ octets[3];
+
+ const mask_length = std.fmt.parseInt(u8, mask_str, 10) catch return error.InvalidFormat;
+ if (mask_length < 1 or mask_length > 32) return error.InvalidMask;
+
+ const shift = @as(u5, @intCast(32 - mask_length));
+ const mask = ~((@as(u32, 1) << shift) - 1);
+ const masked_address = address & mask;
+
+ return Ipv4Cidr{
+ .address = masked_address,
+ .mask_length = mask_length,
+ };
+ }
+
+ pub fn format(
+ self: Ipv4Cidr,
+ comptime _: []const u8,
+ _: std.fmt.FormatOptions,
+ writer: anytype,
+ ) !void {
+ const a = (self.address >> 24) & 0xFF;
+ const b = (self.address >> 16) & 0xFF;
+ const c = (self.address >> 8) & 0xFF;
+ const d = self.address & 0xFF;
+ try writer.print("{}.{}.{}.{}/{}", .{a, b, c, d, self.mask_length});
+ }
+};
+
+pub fn main() !void {
+ const tests = [_][]const u8{
+ "87.70.141.1/22",
+ "36.18.154.103/12",
+ "62.62.197.11/29",
+ "67.137.119.181/4",
+ "161.214.74.21/24",
+ "184.232.176.184/18",
+ };
+
+ for (tests) |my_test| {
+ const cidr = Ipv4Cidr.parse(my_test) catch |err| {
+ std.debug.print("{s}: invalid CIDR ({s})\n", .{my_test, @errorName(err)});
+ continue;
+ };
+ std.debug.print("{s:<18} -> {}\n", .{my_test, cidr});
+ }
+}
diff --git a/Task/Cantor-set/EasyLang/cantor-set.easy b/Task/Cantor-set/EasyLang/cantor-set.easy
index 61ccf82fa3..6e79ec59bb 100644
--- a/Task/Cantor-set/EasyLang/cantor-set.easy
+++ b/Task/Cantor-set/EasyLang/cantor-set.easy
@@ -1,9 +1,8 @@
-color 555
-proc cantor x y sz . .
+gcolor 555
+proc cantor x y sz .
if sz > 0.1
sz3 = sz / 3
- move x y - sz3
- rect sz sz3
+ grect x y - sz3 sz sz3
cantor x y - sz3 sz3
cantor x + 2 * sz3 y - sz3 sz3
.
diff --git a/Task/Carmichael-3-strong-pseudoprimes/EasyLang/carmichael-3-strong-pseudoprimes.easy b/Task/Carmichael-3-strong-pseudoprimes/EasyLang/carmichael-3-strong-pseudoprimes.easy
index cbe08cb092..a1d4f5ee2a 100644
--- a/Task/Carmichael-3-strong-pseudoprimes/EasyLang/carmichael-3-strong-pseudoprimes.easy
+++ b/Task/Carmichael-3-strong-pseudoprimes/EasyLang/carmichael-3-strong-pseudoprimes.easy
@@ -1,14 +1,12 @@
func isprim num .
i = 2
while i <= sqrt num
- if num mod i = 0
- return 0
- .
+ if num mod i = 0 : return 0
i += 1
.
return 1
.
-proc carmichael3 p1 . .
+proc carmichael3 p1 .
for h3 = 1 to p1 - 1
for d = 1 to h3 + p1 - 1
if (h3 + p1) * (p1 - 1) mod d = 0 and -p1 * p1 mod h3 = d mod h3
diff --git a/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes-1.rexx b/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes-1.rexx
deleted file mode 100644
index 5eefc267eb..0000000000
--- a/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes-1.rexx
+++ /dev/null
@@ -1,42 +0,0 @@
-/*REXX program calculates Carmichael 3─strong pseudoprimes (up to and including N). */
-numeric digits 18 /*handle big dig #s (9 is the default).*/
-parse arg N .; if N=='' | N=="," then N=61 /*allow user to specify for the search.*/
-tell= N>0; N= abs(N) /*N>0? Then display Carmichael numbers*/
-#= 0 /*number of Carmichael numbers so far. */
-@.=0; @.2=1; @.3=1; @.5=1; @.7=1; @.11=1; @.13=1; @.17=1; @.19=1; @.23=1; @.29=1; @.31=1
- /*[↑] prime number memoization array. */
- do p=3 to N by 2; pm= p-1; bot=0; top=0 /*step through some (odd) prime numbers*/
- if \isPrime(p) then iterate; nps= -p*p /*is P a prime? No, then skip it.*/
- c.= 0 /*the list of Carmichael #'s (so far).*/
- do h3=2 for pm-1; g= h3 + p /*get Carmichael numbers for this prime*/
- npsH3= ((nps // h3) + h3) // h3 /*define a couple of shortcuts for pgm.*/
- gPM= g * pm /*define a couple of shortcuts for pgm.*/
- /* [↓] perform some weeding of D values*/
- do d=1 for g-1; if gPM // d \== 0 then iterate
- if npsH3 \== d//h3 then iterate
- q= 1 + gPM % d; if \isPrime(q) then iterate
- r= 1 + p * q % h3; if q * r // pm \== 1 then iterate
- if \isPrime(r) then iterate
- #= # + 1; c.q= r /*bump Carmichael counter; add to array*/
- if bot==0 then bot= q; bot= min(bot, q); top= max(top, q)
- end /*d*/
- end /*h3*/
- $= /*build list of some Carmichael numbers*/
- if tell then do j=bot to top by 2; if c.j\==0 then $= $ p"∙"j'∙'c.j
- end /*j*/
-
- if $\=='' then say 'Carmichael number: ' strip($)
- end /*p*/
-say
-say '──────── ' # " Carmichael numbers found."
-exit /*stick a fork in it, we're all done. */
-/*──────────────────────────────────────────────────────────────────────────────────────*/
-isPrime: parse arg x; if @.x then return 1 /*is X a known prime?*/
- if x<37 then return 0; if x//2==0 then return 0; if x// 3==0 then return 0
- parse var x '' -1 _; if _==5 then return 0; if x// 7==0 then return 0
- if x//11==0 then return 0; if x//13==0 then return 0; if x//17==0 then return 0
- if x//19==0 then return 0; if x//23==0 then return 0; if x//29==0 then return 0
- do k=29 by 6 until k*k>x; if x//k ==0 then return 0
- if x//(k+2) ==0 then return 0
- end /*k*/
- @.x=1; return 1
diff --git a/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes-2.rexx b/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes-2.rexx
deleted file mode 100644
index 586ab2e701..0000000000
--- a/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes-2.rexx
+++ /dev/null
@@ -1,59 +0,0 @@
-include Settings
-
-say version; say 'Carmichael 3 strong primes'; say
-arg n
-numeric digits 16
-if n = '' then
- n = 61
-show = (n > 0); n = Abs(n)
-c = Carmichaels(n)
-if show then do
- do i = 1 to capr.0
- say capr.prime1.i 'x' capr.prime2.i 'x' capr.prime3.i '=',
- capr.prime1.i * capr.prime2.i * capr.prime3.i
- end
-end
-say c 'Carmichael numbers found up to first prime' n
-say time('e') 'seconds'
-exit
-
-Carmichaels:
-/* Carmichael 3 strong prime numbers */
-procedure expose capr.
-parse arg x
-n = 0
-do p1 = 3 by 2 to x
-/* Method Janeson */
- if \ Prime(p1) then
- iterate p1
- pm = p1-1; ps = -p1*p1
- do h3 = 1 to pm
- t1 = (h3+p1) * pm; t2 = ps//h3
- if t2 < 0 then
- t2 = t2+h3
- do d = 1 to h3+pm
- if t1//d <> 0 then
- iterate d
- if t2 <> d//h3 then
- iterate d
- p2 = 1+t1%d
- if \ Prime(p2) then
- iterate d
- p3 = 1+(p1*p2%h3)
- if \ Prime(p3) then
- iterate d
- if (p2*p3)//pm <> 1 then
- iterate d
-/* Save results */
- n = n+1
- capr.prime1.n = p1; capr.prime2.n = p2; capr.prime3.n = p3
- end d
- end h3
-end
-capr.0 = n
-/* Return count */
-return n
-
-include Numbers
-include Functions
-include Abend
diff --git a/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes.rexx b/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes.rexx
new file mode 100644
index 0000000000..9cce219003
--- /dev/null
+++ b/Task/Carmichael-3-strong-pseudoprimes/REXX/carmichael-3-strong-pseudoprimes.rexx
@@ -0,0 +1,26 @@
+-- 22 Mar 2025
+include Settings
+
+say 'CARMICHAEL 3 STRONG PSEUDOPRIMES'
+say version
+say
+arg n
+numeric digits 16
+if n = '' then
+ n = 61
+show = (n > 0); n = Abs(n)
+c = Carmichaels(n)
+if show then do
+ do i = 1 to carm.0
+ say carm.1.i 'x' carm.2.i 'x' carm.3.i '=',
+ carm.1.i * carm.2.i * carm.3.i
+ end
+end
+say c 'Carmichael numbers found up to first prime' n
+say time('e') 'seconds'
+exit
+
+include Sequences
+include Numbers
+include Functions
+include Abend
diff --git a/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists-1.cpp b/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists-1.cpp
new file mode 100644
index 0000000000..39cb7169a1
--- /dev/null
+++ b/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists-1.cpp
@@ -0,0 +1,66 @@
+#include
+#include
+#include
+
+void print_inner(const std::vector &v) {
+ std::cout << "(";
+ auto it = v.begin();
+ if (!v.empty()) {
+ std::cout << *it++; // Yield beginning value, then advance
+ }
+ for (; it != v.end(); ++it) {
+ std::cout << ", " << *it;
+ }
+ std::cout << ")";
+}
+
+void print(const std::vector > &v) {
+ std::cout << "[";
+ auto it = v.begin();
+ if (!v.empty()) {
+ print_inner(*it++); // Yield beginning value, then advance
+ }
+ for (; it != v.end(); ++it) {
+ std::cout << ", ";
+ print_inner(*it);
+ }
+ std::cout << "]\n";
+}
+
+auto product(const std::vector > &lists) {
+ std::vector > result;
+ if (std::find_if(std::begin(lists), std::end(lists),
+ [](const auto &e) -> bool { return e.empty(); }) != std::end(lists)) {
+ return result;
+ }
+ for (auto &e: lists[0]) {
+ result.push_back({e});
+ }
+ for (size_t i = 1; i < lists.size(); ++i) {
+ std::vector > temp;
+ for (const auto &e: result) {
+ for (auto f: lists[i]) {
+ auto e_tmp = e;
+ e_tmp.push_back(f);
+ temp.push_back(e_tmp);
+ }
+ }
+ result = temp;
+ }
+ return result;
+}
+
+int main() {
+ std::vector > prods[] = {
+ {{1, 2}, {3, 4}},
+ {{3, 4}, {1, 2}},
+ {{1, 2}, {}},
+ {{}, {1, 2}},
+ {{1776, 1789}, {7, 12}, {4, 14, 23}, {0, 1}},
+ {{1, 2, 3}, {30}, {500, 100}},
+ {{1, 2, 3}, {}, {500, 100}}
+ };
+ for (const auto &p: prods) {
+ print(product(p));
+ }
+}
diff --git a/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists-2.cpp b/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists-2.cpp
new file mode 100644
index 0000000000..2c22d76f01
--- /dev/null
+++ b/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists-2.cpp
@@ -0,0 +1,36 @@
+#include
+#include
+#include
+#include
+
+template
+using a = std::array;
+
+template
+using t = std::tuple;
+
+template
+constexpr auto product(const t& inputs) {
+ const auto rng = std::apply(std::views::cartesian_product, inputs);
+
+ std::println("{}", rng);
+}
+
+int main() {
+ // The size of each list of arrays needs to be known at compile-time in order to use `cartesian_product()`
+ // However, each array is a different size, thus a distinct type, so we use a tuple to hold all of them
+ // The brace-initialized constructor cannot deduce the type of empty array, so we spell them out manually
+ constexpr auto prods = t{
+ t{a{1, 2}, a{3, 4}},
+ t{a{3, 4}, a{1, 2}},
+ t{a{1, 2}, a{}},
+ t{a{}, a{1, 2}},
+ t{a{1776, 1789}, a{7, 12}, a{4, 14, 23}, a{0, 1}},
+ t{a{1, 2, 3}, a{30}, a{500, 100}},
+ t{a{1, 2, 3}, a{}, a{500, 100}}
+ };
+
+ std::apply([](const auto &... test_cases) {
+ (product(test_cases), ...);
+ }, prods);
+}
diff --git a/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists.cpp b/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists.cpp
deleted file mode 100644
index e4a99032bd..0000000000
--- a/Task/Cartesian-product-of-two-or-more-lists/C++/cartesian-product-of-two-or-more-lists.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#include
-#include
-#include