Solve hanging lantern problem: Difference between revisions

m
syntax highlighting fixup automation
m (syntax highlighting fixup automation)
Line 52:
=={{header|APL}}==
{{trans|Pascal}}
<langsyntaxhighlight lang="apl">lanterns ← { (!+/⍵) ÷ ×/!⍵ }</langsyntaxhighlight>
{{Out}}
<pre> lanterns 1 2 3
Line 73:
{{trans|FreeBASIC}}
The result for n >= 5 is slow to emerge
<langsyntaxhighlight lang="freebasic">arraybase 1
n = 4
dim a(n)
Line 97:
if res = 0 then res = 1
return res
end function</langsyntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
Line 104:
{{trans|Python}}
The (1,2,3) example takes about 30 seconds to run on a stock C64; (1,2,3,4) takes about an hour and 40 minutes. Even on a 64 equipped with a 20MHz SuperCPU it takes about 5 minutes.
<langsyntaxhighlight lang="basic">100 PRINT CHR$(147);CHR$(18);"*** HANGING LANTERN PROBLEM ***"
110 INPUT "HOW MANY COLUMNS "; N
120 DIM NL(N-1):T=0
Line 129:
410 GOTO 320
420 IF R(SP)=0 THEN R(SP)=1
430 RETURN</langsyntaxhighlight>
 
{{Out}}
Line 143:
==={{header|FreeBASIC}}===
{{trans|Python}}
<langsyntaxhighlight lang="freebasic">Function getLantern(arr() As Uinteger) As Ulong
Dim As Ulong res = 0
For i As Ulong = 1 To Ubound(arr)
Line 167:
Print "] = "; getLantern(a())
Next i
Sleep</langsyntaxhighlight>
{{out}}
<pre>[ 1 ] = 1
Line 180:
{{trans|FreeBASIC}}
The result for n >= 5 is slow to emerge
<langsyntaxhighlight QBasiclang="qbasic">FUNCTION getLantern (arr())
res = 0
FOR i = 1 TO UBOUND(arr)
Line 203:
PRINT "] = "; getLantern(a())
NEXT i
END</langsyntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
Line 210:
{{trans|FreeBASIC}}
The result for n >= 5 is slow to emerge
<langsyntaxhighlight PureBasiclang="purebasic">;;The result For n >= 5 is slow To emerge
Procedure getLantern(Array arr(1))
res.l = 0
Line 238:
Next i
Input()
CloseConsole()</langsyntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
Line 253:
====Recursive version====
;Main code
<syntaxhighlight lang="vb">
<lang vb>
Dim n As Integer, c As Integer
Dim a() As Integer
Line 294:
If res = 0 Then res = 1
getLantern = res
End Function</langsyntaxhighlight>
 
;Form code:
<syntaxhighlight lang="vb">
<lang vb>
VERSION 5.00
Begin VB.Form Form1
Line 366:
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False</langsyntaxhighlight>
 
====Math solution====
Line 372:
Reimplemented "getLantern" function above
 
