Banker's algorithm: Difference between revisions
→{{header|Scala}}: fix typo
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
(→{{header|Scala}}: fix typo) |
||
(5 intermediate revisions by 4 users not shown) | |||
Line 41:
=={{header|11l}}==
{{trans|Python}}
{{todo|Python|Translate all Spanish texts to English}}
<syntaxhighlight lang="11l">V resources = Int(input(‘Cantidad de recursos: ’))
V processes = Int(input(‘Cantidad de procesos: ’))
V max_resources = input(‘Recursos máximos: ’).split_py().map(i -> Int(i))
Line 122 ⟶ 123:
There are two <code>main()</code> functions to choose from (look for <code>#define BIG_EXAMPLE</code>), one is for task example, the other is a much heavier duty test case.
<syntaxhighlight lang="c">#include <stdio.h>
#include <stdbool.h>
Line 287 ⟶ 288:
=={{header|FreeBASIC}}==
{{trans|Kotlin}}
{{todo|Python|Translate all Spanish texts to English}}
<syntaxhighlight lang="freebasic">
Dim As Integer i, j, r, p
Input "Ingrese la cantidad de recursos: ", r
Line 420 ⟶ 422:
This solution is more inspired by EWD-623 than WP. EWD-623, while it talks of finding a permutation of processes, notes that the "ordering effort" can be stopped as soon as the process requesting resources happens to be found satisfiable. The solution here attempts to make this finding as soon as possible by moving the process to the front of a list of unsatisfied processes. Also since the solved permutation of satisfied processes has no use, it is not kept which simplifies the algorithm a bit.
<syntaxhighlight lang="go">package bank
import (
Line 582 ⟶ 584:
}
}</syntaxhighlight>
<syntaxhighlight lang="go">package main
import (
Line 631 ⟶ 633:
The task description currently does not define the process being run. So we follow the example set by other implementations and have each process free all resources after successfully being run. Also, since this is a demo, we give a blow-by-blow description of what's happening as it runs.
<syntaxhighlight lang="j">bankrun=:1 :0
'MAX ALLOC TOTAL'=. y
todo=.(#ALLOC)#1
Line 663 ⟶ 665:
Definitions for task example:
<syntaxhighlight lang="j">max=: 3 3 2 2,1 2 3 4,:1 3 5 0
alloc=: 1 2 2 1,1 0 3 3,:1 2 1 0
total=:6 5 7 6
Line 674 ⟶ 676:
Example run:
<syntaxhighlight lang=
currently available: 3 1 1 2
running process 0, allocating 2 1 0 1
Line 688 ⟶ 690:
=={{header|Julia}}==
{{trans|Kotlin}}
<syntaxhighlight lang="julia">function queryprompt(query, typ)
print(query, ": ")
entry = uppercase(strip(readline(stdin)))
Line 820 ⟶ 822:
{{trans|C}}
For simplicity, input checking is ignored:
<syntaxhighlight lang="scala">// version 1.1.4-3
fun main(args: Array<String>) {
Line 943 ⟶ 945:
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang=
Module BankerAlgo {
Form 80, 44
Line 1,116 ⟶ 1,118:
=={{header|Nim}}==
{{trans|Kotlin}}
<syntaxhighlight lang=
stdout.write "Enter the number of resources: "
Line 1,222 ⟶ 1,224:
=={{header|Perl}}==
{{trans|Raku}}
<syntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 1,286 ⟶ 1,288:
=={{header|Phix}}==
<!--<syntaxhighlight lang=
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">max_res</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">},</span>
Line 1,364 ⟶ 1,366:
=={{header|Python}}==
<syntaxhighlight lang="python">
def main():
resources = int(input("
processes = int(input("
max_resources = [int(i) for i in input("
print("\n--
currently_allocated = [[int(i) for i in input(f"
print("\n---
max_need = [[int(i) for i in input(f"
allocated = [0] * resources
Line 1,380 ⟶ 1,382:
for j in range(resources):
allocated[j] += currently_allocated[i][j]
print(f"\
available = [max_resources[i] - allocated[i] for i in range(resources)]
print(f"
running = [True] * processes
Line 1,397 ⟶ 1,399:
break
if executing:
print(f"
running[i] = False
count -= 1
Line 1,405 ⟶ 1,407:
break
if not safe:
print("
break
print(f"
Line 1,416 ⟶ 1,418:
{{out}}
<pre>
--
---
process 1 running
The process is in a safe state.
process 2 running
The process is in a safe state.
process 3 running
The process is in a safe state.
</pre>
=={{header|Racket}}==
<syntaxhighlight lang="racket">#lang racket/base
(require racket/block racket/pretty racket/port racket/vector)
Line 1,583 ⟶ 1,585:
Based on the Python3 solution by Shubham Singh found
[https://www.geeksforgeeks.org/program-bankers-algorithm-set-1-safety-algorithm/ here]
<syntaxhighlight lang="raku"
my @maxm = <3 3 2 2>, <1 2 3 4>, <1 3 5 0>; # Maximum resources that can be allocated to processes
my @allot = <1 2 2 1>, <1 0 3 3>, <1 2 1 0>; # Resources allocated to processes
Line 1,631 ⟶ 1,633:
Adapted from the C language version. It crashes for invalid input.
<syntaxhighlight lang="rust">
fn read_numbers<T>() -> Vec<T>
where T: std::str::FromStr {
Line 1,799 ⟶ 1,801:
The process is in safe state.
The available vector is: 8 5 9 7
</pre>
=={{header|Scala}}==
{{trans|Python}}
<syntaxhighlight lang="Scala">
import scala.io.StdIn.readLine
object BankersAlgorithm {
def main(args: Array[String]): Unit = {
println("Number of resources: ")
val resources = readLine().toInt
println("Number of processes: ")
val processes = readLine().toInt
println("Maximum resources: ")
val maxResources = readLine().split(" ").map(_.toInt)
println("\n-- resources allocated for each process --")
val currentlyAllocated = Array.ofDim[Int](processes, resources)
for (i <- 0 until processes) {
println(s"process ${i + 1}: ")
currentlyAllocated(i) = readLine().split(" ").map(_.toInt)
}
println("\n--- maximum resources for each process ---")
val maxNeed = Array.ofDim[Int](processes, resources)
for (i <- 0 until processes) {
println(s"process ${i + 1}: ")
maxNeed(i) = readLine().split(" ").map(_.toInt)
}
val allocated = Array.fill(resources)(0)
for (i <- 0 until processes) {
for (j <- 0 until resources) {
allocated(j) += currentlyAllocated(i)(j)
}
}
println(s"\nTotal resources allocated: ${allocated.mkString(", ")}")
val available = maxResources.zip(allocated).map { case (max, alloc) => max - alloc }
println(s"Total resources available: ${available.mkString(", ")}\n")
var running = Array.fill(processes)(true)
var count = processes
while (count != 0) {
var safe = false
for (i <- 0 until processes if running(i)) {
var executing = true
for (j <- 0 until resources) {
if (maxNeed(i)(j) - currentlyAllocated(i)(j) > available(j)) {
executing = false
}
}
if (executing) {
println(s"process ${i + 1} is running")
running(i) = false
count -= 1
safe = true
for (j <- 0 until resources) {
available(j) += currentlyAllocated(i)(j)
}
}
}
if (!safe) {
println("The processes are in an unsafe state.")
return
}
println(s"The processes are in a safe state.\nAvailable resources: ${available.mkString(", ")}\n")
}
}
}
</syntaxhighlight>
'''input'''
<pre>
4
3
6 5 7 6
1 2 2 1
1 0 3 3
1 2 1 0
3 3 2 2
1 2 3 4
1 3 5 0
</pre>
{{out}}
<pre>
Number of resources: 4
Number of processes: 3
Maximum resources: 6 5 7 6
-- resources allocated for each process --
process 1: 1 2 2 1
process 2: 1 0 3 3
process 3: 1 2 1 0
--- maximum resources for each process ---
process 1: 3 3 2 2
process 2: 1 2 3 4
process 3: 1 3 5 0
Total resources allocated: 3, 4, 6, 4
Total resources available: 3, 1, 1, 2
process 1 is running
process 2 is running
process 3 is running
The processes are in a safe state.
Available resources: 6, 5, 7, 6
</pre>
=={{header|Swift}}==
<syntaxhighlight lang="swift">import Foundation
print("Enter the number of resources: ", terminator: "")
Line 1,948 ⟶ 2,066:
=={{header|Wren}}==
{{trans|Kotlin}}
<syntaxhighlight lang=
System.write("Enter the number of resources: ")
Line 2,074 ⟶ 2,192:
Available Vector: 8 5 9 7
</pre>
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
{{todo|Python|Translate all Spanish texts to English}}
<syntaxhighlight lang="yabasic">
clear screen
input "Ingrese la cantidad de recursos: " r
|