Solve hanging lantern problem: Difference between revisions
(Add Python) |
(Add Visual Basic and VBA) |
||
Line 70: | Line 70: | ||
print(getLantern(a)) |
print(getLantern(a)) |
||
</lang> |
</lang> |
||
=={{header|VBA}}== |
|||
:''See [[Lantern Problem#Visual Basic|Visual Basic]]'' |
|||
=={{header|Visual Basic}}== |
|||
{{works with|Visual Basic|6}} |
|||
;Main code |
|||
<lang vb> |
|||
Dim n As Integer, c As Integer |
|||
Dim a() As Integer |
|||
Private Sub Command1_Click() |
|||
Dim res As Integer |
|||
If c < n Then Label3.Caption = "Please input completely.": Exit Sub |
|||
res = getLantern(a()) |
|||
Label3.Caption = "Result:" + Str(res) |
|||
End Sub |
|||
Private Sub Text1_Change() |
|||
If Val(Text1.Text) <> 0 Then |
|||
n = Val(Text1.Text) |
|||
ReDim a(1 To n) As Integer |
|||
End If |
|||
End Sub |
|||
Private Sub Text2_KeyPress(KeyAscii As Integer) |
|||
If KeyAscii = Asc(vbCr) Then |
|||
If Val(Text2.Text) = 0 Then Exit Sub |
|||
c = c + 1 |
|||
If c > n Then Exit Sub |
|||
a(c) = Val(Text2.Text) |
|||
List1.AddItem Str(a(c)) |
|||
Text2.Text = "" |
|||
End If |
|||
End Sub |
|||
Function getLantern(arr() As Integer) As Integer |
|||
Dim res As Integer |
|||
For i = 1 To n |
|||
If arr(i) <> 0 Then |
|||
arr(i) = arr(i) - 1 |
|||
res = res + getLantern(arr()) |
|||
arr(i) = arr(i) + 1 |
|||
End If |
|||
Next i |
|||
If res = 0 Then res = 1 |
|||
getLantern = res |
|||
End Function</lang> |
|||
;Form code: |
|||
<lang vb> |
|||
VERSION 5.00 |
|||
Begin VB.Form Form1 |
|||
Caption = "Get Lantern" |
|||
ClientHeight = 4410 |
|||
ClientLeft = 120 |
|||
ClientTop = 465 |
|||
ClientWidth = 6150 |
|||
LinkTopic = "Form1" |
|||
ScaleHeight = 4410 |
|||
ScaleWidth = 6150 |
|||
StartUpPosition = 3 |
|||
Begin VB.CommandButton Command1 |
|||
Caption = "Start" |
|||
Height = 495 |
|||
Left = 2040 |
|||
TabIndex = 5 |
|||
Top = 3000 |
|||
Width = 1935 |
|||
End |
|||
Begin VB.ListBox List1 |
|||
Height = 1320 |
|||
Left = 360 |
|||
TabIndex = 4 |
|||
Top = 1440 |
|||
Width = 5175 |
|||
End |
|||
Begin VB.TextBox Text2 |
|||
Height = 855 |
|||
Left = 3360 |
|||
TabIndex = 1 |
|||
Top = 480 |
|||
Width = 2175 |
|||
End |
|||
Begin VB.TextBox Text1 |
|||
Height = 855 |
|||
Left = 360 |
|||
TabIndex = 0 |
|||
Top = 480 |
|||
Width = 2175 |
|||
End |
|||
Begin VB.Label Label3 |
|||
Height = 495 |
|||
Left = 2040 |
|||
TabIndex = 6 |
|||
Top = 3720 |
|||
Width = 2295 |
|||
End |
|||
Begin VB.Label Label2 |
|||
Caption = "Number Each" |
|||
Height = 375 |
|||
Left = 3960 |
|||
TabIndex = 3 |
|||
Top = 120 |
|||
Width = 1695 |
|||
End |
|||
Begin VB.Label Label1 |
|||
Caption = "Total" |
|||
Height = 255 |
|||
Left = 960 |
|||
TabIndex = 2 |
|||
Top = 120 |
|||
Width = 1455 |
|||
End |
|||
End |
|||
Attribute VB_Name = "Form1" |
|||
Attribute VB_GlobalNameSpace = False |
|||
Attribute VB_Creatable = False |
|||
Attribute VB_PredeclaredId = True |
|||
Attribute VB_Exposed = False</lang> |
Revision as of 13:01, 22 May 2022
You are encouraged to solve this task according to the task description, using any language you may know.
There are some groups of lantern hanging on the ceil. Each group contais one or more lanterns. Each time you can fetch one lantern. Now you need to get all these lanterns down, but you can only fetch the one in the bottom of the group. The qustion is how many ways are there to do this.
For example, there are some lanterns hanging like this:
🏮 🏮 🏮
🏮 🏮
🏮
Number these lanterns:
1 2 4
3 5
6
You can take like this: [6,3,5,2,4,1] or [3,1,6,5,2,4]
But not: [6,3,2,4,5,1] because at that time 5 is under 4.
There are 60 ways to take them down.
- Task
Input:
First an integer (n): the number of groups.
Then n integers: the number of lanterns each group has.
Output:
An integer: the number of sequences.
For example, the input of the example above could be:
3
1
2
3
And the output is:
60
- Optional task
Output all the sequences using this format:
[a,b,c,…]
[b,a,c,…]
……
Python
- Recursive version
<lang python> def getLantern(arr):
res = 0 for i in range(0, n): if arr[i] != 0: arr[i] -= 1 res += getLantern(arr) arr[i] += 1 if res == 0: res = 1 return res
a = [] n = int(input()) for i in range(0, n):
a.append(int(input()))
print(getLantern(a)) </lang>
VBA
- See Visual Basic
Visual Basic
- Main code
<lang vb> Dim n As Integer, c As Integer Dim a() As Integer
Private Sub Command1_Click()
Dim res As Integer If c < n Then Label3.Caption = "Please input completely.": Exit Sub res = getLantern(a()) Label3.Caption = "Result:" + Str(res)
End Sub
Private Sub Text1_Change()
If Val(Text1.Text) <> 0 Then n = Val(Text1.Text) ReDim a(1 To n) As Integer End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If KeyAscii = Asc(vbCr) Then If Val(Text2.Text) = 0 Then Exit Sub c = c + 1 If c > n Then Exit Sub a(c) = Val(Text2.Text) List1.AddItem Str(a(c)) Text2.Text = "" End If
End Sub
Function getLantern(arr() As Integer) As Integer
Dim res As Integer For i = 1 To n If arr(i) <> 0 Then arr(i) = arr(i) - 1 res = res + getLantern(arr()) arr(i) = arr(i) + 1 End If Next i If res = 0 Then res = 1 getLantern = res
End Function</lang>
- Form code
<lang vb> VERSION 5.00 Begin VB.Form Form1
Caption = "Get Lantern" ClientHeight = 4410 ClientLeft = 120 ClientTop = 465 ClientWidth = 6150 LinkTopic = "Form1" ScaleHeight = 4410 ScaleWidth = 6150 StartUpPosition = 3 Begin VB.CommandButton Command1 Caption = "Start" Height = 495 Left = 2040 TabIndex = 5 Top = 3000 Width = 1935 End Begin VB.ListBox List1 Height = 1320 Left = 360 TabIndex = 4 Top = 1440 Width = 5175 End Begin VB.TextBox Text2 Height = 855 Left = 3360 TabIndex = 1 Top = 480 Width = 2175 End Begin VB.TextBox Text1 Height = 855 Left = 360 TabIndex = 0 Top = 480 Width = 2175 End Begin VB.Label Label3 Height = 495 Left = 2040 TabIndex = 6 Top = 3720 Width = 2295 End Begin VB.Label Label2 Caption = "Number Each" Height = 375 Left = 3960 TabIndex = 3 Top = 120 Width = 1695 End Begin VB.Label Label1 Caption = "Total" Height = 255 Left = 960 TabIndex = 2 Top = 120 Width = 1455 End
End Attribute VB_Name = "Form1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False</lang>