<langsyntaxhighlight lang="vb">Function getLantern(arr() As Integer) As Integer
Dim tot As Integer, res As Integer
Dim i As Integer
Line 391:
factorial = factorial * i
Next i
End Function</langsyntaxhighlight>
 
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
The result for n >= 5 is slow to emerge
<langsyntaxhighlight lang="yabasic">n = 4
dim a(n)
for i = 1 to arraysize(a(),1)
Line 419:
if res = 0 res = 1
return res
end sub</langsyntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
Line 427:
Translation of [[#APL|APL]]:
 
<langsyntaxhighlight Jlang="j">lanterns=: {{ (!+/y) % */!y }}<</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight Jlang="j"> lanterns 1 2 3
60
lanterns 1 3 3
140
</syntaxhighlight>
</lang>
 
Also, a pedantic version where we must manually count how many values we are providing the computer:
 
<langsyntaxhighlight Jlang="j">pedantic=: {{
assert. ({. = #@}.) y
lanterns }.y
}}</langsyntaxhighlight>
 
And, in the spirit of providing unnecessary but perhaps pleasant (for some) overhead, we'll throw in an unnecessary comma between this count and the relevant values:
 
<langsyntaxhighlight Jlang="j"> pedantic 3, 1 2 3
60
pedantic 3, 1 3 3
140</langsyntaxhighlight>
 
If we wanted to impose even more overhead, we could insist that the numbers be read from a file where tabs, spaces and newlines are all treated equivalently. For that, we must specify the file name and implement some parsing:
 
<langsyntaxhighlight Jlang="j">yetmoreoverhead=: {{
pedantic ({.~ 1+{.) _ ". rplc&(TAB,' ',LF,' ') fread y
}}</langsyntaxhighlight>
 
Examples of this approach are left as an exercise for the user (note: do not use commas with this version, unless you modify the code to treat them as whitespace).
Line 461:
Finally, enumerating solutions might be approached recursively:
 
<langsyntaxhighlight Jlang="j">showlanterns=: {{
arrange=. ($ $ (* +/\)@,) y $&>1
echo 'lantern ids:'
Line 478:
echo 'all lantern removal sequences:'
echo >a:-.~ -.&0 each;0 recur cols
}}</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight Jlang="j"> showlanterns 1 2 1
lantern ids:
1 2 4
Line 499:
4 1 3 2
4 3 1 2
4 3 2 1</langsyntaxhighlight>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="ruby">""" rosettacode.org /wiki/Lantern_Problem """
using Combinatorics
Line 537:
lanternproblem()
lanternproblem(false)
</langsyntaxhighlight>{{out}}
<pre style="height:64ex;overflow:scroll">
Input number of columns, then column heights in sequence:
Line 770:
 
This solution avoids recursion and calculates the result mathematically. As noted in the Picat solution, the result is a multinomial coefficient, e.g. with columns of length 3, 6, 4 the result is (3 + 6 + 4)!/(3!*6!*4!).
<langsyntaxhighlight lang="pascal">
program LanternProblem;
uses SysUtils;
Line 852:
until false;
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 869:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">#!/usr/bin/perl
 
use strict; # https://rosettacode.org/wiki/Solve_hanging_lantern_problem
Line 885:
find( $` . $', $found . $& ) while $in =~ /\w\b/g;
$in =~ /\w/ or $answer .= '[' . $found =~ s/\B/,/gr . "]\n";
}</langsyntaxhighlight>
{{out}}
<pre>
Line 952:
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
Line 1,019:
<span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,051:
=={{header|Picat}}==
{{trans|Python}}
<langsyntaxhighlight Picatlang="picat">main =>
run_lantern().
 
Line 1,077:
if Res == 0 then
Res := 1
end.</langsyntaxhighlight>
 
Some tests:
<langsyntaxhighlight Picatlang="picat">main =>
A = [1,2,3],
println(lantern(A)),
Line 1,086:
println(1..N=lantern(1..N))
end,
nl.</langsyntaxhighlight>
 
{{out}}
Line 1,104:
===Recursive version===
{{trans|Visual Basic}}
<langsyntaxhighlight lang="python">
def getLantern(arr):
res = 0
Line 1,121:
a.append(int(input()))
print(getLantern(a))
</syntaxhighlight>
</lang>
 
===Math solution===
<langsyntaxhighlight lang="python">
import math
n = int(input())
Line 1,136:
res /= math.factorial(a[i])
print(int(res))
</syntaxhighlight>
</lang>
 
===Showing Sequences===
<langsyntaxhighlight lang="python">def seq(x):
if not any(x):
yield tuple()
Line 1,150:
# an example
for x in seq([1, 2, 3]):
print(x)</langsyntaxhighlight>
 
=={{header|Raku}}==
Line 1,160:
If all we need is the count, then we can compute that directly:
 
<syntaxhighlight lang="raku" perl6line>unit sub MAIN(*@columns);
 
sub postfix:<!>($n) { [*] 1..$n }
 
say [+](@columns)! / [*](@columns»!);</langsyntaxhighlight>
 
{{Out}}
Line 1,174:
If we want to list all of the sequences, we have to do some more work. This version outputs the sequences as lists of column numbers (assigned from 1 to N left to right); at each step the bottommost lantern from the numbered column is removed.
 
<syntaxhighlight lang="raku" perl6line>unit sub MAIN(*@columns, :v(:$verbose)=False);
 
my @sequences = @columns
Line 1,190:
say +@sequences;
}
</syntaxhighlight>
</lang>
 
{{Out}}
Line 1,213:
If we want individually-numbered lanterns in the sequence instead of column numbers, as in the example given in the task description, that requires yet more work:
 
<syntaxhighlight lang="raku" perl6line>unit sub MAIN(*@columns, :v(:$verbose)=False);
 
my @sequences = @columns
Line 1,246:
} else {
say +@sequences;
}</langsyntaxhighlight>
 
{{Out}}
Line 1,266:
{{trans|Python}}
The result for n == 5 is slow to emerge.
<langsyntaxhighlight lang="ecmascript">var lantern // recursive function
lantern = Fn.new { |n, a|
var count = 0
Line 1,286:
n = n + 1
System.print("%(a) => %(lantern.call(n, a))")
}</langsyntaxhighlight>
 
{{out}}
Line 1,301:
{{libheader|Wren-big}}
Alternatively, using library methods.
<langsyntaxhighlight lang="ecmascript">import "./perm" for Perm
import "./big" for BigInt
 
Line 1,342:
System.print("%(a) => %(BigInt.multinomial(36, a))")
listPerms.call([1, 2, 3], 4)
listPerms.call([1, 3, 3], 3)</langsyntaxhighlight>
 
{{out}}
Line 1,412:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">char N, Column, Sequences, I, Lanterns;
 
proc Tally(Level);
Line 1,434:
Tally(0);
IntOut(0, Sequences);
]</langsyntaxhighlight>
 
{{out}}
10,327

edits