diff --git a/Lang/ALGOL-68/FASTA-format b/Lang/ALGOL-68/FASTA-format
new file mode 120000
index 0000000000..6951549e47
--- /dev/null
+++ b/Lang/ALGOL-68/FASTA-format
@@ -0,0 +1 @@
+../../Task/FASTA-format/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-68/Next-highest-int-from-digits b/Lang/ALGOL-68/Next-highest-int-from-digits
new file mode 120000
index 0000000000..7e6acab659
--- /dev/null
+++ b/Lang/ALGOL-68/Next-highest-int-from-digits
@@ -0,0 +1 @@
+../../Task/Next-highest-int-from-digits/ALGOL-68
\ No newline at end of file
diff --git a/Lang/ALGOL-W/00-LANG.txt b/Lang/ALGOL-W/00-LANG.txt
index 7d04034cdb..eed21ba5cf 100644
--- a/Lang/ALGOL-W/00-LANG.txt
+++ b/Lang/ALGOL-W/00-LANG.txt
@@ -28,6 +28,9 @@ Awe correctly compiles Tony Marsland's computer [[wp:chess|chess]] player
and Hendrik Boom's [http://mtn-host.prjek.net/projects/a68h/ A68H]
[[Algol 68]] compiler.
+==To do==
+[[Tasks not implemented in ALGOL W]]
+
==See also==
*[[wp:ALGOL_W|Algol W on Wikipedia]]
*[[ALGOL 60]]
diff --git a/Lang/ALGOL-W/Numbers-which-are-the-cube-roots-of-the-product-of-their-proper-divisors b/Lang/ALGOL-W/Numbers-which-are-the-cube-roots-of-the-product-of-their-proper-divisors
new file mode 120000
index 0000000000..19db81f6ed
--- /dev/null
+++ b/Lang/ALGOL-W/Numbers-which-are-the-cube-roots-of-the-product-of-their-proper-divisors
@@ -0,0 +1 @@
+../../Task/Numbers-which-are-the-cube-roots-of-the-product-of-their-proper-divisors/ALGOL-W
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/Horizontal-sundial-calculations b/Lang/ANSI-BASIC/Horizontal-sundial-calculations
new file mode 120000
index 0000000000..9ac1ff4a6b
--- /dev/null
+++ b/Lang/ANSI-BASIC/Horizontal-sundial-calculations
@@ -0,0 +1 @@
+../../Task/Horizontal-sundial-calculations/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/Largest-proper-divisor-of-n b/Lang/ANSI-BASIC/Largest-proper-divisor-of-n
new file mode 120000
index 0000000000..e505793222
--- /dev/null
+++ b/Lang/ANSI-BASIC/Largest-proper-divisor-of-n
@@ -0,0 +1 @@
+../../Task/Largest-proper-divisor-of-n/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/ANSI-BASIC/Nth b/Lang/ANSI-BASIC/Nth
new file mode 120000
index 0000000000..83517d5111
--- /dev/null
+++ b/Lang/ANSI-BASIC/Nth
@@ -0,0 +1 @@
+../../Task/Nth/ANSI-BASIC
\ No newline at end of file
diff --git a/Lang/ARM-Assembly/Averages-Median b/Lang/ARM-Assembly/Averages-Median
new file mode 120000
index 0000000000..c20d36fae7
--- /dev/null
+++ b/Lang/ARM-Assembly/Averages-Median
@@ -0,0 +1 @@
+../../Task/Averages-Median/ARM-Assembly
\ No newline at end of file
diff --git a/Lang/ATS/Determine-if-two-triangles-overlap b/Lang/ATS/Determine-if-two-triangles-overlap
new file mode 120000
index 0000000000..68e5e730ef
--- /dev/null
+++ b/Lang/ATS/Determine-if-two-triangles-overlap
@@ -0,0 +1 @@
+../../Task/Determine-if-two-triangles-overlap/ATS
\ No newline at end of file
diff --git a/Lang/AutoHotkey/ASCII-art-diagram-converter b/Lang/AutoHotkey/ASCII-art-diagram-converter
new file mode 120000
index 0000000000..fe014a6bf3
--- /dev/null
+++ b/Lang/AutoHotkey/ASCII-art-diagram-converter
@@ -0,0 +1 @@
+../../Task/ASCII-art-diagram-converter/AutoHotkey
\ No newline at end of file
diff --git a/Lang/C++/00-LANG.txt b/Lang/C++/00-LANG.txt
index f5d2924ed6..5bd73a99aa 100644
--- a/Lang/C++/00-LANG.txt
+++ b/Lang/C++/00-LANG.txt
@@ -12,7 +12,7 @@
|LCT=yes
|bnf=http://cpp.comsci.us/syntax/statement/index.html}}{{codepad}}{{allows|Network access}}{{allows|Database access
}}{{allows|Concurrency}}{{provides|Run time polymorphism}}{{provides|Compile time polymorphism}}{{allows|Windowing UI}}{{allows|Graphics}}{{allows|OpenGL}}{{allows|Dynamic linking}}{{provides|File access}}{{allows|File system access}}{{provides|Objects}}{{allows|Signal handling}}{{provides|Mutable state}}
-'''C++''' is named after the [[derived from::compatible with::C]] language, from which it is derived. C++ extends C into an [[object-oriented language]]. However, unlike other object-oriented languages, it doesn't try to force you into [[object-oriented programming]], but is a multi-[[:Category:Programming Paradigms|paradigm]] language. Besides conventional [[procedural programming]] and object-oriented programming, it also supports [[generic programming]].
+'''C++''' is named after the C language, from which it is derived. C++ extends C into an [[object-oriented language]]. However, unlike other object-oriented languages, it doesn't try to force you into [[object-oriented programming]], but is a multi-[[:Category:Programming Paradigms|paradigm]] language. Besides conventional [[procedural programming]] and object-oriented programming, it also supports [[generic programming]].
If you can't find an implementation for your task in the C++ category below, please look in the [[C]] category, as many of the tasks can be implemented identically in C and C++.
diff --git a/Lang/C++/B-zier-curves-Intersections b/Lang/C++/B-zier-curves-Intersections
new file mode 120000
index 0000000000..8499695feb
--- /dev/null
+++ b/Lang/C++/B-zier-curves-Intersections
@@ -0,0 +1 @@
+../../Task/B-zier-curves-Intersections/C++
\ No newline at end of file
diff --git a/Lang/C++/Deconvolution-1D b/Lang/C++/Deconvolution-1D
new file mode 120000
index 0000000000..e1264f9bbd
--- /dev/null
+++ b/Lang/C++/Deconvolution-1D
@@ -0,0 +1 @@
+../../Task/Deconvolution-1D/C++
\ No newline at end of file
diff --git a/Lang/C++/Demings-funnel b/Lang/C++/Demings-funnel
new file mode 120000
index 0000000000..4aaac74cc8
--- /dev/null
+++ b/Lang/C++/Demings-funnel
@@ -0,0 +1 @@
+../../Task/Demings-funnel/C++
\ No newline at end of file
diff --git a/Lang/C++/Determine-sentence-type b/Lang/C++/Determine-sentence-type
new file mode 120000
index 0000000000..707f2f3f78
--- /dev/null
+++ b/Lang/C++/Determine-sentence-type
@@ -0,0 +1 @@
+../../Task/Determine-sentence-type/C++
\ No newline at end of file
diff --git a/Lang/C++/Distance-and-Bearing b/Lang/C++/Distance-and-Bearing
new file mode 120000
index 0000000000..3df222c9d2
--- /dev/null
+++ b/Lang/C++/Distance-and-Bearing
@@ -0,0 +1 @@
+../../Task/Distance-and-Bearing/C++
\ No newline at end of file
diff --git a/Lang/C++/EKG-sequence-convergence b/Lang/C++/EKG-sequence-convergence
new file mode 120000
index 0000000000..752c0b16e1
--- /dev/null
+++ b/Lang/C++/EKG-sequence-convergence
@@ -0,0 +1 @@
+../../Task/EKG-sequence-convergence/C++
\ No newline at end of file
diff --git a/Lang/C++/Pisano-period b/Lang/C++/Pisano-period
new file mode 120000
index 0000000000..649197ce20
--- /dev/null
+++ b/Lang/C++/Pisano-period
@@ -0,0 +1 @@
+../../Task/Pisano-period/C++
\ No newline at end of file
diff --git a/Lang/C/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k b/Lang/C/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k
new file mode 120000
index 0000000000..ddb6ce6303
--- /dev/null
+++ b/Lang/C/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k
@@ -0,0 +1 @@
+../../Task/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k/C
\ No newline at end of file
diff --git a/Lang/Craft-Basic/Harmonic-series b/Lang/Craft-Basic/Harmonic-series
new file mode 120000
index 0000000000..a11d3963eb
--- /dev/null
+++ b/Lang/Craft-Basic/Harmonic-series
@@ -0,0 +1 @@
+../../Task/Harmonic-series/Craft-Basic
\ No newline at end of file
diff --git a/Lang/Craft-Basic/Largest-proper-divisor-of-n b/Lang/Craft-Basic/Largest-proper-divisor-of-n
new file mode 120000
index 0000000000..1f5596ae43
--- /dev/null
+++ b/Lang/Craft-Basic/Largest-proper-divisor-of-n
@@ -0,0 +1 @@
+../../Task/Largest-proper-divisor-of-n/Craft-Basic
\ No newline at end of file
diff --git a/Lang/EMal/Comments b/Lang/EMal/Comments
new file mode 120000
index 0000000000..09f782bacf
--- /dev/null
+++ b/Lang/EMal/Comments
@@ -0,0 +1 @@
+../../Task/Comments/EMal
\ No newline at end of file
diff --git a/Lang/EMal/Enumerations b/Lang/EMal/Enumerations
new file mode 120000
index 0000000000..711fc51114
--- /dev/null
+++ b/Lang/EMal/Enumerations
@@ -0,0 +1 @@
+../../Task/Enumerations/EMal
\ No newline at end of file
diff --git a/Lang/EMal/Filter b/Lang/EMal/Filter
new file mode 120000
index 0000000000..e496c77526
--- /dev/null
+++ b/Lang/EMal/Filter
@@ -0,0 +1 @@
+../../Task/Filter/EMal
\ No newline at end of file
diff --git a/Lang/EMal/Hash-from-two-arrays b/Lang/EMal/Hash-from-two-arrays
new file mode 120000
index 0000000000..25f9a9c7af
--- /dev/null
+++ b/Lang/EMal/Hash-from-two-arrays
@@ -0,0 +1 @@
+../../Task/Hash-from-two-arrays/EMal
\ No newline at end of file
diff --git a/Lang/EMal/Inheritance-Single b/Lang/EMal/Inheritance-Single
new file mode 120000
index 0000000000..a68d11ae59
--- /dev/null
+++ b/Lang/EMal/Inheritance-Single
@@ -0,0 +1 @@
+../../Task/Inheritance-Single/EMal
\ No newline at end of file
diff --git a/Lang/EMal/String-prepend b/Lang/EMal/String-prepend
new file mode 120000
index 0000000000..9ace108cf5
--- /dev/null
+++ b/Lang/EMal/String-prepend
@@ -0,0 +1 @@
+../../Task/String-prepend/EMal
\ No newline at end of file
diff --git a/Lang/F-Sharp/Minkowski-question-mark-function b/Lang/F-Sharp/Minkowski-question-mark-function
new file mode 120000
index 0000000000..7a9886265b
--- /dev/null
+++ b/Lang/F-Sharp/Minkowski-question-mark-function
@@ -0,0 +1 @@
+../../Task/Minkowski-question-mark-function/F-Sharp
\ No newline at end of file
diff --git a/Lang/Free-Pascal-Lazarus/Abundant-deficient-and-perfect-number-classifications b/Lang/Free-Pascal-Lazarus/Abundant-deficient-and-perfect-number-classifications
new file mode 120000
index 0000000000..861558930b
--- /dev/null
+++ b/Lang/Free-Pascal-Lazarus/Abundant-deficient-and-perfect-number-classifications
@@ -0,0 +1 @@
+../../Task/Abundant-deficient-and-perfect-number-classifications/Free-Pascal-Lazarus
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Canonicalize-CIDR b/Lang/FreeBASIC/Canonicalize-CIDR
new file mode 120000
index 0000000000..23d4ee9b09
--- /dev/null
+++ b/Lang/FreeBASIC/Canonicalize-CIDR
@@ -0,0 +1 @@
+../../Task/Canonicalize-CIDR/FreeBASIC
\ No newline at end of file
diff --git a/Lang/FreeBASIC/Nautical-bell b/Lang/FreeBASIC/Nautical-bell
new file mode 120000
index 0000000000..e2ac406a86
--- /dev/null
+++ b/Lang/FreeBASIC/Nautical-bell
@@ -0,0 +1 @@
+../../Task/Nautical-bell/FreeBASIC
\ No newline at end of file
diff --git a/Lang/J/Sum-and-product-puzzle b/Lang/J/Sum-and-product-puzzle
new file mode 120000
index 0000000000..6f416bebd6
--- /dev/null
+++ b/Lang/J/Sum-and-product-puzzle
@@ -0,0 +1 @@
+../../Task/Sum-and-product-puzzle/J
\ No newline at end of file
diff --git a/Lang/Java/15-puzzle-solver b/Lang/Java/15-puzzle-solver
new file mode 120000
index 0000000000..9d7820e546
--- /dev/null
+++ b/Lang/Java/15-puzzle-solver
@@ -0,0 +1 @@
+../../Task/15-puzzle-solver/Java
\ No newline at end of file
diff --git a/Lang/Java/B-zier-curves-Intersections b/Lang/Java/B-zier-curves-Intersections
new file mode 120000
index 0000000000..043cd63f13
--- /dev/null
+++ b/Lang/Java/B-zier-curves-Intersections
@@ -0,0 +1 @@
+../../Task/B-zier-curves-Intersections/Java
\ No newline at end of file
diff --git a/Lang/Java/Color-quantization b/Lang/Java/Color-quantization
new file mode 120000
index 0000000000..4d565a6cb5
--- /dev/null
+++ b/Lang/Java/Color-quantization
@@ -0,0 +1 @@
+../../Task/Color-quantization/Java
\ No newline at end of file
diff --git a/Lang/Java/Compile-time-calculation b/Lang/Java/Compile-time-calculation
new file mode 120000
index 0000000000..a789f870ef
--- /dev/null
+++ b/Lang/Java/Compile-time-calculation
@@ -0,0 +1 @@
+../../Task/Compile-time-calculation/Java
\ No newline at end of file
diff --git a/Lang/Java/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k b/Lang/Java/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k
new file mode 120000
index 0000000000..0258b227f0
--- /dev/null
+++ b/Lang/Java/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k
@@ -0,0 +1 @@
+../../Task/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k/Java
\ No newline at end of file
diff --git a/Lang/Java/Consecutive-primes-with-ascending-or-descending-differences b/Lang/Java/Consecutive-primes-with-ascending-or-descending-differences
new file mode 120000
index 0000000000..7e16795d72
--- /dev/null
+++ b/Lang/Java/Consecutive-primes-with-ascending-or-descending-differences
@@ -0,0 +1 @@
+../../Task/Consecutive-primes-with-ascending-or-descending-differences/Java
\ No newline at end of file
diff --git a/Lang/Java/Curzon-numbers b/Lang/Java/Curzon-numbers
new file mode 120000
index 0000000000..33d4de844a
--- /dev/null
+++ b/Lang/Java/Curzon-numbers
@@ -0,0 +1 @@
+../../Task/Curzon-numbers/Java
\ No newline at end of file
diff --git a/Lang/Java/Deceptive-numbers b/Lang/Java/Deceptive-numbers
new file mode 120000
index 0000000000..db81eb6836
--- /dev/null
+++ b/Lang/Java/Deceptive-numbers
@@ -0,0 +1 @@
+../../Task/Deceptive-numbers/Java
\ No newline at end of file
diff --git a/Lang/Java/Descending-primes b/Lang/Java/Descending-primes
new file mode 120000
index 0000000000..984d9a675b
--- /dev/null
+++ b/Lang/Java/Descending-primes
@@ -0,0 +1 @@
+../../Task/Descending-primes/Java
\ No newline at end of file
diff --git a/Lang/Java/Determine-sentence-type b/Lang/Java/Determine-sentence-type
new file mode 120000
index 0000000000..29a6c60854
--- /dev/null
+++ b/Lang/Java/Determine-sentence-type
@@ -0,0 +1 @@
+../../Task/Determine-sentence-type/Java
\ No newline at end of file
diff --git a/Lang/Java/Duffinian-numbers b/Lang/Java/Duffinian-numbers
new file mode 120000
index 0000000000..bd207e2a7c
--- /dev/null
+++ b/Lang/Java/Duffinian-numbers
@@ -0,0 +1 @@
+../../Task/Duffinian-numbers/Java
\ No newline at end of file
diff --git a/Lang/Jq/Old-Russian-measure-of-length b/Lang/Jq/Old-Russian-measure-of-length
new file mode 120000
index 0000000000..b608da8973
--- /dev/null
+++ b/Lang/Jq/Old-Russian-measure-of-length
@@ -0,0 +1 @@
+../../Task/Old-Russian-measure-of-length/Jq
\ No newline at end of file
diff --git a/Lang/Lua/00-LANG.txt b/Lang/Lua/00-LANG.txt
index 2494cc1b9f..e66f86629d 100644
--- a/Lang/Lua/00-LANG.txt
+++ b/Lang/Lua/00-LANG.txt
@@ -21,358 +21,4 @@ As a result, the base language is light—in fact, the full reference interprete
* [[wp:Lua_%28programming_language%29|Wikipedia:Lua (programming language)]]
==Unimplemented programming tasks==
-Output from [[Find_unimplemented_tasks]] :
-
-Lua has 355 unimplemented programming tasks:
- 15 puzzle solver
- 2048
- 4-rings or 4-squares puzzle
- 9 billion names of God the integer
- AKS test for primes
- Abbreviations, automatic
- Abbreviations, easy
- Abbreviations, simple
- Active Directory/Connect
- Active Directory/Search for a user
- Active object
- Address of a variable
- Aliquot sequence classifications
- Anagrams/Deranged anagrams
- Animation
- Append a record to the end of a text file
- Apply a digital filter (direct form II transposed)
- Arbitrary-precision integers (included)
- Archimedean spiral
- Arena storage pool
- Arithmetic-geometric mean/Calculate Pi
- Atomic updates
- Average loop length
- Balanced ternary
- Best shuffle
- Bitcoin/address validation
- Bitcoin/public point to address
- Bitmap/Bresenham's line algorithm
- Bitmap/Bézier curves/Cubic
- Bitmap/Bézier curves/Quadratic
- Bitmap/Flood fill
- Bitmap/Midpoint circle algorithm
- Bitmap/PPM conversion through a pipe
- Bitmap/Read an image through a pipe
- Bitwise IO
- Brace expansion
- Break OO privacy
- Bulls and cows/Player
- Call a function in a shared library
- Canny edge detector
- Carmichael 3 strong pseudoprimes
- Casting out nines
- Catmull–Clark subdivision surface
- Chat server
- Check Machin-like formulas
- Checkpoint synchronization
- Chinese zodiac
- Cholesky decomposition
- Church Numerals
- Circles of given radius through two points
- Closest-pair problem
- Color of a screen pixel
- Color quantization
- Colour bars/Display
- Colour pinstripe/Display
- Colour pinstripe/Printer
- Combinations and permutations
- Commatizing numbers
- Compare sorting algorithms' performance
- Compile-time calculation
- Compiler/AST interpreter
- Compiler/code generator
- Compiler/lexical analyzer
- Compiler/syntax analyzer
- Compiler/virtual machine interpreter
- Conjugate transpose
- Constrained genericity
- Constrained random points on a circle
- Continued fraction
- Continued fraction/Arithmetic/Construct from rational number
- Convert decimal number to rational
- Create a file on magnetic tape
- Create an object at a given address
- Currency
- Cut a rectangle
- Death Star
- Deconvolution/2D+
- Define a primitive data type
- Delegates
- Determine if only one instance is running
- Digital root/Multiplicative digital root
- Dining philosophers
- Discordian date
- Distributed programming
- Documentation
- Doubly-linked list/Definition
- Doubly-linked list/Element definition
- Doubly-linked list/Element insertion
- Doubly-linked list/Traversal
- Draw a cuboid
- Draw a pixel
- Draw a rotating cube
- Dutch national flag problem
- EKG sequence convergence
- Eertree
- Egyptian division
- Egyptian fractions
- Element-wise operations
- Elementary cellular automaton
- Enforced immutability
- Equilibrium index
- Euler's identity
- Events
- Extend your language
- Extensible prime generator
- FTP
- Factors of a Mersenne number
- Find common directory path
- Find largest left truncatable prime in a given base
- Find palindromic numbers in both binary and ternary bases
- Floyd-Warshall algorithm
- Four is magic
- Four is the number of letters in the ...
- Fractran
- Function frequency
- GUI component interaction
- GUI enabling/disabling of controls
- GUI/Maximum window dimensions
- Galton box animation
- Gaussian elimination
- Generate random chess position
- Go Fish
- Greyscale bars/Display
- HTTPS/Client-authenticated
- Handle a signal
- Hash join
- Hello world/Line printer
- Hello world/Web server
- Hickerson series of almost integers
- History variables
- Hofstadter Figure-Figure sequences
- Hofstadter Q sequence
- Honeycombs
- Horizontal sundial calculations
- Host introspection
- Hough transform
- Hunt The Wumpus
- Image convolution
- Image noise
- Index finite lists of positive integers
- Inheritance/Single
- Integer overflow
- Inverted index
- Inverted syntax
- Jaro distance
- Jewels and Stones
- Joystick position
- Julia set
- K-d tree
- K-means++ clustering
- Keyboard input/Flush the keyboard buffer
- Keyboard input/Keypress check
- Keyboard input/Obtain a Y or N response
- Keyboard macros
- Knapsack problem/0-1
- Knapsack problem/Bounded
- Knapsack problem/Continuous
- Knuth's algorithm S
- Knuth's power tree
- Kolakoski sequence
- LU decomposition
- Largest number divisible by its digits
- Last letter-first letter
- Law of cosines - triples
- Long multiplication
- Long primes
- Loops/Increment loop index within loop body
- Loops/Wrong ranges
- Lucas-Lehmer test
- Lucky and even lucky numbers
- Lychrel numbers
- MD5/Implementation
- Machine code
- Mad Libs
- Main step of GOST 28147-89
- Maze solving
- Median filter
- Memory allocation
- Memory layout of a data structure
- Metered concurrency
- Metronome
- Miller–Rabin primality test
- Mind boggling card trick
- Minesweeper game
- Modular exponentiation
- Modular inverse
- Mouse position
- Multiple regression
- Multiplicative order
- Narcissist
- Natural sorting
- Nautical bell
- Negative base numbers
- Nested templated data
- Non-continuous subsequences
- Nonogram solver
- Numeric error propagation
- OLE Automation
- Object serialization
- Odd word problem
- OpenWebNet Password
- Paraffins
- Parallel Brute Force
- Parallel calculations
- Parametric polymorphism
- Parametrized SQL statement
- Parse an IP Address
- Parsing/RPN to infix conversion
- Parsing/Shunting-yard algorithm
- Partition an integer X into N primes
- Pascal's triangle/Puzzle
- Pathological floating point problems
- Pattern matching
- Pentagram
- Percentage difference between images
- Percolation/Bond percolation
- Percolation/Mean cluster density
- Percolation/Mean run density
- Percolation/Site percolation
- Permutation test
- Permutations/Rank of a permutation
- Pig the dice game/Player
- Pinstripe/Printer
- Play recorded sounds
- Plot coordinate pairs
- Polymorphic copy
- Polynomial long division
- Polynomial regression
- Pragmatic directives
- Primes - allocate descendants to their ancestors
- Primorial numbers
- Problem of Apollonius
- Pythagoras tree
- Pythagorean quadruples
- Pythagorean triples
- QR decomposition
- RCRPG
- RPG Attributes Generator
- RSA code
- Ramer-Douglas-Peucker line simplification
- Random number generator (device)
- Ranking methods
- Rate counter
- Ray-casting algorithm
- Recaman's sequence
- Record sound
- Reflection/Get source
- Reflection/List methods
- Reflection/List properties
- Rendezvous
- Rep-string
- Resistor mesh
- Retrieve and search chat history
- Rosetta Code/Count examples
- Rosetta Code/Find bare lang tags
- Rosetta Code/Rank languages by popularity
- Runge-Kutta method
- S-Expressions
- SEDOLs
- SOAP
- SQL-based authentication
- Safe addition
- Sailors, coconuts and a monkey problem
- Same Fringe
- Scope modifiers
- Scope/Function names and labels
- Sequence of primorial primes
- Set consolidation
- Set of real numbers
- Set puzzle
- Shortest common supersequence
- Sierpinski carpet
- Sierpinski pentagon
- Sierpinski triangle
- Simple database
- Simulate input/Keyboard
- Simulate input/Mouse
- Singleton
- Singly-linked list/Element definition
- Singly-linked list/Element insertion
- Singly-linked list/Traversal
- Sokoban
- Solve a Hidato puzzle
- Solve a Hopido puzzle
- Solve a Numbrix puzzle
- Solve the no connection puzzle
- Sorting algorithms/Heapsort
- Sorting algorithms/Radix sort
- Sorting algorithms/Strand sort
- Sparkline in unicode
- Speech synthesis
- Spelling of ordinal numbers
- Spinning rod animation/Text
- Square but not cube
- Start from a main routine
- State name puzzle
- Stream Merge
- Subtractive generator
- Sum and Product Puzzle
- Sum to 100
- Superellipse
- Superpermutation minimisation
- Taxicab numbers
- Terminal control/Coloured text
- Terminal control/Cursor movement
- Terminal control/Cursor positioning
- Terminal control/Dimensions
- Terminal control/Hiding the cursor
- Terminal control/Inverse video
- Terminal control/Positional read
- Terminal control/Preserve screen
- Terminal control/Unicode output
- Ternary logic
- The ISAAC Cipher
- The Name Game
- Thiele's interpolation formula
- Topic variable
- Topological sort
- Total circles area
- Tree traversal
- Truth table
- Twelve statements
- URL parser
- Ulam spiral (for primes)
- Unicode strings
- Update a configuration file
- Use another language to call a function
- User input/Graphical
- Vampire number
- Variable size/Get
- Variable size/Set
- Variable-length quantity
- Verify distribution uniformity/Chi-squared test
- Verify distribution uniformity/Naive
- Video display modes
- Vigenère cipher/Cryptanalysis
- Visualize a tree
- Vogel's approximation method
- Walk a directory/Recursively
- Water collected between towers
- Window creation/X11
- Window management
- Word search
- World Cup group stage
- Write to Windows event log
- Xiaolin Wu's line algorithm
- Yahoo! search interface
- Yin and yang
- Zebra puzzle
- Zeckendorf arithmetic
-
-See also [[Reports:Tasks_not_implemented_in_Lua]]
\ No newline at end of file
+[[Tasks not implemented in Lua]]
\ No newline at end of file
diff --git a/Lang/Lua/Factorial-primes b/Lang/Lua/Factorial-primes
new file mode 120000
index 0000000000..0fa5987208
--- /dev/null
+++ b/Lang/Lua/Factorial-primes
@@ -0,0 +1 @@
+../../Task/Factorial-primes/Lua
\ No newline at end of file
diff --git a/Lang/Lua/Particle-fountain b/Lang/Lua/Particle-fountain
new file mode 120000
index 0000000000..5cdfe5c932
--- /dev/null
+++ b/Lang/Lua/Particle-fountain
@@ -0,0 +1 @@
+../../Task/Particle-fountain/Lua
\ No newline at end of file
diff --git a/Lang/M2000-Interpreter/Last-Friday-of-each-month b/Lang/M2000-Interpreter/Last-Friday-of-each-month
new file mode 120000
index 0000000000..9d663b1c7c
--- /dev/null
+++ b/Lang/M2000-Interpreter/Last-Friday-of-each-month
@@ -0,0 +1 @@
+../../Task/Last-Friday-of-each-month/M2000-Interpreter
\ No newline at end of file
diff --git a/Lang/Maxima/Attractive-numbers b/Lang/Maxima/Attractive-numbers
new file mode 120000
index 0000000000..9cd40ac3af
--- /dev/null
+++ b/Lang/Maxima/Attractive-numbers
@@ -0,0 +1 @@
+../../Task/Attractive-numbers/Maxima
\ No newline at end of file
diff --git a/Lang/MiniScript/Anti-primes b/Lang/MiniScript/Anti-primes
new file mode 120000
index 0000000000..f139044edd
--- /dev/null
+++ b/Lang/MiniScript/Anti-primes
@@ -0,0 +1 @@
+../../Task/Anti-primes/MiniScript
\ No newline at end of file
diff --git a/Lang/Modula-2/Trabb-Pardo-Knuth-algorithm b/Lang/Modula-2/Trabb-Pardo-Knuth-algorithm
new file mode 120000
index 0000000000..b03be3b61b
--- /dev/null
+++ b/Lang/Modula-2/Trabb-Pardo-Knuth-algorithm
@@ -0,0 +1 @@
+../../Task/Trabb-Pardo-Knuth-algorithm/Modula-2
\ No newline at end of file
diff --git a/Lang/Odin/Anti-primes b/Lang/Odin/Anti-primes
new file mode 120000
index 0000000000..2e9879ece6
--- /dev/null
+++ b/Lang/Odin/Anti-primes
@@ -0,0 +1 @@
+../../Task/Anti-primes/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Fibonacci-sequence b/Lang/Odin/Fibonacci-sequence
new file mode 120000
index 0000000000..63383c8c82
--- /dev/null
+++ b/Lang/Odin/Fibonacci-sequence
@@ -0,0 +1 @@
+../../Task/Fibonacci-sequence/Odin
\ No newline at end of file
diff --git a/Lang/Odin/Pseudo-random-numbers-Splitmix64 b/Lang/Odin/Pseudo-random-numbers-Splitmix64
new file mode 120000
index 0000000000..57eaaa3079
--- /dev/null
+++ b/Lang/Odin/Pseudo-random-numbers-Splitmix64
@@ -0,0 +1 @@
+../../Task/Pseudo-random-numbers-Splitmix64/Odin
\ No newline at end of file
diff --git a/Lang/PL-M/FASTA-format b/Lang/PL-M/FASTA-format
new file mode 120000
index 0000000000..a0f59017a2
--- /dev/null
+++ b/Lang/PL-M/FASTA-format
@@ -0,0 +1 @@
+../../Task/FASTA-format/PL-M
\ No newline at end of file
diff --git a/Lang/Palo-Alto-Tiny-BASIC/00-LANG.txt b/Lang/Palo-Alto-Tiny-BASIC/00-LANG.txt
index 545aaf2990..c92d6147dd 100644
--- a/Lang/Palo-Alto-Tiny-BASIC/00-LANG.txt
+++ b/Lang/Palo-Alto-Tiny-BASIC/00-LANG.txt
@@ -15,6 +15,18 @@ Palo Alto Tiny BASIC has some features that distinguish it from other Tiny BASIC
* Lack of THEN in an IF command.
* Numeric results of compare operations: 1 (if true), 0 (if false). Thus, one can use them in arithmetic expression. Note: LET A=B=0 means "set A to the result of comparing B with 0".
* A prompt in an INPUT command. If the prompt is omitted, the default is a name of the variable. E.g. INPUT "WHAT IS THE HEIGHT"H will print WHAT IS THE HEIGHT: and wait to read an expression from the input device.INPUT H will print H: and so on.
+* The function RND(X) that returns a random number between 1 and X (inclusive).
+* Separating print items with , (comma).
+* Setting widths of numeric print items. A number preceeded by # sets the width (6 by default) of following numeric print items. It does not count leading spaces. For example,
+
+10 PRINT "X",#2,1,10,"X"
+20 PRINT 1,#4,10,20,#2,30,40
+
+displays
+
+X 1 10X
+ 1 10 20 30 40
+
==Implementations==
Palo Alto Tiny BASIC was adapted for many implementations:
diff --git a/Lang/Pascal/Abundant-deficient-and-perfect-number-classifications b/Lang/Pascal/Abundant-deficient-and-perfect-number-classifications
deleted file mode 120000
index ebe91e232f..0000000000
--- a/Lang/Pascal/Abundant-deficient-and-perfect-number-classifications
+++ /dev/null
@@ -1 +0,0 @@
-../../Task/Abundant-deficient-and-perfect-number-classifications/Pascal
\ No newline at end of file
diff --git a/Lang/QBasic/Canonicalize-CIDR b/Lang/QBasic/Canonicalize-CIDR
new file mode 120000
index 0000000000..ec487a7a62
--- /dev/null
+++ b/Lang/QBasic/Canonicalize-CIDR
@@ -0,0 +1 @@
+../../Task/Canonicalize-CIDR/QBasic
\ No newline at end of file
diff --git a/Lang/Rust/Arithmetic-derivative b/Lang/Rust/Arithmetic-derivative
new file mode 120000
index 0000000000..9089e5de0a
--- /dev/null
+++ b/Lang/Rust/Arithmetic-derivative
@@ -0,0 +1 @@
+../../Task/Arithmetic-derivative/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Cistercian-numerals b/Lang/Rust/Cistercian-numerals
new file mode 120000
index 0000000000..7275757e17
--- /dev/null
+++ b/Lang/Rust/Cistercian-numerals
@@ -0,0 +1 @@
+../../Task/Cistercian-numerals/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Colorful-numbers b/Lang/Rust/Colorful-numbers
new file mode 120000
index 0000000000..3a3eebd835
--- /dev/null
+++ b/Lang/Rust/Colorful-numbers
@@ -0,0 +1 @@
+../../Task/Colorful-numbers/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k b/Lang/Rust/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k
new file mode 120000
index 0000000000..32e7726ee7
--- /dev/null
+++ b/Lang/Rust/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k
@@ -0,0 +1 @@
+../../Task/Composite-numbers-k-with-no-single-digit-factors-whose-factors-are-all-substrings-of-k/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Dinesmans-multiple-dwelling-problem b/Lang/Rust/Dinesmans-multiple-dwelling-problem
new file mode 120000
index 0000000000..5202c4e91b
--- /dev/null
+++ b/Lang/Rust/Dinesmans-multiple-dwelling-problem
@@ -0,0 +1 @@
+../../Task/Dinesmans-multiple-dwelling-problem/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Modified-random-distribution b/Lang/Rust/Modified-random-distribution
new file mode 120000
index 0000000000..af3045024d
--- /dev/null
+++ b/Lang/Rust/Modified-random-distribution
@@ -0,0 +1 @@
+../../Task/Modified-random-distribution/Rust
\ No newline at end of file
diff --git a/Lang/Rust/Sum-and-product-puzzle b/Lang/Rust/Sum-and-product-puzzle
new file mode 120000
index 0000000000..c841eb9b4e
--- /dev/null
+++ b/Lang/Rust/Sum-and-product-puzzle
@@ -0,0 +1 @@
+../../Task/Sum-and-product-puzzle/Rust
\ No newline at end of file
diff --git a/Lang/S-BASIC/Array-length b/Lang/S-BASIC/Array-length
new file mode 120000
index 0000000000..376b70f748
--- /dev/null
+++ b/Lang/S-BASIC/Array-length
@@ -0,0 +1 @@
+../../Task/Array-length/S-BASIC
\ No newline at end of file
diff --git a/Lang/Sidef/00-LANG.txt b/Lang/Sidef/00-LANG.txt
index f44393181c..a63ddf8a52 100644
--- a/Lang/Sidef/00-LANG.txt
+++ b/Lang/Sidef/00-LANG.txt
@@ -25,4 +25,8 @@ The language is mostly used as a research programming language.
For more details, see:
* Gitbook: [https://trizen.gitbook.io/sidef-lang/ https://trizen.gitbook.io/sidef-lang/]
* Tutorial: [https://notabug.org/trizen/sidef/wiki https://notabug.org/trizen/sidef/wiki]
-* Development page: [https://github.com/trizen/sidef https://github.com/trizen/sidef]
\ No newline at end of file
+* Development page: [https://github.com/trizen/sidef https://github.com/trizen/sidef]
+
+==Todo==
+
+[[Tasks_not_implemented_in_Sidef]]
\ No newline at end of file
diff --git a/Lang/Sidef/Factorial-primes b/Lang/Sidef/Factorial-primes
new file mode 120000
index 0000000000..653de65402
--- /dev/null
+++ b/Lang/Sidef/Factorial-primes
@@ -0,0 +1 @@
+../../Task/Factorial-primes/Sidef
\ No newline at end of file
diff --git a/Lang/Tcl/Harmonic-series b/Lang/Tcl/Harmonic-series
new file mode 120000
index 0000000000..f5f96a3ec9
--- /dev/null
+++ b/Lang/Tcl/Harmonic-series
@@ -0,0 +1 @@
+../../Task/Harmonic-series/Tcl
\ No newline at end of file
diff --git a/Lang/Tcl/Pseudo-random-numbers-Middle-square-method b/Lang/Tcl/Pseudo-random-numbers-Middle-square-method
new file mode 120000
index 0000000000..3819fd9c41
--- /dev/null
+++ b/Lang/Tcl/Pseudo-random-numbers-Middle-square-method
@@ -0,0 +1 @@
+../../Task/Pseudo-random-numbers-Middle-square-method/Tcl
\ No newline at end of file
diff --git a/Lang/Transact-SQL/Julia-set b/Lang/Transact-SQL/Julia-set
new file mode 120000
index 0000000000..6f30c72f4e
--- /dev/null
+++ b/Lang/Transact-SQL/Julia-set
@@ -0,0 +1 @@
+../../Task/Julia-set/Transact-SQL
\ No newline at end of file
diff --git a/Task/15-puzzle-solver/Java/15-puzzle-solver.java b/Task/15-puzzle-solver/Java/15-puzzle-solver.java
new file mode 100644
index 0000000000..c45a1de8d6
--- /dev/null
+++ b/Task/15-puzzle-solver/Java/15-puzzle-solver.java
@@ -0,0 +1,143 @@
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.PriorityQueue;
+import java.util.Queue;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public final class Puzzle15Solver {
+
+ public static void main(String[] aArgs) {
+ List start = List.of( 15, 14, 1, 6, 9, 11, 4, 12, 0, 10, 7, 3, 13, 8, 5, 2 );
+ final int zeroIndex = 8;
+ Puzzle initial = new Puzzle(start, new ArrayList(), zeroIndex, 0);
+ openSet.add(initial);
+ System.out.println("Solving the 15 puzzle:");
+ initial.display();
+
+ while ( solution == null ) {
+ search();
+ }
+
+ System.out.println(solution.moves.stream().collect(Collectors.joining("")));
+ System.out.println("Number of steps: " + solution.moves.size());
+ System.out.println("Number of puzzle states checked: " + closedSet.size());
+ }
+
+ private static void search() {
+ Puzzle current = openSet.poll();
+ closedSet.add(current);
+ final int zeroIndex = current.zeroIndex;
+ final int row = zeroIndex / 4;
+ final int column = zeroIndex % 4;
+
+ if ( column > 0 ) {
+ Puzzle nextPuzzle = current.clone();
+ nextPuzzle.makeMove(Move.LEFT);
+ }
+ if ( column < 3 ) {
+ Puzzle nextPuzzle = current.clone();
+ nextPuzzle.makeMove(Move.RIGHT);
+ }
+ if ( row > 0 ) {
+ Puzzle nextPuzzle = current.clone();
+ nextPuzzle.makeMove(Move.UP);
+ }
+ if ( row < 3 ) {
+ Puzzle nextPuzzle = current.clone();
+ nextPuzzle.makeMove(Move.DOWN);
+ }
+ }
+
+ private enum Move {
+ LEFT("L", -1), RIGHT("R", +1), UP("U", -4), DOWN("D", +4);
+
+ private Move(String aSymbol, int aStep) {
+ symbol = aSymbol;
+ step = aStep;
+ }
+
+ private String symbol;
+ private Integer step;
+ }
+
+ private static class Puzzle {
+
+ public Puzzle(List aTiles, List aMoves, int aZeroIndex, int aSearchDepth) {
+ tiles = aTiles;
+ moves = aMoves;
+ zeroIndex = aZeroIndex;
+ searchDepth = aSearchDepth;
+ }
+
+ public void makeMove(Move aMove) {
+ Integer temp = tiles.get(zeroIndex + aMove.step);
+ tiles.set(zeroIndex + aMove.step, 0);
+ tiles.set(zeroIndex, temp);
+
+ zeroIndex += aMove.step;
+ moves.add(aMove.symbol);
+
+ if ( ! closedSet.contains(this) ) {
+ openSet.add(this);
+ if ( tiles.equals(Puzzle.GOAL) ) {
+ solution = this;
+ }
+ }
+ }
+
+ public long heuristic() {
+ int distance = 0;
+ for ( int i = 0; i < tiles.size(); i++ ) {
+ final int tile = tiles.get(i);
+ if ( tile > 0 ) {
+ distance += Math.abs( ( i / 4 ) - ( tile - 1 ) / 4 ) + Math.abs( ( i % 4 ) - ( tile - 1 ) % 4 );
+ }
+ }
+ return distance + searchDepth;
+ }
+
+ public Puzzle clone() {
+ return new Puzzle(new ArrayList(tiles), new ArrayList(moves), zeroIndex, searchDepth + 1);
+ }
+
+ public void display() {
+ for ( int i = 0; i < tiles.size(); i++ ) {
+ System.out.print(String.format("%s%2d%s",
+ ( i % 4 == 0 ) ? "[" : "", tiles.get(i), ( i % 4 == 3 ) ? "]\n" : " "));
+ }
+ System.out.println();
+ }
+
+ @Override
+ public boolean equals(Object aObject) {
+ return switch(aObject) {
+ case Puzzle puzzle -> tiles.equals(puzzle.tiles);
+ case Object object -> false;
+ };
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 3;
+ hash = 23 * hash + tiles.hashCode();
+ hash = 23 * hash + zeroIndex;
+ return hash;
+ }
+
+ private List tiles;
+ private List moves;
+ private int zeroIndex;
+ private int searchDepth;
+
+ private static final List GOAL = List.of( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 );
+
+ }
+
+ private static Queue openSet =
+ new PriorityQueue( (one, two) -> Long.compare(one.heuristic(), two.heuristic()) );
+ private static Set closedSet = new HashSet();
+ private static Puzzle solution;
+
+}
diff --git a/Task/24-game/Elena/24-game.elena b/Task/24-game/Elena/24-game.elena
index ef481696de..fc6d5d8743 100644
--- a/Task/24-game/Elena/24-game.elena
+++ b/Task/24-game/Elena/24-game.elena
@@ -7,7 +7,7 @@ import extensions;
class ExpressionTree
{
- object theTree;
+ object _tree;
constructor(s)
{
@@ -18,40 +18,40 @@ class ExpressionTree
var node := new DynamicStruct();
ch =>
- $43 { node.Level := level + 1; node.Operation := __subj add } // +
- $45 { node.Level := level + 1; node.Operation := __subj subtract } // -
- $42 { node.Level := level + 2; node.Operation := __subj multiply } // *
- $47 { node.Level := level + 2; node.Operation := __subj 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
};
- if (nil == theTree)
+ if (nil == _tree)
{
- theTree := node
+ _tree := node
}
else
{
- if (theTree.Level >= node.Level)
+ if (_tree.Level >= node.Level)
{
- node.Left := theTree;
- node.Right := nilValue;
+ node.Left := _tree;
+ node.Right := nil;
- theTree := node
+ _tree := node
}
else
{
- var top := theTree;
- while ((nilValue != top.Right)&&(top.Right.Level < node.Level))
- { top := top.Right };
+ var top := _tree;
+ while ((nil != top.Right)&&(top.Right.Level < node.Level))
+ { top := top.Right };
- node.Left := top.Right;
- node.Right := nilValue;
+ node.Left := top.Right;
+ node.Right := nil;
- top.Right := node
+ top.Right := node
}
}
}
@@ -59,7 +59,7 @@ class ExpressionTree
eval(node)
{
- if (node.containsProperty(subjconst Leaf))
+ if (node.containsProperty(mssg Leaf))
{
^ node.Leaf
}
@@ -75,14 +75,14 @@ class ExpressionTree
}
get Value()
- <= eval(theTree);
+ <= eval(_tree);
readLeaves(list, node)
{
if (nil == node)
{ InvalidArgumentException.raise() };
- if (node.containsProperty(subjconst Leaf))
+ if (node.containsProperty(mssg Leaf))
{
list.append(node.Leaf)
}
@@ -94,7 +94,7 @@ class ExpressionTree
}
readLeaves(list)
- <= readLeaves(list,theTree);
+ <= readLeaves(list,_tree);
}
// --- Game ---
@@ -112,10 +112,10 @@ class TwentyFourGame
{
theNumbers := new object[]
{
- 1 + randomGenerator.eval:9,
- 1 + randomGenerator.eval:9,
- 1 + randomGenerator.eval:9,
- 1 + randomGenerator.eval:9
+ 1 + randomGenerator.nextInt:9,
+ 1 + randomGenerator.nextInt:9,
+ 1 + randomGenerator.nextInt:9,
+ 1 + randomGenerator.nextInt:9
}
}
@@ -149,8 +149,11 @@ 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 };
+ ifnot (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)
@@ -188,7 +191,8 @@ extension gameOp
}
catch(Exception e)
{
- console.printLine:"An error occurred. Check your input and try again."
+ console.printLine:e
+ //console.printLine:"An error occurred. Check your input and try again."
}
};
@@ -197,6 +201,8 @@ extension gameOp
}
}
+// --- program ---
+
public program()
{
var game := new TwentyFourGame().help();
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 eeef1e1ab9..54a7e75cfa 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
@@ -14,7 +14,7 @@ extension bottleOp
{
bool next() = n > 0;
- get() = new StringWriter()
+ get Value() = new StringWriter()
.printLine(n.bottleDescription()," of beer on the wall")
.printLine(n.bottleDescription()," of beer")
.printLine("Take one down, pass it around")
@@ -22,7 +22,7 @@ extension bottleOp
reset() {}
- enumerable() = __target;
+ enumerable() = weak self;
}
};
}
diff --git a/Task/A+B/Elena/a+b-2.elena b/Task/A+B/Elena/a+b-2.elena
index 0a28b451d9..8097b76574 100644
--- a/Task/A+B/Elena/a+b-2.elena
+++ b/Task/A+B/Elena/a+b-2.elena
@@ -5,6 +5,6 @@ public program()
{
console.printLine(console.readLine()
.split()
- .selectBy(mssgconst toInt[1])
+ .selectBy(mssgconst toInt[1])
.summarize())
}
diff --git a/Task/ASCII-art-diagram-converter/AutoHotkey/ascii-art-diagram-converter.ahk b/Task/ASCII-art-diagram-converter/AutoHotkey/ascii-art-diagram-converter.ahk
new file mode 100644
index 0000000000..fd95154e51
--- /dev/null
+++ b/Task/ASCII-art-diagram-converter/AutoHotkey/ascii-art-diagram-converter.ahk
@@ -0,0 +1,59 @@
+Header := "
+(LTrim
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | ID |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | QDCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | ANCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | NSCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | ARCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+)"
+
+Data := "78477BBF5496E12E1BF169A4"
+MsgBox % result := ASCII_art_diagram_converter(Header, Data)
+return
+
+ASCII_art_diagram_converter(Header, Data){
+ oDataBin := []
+ for i, h in StrSplit(Data)
+ for i, v in StrSplit(SubStr("0000" . ConvertBase(16, 2, h), -3))
+ oDataBin.Push(v)
+
+ bitWidth := StrLen(StrSplit(Header, "+").2) + 1
+ prevW := 0
+ result := "Name`t`tSize`tBinary"
+ for i, line in StrSplit(Header, "`n", "`r")
+ {
+ if Mod(A_Index, 2)
+ continue
+ strtPos := 0
+ loop
+ {
+ if w := (strtPos := InStr(line, "|",, ++strtPos)) // bitWidth
+ {
+ b := ""
+ loop % width := w - prevW
+ b .= oDataBin.RemoveAt(1)
+ result .= "`n" Trim(StrSplit(line, "|")[A_Index]) "`t`t" width . "`t" b
+ }
+ prevW := w
+ }
+ until !strtPos
+ }
+ return result
+}
+
+ConvertBase(InputBase, OutputBase, nptr){ ; Base 2 - 36 ; https://www.autohotkey.com/boards/viewtopic.php?t=3925#p21143
+ static u := A_IsUnicode ? "_wcstoui64" : "_strtoui64"
+ static v := A_IsUnicode ? "_i64tow" : "_i64toa"
+ VarSetCapacity(s, 66, 0)
+ value := DllCall("msvcrt.dll\" u, "Str", nptr, "UInt", 0, "UInt", InputBase, "CDECL Int64")
+ DllCall("msvcrt.dll\" v, "Int64", value, "Str", s, "UInt", OutputBase, "CDECL")
+ return s
+}
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/Free-Pascal-Lazarus/abundant-deficient-and-perfect-number-classifications.pas b/Task/Abundant-deficient-and-perfect-number-classifications/Free-Pascal-Lazarus/abundant-deficient-and-perfect-number-classifications.pas
new file mode 100644
index 0000000000..f64e203a0d
--- /dev/null
+++ b/Task/Abundant-deficient-and-perfect-number-classifications/Free-Pascal-Lazarus/abundant-deficient-and-perfect-number-classifications.pas
@@ -0,0 +1,49 @@
+program KindOfN; //[deficient,perfect,abundant]
+{$IFDEF FPC}
+ {$MODE DELPHI}{$OPTIMIZATION ON,ALL}{$COPERATORS ON}{$CODEALIGN proc=16}
+{$ENDIF}
+{$IFDEF WINDOWS} {$APPTYPE CONSOLE}{$ENDIF}
+uses
+ sysutils,PrimeDecomp // limited to 1.2e11
+{$IFDEF WINDOWS},Windows{$ENDIF}
+ ;
+//alternative copy and paste PrimeDecomp.inc for TIO.RUN
+{$I PrimeDecomp.inc}
+type
+ tKindIdx = 0..2;//[deficient,perfect,abundant];
+ tKind = array[tKindIdx] of Uint64;
+
+procedure GetKind(Limit:Uint64);
+var
+ pPrimeDecomp :tpPrimeFac;
+ SumOfKind : tKind;
+ n: NativeUInt;
+ c: NativeInt;
+ T0:Int64;
+Begin
+ writeln('Limit: ',LIMIT);
+ T0 := GetTickCount64;
+ fillchar(SumOfKind,SizeOf(SumOfKind),#0);
+ n := 1;
+ Init_Sieve(n);
+ repeat
+ pPrimeDecomp:= GetNextPrimeDecomp;
+ c := pPrimeDecomp^.pfSumOfDivs-2*n;
+ c := ORD(c>0)-ORD(c<0)+1;//sgn(c)+1
+ inc(SumOfKind[c]);
+ inc(n);
+ until n > LIMIT;
+ T0 := GetTickCount64-T0;
+ writeln('deficient: ',SumOfKind[0]);
+ writeln('abundant: ',SumOfKind[2]);
+ writeln('perfect: ',SumOfKind[1]);
+ writeln('runtime ',T0/1000:0:3,' s');
+ writeln;
+end;
+
+Begin
+ InitSmallPrimes; //using PrimeDecomp.inc
+ GetKind(20000);
+ GetKind(10*1000*1000);
+ GetKind(524*1000*1000);
+end.
diff --git a/Task/Abundant-deficient-and-perfect-number-classifications/Pascal/abundant-deficient-and-perfect-number-classifications.pas b/Task/Abundant-deficient-and-perfect-number-classifications/Pascal/abundant-deficient-and-perfect-number-classifications.pas
deleted file mode 100644
index d66fb4c8c3..0000000000
--- a/Task/Abundant-deficient-and-perfect-number-classifications/Pascal/abundant-deficient-and-perfect-number-classifications.pas
+++ /dev/null
@@ -1,214 +0,0 @@
-program AmicablePairs;
-{find amicable pairs in a limited region 2..MAX
-beware that >both< numbers must be smaller than MAX
-there are 455 amicable pairs up to 524*1000*1000
-correct up to
-#437 460122410
-}
-//optimized for freepascal 2.6.4 32-Bit
-{$IFDEF FPC}
- {$MODE DELPHI}
- {$OPTIMIZATION ON,peephole,cse,asmcse,regvar}
- {$CODEALIGN loop=1,proc=8}
-{$ELSE}
- {$APPTYPE CONSOLE}
-{$ENDIF}
-
-uses
- sysutils;
-const
- MAX = 20000;
-//{$IFDEF UNIX} MAX = 524*1000*1000;{$ELSE}MAX = 499*1000*1000;{$ENDIF}
-type
- tValue = LongWord;
- tpValue = ^tValue;
- tPower = array[0..31] of tValue;
- tIndex = record
- idxI,
- idxS : tValue;
- end;
- tdpa = array[0..2] of LongWord;
-var
- power : tPower;
- PowerFac : tPower;
- DivSumField : array[0..MAX] of tValue;
- Indices : array[0..511] of tIndex;
- DpaCnt : tdpa;
-
-procedure Init;
-var
- i : LongInt;
-begin
- DivSumField[0]:= 0;
- For i := 1 to MAX do
- DivSumField[i]:= 1;
-end;
-
-procedure ProperDivs(n: tValue);
-//Only for output, normally a factorication would do
-var
- su,so : string;
- i,q : tValue;
-begin
- su:= '1';
- so:= '';
- i := 2;
- while i*i <= n do
- begin
- q := n div i;
- IF q*i -n = 0 then
- begin
- su:= su+','+IntToStr(i);
- IF q <> i then
- so:= ','+IntToStr(q)+so;
- end;
- inc(i);
- end;
- writeln(' [',su+so,']');
-end;
-
-procedure AmPairOutput(cnt:tValue);
-var
- i : tValue;
- r : double;
-begin
- r := 1.0;
- For i := 0 to cnt-1 do
- with Indices[i] do
- begin
- writeln(i+1:4,IdxI:12,IDxS:12,' ratio ',IdxS/IDxI:10:7);
- if r < IdxS/IDxI then
- r := IdxS/IDxI;
- IF cnt < 20 then
- begin
- ProperDivs(IdxI);
- ProperDivs(IdxS);
- end;
- end;
- writeln(' max ratio ',r:10:4);
-end;
-
-function Check:tValue;
-var
- i,s,n : tValue;
-begin
- fillchar(DpaCnt,SizeOf(dpaCnt),#0);
- n := 0;
- For i := 1 to MAX do
- begin
- //s = sum of proper divs (I) == sum of divs (I) - I
- s := DivSumField[i]-i;
- IF (s <=MAX) AND (s>i) then
- begin
- IF DivSumField[s]-s = i then
- begin
- With indices[n] do
- begin
- idxI := i;
- idxS := s;
- end;
- inc(n);
- end;
- end;
- inc(DpaCnt[Ord(s>=i)-Ord(s<=i)+1]);
- end;
- result := n;
-end;
-
-Procedure CalcPotfactor(prim:tValue);
-//PowerFac[k] = (prim^(k+1)-1)/(prim-1) == Sum (i=1..k) prim^i
-var
- k: tValue;
- Pot, //== prim^k
- PFac : Int64;
-begin
- Pot := prim;
- PFac := 1;
- For k := 0 to High(PowerFac) do
- begin
- PFac := PFac+Pot;
- IF (POT > MAX) then
- BREAK;
- PowerFac[k] := PFac;
- Pot := Pot*prim;
- end;
-end;
-
-procedure InitPW(prim:tValue);
-begin
- fillchar(power,SizeOf(power),#0);
- CalcPotfactor(prim);
-end;
-
-function NextPotCnt(p: tValue):tValue;inline;
-//return the first power <> 0
-//power == n to base prim
-var
- i : tValue;
-begin
- result := 0;
- repeat
- i := power[result];
- Inc(i);
- IF i < p then
- BREAK
- else
- begin
- i := 0;
- power[result] := 0;
- inc(result);
- end;
- until false;
- power[result] := i;
-end;
-
-function Sieve(prim: tValue):tValue;
-//simple version
-var
- actNumber : tValue;
-begin
- while prim <= MAX do
- begin
- InitPW(prim);
- //actNumber = actual number = n*prim
- //power == n to base prim
- actNumber := prim;
- while actNumber < MAX do
- begin
- DivSumField[actNumber] := DivSumField[actNumber] *PowerFac[NextPotCnt(prim)];
- inc(actNumber,prim);
- end;
- //next prime
- repeat
- inc(prim);
- until (DivSumField[prim] = 1);
- end;
- result := prim;
-end;
-
-var
- T2,T1,T0: TDatetime;
- APcnt: tValue;
-
-begin
- T0:= time;
- Init;
- Sieve(2);
- T1:= time;
- APCnt := Check;
- T2:= time;
-
- //AmPairOutput(APCnt);
- writeln(Max:10,' upper limit');
- writeln(DpaCnt[0]:10,' deficient');
- writeln(DpaCnt[1]:10,' perfect');
- writeln(DpaCnt[2]:10,' abundant');
- writeln(DpaCnt[2]/Max:14:10,' ratio abundant/upper Limit ');
- writeln(DpaCnt[0]/Max:14:10,' ratio abundant/upper Limit ');
- writeln(DpaCnt[2]/DpaCnt[0]:14:10,' ratio abundant/deficient ');
- writeln('Time to calc sum of divs ',FormatDateTime('HH:NN:SS.ZZZ' ,T1-T0));
- writeln('Time to find amicable pairs ',FormatDateTime('HH:NN:SS.ZZZ' ,T2-T1));
- {$IFNDEF UNIX}
- readln;
- {$ENDIF}
-end.
diff --git a/Task/Anti-primes/ALGOL-68/anti-primes.alg b/Task/Anti-primes/ALGOL-68/anti-primes.alg
index 2de1e9255b..f84b0322e1 100644
--- a/Task/Anti-primes/ALGOL-68/anti-primes.alg
+++ b/Task/Anti-primes/ALGOL-68/anti-primes.alg
@@ -1,19 +1,20 @@
BEGIN # find some anti-primes: numbers with more divisors than the #
# previous numbers #
- INT max number := 10 000;
+ REF[]INT ndc := HEAP[ 1 : 0 ]INT; # table of divisor counts #
INT max divisors := 0;
- # construct a table of the divisor counts #
- [ 1 : max number ]INT ndc; FOR i FROM 1 TO UPB ndc DO ndc[ i ] := 1 OD;
- FOR i FROM 2 TO UPB ndc DO
- FOR j FROM i BY i TO UPB ndc DO ndc[ j ] +:= 1 OD
- OD;
- # show the numbers with more divisors than their predecessors #
- INT a count := 0;
- FOR i TO UPB ndc WHILE a count < 20 DO
- INT divisor count = ndc[ i ];
- IF divisor count > max divisors THEN
- print( ( " ", whole( i, 0 ) ) );
- max divisors := divisor count;
+ INT a count := 0;
+ FOR n WHILE a count < 20 DO
+ IF n > UPB ndc THEN
+ # need a bigger table of divisor counts #
+ ndc := HEAP[ 1 : UPB ndc + 5 000 ]INT;
+ FOR i FROM 1 TO UPB ndc DO ndc[ i ] := 1 OD;
+ FOR i FROM 2 TO UPB ndc DO
+ FOR j FROM i BY i TO UPB ndc DO ndc[ j ] +:= 1 OD
+ OD
+ FI;
+ IF ndc[ n ] > max divisors THEN
+ print( ( " ", whole( n, 0 ) ) );
+ max divisors := ndc[ n ];
a count +:= 1
FI
OD;
diff --git a/Task/Anti-primes/Lua/anti-primes.lua b/Task/Anti-primes/Lua/anti-primes-1.lua
similarity index 100%
rename from Task/Anti-primes/Lua/anti-primes.lua
rename to Task/Anti-primes/Lua/anti-primes-1.lua
diff --git a/Task/Anti-primes/Lua/anti-primes-2.lua b/Task/Anti-primes/Lua/anti-primes-2.lua
new file mode 100644
index 0000000000..a849a48fa0
--- /dev/null
+++ b/Task/Anti-primes/Lua/anti-primes-2.lua
@@ -0,0 +1,29 @@
+-- Find the first 20 antiprimes.
+
+-- returns a table of the first goal antiprimes
+function antiprimes(goal)
+ local maxNumber = 0
+ local ndc = {} -- table of divisor counts - initially empty
+ local list, number, mostFactors = {}, 1, 0
+ while #list < goal do
+ if number > #ndc then
+ -- need a bigger table of divisor counts
+ maxNumber = maxNumber + 5000
+ ndc = {}
+ for i = 1, maxNumber do ndc[ i ] = 1 end
+ for i = 2, maxNumber do
+ for j = i, maxNumber, i do ndc[ j ] = ndc[ j ] + 1 end
+ end
+ end
+ local factors = ndc[ number ]
+ if factors > mostFactors then
+ table.insert( list, number )
+ mostFactors = factors
+ end
+ number = number + 1
+ end
+ return list
+end
+
+-- display the antiprimes
+oo.write( table.concat( antiprimes( 20 ), " " ) )
diff --git a/Task/Anti-primes/MiniScript/anti-primes.mini b/Task/Anti-primes/MiniScript/anti-primes.mini
new file mode 100644
index 0000000000..b3e3966c36
--- /dev/null
+++ b/Task/Anti-primes/MiniScript/anti-primes.mini
@@ -0,0 +1,33 @@
+// Find the first 20 antiprimes.
+
+// returns a table of the first goal antiprimes
+antiprimes = function(goal)
+ maxNumber = 0
+ ndc = [] // table of divisor counts - initially empty
+ list = [0] * goal; number = 1; mostFactors = 0
+ aCount = 0
+ while aCount < goal
+ if number > maxNumber then
+ // need a bigger table of divisor counts
+ maxNumber = maxNumber + 5000
+ ndc = [1] * ( maxNumber + 1 )
+ ndc[ 0 ] = 0
+ for i in range( 2, maxNumber )
+ for j in range( i, maxNumber, i )
+ ndc[ j ] = ndc[ j ] + 1
+ end for
+ end for
+ end if
+ factors = ndc[ number ]
+ if factors > mostFactors then
+ list[ aCount ] = number
+ mostFactors = factors
+ aCount = aCount + 1
+ end if
+ number = number + 1
+ end while
+ return list
+end function
+
+// display the antiprimes
+print antiprimes( 20 ).join( " " )
diff --git a/Task/Anti-primes/Odin/anti-primes.odin b/Task/Anti-primes/Odin/anti-primes.odin
new file mode 100644
index 0000000000..6658df8e73
--- /dev/null
+++ b/Task/Anti-primes/Odin/anti-primes.odin
@@ -0,0 +1,42 @@
+package antiprimes
+import "core:fmt"
+
+main :: proc() {
+ AntiPrimeCount, MaxDivisors, Divisors, n: u64
+ MaxAntiPrime: u64 = 20
+ fmt.print("\nFirst 20 anti-primes\n")
+ fmt.println("--------------------")
+ for (AntiPrimeCount < MaxAntiPrime) {
+ n += 1
+ Divisors = DivisorCount(n)
+ if Divisors > MaxDivisors {
+ fmt.print(n, " ")
+ MaxDivisors = Divisors
+ AntiPrimeCount += 1
+ }
+ }
+}
+
+DivisorCount :: proc(v: u64) -> u64 {
+ total: u64 = 1
+ a := v
+ if a == 0 {
+ return 0
+ }
+ for a % 2 == 0 {
+ total += 1
+ a /= 2
+ }
+ for p: u64 = 3; p * p <= a; p += 2 {
+ count: u64 = 1
+ for a % p == 0 {
+ count += 1
+ a /= p
+ }
+ total *= count
+ }
+ if a > 1 {
+ total *= 2
+ }
+ return total
+}
diff --git a/Task/Anti-primes/Ring/anti-primes.ring b/Task/Anti-primes/Ring/anti-primes-1.ring
similarity index 100%
rename from Task/Anti-primes/Ring/anti-primes.ring
rename to Task/Anti-primes/Ring/anti-primes-1.ring
diff --git a/Task/Anti-primes/Ring/anti-primes-2.ring b/Task/Anti-primes/Ring/anti-primes-2.ring
new file mode 100644
index 0000000000..1d44cbb7bf
--- /dev/null
+++ b/Task/Anti-primes/Ring/anti-primes-2.ring
@@ -0,0 +1,36 @@
+# find the first 20 antiprimes
+# - numbers woth more divisors than the previous numbers
+
+numberOfDivisorCounts = 0
+maxDivisor = 0
+num = 0
+n = 0
+result = list(20)
+while num < 20
+ n += 1
+ if n > numberOfDivisorCounts
+ # need a bigger table of divisor counts
+ numberOfDivisorCounts += 5000
+ ndc = list(numberOfDivisorCounts)
+ for i = 1 to numberOfDivisorCounts
+ ndc[ i ] = 1
+ next
+ for i = 2 to numberOfDivisorCounts
+ j = i
+ while j <= numberOfDivisorCounts
+ ndc[ j ] = ndc[ j ] + 1
+ j += i
+ end
+ next
+ ok
+ div = ndc[ n ]
+ if (div > maxDivisor)
+ maxDivisor = div
+ num += 1
+ result[num] = n
+ ok
+end
+see result[1]
+for n = 2 to len(result)
+ see " " + string(result[n])
+next
diff --git a/Task/Anti-primes/Ruby/anti-primes.rb b/Task/Anti-primes/Ruby/anti-primes.rb
index 86541cc62b..532be171a8 100644
--- a/Task/Anti-primes/Ruby/anti-primes.rb
+++ b/Task/Anti-primes/Ruby/anti-primes.rb
@@ -1,6 +1,6 @@
require 'prime'
def num_divisors(n)
- n.prime_division.inject(1){|prod, (_p,n)| prod *= (n + 1) }
+ n.prime_division.inject(1){|prod, (_p,n)| prod * (n + 1) }
end
anti_primes = Enumerator.new do |y| # y is the yielder
diff --git a/Task/Arbitrary-precision-integers-included-/Sidef/arbitrary-precision-integers-included-.sidef b/Task/Arbitrary-precision-integers-included-/Sidef/arbitrary-precision-integers-included-.sidef
index 1f06a61cc6..8f4c7ec041 100644
--- a/Task/Arbitrary-precision-integers-included-/Sidef/arbitrary-precision-integers-included-.sidef
+++ b/Task/Arbitrary-precision-integers-included-/Sidef/arbitrary-precision-integers-included-.sidef
@@ -1,3 +1,3 @@
-var x = 5**(4**(3**2));
-var y = x.to_s;
-printf("5**4**3**2 = %s...%s and has %i digits\n", y.ft(0,19), y.ft(-20), y.len);
+var x = 5**(4**(3**2))
+var y = x.to_s
+printf("5**4**3**2 = %s...%s and has %i digits\n", y.first(20), y.last(20), y.len)
diff --git a/Task/Arithmetic-derivative/Rust/arithmetic-derivative.rust b/Task/Arithmetic-derivative/Rust/arithmetic-derivative.rust
new file mode 100644
index 0000000000..e81375c533
--- /dev/null
+++ b/Task/Arithmetic-derivative/Rust/arithmetic-derivative.rust
@@ -0,0 +1,25 @@
+use prime_factorization::Factorization;
+
+fn d(n: i128) -> i128 {
+ if n < 0 {
+ return -(d(-n));
+ } else if n < 2 {
+ return 0;
+ } else {
+ let fpairs = Factorization::run(n as u128).prime_factor_repr();
+ if fpairs.len() == 1 && fpairs[0].1 == 1 {
+ return 1;
+ }
+ return fpairs.iter().fold(0_i128, |p, q| p + n * (q.1 as i128) / (q.0 as i128));
+ }
+}
+
+fn main() {
+ for n in -99..101 {
+ print!("{:5}{}", d(n), { if n % 10 == 0 { "\n" } else {""} });
+ }
+ println!();
+ for m in 1..21 {
+ println!("(D for 10 ^ {}) divided by 7 is {}", m, d(10_i128.pow(m)) / 7)
+ }
+}
diff --git a/Task/Array-length/S-BASIC/array-length.basic b/Task/Array-length/S-BASIC/array-length.basic
new file mode 100644
index 0000000000..3f753e3dc8
--- /dev/null
+++ b/Task/Array-length/S-BASIC/array-length.basic
@@ -0,0 +1,13 @@
+dim string animals(2) rem here is our array
+var array_struct_address = integer
+based array_size = integer
+
+animals(1) = "ardvark"
+animals(2) = "bison"
+
+location spec array_struct_address = animals
+base array_size at array_struct_address + 5
+
+print "Size of array ="; array_size
+
+end
diff --git a/Task/Ascending-primes/00-TASK.txt b/Task/Ascending-primes/00-TASK.txt
index f84794ce53..643622eba2 100644
--- a/Task/Ascending-primes/00-TASK.txt
+++ b/Task/Ascending-primes/00-TASK.txt
@@ -14,5 +14,6 @@ at least one significantly better and much faster way, needing a mere 511 odd/pr
;Related:
*[[Primes with digits in nondecreasing order]] (infinite series allowing duplicate digits, whereas this isn't and doesn't)
*[[Pandigital prime]] (whereas this is the smallest, with gaps in the used digits being permitted)
+*[[Descending primes]]
diff --git a/Task/Attractive-numbers/Maxima/attractive-numbers.maxima b/Task/Attractive-numbers/Maxima/attractive-numbers.maxima
new file mode 100644
index 0000000000..2f3fad1b07
--- /dev/null
+++ b/Task/Attractive-numbers/Maxima/attractive-numbers.maxima
@@ -0,0 +1,7 @@
+AttractiveNumber(N):=block([Q:0],
+ if not primep(N) then (
+ if primep(apply("+", map(lambda([Z], Z[2]), ifactors(N)))) then Q: N
+ ), Q
+)$
+
+delete(0, makelist(AttractiveNumber(K), K, 1, 120));
diff --git a/Task/Averages-Median/ARM-Assembly/averages-median.arm b/Task/Averages-Median/ARM-Assembly/averages-median.arm
new file mode 100644
index 0000000000..5b06da83df
--- /dev/null
+++ b/Task/Averages-Median/ARM-Assembly/averages-median.arm
@@ -0,0 +1,493 @@
+/* ARM assembly Raspberry PI */
+/* program averageMed.s */
+/* use quickselect look pseudo code in wikipedia quickselect */
+
+/************************************/
+/* Constantes */
+/************************************/
+/* for constantes see task include a file in arm assembly */
+.include "../constantes.inc"
+
+/*********************************/
+/* Initialized data */
+/*********************************/
+.data
+szMessResultValue: .asciz "Result : "
+szCarriageReturn: .asciz "\n"
+
+.align 4
+TableNumber: .float 4.1, 5.6, 7.2, 1.7, 9.3, 4.4, 3.2
+.equ NBELEMENTS, (. - TableNumber) / 4
+TableNumber2: .float 4.1, 7.2, 1.7, 9.3, 4.4, 3.2
+.equ NBELEMENTS2, (. - TableNumber2) / 4
+/*********************************/
+/* UnInitialized data */
+/*********************************/
+.bss
+sZoneConv: .skip 24
+sZoneConv1: .skip 24
+/*********************************/
+/* code section */
+/*********************************/
+.text
+.global main
+main: @ entry of program
+
+ ldr r0,iAdrTableNumber @ address number table
+ mov r1,#0 @ index first item
+ mov r2,#NBELEMENTS -1 @ index last item
+ bl searchMedian
+ ldr r0,iAdrTableNumber2 @ address number table 2
+ mov r1,#0 @ index first item
+ mov r2,#NBELEMENTS2 -1 @ index last item
+ bl searchMedian
+
+100: @ standard end of the program
+ mov r0, #0 @ return code
+ mov r7, #EXIT @ request to exit program
+ svc #0 @ perform the system call
+
+iAdrszCarriageReturn: .int szCarriageReturn
+iAdrTableNumber: .int TableNumber
+iAdrTableNumber2: .int TableNumber2
+iAdrsZoneConv: .int sZoneConv
+iAdrszMessResultValue: .int szMessResultValue
+/***************************************************/
+/* search median term in float array */
+/***************************************************/
+/* r0 contains the address of table */
+/* r1 contains index of first item */
+/* r2 contains index of last item */
+searchMedian:
+ push {r1-r5,lr} @ save registers
+ mov r5,r0 @ save array address
+ add r4,r1,r2
+ add r4,r4,#1 @ sum numbers terms
+ tst r4,#1 @ odd ?
+ bne 1f
+ lsr r3,r4,#1 @ compute median index
+ bl select @ call selection
+ vmov s0,r0 @ save first result
+ sub r3,r3,#1 @ second term
+ mov r0,r5
+ bl select @ call selection
+ vmov s1,r0 @ save 2ieme résult
+ vadd.f32 s0,s1 @ compute average two résults
+ mov r0,#2
+ vmov s1,r0
+ vcvt.f32.u32 s1,s1 @ conversion integer -> float
+ vdiv.f32 s0,s0,s1
+ b 2f
+1: @ even
+ lsr r3,r4,#1
+ bl select @ call selection
+ vmov s0,r0
+2:
+ ldr r0,iAdrsZoneConv @ conversion float in decimal string
+ bl convertirFloat
+ mov r0,#3 @ and display result
+ ldr r1,iAdrszMessResultValue
+ ldr r2,iAdrsZoneConv
+ ldr r3,iAdrszCarriageReturn
+ bl displayStrings
+100: @ end function
+ pop {r1-r5,pc} @ restaur register
+/***************************************************/
+/* Appel récursif selection */
+/***************************************************/
+/* r0 contains the address of table */
+/* r1 contains index of first item */
+/* r2 contains index of last item */
+/* r3 contains search index */
+/* r0 return final value in float */
+/* remark : the final result is a float returned in r0 register */
+select:
+ push {r1-r6,lr} @ save registers
+ mov r6,r3 @ save search index
+ cmp r1,r2 @ first = last ?
+ ldreq r0,[r0,r1,lsl #2] @ return value of first index
+ beq 100f @ yes -> end
+ add r3,r1,r2
+ lsr r3,r3,#1 @ compute median pivot
+ mov r4,r0 @ save r0
+ mov r5,r2 @ save r2
+ bl partition @ cutting into 2 parts
+ cmp r6,r0 @ pivot is ok ?
+ ldreq r0,[r4,r0,lsl #2] @ return value
+ beq 100f
+ bgt 1f
+ sub r2,r0,#1 @ index partition - 1
+ mov r0,r4 @ array address
+ mov r3,r6 @ search index
+ bl select @ select lower part
+ b 100f
+1:
+ add r1,r0,#1 @ index begin = index partition + 1
+ mov r0,r4 @ array address
+ mov r2,r5 @ last item
+ mov r3,r6 @ search index
+ bl select @ select higter part
+ 100: @ end function
+ pop {r1-r6,pc} @ restaur register
+/******************************************************************/
+/* Partition table elements */
+/******************************************************************/
+/* r0 contains the address of table */
+/* r1 contains index of first item */
+/* r2 contains index of last item */
+/* r3 contains index of pivot */
+partition:
+ push {r1-r6,lr} @ save registers
+ ldr r4,[r0,r3,lsl #2] @ load value of pivot
+ ldr r5,[r0,r2,lsl #2] @ load value last index
+ str r5,[r0,r3,lsl #2] @ swap value of pivot
+ str r4,[r0,r2,lsl #2] @ and value last index
+ mov r3,r1 @ init with first index
+1: @ begin loop
+ ldr r6,[r0,r3,lsl #2] @ load value
+ cmp r6,r4 @ compare loop value and pivot value
+ ldrlt r5,[r0,r1,lsl #2] @ if < swap value table
+ strlt r6,[r0,r1,lsl #2]
+ strlt r5,[r0,r3,lsl #2]
+ addlt r1,#1 @ and increment index 1
+ add r3,#1 @ increment index 2
+ cmp r3,r2 @ end ?
+ blt 1b @ no loop
+ ldr r5,[r0,r1,lsl #2] @ swap value
+ str r4,[r0,r1,lsl #2]
+ str r5,[r0,r2,lsl #2]
+ mov r0,r1 @ return index partition
+100:
+ pop {r1-r6,pc}
+
+/***************************************************/
+/* display multi strings */
+/***************************************************/
+/* r0 contains number strings address */
+/* r1 address string1 */
+/* r2 address string2 */
+/* r3 address string3 */
+/* other address on the stack */
+/* thinck to add number other address * 4 to add to the stack */
+displayStrings: @ INFO: displayStrings
+ push {r1-r4,fp,lr} @ save des registres
+ add fp,sp,#24 @ save paraméters address (6 registers saved * 4 bytes)
+ mov r4,r0 @ save strings number
+ cmp r4,#0 @ 0 string -> end
+ ble 100f
+ mov r0,r1 @ string 1
+ bl affichageMess
+ cmp r4,#1 @ number > 1
+ ble 100f
+ mov r0,r2
+ bl affichageMess
+ cmp r4,#2
+ ble 100f
+ mov r0,r3
+ bl affichageMess
+ cmp r4,#3
+ ble 100f
+ mov r3,#3
+ sub r2,r4,#4
+1: @ loop extract address string on stack
+ ldr r0,[fp,r2,lsl #2]
+ bl affichageMess
+ subs r2,#1
+ bge 1b
+100:
+ pop {r1-r4,fp,pc}
+/******************************************************************/
+/* Conversion Float */
+/******************************************************************/
+/* s0 contains Float */
+/* r0 contains address conversion area mini 20 charactèrs*/
+/* r0 return result length */
+convertirFloat:
+ push {r1-r7,lr}
+ vpush {s0-s2}
+ mov r6,r0 @ save area address
+ vmov r0,s0
+ mov r1,#0
+ vmov s1,r1
+ movs r7,#0 @ result length
+ movs r3,#'+'
+ strb r3,[r6] @ sign + forcing
+ mov r2,r0
+ lsls r2,#1 @ extraction bit 31
+ bcc 1f @ positive ?
+ lsrs r0,r2,#1 @ raz sign if negative
+ movs r3,#'-' @ sign -
+ strb r3,[r6]
+1:
+ adds r7,#1 @ next position
+ cmp r0,#0 @ case of positive or negative 0
+ bne 2f
+ movs r3,#'0'
+ strb r3,[r6,r7] @ store character 0
+ adds r7,#1 @ next position
+ movs r3,#0
+ strb r3,[r6,r7] @ store 0 final
+ mov r0,r7 @ return length
+ b 100f @ and end
+2:
+ ldr r2,iMaskExposant
+ mov r1,r0
+ ands r1,r2 @ exposant = 255 ?
+ cmp r1,r2
+ bne 4f
+ lsls r0,#10 @ bit 22 à 0 ?
+ bcc 3f @ yes
+ movs r2,#'N' @ case of Nan. store byte, if not possible store int
+ strb r2,[r6] @ area no aligned
+ movs r2,#'a'
+ strb r2,[r6,#1]
+ movs r2,#'n'
+ strb r2,[r6,#2]
+ movs r2,#0 @ 0 final
+ strb r2,[r6,#3]
+ movs r0,#3 @ return length 3
+ b 100f
+3: @ case infini positive or négative
+ movs r2,#'I'
+ strb r2,[r6,r7]
+ adds r7,#1
+ movs r2,#'n'
+ strb r2,[r6,r7]
+ adds r7,#1
+ movs r2,#'f'
+ strb r2,[r6,r7]
+ adds r7,#1
+ movs r2,#0
+ strb r2,[r6,r7]
+ mov r0,r7
+ b 100f
+4:
+ bl normaliserFloat
+ mov r5,r0 @ save exposant
+ VCVT.U32.f32 s2,s0 @ integer value of integer part
+ vmov r0,s2 @ integer part
+ VCVT.F32.U32 s1,s2 @ conversion float
+ vsub.f32 s1,s0,s1 @ extraction fract part
+ vldr s2,iConst1
+ vmul.f32 s1,s2,s1 @ to crop it in full
+
+ VCVT.U32.f32 s1,s1 @ integer conversion
+ vmov r4,s1 @ fract value
+ @ integer conversion in r0
+ mov r2,r6 @ save address area begin
+ adds r6,r7
+ mov r1,r6
+ bl conversion10
+ add r6,r0
+ movs r3,#','
+ strb r3,[r6]
+ adds r6,#1
+
+ mov r0,r4 @ conversion fractional part
+ mov r1,r6
+ bl conversion10SP @ spécial routine with conservation begin 0
+ add r6,r0
+ subs r6,#1
+ @ remove trailing zeros
+5:
+ ldrb r0,[r6]
+ cmp r0,#'0'
+ bne 6f
+ subs r6,#1
+ b 5b
+6:
+ cmp r0,#','
+ bne 7f
+ subs r6,#1
+7:
+ adds r6,#1
+ movs r3,#'E'
+ strb r3,[r6]
+ adds r6,#1
+ mov r0,r5 @ conversion exposant
+ mov r3,r0
+ lsls r3,#1
+ bcc 4f
+ rsbs r0,r0,#0
+ movs r3,#'-'
+ strb r3,[r6]
+ adds r6,#1
+4:
+ mov r1,r6
+ bl conversion10
+ add r6,r0
+
+ movs r3,#0
+ strb r3,[r6]
+ adds r6,#1
+ mov r0,r6
+ subs r0,r2 @ return length result
+ subs r0,#1 @ - 0 final
+
+100:
+ vpop {s0-s2}
+ pop {r1-r7,pc}
+iMaskExposant: .int 0xFF<<23
+iConst1: .float 0f1E9
+
+/***************************************************/
+/* normaliser float */
+/***************************************************/
+/* r0 contain float value (always positive value and <> Nan) */
+/* s0 return new value */
+/* r0 return exposant */
+normaliserFloat:
+ push {lr} @ save registre
+ vmov s0,r0 @ value float
+ movs r0,#0 @ exposant
+ vldr s1,iConstE7 @ no normalisation for value < 1E7
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 10f @ if s0 < iConstE7
+
+ vldr s1,iConstE32
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 1f
+ vldr s1,iConstE32
+ vdiv.f32 s0,s0,s1
+ adds r0,#32
+1:
+ vldr s1,iConstE16
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 2f
+ vldr s1,iConstE16
+ vdiv.f32 s0,s0,s1
+ adds r0,#16
+2:
+ vldr s1,iConstE8
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 3f
+ vldr s1,iConstE8
+ vdiv.f32 s0,s0,s1
+ adds r0,#8
+3:
+ vldr s1,iConstE4
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 4f
+ vldr s1,iConstE4
+ vdiv.f32 s0,s0,s1
+ adds r0,#4
+4:
+ vldr s1,iConstE2
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 5f
+ vldr s1,iConstE2
+ vdiv.f32 s0,s0,s1
+ adds r0,#2
+5:
+ vldr s1,iConstE1
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ blo 10f
+ vldr s1,iConstE1
+ vdiv.f32 s0,s0,s1
+ adds r0,#1
+
+10:
+ vldr s1,iConstME5 @ pas de normalisation pour les valeurs > 1E-5
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 100f
+ vldr s1,iConstME31
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 11f
+ vldr s1,iConstE32
+
+ vmul.f32 s0,s0,s1
+ subs r0,#32
+11:
+ vldr s1,iConstME15
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 12f
+ vldr s1,iConstE16
+ vmul.f32 s0,s0,s1
+ subs r0,#16
+12:
+ vldr s1,iConstME7
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 13f
+ vldr s1,iConstE8
+ vmul.f32 s0,s0,s1
+ subs r0,#8
+13:
+ vldr s1,iConstME3
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 14f
+ vldr s1,iConstE4
+ vmul.f32 s0,s0,s1
+ subs r0,#4
+14:
+ vldr s1,iConstME1
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 15f
+ vldr s1,iConstE2
+ vmul.f32 s0,s0,s1
+ subs r0,#2
+15:
+ vldr s1,iConstE0
+ vcmp.f32 s0,s1
+ vmrs APSR_nzcv,FPSCR
+ bhi 100f
+ vldr s1,iConstE1
+ vmul.f32 s0,s0,s1
+ subs r0,#1
+
+100: @ fin standard de la fonction
+ pop {pc} @ restaur des registres
+.align 2
+iConstE7: .float 0f1E7
+iConstE32: .float 0f1E32
+iConstE16: .float 0f1E16
+iConstE8: .float 0f1E8
+iConstE4: .float 0f1E4
+iConstE2: .float 0f1E2
+iConstE1: .float 0f1E1
+iConstME5: .float 0f1E-5
+iConstME31: .float 0f1E-31
+iConstME15: .float 0f1E-15
+iConstME7: .float 0f1E-7
+iConstME3: .float 0f1E-3
+iConstME1: .float 0f1E-1
+iConstE0: .float 0f1E0
+/******************************************************************/
+/* Décimal Conversion */
+/******************************************************************/
+/* r0 contain value et r1 address conversion area */
+conversion10SP:
+ push {r1-r6,lr} @ save registers
+ mov r5,r1
+ mov r4,#8
+ mov r2,r0
+ mov r1,#10 @ conversion decimale
+1: @ begin loop
+ mov r0,r2 @ copy number or quotients
+ bl division @ r0 dividende r1 divisor r2 quotient r3 remainder
+ add r3,#48 @ compute digit
+ strb r3,[r5,r4] @ store byte area address (r5) + offset (r4)
+ subs r4,r4,#1 @ position précedente
+ bge 1b @ and loop if not < zero
+ mov r0,#8
+ mov r3,#0
+ strb r3,[r5,r0] @ store 0 final
+100:
+ pop {r1-r6,pc} @ restaur registers
+/***************************************************/
+/* ROUTINES INCLUDE */
+/***************************************************/
+/* for this file see task include a file in language ARM assembly */
+.include "../affichage.inc"
diff --git a/Task/B-zier-curves-Intersections/C++/b-zier-curves-intersections.cpp b/Task/B-zier-curves-Intersections/C++/b-zier-curves-intersections.cpp
new file mode 100644
index 0000000000..ebc1328aa0
--- /dev/null
+++ b/Task/B-zier-curves-Intersections/C++/b-zier-curves-intersections.cpp
@@ -0,0 +1,133 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+const double TOLERANCE = 0.000'000'1;
+const double SPACING = 10 * TOLERANCE;
+
+typedef std::pair point;
+
+class quad_spline {
+public:
+ quad_spline(double c0, double c1, double c2) : c0(c0), c1(c1), c2(c2) {};
+ quad_spline() : c0(0.0), c1(0.0), c2(0.0) {};
+ double c0, c1, c2;
+};
+
+class quad_curve {
+public:
+ quad_curve(quad_spline x, quad_spline y) : x(x), y(y) {};
+ quad_curve() : x(quad_spline()), y(quad_spline()) {};
+ quad_spline x, y;
+};
+
+// de Casteljau's algorithm
+void subdivide_quad_spline(const quad_spline& q, const double& t, quad_spline& u, quad_spline& v) {
+ const double s = 1.0 - t;
+ u.c0 = q.c0;
+ v.c2 = q.c2;
+ u.c1 = s * q.c0 + t * q.c1;
+ v.c1 = s * q.c1 + t * q.c2;
+ u.c2 = s * u.c1 + t * v.c1;
+ v.c0 = u.c2;
+}
+
+void subdivide_quad_curve(const quad_curve& q, const double t, quad_curve& u, quad_curve& v) {
+ subdivide_quad_spline(q.x, t, u.x, v.x);
+ subdivide_quad_spline(q.y, t, u.y, v.y);
+}
+
+bool rectangles_overlap(const double& xa0, const double& ya0, const double& xa1, const double& ya1,
+ const double& xb0, const double& yb0, const double& xb1, const double& yb1) {
+ return xb0 <= xa1 && xa0 <= xb1 && yb0 <= ya1 && ya0 <= yb1;
+}
+
+std::tuple test_intersection(const quad_curve& p, const quad_curve& q) {
+ const double px_min = std::min(std::min(p.x.c0, p.x.c1), p.x.c2);
+ const double py_min = std::min(std::min(p.y.c0, p.y.c1), p.y.c2);
+ const double px_max = std::max(std::max(p.x.c0, p.x.c1), p.x.c2);
+ const double py_max = std::max(std::max(p.y.c0, p.y.c1), p.y.c2);
+
+ const double qx_min = std::min(std::min(q.x.c0, q.x.c1), q.x.c2);
+ const double qy_min = std::min(std::min(q.y.c0, q.y.c1), q.y.c2);
+ const double qx_max = std::max(std::max(q.x.c0, q.x.c1), q.x.c2);
+ const double qy_max = std::max(std::max(q.y.c0, q.y.c1), q.y.c2);
+
+ bool accepted = false;
+ bool excluded = true;
+ point intersect = std::make_pair(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;
+ const double x_min = std::max(px_min, qx_min);
+ const double x_max = std::min(px_max, px_max);
+ if ( x_max - x_min <= TOLERANCE ) {
+ const double y_min = std::max(py_min, qy_min);
+ const double y_max = std::min(py_max, qy_max);
+ if ( y_max - y_min <= TOLERANCE ) {
+ accepted = true;
+ intersect = std::make_pair(0.5 * ( x_min + x_max ), 0.5 * ( y_min + y_max));
+ }
+ }
+ }
+ return std::make_tuple(accepted, excluded, intersect);
+}
+
+bool seems_to_be_duplicate(const std::vector& intersects, const point& pt) {
+ for ( point intersect : intersects ) {
+ if ( fabs(intersect.first - pt.first) < SPACING && fabs(intersect.second - pt.second) < SPACING ) {
+ return true;
+ }
+ }
+ return false;
+}
+
+std::vector find_intersects(const quad_curve& p, const quad_curve& q) {
+ std::vector result;
+ std::stack stack;
+ stack.push(p);
+ stack.push(q);
+
+ while ( ! stack.empty() ) {
+ quad_curve pp = stack.top();
+ stack.pop();
+ quad_curve qq = stack.top();
+ stack.pop();
+
+ std::tuple objects = test_intersection(pp, qq);
+ bool accepted, excluded;
+ point intersect;
+ std::tie(accepted, excluded, intersect) = objects;
+
+ if ( accepted ) {
+ if ( ! seems_to_be_duplicate(result, intersect) ) {
+ result.push_back(intersect);
+ }
+ } else if ( ! excluded ) {
+ quad_curve p0{}, q0{}, p1{}, q1{};
+ subdivide_quad_curve(pp, 0.5, p0, p1);
+ subdivide_quad_curve(qq, 0.5, q0, q1);
+ for ( quad_curve item : { p0, q0, p0, q1, p1, q0, p1, q1 } ) {
+ stack.push(item);
+ }
+ }
+ }
+ return result;
+}
+
+int main() {
+ quad_curve vertical(quad_spline(-1.0, 0.0, 1.0), quad_spline(0.0, 10.0, 0.0));
+ // QuadCurve vertical represents the Bezier curve having control points (-1, 0), (0, 10) and (1, 0)
+ quad_curve horizontal(quad_spline(2.0, -8.0, 2.0), quad_spline(1.0, 2.0, 3.0));
+ // QuadCurve horizontal represents the Bezier curve having control points (2, 1), (-8, 2) and (2, 3)
+
+ std::cout << "The points of intersection are:" << std::endl;
+ std::vector intersects = find_intersects(vertical, horizontal);
+ for ( const point& intersect : intersects ) {
+ std::cout << "( " << std::setw(9) << std::setprecision(6) << intersect.first
+ << ", " << intersect.second << " )" << std::endl;
+ }
+}
diff --git a/Task/B-zier-curves-Intersections/Java/b-zier-curves-intersections.java b/Task/B-zier-curves-Intersections/Java/b-zier-curves-intersections.java
new file mode 100644
index 0000000000..2cfbfe3be9
--- /dev/null
+++ b/Task/B-zier-curves-Intersections/Java/b-zier-curves-intersections.java
@@ -0,0 +1,145 @@
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public final class BezierCurveIntersection {
+
+ public static void main(String[] aArgs) {
+ QuadCurve vertical = new QuadCurve( new QuadSpline(-1.0, 0.0, 1.0), new QuadSpline(0.0, 10.0, 0.0) );
+ // QuadCurve vertical represents the Bezier curve having control points (-1, 0), (0, 10) and (1, 0)
+ QuadCurve horizontal = new QuadCurve( new QuadSpline(2.0, -8.0, 2.0), new QuadSpline(1.0, 2.0, 3.0) );
+ // QuadCurve horizontal represents the Bezier curve having control points (2, 1), (-8, 2) and (2, 3)
+
+ System.out.println("The points of intersection are:");
+ List intersects = findIntersects(vertical, horizontal);
+ for ( Point intersect : intersects ) {
+ System.out.println(String.format("%s%9.6f%s%9.6f%s", "( ", intersect.aX, ", ", intersect.aY, " )"));
+ }
+ }
+
+ private static List findIntersects(QuadCurve aP, QuadCurve aQ) {
+ List result = new ArrayList();
+ Stack stack = new Stack();
+ stack.push(aP);
+ stack.push(aQ);
+
+ while ( ! stack.isEmpty() ) {
+ QuadCurve pp = stack.pop();
+ QuadCurve qq = stack.pop();
+ List