Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,4 @@
---
category:
- Puzzles
from: http://rosettacode.org/wiki/Department_numbers

View file

@ -0,0 +1,24 @@
There is a highly organized city that has decided to assign a number to each of their departments:
::*   police department
::*   sanitation department
::*   fire department
Each department can have a number between   '''1'''   and   '''7'''   (inclusive).
The three department numbers are to be unique (different from each other) and must add up to   '''12'''.
The Chief of the Police doesn't like odd numbers and wants to have an even number for his department.
;Task:
Write a computer program which outputs <u>all</u> valid combinations.
Possible output &nbsp; (for the 1<sup>st</sup> and 14<sup>th</sup> solutions):
--police-- --sanitation-- --fire--
2 3 7
6 5 1
<br><br>

View file

@ -0,0 +1,8 @@
print(Police Sanitation Fire)
print(----------------------------------)
L(police) (2..6).step(2)
L(sanitation) 1..7
L(fire) 1..7
I police!=sanitation & sanitation!=fire & fire!=police & police+fire+sanitation==12
print(police"\t\t"sanitation"\t\t"fire)

View file

@ -0,0 +1,49 @@
org 100h
lxi h,obuf ; HL = output buffer
mvi b,2 ; B = police
pol: mvi c,1 ; C = sanitation
san: mvi d,1 ; D = fire
fire: mov a,b ; Fire equal to police?
cmp d
jz next ; If so, invalid combination
mov a,c ; Fire equal to sanitation?
cmp d
jz next ; If so, invalid combination
mov a,b ; Total equal to 12?
add c
add d
cpi 12
jnz next ; If not, invalid combination
mov a,b ; Combination is valid, add to output
call num
mov a,c
call num
mov a,d
call num
mvi m,13 ; Add a newline to the output
inx h
mvi m,10
inx h
next: mvi a,7 ; Load 7 to compare to
inr d ; Next fire number
cmp d ; Reached the end?
jnc fire ; If not, next fire number
inr c ; Otherwise, next sanitation number
cmp c ; Reached the end?
jnc san ; If not, next sanitation number
inr b ; Increment police number twice
inr b ; (twice, because it must be even)
cmp b ; Reached the end?
jnc pol ; If not, next police number
mvi m,'$' ; If so, we're done - add CP/M string terminator
mvi c,9 ; Print the output string
lxi d,ohdr
jmp 5
num: adi '0' ; Add number A and space to the output
mov m,a
inx h
mvi m,' '
inx h
ret
ohdr: db 'P S F',13,10
obuf: equ $ ; Output buffer goes after program

View file

@ -0,0 +1,50 @@
cpu 8086
bits 16
org 100h
section .text
mov di,obuf ; Output buffer
mov bl,2 ; BL = police
pol: mov cl,1 ; CL = sanitation
san: mov dl,1 ; DL = fire
fire: cmp bl,cl ; Police equal to sanitation?
je next ; Invalid combination
cmp bl,dl ; Police equal to fire?
je next ; Invalid combination
cmp cl,dl ; Sanitation equal to fire?
je next ; Invalid combination
mov al,bl ; Total equal to 12?
add al,cl
add al,dl
cmp al,12
jne next ; If not, invalid combination
mov al,bl ; Combination is valid, write the three numbers
call num
mov al,cl
call num
mov al,dl
call num
mov ax,0A0Dh ; And a newline
stosw
next: mov al,7 ; Load 7 to compare to
inc dx ; Increment fire number
cmp al,dl ; If 7 or less,
jae fire ; next fire number.
inc cx ; Otherwise, ncrement sanitation number
cmp al,cl ; If 7 or less,
jae san ; next sanitation number
inc bx ; Increment police number twice
inc bx ; (it must be even)
cmp al,bl ; If 7 or less,
jae pol ; next police number.
mov byte [di],'$' ; At the end, terminate the string
mov dx,ohdr ; Tell MS-DOS to print it
mov ah,9
int 21h
ret
num: mov ah,' ' ; Space
add al,'0' ; Add number to output
stosw ; Store number and space
ret
section .data
ohdr: db 'P S F',13,10 ; Header
obuf: equ $ ; Place to write output

View file

@ -0,0 +1,26 @@
BEGIN
# show possible department number allocations for police, sanitation and fire departments #
# the police department number must be even, all department numbers in the range 1 .. 7 #
# the sum of the department numbers must be 12 #
INT max department number = 7;
INT department sum = 12;
print( ( "police sanitation fire", newline ) );
FOR police FROM 2 BY 2 TO max department number DO
FOR sanitation TO max department number DO
IF sanitation /= police THEN
INT fire = ( department sum - police ) - sanitation;
IF fire > 0 AND fire <= max department number
AND fire /= sanitation
AND fire /= police
THEN
print( ( whole( police, -6 )
, whole( sanitation, -11 )
, whole( fire, -5 )
, newline
)
)
FI
FI
OD
OD
END

View file

@ -0,0 +1,20 @@
begin
% show possible department number allocations for police, sanitation and fire departments %
% the police department number must be even, all department numbers in the range 1 .. 7 %
% the sum of the department numbers must be 12 %
integer MAX_DEPARTMENT_NUMBER, DEPARTMENT_SUM;
MAX_DEPARTMENT_NUMBER := 7;
DEPARTMENT_SUM := 12;
write( "police sanitation fire" );
for police := 2 step 2 until MAX_DEPARTMENT_NUMBER do begin
for sanitation := 1 until MAX_DEPARTMENT_NUMBER do begin
IF sanitation not = police then begin
integer fire;
fire := ( DEPARTMENT_SUM - police ) - sanitation;
if fire > 0 and fire <= MAX_DEPARTMENT_NUMBER and fire not = sanitation and fire not = police then begin
write( s_w := 0, i_w := 6, police, i_w := 11, sanitation, i_w := 5, fire )
end if_valid_combination
end if_sanitation_ne_police
end for_sanitation
end for_police
end.

View file

@ -0,0 +1 @@
'PSF'(()(()¨(0=2|1[2])12=+/)),3/7

View file

@ -0,0 +1,20 @@
# syntax: GAWK -f DEPARTMENT_NUMBERS.AWK
BEGIN {
print(" # FD PD SD")
for (fire=1; fire<=7; fire++) {
for (police=1; police<=7; police++) {
for (sanitation=1; sanitation<=7; sanitation++) {
if (rules() ~ /^1+$/) {
printf("%2d %2d %2d %2d\n",++count,fire,police,sanitation)
}
}
}
}
exit(0)
}
function rules( stmt1,stmt2,stmt3) {
stmt1 = fire != police && fire != sanitation && police != sanitation
stmt2 = fire + police + sanitation == 12
stmt3 = police % 2 == 0
return(stmt1 stmt2 stmt3)
}

View file

@ -0,0 +1,17 @@
PROC Main()
BYTE p,s,f
PrintE("P S F")
FOR p=2 TO 6 STEP 2
DO
FOR s=1 TO 7
DO
FOR f=1 TO 7
DO
IF p#s AND p#f AND s#f AND p+s+f=12 THEN
PrintF("%B %B %B%E",p,s,f)
FI
OD
OD
OD
RETURN

View file

@ -0,0 +1,22 @@
with Ada.Text_IO;
procedure Department_Numbers is
use Ada.Text_IO;
begin
Put_Line (" P S F");
for Police in 2 .. 6 loop
for Sanitation in 1 .. 7 loop
for Fire in 1 .. 7 loop
if
Police mod 2 = 0 and
Police + Sanitation + Fire = 12 and
Sanitation /= Police and
Sanitation /= Fire and
Police /= Fire
then
Put_Line (Police'Image & Sanitation'Image & Fire'Image);
end if;
end loop;
end loop;
end loop;
end Department_Numbers;

View file

@ -0,0 +1,14 @@
integer p, s, f;
p = 0;
while ((p += 2) <= 7) {
s = 0;
while ((s += 1) <= 7) {
f = 0;
while ((f += 1) <= 7) {
if (p + s + f == 12 && p != s && p != f && s != f) {
o_form(" ~ ~ ~\n", p, s, f);
}
}
}
}

View file

@ -0,0 +1,65 @@
on run
script
on |λ|(x)
script
on |λ|(y)
script
on |λ|(z)
if y z and 1 z and z 7 then
{{x, y, z} as string}
else
{}
end if
end |λ|
end script
concatMap(result, {12 - (x + y)}) --Z
end |λ|
end script
concatMap(result, {1, 2, 3, 4, 5, 6, 7}) --Y
end |λ|
end script
unlines(concatMap(result, {2, 4, 6})) --X
end run
-- GENERIC FUNCTIONS ----------------------------------------------------------
-- concatMap :: (a -> [b]) -> [a] -> [b]
on concatMap(f, xs)
set lst to {}
set lng to length of xs
tell mReturn(f)
repeat with i from 1 to lng
set lst to (lst & |λ|(contents of item i of xs, i, xs))
end repeat
end tell
return lst
end concatMap
-- intercalate :: Text -> [Text] -> Text
on intercalate(strText, lstText)
set {dlm, my text item delimiters} to {my text item delimiters, strText}
set strJoined to lstText as text
set my text item delimiters to dlm
return strJoined
end intercalate
-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: Handler -> Script
on mReturn(f)
if class of f is script then
f
else
script
property |λ| : f
end script
end if
end mReturn
-- unlines :: [String] -> String
on unlines(xs)
intercalate(linefeed, xs)
end unlines

View file

@ -0,0 +1,174 @@
-- NUMBERING CONSTRAINTS ------------------------------------------------------
-- options :: Int -> Int -> Int -> [(Int, Int, Int)]
on options(lo, hi, total)
set ds to enumFromTo(lo, hi)
script Xeven
on |λ|(x)
script Ydistinct
on |λ|(y)
script ZinRange
on |λ|(z)
if y z and lo z and z hi then
{{x, y, z}}
else
{}
end if
end |λ|
end script
concatMap(ZinRange, {total - (x + y)}) -- Z IS IN RANGE
end |λ|
end script
script notX
on |λ|(d)
d x
end |λ|
end script
concatMap(Ydistinct, filter(notX, ds)) -- Y IS NOT X
end |λ|
end script
concatMap(Xeven, filter(my even, ds)) -- X IS EVEN
end options
-- TEST -----------------------------------------------------------------------
on run
set xs to options(1, 7, 12)
intercalate("\n\n", ¬
{"(Police, Sanitation, Fire)", ¬
unlines(map(show, xs)), ¬
"Number of options: " & |length|(xs)})
end run
-- GENERIC FUNCTIONS ----------------------------------------------------------
-- concatMap :: (a -> [b]) -> [a] -> [b]
on concatMap(f, xs)
set lst to {}
set lng to length of xs
tell mReturn(f)
repeat with i from 1 to lng
set lst to (lst & |λ|(contents of item i of xs, i, xs))
end repeat
end tell
return lst
end concatMap
-- enumFromTo :: Int -> Int -> [Int]
on enumFromTo(m, n)
if n < m then
set d to -1
else
set d to 1
end if
set lst to {}
repeat with i from m to n by d
set end of lst to i
end repeat
return lst
end enumFromTo
-- even :: Int -> Bool
on even(x)
x mod 2 = 0
end even
-- filter :: (a -> Bool) -> [a] -> [a]
on filter(f, xs)
tell mReturn(f)
set lst to {}
set lng to length of xs
repeat with i from 1 to lng
set v to item i of xs
if |λ|(v, i, xs) then set end of lst to v
end repeat
return lst
end tell
end filter
-- intercalate :: Text -> [Text] -> Text
on intercalate(strText, lstText)
set {dlm, my text item delimiters} to {my text item delimiters, strText}
set strJoined to lstText as text
set my text item delimiters to dlm
return strJoined
end intercalate
-- length :: [a] -> Int
on |length|(xs)
length of xs
end |length|
-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
tell mReturn(f)
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to |λ|(item i of xs, i, xs)
end repeat
return lst
end tell
end map
-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: Handler -> Script
on mReturn(f)
if class of f is script then
f
else
script
property |λ| : f
end script
end if
end mReturn
-- show :: a -> String
on show(e)
set c to class of e
if c = list then
script serialized
on |λ|(v)
show(v)
end |λ|
end script
"[" & intercalate(", ", map(serialized, e)) & "]"
else if c = record then
script showField
on |λ|(kv)
set {k, ev} to kv
"\"" & k & "\":" & show(ev)
end |λ|
end script
"{" & intercalate(", ", ¬
map(showField, zip(allKeys(e), allValues(e)))) & "}"
else if c = date then
"\"" & iso8601Z(e) & "\""
else if c = text then
"\"" & e & "\""
else if (c = integer or c = real) then
e as text
else if c = class then
"null"
else
try
e as text
on error
("«" & c as text) & "»"
end try
end if
end show
-- unlines :: [String] -> String
on unlines(xs)
intercalate(linefeed, xs)
end unlines

View file

@ -0,0 +1,11 @@
loop 1..7 'x [
loop 1..7 'y [
loop 1..7 'z [
if all? @[
even? x
12 = sum @[x y z]
3 = size unique @[x y z]
] -> print [x y z]
]
]
]

View file

@ -0,0 +1,13 @@
write("--police-- --sanitation-- --fire--");
for(int police = 2; police < 6; police += 2) {
for(int sanitation = 1; sanitation < 7; ++sanitation) {
for(int fire = 1; fire < 7; ++fire) {
if(police != sanitation && sanitation != fire && fire != police && police+fire+sanitation == 12){
write(" ", police, suffix=none);
write(" ", sanitation, suffix=none);
write(" ", fire);
}
}
}
}

View file

@ -0,0 +1,16 @@
perm(elements, n, opt:="", Delim:="", str:="", res:="", j:=0, dup:="") {
res := IsObject(res) ? res : [], dup := IsObject(dup) ? dup : []
if (n > j)
Loop, parse, elements, % Delim
res := !(InStr(str, A_LoopField) && !(InStr(opt, "rep"))) ? perm(elements, n, opt, Delim, trim(str Delim A_LoopField, Delim), res, j+1, dup) : res
else if !(dup[x := perm_sort(str, Delim)] && (InStr(opt, "comb")))
dup[x] := 1, res.Insert(str)
return res, j++
}
perm_sort(str, Delim){
Loop, Parse, str, % Delim
res .= A_LoopField "`n"
Sort, res, D`n
return StrReplace(res, "`n", Delim)
}

View file

@ -0,0 +1,7 @@
elements := "1234567", n := 3
for k, v in perm(elements, n)
if (SubStr(v, 1, 1) + SubStr(v, 2, 1) + SubStr(v, 3, 1) = 12) && (SubStr(v, 1, 1) / 2 = Floor(SubStr(v, 1, 1)/2))
res4 .= v "`n"
MsgBox, 262144, , % res4
return

View file

@ -0,0 +1,12 @@
print "--police-- --sanitation-- --fire--"
for police = 2 to 7 step 2
for fire = 1 to 7
if fire = police then continue for
sanitation = 12 - police - fire
if sanitation = fire or sanitation = police then continue for
if sanitation >= 1 and sanitation <= 7 then
print rjust(police, 6); rjust(fire, 13); rjust(sanitation, 12)
end if
next fire
next police

View file

@ -0,0 +1,13 @@
REM >deptnums
max_dept_num% = 7
dept_sum% = 12
PRINT "police sanitation fire"
FOR police% = 2 TO max_dept_num% STEP 2
FOR sanitation% = 1 TO max_dept_num%
IF sanitation% <> police% THEN
fire% = (dept_sum% - police%) - sanitation%
IF fire% > 0 AND fire% <= max_dept_num% AND fire% <> sanitation% AND fire% <> police% THEN PRINT " "; police%; " "; sanitation%; " "; fire%
ENDIF
NEXT
NEXT
END

View file

@ -0,0 +1,8 @@
get "libhdr"
let start() be
for p=2 to 6 by 2
for s=1 to 7
for f=1 to 7
if p~=s & s~=f & p~=f & p+s+f=12 then
writef("%N %N %N*N", p, s, f)

View file

@ -0,0 +1,19 @@
#include <iostream>
#include <iomanip>
int main( int argc, char* argv[] ) {
int sol = 1;
std::cout << "\t\tFIRE\t\tPOLICE\t\tSANITATION\n";
for( int f = 1; f < 8; f++ ) {
for( int p = 1; p < 8; p++ ) {
for( int s = 1; s < 8; s++ ) {
if( f != p && f != s && p != s && !( p & 1 ) && ( f + s + p == 12 ) ) {
std::cout << "SOLUTION #" << std::setw( 2 ) << sol++ << std::setw( 2 )
<< ":\t" << std::setw( 2 ) << f << "\t\t " << std::setw( 3 ) << p
<< "\t\t" << std::setw( 6 ) << s << "\n";
}
}
}
}
return 0;
}

View file

@ -0,0 +1,16 @@
using System;
public class Program
{
public static void Main() {
for (int p = 2; p <= 7; p+=2) {
for (int s = 1; s <= 7; s++) {
int f = 12 - p - s;
if (s >= f) break;
if (f > 7) continue;
if (s == p || f == p) continue; //not even necessary
Console.WriteLine($"Police:{p}, Sanitation:{s}, Fire:{f}");
Console.WriteLine($"Police:{p}, Sanitation:{f}, Fire:{s}");
}
}
}
}

View file

@ -0,0 +1,21 @@
#include<stdio.h>
int main()
{
int police,sanitation,fire;
printf("Police Sanitation Fire\n");
printf("----------------------------------");
for(police=2;police<=6;police+=2){
for(sanitation=1;sanitation<=7;sanitation++){
for(fire=1;fire<=7;fire++){
if(police!=sanitation && sanitation!=fire && fire!=police && police+fire+sanitation==12){
printf("\n%d\t\t%d\t\t%d",police,sanitation,fire);
}
}
}
}
return 0;
}

View file

@ -0,0 +1,20 @@
start_up = proc ()
po: stream := stream$primary_output()
stream$putl(po, "P S F\n- - -")
for police: int in int$from_to_by(2,7,2) do
for sanitation: int in int$from_to(1,7) do
for fire: int in int$from_to(1,7) do
if police~=sanitation
& sanitation~=fire
& police~=fire
& police+sanitation+fire = 12
then
stream$putl(po, int$unparse(police) || " " ||
int$unparse(sanitation) || " " ||
int$unparse(fire))
end
end
end
end
end start_up

View file

@ -0,0 +1,37 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. DEPARTMENT-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 BANNER PIC X(24) VALUE "POLICE SANITATION FIRE".
01 COMBINATION.
03 FILLER PIC X(5) VALUE SPACES.
03 POLICE PIC 9.
03 FILLER PIC X(11) VALUE SPACES.
03 SANITATION PIC 9.
03 FILLER PIC X(5) VALUE SPACES.
03 FIRE PIC 9.
01 TOTAL PIC 99.
PROCEDURE DIVISION.
BEGIN.
DISPLAY BANNER.
PERFORM POLICE-LOOP VARYING POLICE FROM 2 BY 2
UNTIL POLICE IS GREATER THAN 6.
STOP RUN.
POLICE-LOOP.
PERFORM SANITATION-LOOP VARYING SANITATION FROM 1 BY 1
UNTIL SANITATION IS GREATER THAN 7.
SANITATION-LOOP.
PERFORM FIRE-LOOP VARYING FIRE FROM 1 BY 1
UNTIL FIRE IS GREATER THAN 7.
FIRE-LOOP.
ADD POLICE, SANITATION, FIRE GIVING TOTAL.
IF POLICE IS NOT EQUAL TO SANITATION
AND POLICE IS NOT EQUAL TO FIRE
AND SANITATION IS NOT EQUAL TO FIRE
AND TOTAL IS EQUAL TO 12,
DISPLAY COMBINATION.

View file

@ -0,0 +1,10 @@
10 CLS
20 PRINT "--police-- --sanitation-- --fire--"
30 FOR police = 2 TO 7 STEP 2
40 FOR fire = 1 TO 7
50 sanitation = 12-police-fire
60 IF sanitation >= 1 AND sanitation <= 7 THEN
70 PRINT TAB (5)police TAB (18)fire TAB (30)sanitation
80 endif
90 NEXT fire
100 NEXT police

View file

@ -0,0 +1,8 @@
(let [n (range 1 8)]
(for [police n
sanitation n
fire n
:when (distinct? police sanitation fire)
:when (even? police)
:when (= 12 (+ police sanitation fire))]
(println police sanitation fire)))

View file

@ -0,0 +1,30 @@
include "cowgol.coh";
typedef Dpt is int(1, 7);
# print combination if valid
sub print_comb(p: Dpt, s: Dpt, f: Dpt) is
var out: uint8[] := {'*',' ','*',' ','*','\n',0};
out[0] := p + '0';
out[2] := s + '0';
out[4] := f + '0';
if p != s and p != f and f != s and p+s+f == 12 then
print(&out[0]);
end if;
end sub;
print("P S F\n"); # header
var pol: Dpt := 2;
while pol <= 7 loop
var san: Dpt := 1;
while san <= 7 loop
var fire: Dpt := 1;
while fire <= 7 loop
print_comb(pol, san, fire);
fire := fire + 1;
end loop;
san := san + 1;
end loop;
pol := pol + 2;
end loop;

View file

@ -0,0 +1,23 @@
print "P S F"
for p = 2 to 7 step 2
for s = 1 to 7
if s <> p then
let f = (12 - p) - s
if f > 0 and f <= 7 and f <> s and f <> p then
print p, " ", s, " ", f
endif
endif
next s
next p
end

View file

@ -0,0 +1,15 @@
import std.stdio, std.range;
void main() {
int sol = 1;
writeln("\t\tFIRE\t\tPOLICE\t\tSANITATION");
foreach( f; iota(1,8) ) {
foreach( p; iota(1,8) ) {
foreach( s; iota(1,8) ) {
if( f != p && f != s && p != s && !( p & 1 ) && ( f + s + p == 12 ) ) {
writefln("SOLUTION #%2d:\t%2d\t\t%3d\t\t%6d", sol++, f, p, s);
}
}
}
}
}

View file

@ -0,0 +1,36 @@
program Department_numbers;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
i, j, k, count: Integer;
begin
writeln('Police Sanitation Fire');
writeln('------ ---------- ----');
count := 0;
i := 2;
while i < 7 do
begin
for j := 1 to 7 do
begin
if j = i then
Continue;
for k := 1 to 7 do
begin
if (k = i) or (k = j) then
Continue;
if i + j + k <> 12 then
Continue;
writeln(format(' %d %d %d', [i, j, k]));
inc(count);
end;
end;
inc(i, 2);
end;
writeln(#10, count, ' valid combinations');
readln;
end.

View file

@ -0,0 +1,17 @@
proc main() void:
byte police, sanitation, fire;
writeln("Police Sanitation Fire");
for police from 2 by 2 upto 7 do
for sanitation from 1 upto 7 do
for fire from 1 upto 7 do
if police /= sanitation
and police /= fire
and sanitation /= fire
and police + sanitation + fire = 12 then
writeln(police:6, " ", sanitation:10, " ", fire:4)
fi
od
od
od
corp

View file

@ -0,0 +1,12 @@
numfmt 0 3
for pol = 2 step 2 to 6
for san = 1 to 7
for fire = 1 to 7
if pol <> san and san <> fire and fire <> pol
if pol + fire + san = 12
print pol & san & fire
.
.
.
.
.

View file

@ -0,0 +1,8 @@
IO.puts("P - F - S")
for p <- [2,4,6],
f <- 1..7,
s <- 1..7,
p != f and p != s and f != s and p + f + s == 12 do
"#{p} - #{f} - #{s}"
end
|> Enum.each(&IO.puts/1)

View file

@ -0,0 +1,15 @@
P - F - S
2 - 3 - 7
2 - 4 - 6
2 - 6 - 4
2 - 7 - 3
4 - 1 - 7
4 - 2 - 6
4 - 3 - 5
4 - 5 - 3
4 - 6 - 2
4 - 7 - 1
6 - 1 - 5
6 - 2 - 4
6 - 4 - 2
6 - 5 - 1

View file

@ -0,0 +1,25 @@
departmentNumbers
=validRows(
LAMBDA(ab,
LET(
x, INDEX(ab, 0, 1),
y, INDEX(ab, 0, 2),
z, 12 - (x + y),
IF(y <> z,
IF(1 <= z,
IF(7 >= z,
CHOOSE({1, 2, 3}, x, y, z),
NA()
),
NA()
),
NA()
)
)
)(
cartesianProduct({2;4;6})(
SEQUENCE(7, 1, 1, 1)
)
)
)

View file

@ -0,0 +1,43 @@
cartesianProduct
=LAMBDA(xs,
LAMBDA(ys,
LET(
ny, ROWS(ys),
ixs, SEQUENCE(ROWS(xs) * ny, 2, 1, 1),
IF(0 <> MOD(ixs, 2),
INDEX(xs,
1 + QUOTIENT(ixs, ny * 2)
),
LET(
r, MOD(QUOTIENT(ixs, 2), ny),
INDEX(ys, IF(0 = r, ny, r))
)
)
)
)
)
validRows
=LAMBDA(xs,
LET(
ixs, SEQUENCE(ROWS(xs), 1, 1, 1),
valids, FILTER(
ixs,
LAMBDA(i,
NOT(ISNA(INDEX(xs, i)))
)(ixs)
),
INDEX(
xs,
valids,
SEQUENCE(
1,
COLUMNS(xs)
)
)
)
)

View file

@ -0,0 +1,4 @@
// A function to generate department numbers. Nigel Galloway: May 2nd., 2018
type dNum = {Police:int; Fire:int; Sanitation:int}
let fN n=n.Police%2=0&&n.Police+n.Fire+n.Sanitation=12&&n.Police<>n.Fire&&n.Police<>n.Sanitation&&n.Fire<>n.Sanitation
List.init (7*7*7) (fun n->{Police=n%7+1;Fire=(n/7)%7+1;Sanitation=(n/49)+1})|>List.filter fN|>List.iter(printfn "%A")

View file

@ -0,0 +1,9 @@
01.10 F P=2,2,6;F S=1,7;F G=1,7;D 2
01.20 Q
02.10 I (P-S)2.2,2.6,2.2
02.20 I (P-G)2.3,2.6,2.3
02.30 I (S-G)2.4,2.6,2.4
02.40 I (P+S+G-12)2.6,2.5,2.6
02.50 T %1,P,S,G,!
02.60 R

View file

@ -0,0 +1,9 @@
USING: formatting io kernel math math.combinatorics math.ranges
sequences sets ;
IN: rosetta-code.department-numbers
7 [1,b] 3 <k-permutations>
[ [ first even? ] [ sum 12 = ] bi and ] filter
"{ Police, Sanitation, Fire }" print nl
[ "%[%d, %]\n" printf ] each

View file

@ -0,0 +1,7 @@
!!'Police Sanitation Fire';
!!'------|----------|----';
for p = 2 to 6 by 2 do
for s = 1 to 7 do
for f = 1 to 7 do
if p+f+s=12 and f<>p and f<>s and s<>p then !!(' ',p,' ',s,' ',f);
fi od od od;

View file

@ -0,0 +1,23 @@
\ if department numbers are valid, print them on a single line
: fire ( pol san fir -- )
2dup = if 2drop drop exit then
2 pick over = if 2drop drop exit then
rot . swap . . cr ;
\ tries to assign numbers with given policeno and sanitationno
\ and fire = 12 - policeno - sanitationno
: sanitation ( pol san -- )
2dup = if 2drop exit then \ no repeated numbers
12 over - 2 pick - \ calculate fireno
dup 1 < if 2drop drop exit then \ cannot be less than 1
dup 7 > if 2drop drop exit then \ cannot be more than 7
fire ;
\ tries to assign numbers with given policeno
\ and sanitation = 1, 2, 3, ..., or 7
: police ( pol -- )
8 1 do dup i sanitation loop drop ;
\ tries to assign numbers with police = 2, 4, or 6
: departments cr \ leave input line
8 2 do i police 2 +loop ;

View file

@ -0,0 +1,11 @@
INTEGER P,S,F !Department codes for Police, Sanitation, and Fire. Values 1 to 7 only.
1 PP:DO P = 2,7,2 !The police demand an even number. They're special and use violence.
2 SS:DO S = 1,7 !The sanitation department accepts any value.
3 IF (P.EQ.S) CYCLE SS !But it must differ from the others.
4 F = 12 - (P + S) !The fire department accepts any number, but the sum must be twelve.
5 IF (F.LE.0 .OR. F.GT.7) CYCLE SS !Ensure that the only option is within range.
6 IF ((F - S)*(F - P)) 7,8,7 !And F is to differ from S and from P
7 WRITE (6,"(3I2)") P,S,F !If we get here, we have a possible set.
8 END DO SS !Next S
9 END DO PP !Next P.
END !Well, that was straightforward.

View file

@ -0,0 +1,24 @@
' version 15-08-2017
' compile with: fbc -s console
Dim As Integer fire, police, sanitation
Print "police fire sanitation"
Print "----------------------"
For police = 2 To 7 Step 2
For fire = 1 To 7
If fire = police Then Continue For
sanitation = 12 - police - fire
If sanitation = fire Or sanitation = police Then Continue For
If sanitation >= 1 And sanitation <= 7 Then
Print Using " # # # "; police; fire; sanitation
End If
Next
Next
' empty keyboard buffer
While Inkey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End

View file

@ -0,0 +1,25 @@
include "NSLog.incl"
void local fn DepartmentNumbers
long police, sanitation, fire
printf @"Police Sanitation Fire"
printf @"-------------------------------"
for police = 2 to 7 step 2
for fire = 1 to 7
if ( fire = police ) then continue
sanitation = 12 - police - fire
if ( sanitation == fire ) or ( sanitation == police ) then continue
if ( sanitation >= 1 ) and ( sanitation <= 7 )
printf @"%4d%12d%13d", police, fire, sanitation
end if
next
next
end fn
window 1
fn DepartmentNumbers
HandleEvents

View file

@ -0,0 +1,11 @@
10 PRINT "Police Sanitation Fire"
20 PRINT "------|----------|----"
30 FOR P = 2 TO 7 STEP 2
40 FOR S = 1 TO 7
50 IF S = P THEN GOTO 100
60 FOR F = 1 TO 7
70 IF S = F OR F = P THEN GOTO 90
80 IF P+S+F = 12 THEN PRINT USING " # # #";P;F;S
90 NEXT F
100 NEXT S
110 NEXT P

View file

@ -0,0 +1,24 @@
Public Sub Main()
Dim siC0, siC1, siC2 As Short
Dim sOut As New String[]
Dim sTemp As String
For siC0 = 2 To 6 Step 2
For siC1 = 1 To 7
For siC2 = 1 To 7
If sic0 + siC1 + siC2 = 12 Then
If siC0 <> siC1 And siC1 <> siC2 And siC0 <> siC2 Then sOut.Add(Str(siC0) & Str(siC1) & Str(siC2))
End If
Next
Next
Next
Print "\tPolice\tFire\tSanitation"
siC0 = 0
For Each sTemp In sOut
Inc sic0
Print "[" & Format(Str(siC0), "00") & "]\t" & Left(sTemp, 1) & "\t" & Mid(sTemp, 2, 1) & "\t" & Right(sTemp, 1)
Next
End

View file

@ -0,0 +1,21 @@
package main
import "fmt"
func main() {
fmt.Println("Police Sanitation Fire")
fmt.Println("------ ---------- ----")
count := 0
for i := 2; i < 7; i += 2 {
for j := 1; j < 8; j++ {
if j == i { continue }
for k := 1; k < 8; k++ {
if k == i || k == j { continue }
if i + j + k != 12 { continue }
fmt.Printf(" %d %d %d\n", i, j, k)
count++
}
}
}
fmt.Printf("\n%d valid combinations\n", count)
}

View file

@ -0,0 +1,20 @@
class DepartmentNumbers {
static void main(String[] args) {
println("Police Sanitation Fire")
println("------ ---------- ----")
int count = 0
for (int i = 2; i <= 6; i += 2) {
for (int j = 1; j <= 7; ++j) {
if (j == i) continue
for (int k = 1; k <= 7; ++k) {
if (k == i || k == j) continue
if (i + j + k != 12) continue
println(" $i $j $k")
count++
}
}
}
println()
println("$count valid combinations")
}
}

View file

@ -0,0 +1,12 @@
main :: IO ()
main =
mapM_ print $
[2, 4, 6] >>=
\x ->
[1 .. 7] >>=
\y ->
[12 - (x + y)] >>=
\z ->
case y /= z && 1 <= z && z <= 7 of
True -> [(x, y, z)]
_ -> []

View file

@ -0,0 +1,9 @@
main :: IO ()
main =
mapM_
print
[ (x, y, z)
| x <- [2, 4, 6]
, y <- [1 .. 7]
, z <- [12 - (x + y)]
, y /= z && 1 <= z && z <= 7 ]

View file

@ -0,0 +1,9 @@
main :: IO ()
main =
mapM_ print $
do x <- [2, 4, 6]
y <- [1 .. 7]
z <- [12 - (x + y)]
if y /= z && 1 <= z && z <= 7
then [(x, y, z)]
else []

View file

@ -0,0 +1,14 @@
import Data.List (nub)
main :: IO ()
main =
let xs = [1 .. 7]
in mapM_ print $
xs >>=
\x ->
xs >>=
\y ->
xs >>=
\z ->
[ (x, y, z)
| even x && 3 == length (nub [x, y, z]) && 12 == sum [x, y, z] ]

View file

@ -0,0 +1,28 @@
-------------------- DEPARTMENT NUMBERS ------------------
options :: Int -> Int -> Int -> [(Int, Int, Int)]
options lo hi total =
( \ds ->
filter even ds
>>= \x ->
filter (/= x) ds
>>= \y ->
[total - (x + y)]
>>= \z ->
[ (x, y, z)
| y /= z && lo <= z && z <= hi
]
)
[lo .. hi]
--------------------------- TEST -------------------------
main :: IO ()
main =
let xs = options 1 7 12
in putStrLn "(Police, Sanitation, Fire)\n"
>> mapM_ print xs
>> mapM_
putStrLn
[ "\nNumber of options: ",
show (length xs)
]

View file

@ -0,0 +1,8 @@
options :: Int -> Int -> Int -> [(Int, Int, Int)]
options lo hi total =
let ds = [lo .. hi]
in [ (x, y, z)
| x <- filter even ds
, y <- filter (/= x) ds
, let z = total - (x + y)
, y /= z && lo <= z && z <= hi ]

View file

@ -0,0 +1,10 @@
import Control.Monad (guard)
options :: Int -> Int -> Int -> [(Int, Int, Int)]
options lo hi total =
let ds = [lo .. hi]
in do x <- filter even ds
y <- filter (/= x) ds
let z = total - (x + y)
guard $ y /= z && lo <= z && z <= hi
return (x, y, z)

View file

@ -0,0 +1,9 @@
100 PRINT "Police","San.","Fire"
110 FOR P=2 TO 7 STEP 2
120 FOR S=1 TO 7
130 IF S<>P THEN
131 LET F=(12-P)-S
140 IF F>0 AND F<=7 AND F<>S AND F<>P THEN PRINT P,S,F
141 END IF
150 NEXT
160 NEXT

View file

@ -0,0 +1,12 @@
require 'stats'
permfrom=: ,/@(perm@[ {"_ 1 comb) NB. get permutations of length x from y possible items
alluniq=: # = #@~. NB. check items are unique
addto12=: 12 = +/ NB. check items add to 12
iseven=: -.@(2&|) NB. check items are even
policeeven=: {.@iseven NB. check first item is even
conditions=: policeeven *. addto12 *. alluniq
Validnums=: >: i.7 NB. valid Department numbers
getDeptNums=: [: (#~ conditions"1) Validnums {~ permfrom

View file

@ -0,0 +1,15 @@
3 getDeptNums 7
4 1 7
4 7 1
6 1 5
6 5 1
2 3 7
2 7 3
2 4 6
2 6 4
4 2 6
4 6 2
6 2 4
6 4 2
4 3 5
4 5 3

View file

@ -0,0 +1,6 @@
(/:"#. 2|]) (#~ 12=+/"1) 1+3 comb 7 [ load'stats'
4 1 7
6 1 5
2 3 7
2 4 6
4 3 5

View file

@ -0,0 +1,24 @@
NB. 3 departments, 1..7 in each
#rule1=. >,{3#<1+i.7
343
NB. total must be 12, numbers must be unique
#rule2=. (#~ ((3=#@~.) * 12=+/)"1) rule1
30
NB. no odd numbers in police department (first department)
#rule3=. (#~ 0=2|{."1) rule2
14
rule3
2 3 7
2 4 6
2 6 4
2 7 3
4 1 7
4 2 6
4 3 5
4 5 3
4 6 2
4 7 1
6 1 5
6 2 4
6 4 2
6 5 1

View file

@ -0,0 +1,19 @@
public class DepartmentNumbers {
public static void main(String[] args) {
System.out.println("Police Sanitation Fire");
System.out.println("------ ---------- ----");
int count = 0;
for (int i = 2; i <= 6; i += 2) {
for (int j = 1; j <= 7; ++j) {
if (j == i) continue;
for (int k = 1; k <= 7; ++k) {
if (k == i || k == j) continue;
if (i + j + k != 12) continue;
System.out.printf(" %d %d %d\n", i, j, k);
count++;
}
}
}
System.out.printf("\n%d valid combinations", count);
}
}

View file

@ -0,0 +1,21 @@
(function () {
'use strict';
// concatMap :: (a -> [b]) -> [a] -> [b]
function concatMap(f, xs) {
return [].concat.apply([], xs.map(f));
};
return '(Police, Sanitation, Fire)\n' +
concatMap(function (x) {
return concatMap(function (y) {
return concatMap(function (z) {
return z !== y && 1 <= z && z <= 7 ? [
[x, y, z]
] : [];
}, [12 - (x + y)]);
}, [1, 2, 3, 4, 5, 6, 7]);
}, [2, 4, 6])
.map(JSON.stringify)
.join('\n');
})();

View file

@ -0,0 +1,79 @@
(function () {
'use strict';
// NUMBERING CONSTRAINTS --------------------------------------------------
// options :: Int -> Int -> Int -> [(Int, Int, Int)]
function options(lo, hi, total) {
var bind = flip(concatMap),
ds = enumFromTo(lo, hi);
return bind(filter(even, ds),
function (x) { // X is even,
return bind(filter(function (d) { return d !== x; }, ds),
function (y) { // Y is distinct from X,
return bind([total - (x + y)],
function (z) { // Z sums with x and y to total, and is in ds.
return z !== y && lo <= z && z <= hi ? [
[x, y, z]
] : [];
})})})};
// GENERIC FUNCTIONS ------------------------------------------------------
// concatMap :: (a -> [b]) -> [a] -> [b]
function concatMap(f, xs) {
return [].concat.apply([], xs.map(f));
};
// enumFromTo :: Int -> Int -> [Int]
function enumFromTo(m, n) {
return Array.from({
length: Math.floor(n - m) + 1
}, function (_, i) {
return m + i;
});
};
// even :: Integral a => a -> Bool
function even(n) {
return n % 2 === 0;
};
// filter :: (a -> Bool) -> [a] -> [a]
function filter(f, xs) {
return xs.filter(f);
};
// flip :: (a -> b -> c) -> b -> a -> c
function flip(f) {
return function (a, b) {
return f.apply(null, [b, a]);
};
};
// length :: [a] -> Int
function length(xs) {
return xs.length;
};
// map :: (a -> b) -> [a] -> [b]
function map(f, xs) {
return xs.map(f);
};
// show :: a -> String
function show(x) {
return JSON.stringify(x);
}; //, null, 2);
// unlines :: [String] -> String
function unlines(xs) {
return xs.join('\n');
};
// TEST -------------------------------------------------------------------
var xs = options(1, 7, 12);
return '(Police, Sanitation, Fire)\n\n' +
unlines(map(show, xs)) + '\n\nNumber of options: ' + length(xs);
})();

View file

@ -0,0 +1,22 @@
(() => {
"use strict";
const
label = "(Police, Sanitation, Fire)",
solutions = [2, 4, 6]
.flatMap(
x => [1, 2, 3, 4, 5, 6, 7]
.flatMap(
y => [12 - (x + y)]
.flatMap(
z => z !== y && 1 <= z && z <= 7 ? [
[x, y, z]
] : []
)
)
)
.map(JSON.stringify)
.join("\n");
return `${label}\n${solutions}`;
})();

View file

@ -0,0 +1,51 @@
(() => {
"use strict";
// -------------- NUMBERING CONSTRAINTS --------------
// options :: Int -> Int -> Int -> [(Int, Int, Int)]
const options = lo => hi => total => {
const
bind = xs => f => xs.flatMap(f),
ds = enumFromTo(lo)(hi);
return bind(ds.filter(even))(
x => bind(ds.filter(d => d !== x))(
y => bind([total - (x + y)])(
z => (z !== y && lo <= z && z <= hi) ? [
[x, y, z]
] : []
)
)
);
};
// ---------------------- TEST -----------------------
const main = () => {
const
label = "(Police, Sanitation, Fire)",
solutions = options(1)(7)(12),
n = solutions.length,
list = solutions
.map(JSON.stringify)
.join("\n");
return (
`${label}\n\n${list}\n\nNumber of options: ${n}`
);
};
// ---------------- GENERIC FUNCTIONS ----------------
// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
// even :: Integral a => a -> Bool
const even = n => n % 2 === 0;
// MAIN ---
return main();
})();

View file

@ -0,0 +1,10 @@
def check(fire; police; sanitation):
(fire != police) and (fire != sanitation) and (police != sanitation)
and (fire + police + sanitation == 12)
and (police % 2 == 0);
range(1;8) as $fire
| range(1;8) as $police
| range(1;8) as $sanitation
| select( check($fire; $police; $sanitation) )
| {$fire, $police, $sanitation}

View file

@ -0,0 +1,4 @@
{fire: range(1;8), police: range(1;8), sanitation: range(1;8)}
| select( .fire != .police and .fire != .sanitation and .police != .sanitation
and .fire + .police + .sanitation == 12
and .police % 2 == 0 )

View file

@ -0,0 +1,4 @@
[range(1;8)]
| combinations(3)
| select( add == 12 and .[1] % 2 == 0)
| {fire: .[0], police: .[1], sanitation: .[2]}

View file

@ -0,0 +1,21 @@
using Printf
function findsolution(rng=1:7)
rst = Matrix{Int}(0, 3)
for p in rng, f in rng, s in rng
if p != s != f != p && p + s + f == 12 && iseven(p)
rst = [rst; p s f]
end
end
return rst
end
function printsolutions(sol::Matrix{Int})
println(" Pol. Fire San.")
println(" ---- ---- ----")
for row in 1:size(sol, 1)
@printf("%2i | %4i%7i%7i\n", row, sol[row, :]...)
end
end
printsolutions(findsolution())

View file

@ -0,0 +1,19 @@
// version 1.1.2
fun main(args: Array<String>) {
println("Police Sanitation Fire")
println("------ ---------- ----")
var count = 0
for (i in 2..6 step 2) {
for (j in 1..7) {
if (j == i) continue
for (k in 1..7) {
if (k == i || k == j) continue
if (i + j + k != 12) continue
println(" $i $j $k")
count++
}
}
}
println("\n$count valid combinations")
}

View file

@ -0,0 +1,12 @@
print( "Fire", "Police", "Sanitation" )
sol = 0
for f = 1, 7 do
for p = 1, 7 do
for s = 1, 7 do
if s + p + f == 12 and p % 2 == 0 and f ~= p and f ~= s and p ~= s then
print( f, p, s ); sol = sol + 1
end
end
end
end
print( string.format( "\n%d solutions found", sol ) )

View file

@ -0,0 +1,10 @@
NORMAL MODE IS INTEGER
PRINT COMMENT $ POLICE SANITATION FIRE$
THROUGH LOOP, FOR P=2, 2, P.G.7
THROUGH LOOP, FOR S=1, 1, S.G.7
THROUGH LOOP, FOR F=1, 1, F.G.7
WHENEVER P.E.S .OR. P.E.F .OR. S.E.F, TRANSFER TO LOOP
WHENEVER P+S+F .E. 12, PRINT FORMAT OCC, P, S, F
LOOP CONTINUE
VECTOR VALUES OCC = $I6,S2,I10,S2,I4*$
END OF PROGRAM

View file

@ -0,0 +1,23 @@
#determines if i, j, k are exclusive numbers
exclusive_numbers := proc(i, j, k)
if (i = j) or (i = k) or (j = k) then
return false;
end if;
return true;
end proc;
#outputs all possible combinations of numbers that statisfy given conditions
department_numbers := proc()
local i, j, k;
printf("Police Sanitation Fire\n");
for i to 7 do
for j to 7 do
k := 12 - i - j;
if (k <= 7) and (k >= 1) and (i mod 2 = 0) and exclusive_numbers(i,j,k) then
printf("%d %d %d\n", i, j, k);
end if;
end do;
end do;
end proc;
department_numbers();

View file

@ -0,0 +1 @@
Select[Permutations[Range[7], {3}], Total[#] == 12 && EvenQ[First[#]] &]

View file

@ -0,0 +1,29 @@
:- module department_numbers.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module int, list, solutions, string.
main(!IO) :-
io.print_line("P S F", !IO),
unsorted_aggregate(department_number, print_solution, !IO).
:- pred print_solution({int, int, int}::in, io::di, io::uo) is det.
print_solution({P, S, F}, !IO) :-
io.format("%d %d %d\n", [i(P), i(S), i(F)], !IO).
:- pred department_number({int, int, int}::out) is nondet.
department_number({Police, Sanitation, Fire}) :-
list.member(Police, [2, 4, 6]),
list.member(Sanitation, 1 .. 7),
list.member(Fire, 1 .. 7),
Police \= Sanitation,
Police \= Fire,
Sanitation \= Fire,
Police + Sanitation + Fire = 12.

View file

@ -0,0 +1,14 @@
10 REM Department numbers
20 PRINT "POLICE SANITATION FIRE"
30 FOR P = 2 TO 7 STEP 2
40 FOR S = 1 TO 7
50 IF S = P THEN 120
60 LET F = (12-P)-S
70 IF F <= 0 THEN 120
80 IF F > 7 THEN 120
90 IF F = S THEN 120
100 IF F = P THEN 120
110 PRINT TAB(3); P; TAB(11); S; TAB(19); F
120 NEXT S
130 NEXT P
140 END

View file

@ -0,0 +1,45 @@
MODULE DepartmentNumbers;
FROM Conversions IMPORT IntToStr;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
PROCEDURE WriteInt(num : INTEGER);
VAR str : ARRAY[0..16] OF CHAR;
BEGIN
IntToStr(num,str);
WriteString(str);
END WriteInt;
VAR i,j,k,count : INTEGER;
BEGIN
count:=0;
WriteString("Police Sanitation Fire");
WriteLn;
WriteString("------ ---------- ----");
WriteLn;
FOR i:=2 TO 6 BY 2 DO
FOR j:=1 TO 7 DO
IF j=i THEN CONTINUE; END;
FOR k:=1 TO 7 DO
IF (k=i) OR (k=j) THEN CONTINUE; END;
IF i+j+k # 12 THEN CONTINUE; END;
WriteString(" ");
WriteInt(i);
WriteString(" ");
WriteInt(j);
WriteString(" ");
WriteInt(k);
WriteLn;
INC(count);
END;
END;
END;
WriteLn;
WriteInt(count);
WriteString(" valid combinations");
WriteLn;
ReadChar;
END DepartmentNumbers.

View file

@ -0,0 +1,13 @@
type Solution = tuple[p, s, f: int]
iterator solutions(max, total: Positive): Solution =
for p in countup(2, max, 2):
for s in 1..max:
if s == p: continue
let f = total - p - s
if f notin [p, s] and f in 1..max:
yield (p, s, f)
echo "P S F"
for sol in solutions(7, 12):
echo sol.p, " ", sol.s, " ", sol.f

View file

@ -0,0 +1,64 @@
(*
* Caution: This is my first Ocaml program and anyone with Ocaml experience probably thinks it's horrible
* So please don't use this as an example for "good ocaml code" see it more as
* "this is what my first lines of ocaml might look like"
*
* The only reason im publishing this is that nobody has yet submitted an example in ocaml
*)
(* sfp is just a convenience to put a combination if sanitation (s) fire (f) and police (p) department in one record*)
type sfp = {s : int; f : int; p : int}
(* Convenience Function to print a single sfp Record *)
let print_sfp e =
Printf.printf "%d %d %d\n" e.s e.f e.p
(* Convenience Function to print a list of sfp Records*)
let print_sfp_list l =
l |> List.iter print_sfp
(* Computes sum of list l *)
let sum l = List.fold_left (+) 0 l
(* checks if element e is in list l *)
let element_in_list e l =
l |> List.find_map (fun x -> if x == e then Some(e) else None) <> None
(* returns a list with only the unique elements of list l *)
let uniq l =
let rec uniq_helper acc l =
match l with
| [] -> acc
| h::t -> if element_in_list h t then uniq_helper acc t else uniq_helper (h::acc) t in
uniq_helper [] l |> List.rev
(* checks wheter or not list l only contains unique elements *)
let is_uniq l = uniq l = l
(* computes all combinations for a given list of sanitation, fire & police departments
im not very proud of this function...maybe someone with some experience can clean it up? ;)
*)
let department_numbers sl fl pl =
sl |> List.fold_left (fun aa s ->
fl |> List.fold_left (fun fa f ->
pl |> List.fold_left (fun pa p ->
if
sum [s;f;p] == 12 &&
is_uniq [s;f;p] then
{s = s; f = f; p = p} :: pa
else
pa) []
|> List.append fa) []
|> List.append aa) []
(* "main" function *)
let _ =
let s = [1;2;3;4;5;6;7] in
let f = [1;2;3;4;5;6;7] in
let p = [2;4;6] in
let result = department_numbers s f p in
print_endline "S F P";
print_sfp_list result;

View file

@ -0,0 +1,16 @@
class Program {
function : Main(args : String[]) ~ Nil {
sol := 1;
"\t\tFIRE\tPOLICE\tSANITATION"->PrintLine();
for( f := 1; f < 8; f+=1; ) {
for( p := 1; p < 8; p+=1; ) {
for( s:= 1; s < 8; s+=1; ) {
if( f <> p & f <> s & p <> s & ( p and 1 ) = 0 & ( f + s + p = 12 ) ) {
"SOLUTION #{$sol}: \t{$f}\t{$p}\t{$s}"->PrintLine();
sol += 1;
};
};
};
};
}
}

View file

@ -0,0 +1 @@
forstep(p=2,6,2, for(f=1,7, s=12-p-f; if(p!=f && p!=s && f!=s && s>0 && s<8, print(p" "f" "s))))

View file

@ -0,0 +1,13 @@
<?php
$valid = 0;
for ($police = 2 ; $police <= 6 ; $police += 2) {
for ($sanitation = 1 ; $sanitation <= 7 ; $sanitation++) {
$fire = 12 - $police - $sanitation;
if ((1 <= $fire) and ($fire <= 7) and ($police != $sanitation) and ($sanitation != $fire)) {
echo 'Police: ', $police, ', Sanitation: ', $sanitation, ', Fire: ', $fire, PHP_EOL;
$valid++;
}
}
}
echo $valid, ' valid combinations found.', PHP_EOL;

View file

@ -0,0 +1,48 @@
100H: /* SHOW POSSIBLE DEPARTMENT NUMBERS FOR POLICE, SANITATION AND FIRE */
/* THE POLICE DEPARTMENT NUMBER MUST BE EVEN, ALL DEPARTMENT NUMBERS */
/* MUST BE IN THE RANGE 1 .. 7 AND THE NUMBERS MUST SUM TO 12 */
/* CP/M SYSTEM CALL AND I/O ROUTINES */
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */
DECLARE N ADDRESS;
DECLARE V ADDRESS, N$STR ( 6 )BYTE, W BYTE;
V = N;
W = LAST( N$STR );
N$STR( W ) = '$';
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
DO WHILE( ( V := V / 10 ) > 0 );
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
END;
CALL PR$STRING( .N$STR( W ) );
END PR$NUMBER;
/* TASK */
DECLARE MAX$DEPARTMENT$NUMBER LITERALLY '7';
DECLARE DEPARTMENT$SUM LITERALLY '12';
DECLARE ( POLICE, SANITATION, FIRE ) BYTE;
CALL PR$STRING( .'POLICE SANITATION FIRE$' );
CALL PR$NL;
DO POLICE = 2 TO MAX$DEPARTMENT$NUMBER BY 2;
DO SANITATION = 1 TO MAX$DEPARTMENT$NUMBER;
IF SANITATION <> POLICE THEN DO;
FIRE = ( DEPARTMENT$SUM - POLICE ) - SANITATION;
IF FIRE <= MAX$DEPARTMENT$NUMBER
AND FIRE <> SANITATION
AND FIRE <> POLICE
THEN DO;
CALL PR$STRING( .' $' ); CALL PR$NUMBER( POLICE );
CALL PR$STRING( .' $' ); CALL PR$NUMBER( SANITATION );
CALL PR$STRING( .' $' ); CALL PR$NUMBER( FIRE );
CALL PR$NL;
END;
END;
END;
END;
EOF

View file

@ -0,0 +1,30 @@
#!/usr/bin/perl
my @even_numbers;
for (1..7)
{
if ( $_ % 2 == 0)
{
push @even_numbers, $_;
}
}
print "Police\tFire\tSanitation\n";
foreach my $police_number (@even_numbers)
{
for my $fire_number (1..7)
{
for my $sanitation_number (1..7)
{
if ( $police_number + $fire_number + $sanitation_number == 12 &&
$police_number != $fire_number &&
$fire_number != $sanitation_number &&
$sanitation_number != $police_number)
{
print "$police_number\t$fire_number\t$sanitation_number\n";
}
}
}
}

View file

@ -0,0 +1,19 @@
#!/usr/bin/perl
use strict; # Not necessary but considered good perl style
use warnings; # this one too
print "Police\t-\tFire\t-\tSanitation\n";
for my $p ( 1..7 ) # Police Department
{
for my $f ( 1..7) # Fire Department
{
for my $s ( 1..7 ) # Sanitation Department
{
if ( $p % 2 == 0 && $p + $f + $s == 12 && $p != $f && $f != $s && $s != $p && $f != $s) # Check if the combination of numbers is valid
{
print "$p\t-\t$f\t-\t$s\n";
}
}
}
}

View file

@ -0,0 +1,15 @@
Police - Fire - Sanitation
2 - 3 - 7
2 - 4 - 6
2 - 6 - 4
2 - 7 - 3
4 - 1 - 7
4 - 2 - 6
4 - 3 - 5
4 - 5 - 3
4 - 6 - 2
4 - 7 - 1
6 - 1 - 5
6 - 2 - 4
6 - 4 - 2
6 - 5 - 1

View file

@ -0,0 +1,11 @@
#!/usr/bin/perl
use strict; # https://rosettacode.org/wiki/Department_numbers
use warnings;
print "P S F\n\n";
'246 1234567 1234567' =~
/(.).* \s .*?(?!\1)(.).* \s .*(?!\1)(?!\2)(.)
(??{$1+$2+$3!=12})
(?{ print "@{^CAPTURE}\n" })(*FAIL)/x;

View file

@ -0,0 +1,10 @@
#!/usr/bin/perl
use strict; # https://rosettacode.org/wiki/Department_numbers
use warnings;
print "P S F\n\n";
print tr/+/ /r, "\n" for
grep !/(\d).*\1/ && 12 == eval,
glob '{2,4,6}' . '+{1,2,3,4,5,6,7}' x 2;

View file

@ -0,0 +1,20 @@
(phixonline)-->
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Police Sanitation Fire\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"------ ---------- ----\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">solutions</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">police</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">7</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">sanitation</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">7</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sanitation</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">police</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">fire</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">12</span><span style="color: #0000FF;">-(</span><span style="color: #000000;">police</span><span style="color: #0000FF;">+</span><span style="color: #000000;">sanitation</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">fire</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">1</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">fire</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">7</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">fire</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">police</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">fire</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">sanitation</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %d %d %d\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">police</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sanitation</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fire</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">solutions</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n%d solutions found\n"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">solutions</span><span style="color: #0000FF;">)</span>
<!--

View file

@ -0,0 +1,22 @@
import cp.
go ?=>
N = 7,
Sols = findall([P,S,F], department_numbers(N, P,S,F)),
println(" P S F"),
foreach([P,S,F] in Sols)
printf("%2d %2d %2d\n",P,S,F)
end,
nl,
printf("Number of solutions: %d\n", Sols.len),
nl.
go => true.
department_numbers(N, Police,Sanitation,Fire) =>
Police :: 1..N,
Sanitation :: 1..N,
Fire :: 1..N,
all_different([Police,Sanitation,Fire]),
Police + Sanitation + Fire #= 12,
Police mod 2 #= 0,
solve([Police,Sanitation,Fire]).

View file

@ -0,0 +1,9 @@
go2 => department_numbers2(N) =>
println(" P S F"),
foreach(P in 1..N, P mod 2 == 0)
foreach(S in 1..N, P != S)
foreach(F in 1..N, F != P, F != S, P + S + F == 12)
printf("%2d %2d %2d\n",P,S,F)
end
end
end.

View file

@ -0,0 +1,9 @@
import util.
department_numbers3(N) =>
println("P S F"),
L = [[P.to_string,S.to_string,F.to_string] : P in 1..N, P mod 2 == 0,
S in 1..N, P != S,
F in 1..N,
F != P, F != S, P + S + F == 12],
println(map(L,join).join("\n")).

View file

@ -0,0 +1,17 @@
go :-
println("P F S"),
assign(Police, Fire, Sanitation),
printf("%w %w %w\n", Police, Fire, Sanitation),
fail,
nl.
dept(X) :- between(1, 7, X).
police(X) :- member(X, [2, 4, 6]).
fire(X) :- dept(X).
san(X) :- dept(X).
assign(A, B, C) :-
police(A), fire(B), san(C),
A != B, A != C, B != C,
12 is A + B + C.

View file

@ -0,0 +1,18 @@
(de numbers NIL
(co 'numbers
(let N 7
(for P N
(for S N
(for F N
(yield (list P S F)) ) ) ) ) ) )
(de departments NIL
(use (L)
(while (setq L (numbers))
(or
(bit? 1 (car L))
(= (car L) (cadr L))
(= (car L) (caddr L))
(= (cadr L) (caddr L))
(<> 12 (apply + L))
(println L) ) ) ) )
(departments)

View file

@ -0,0 +1,10 @@
(be departments (@Pol @Fire @San)
(member @Pol (2 4 6))
(for @Fire 1 7)
(for @San 1 7)
(different @Pol @Fire)
(different @Pol @San)
(different @Fire @San)
(^ @
(= 12
(+ (-> @Pol) (-> @Fire) (-> @San)) ) ) )

View file

@ -0,0 +1,17 @@
dept(X) :- between(1, 7, X).
police(X) :- member(X, [2, 4, 6]).
fire(X) :- dept(X).
san(X) :- dept(X).
assign(A, B, C) :-
police(A), fire(B), san(C),
A =\= B, A =\= C, B =\= C,
12 is A + B + C.
main :-
write("P F S"), nl,
forall(assign(Police, Fire, Sanitation), format("~w ~w ~w~n", [Police, Fire, Sanitation])),
halt.
?- main.

View file

@ -0,0 +1,18 @@
OpenConsole()
PrintN("--police-- --sanitation-- --fire--")
For police = 2 To 7 Step 2
For fire = 1 To 7
If fire = police:
Continue
EndIf
sanitation = 12 - police - fire
If sanitation = fire Or sanitation = police: Continue : EndIf
If sanitation >= 1 And sanitation <= 7:
PrintN(" " + Str(police) + #TAB$ + #TAB$ + Str(fire) + #TAB$ + #TAB$ + Str(sanitation))
EndIf
Next fire
Next police
Input()
CloseConsole()

View file

@ -0,0 +1,13 @@
from itertools import permutations
def solve():
c, p, f, s = "\\,Police,Fire,Sanitation".split(',')
print(f"{c:>3} {p:^6} {f:^4} {s:^10}")
c = 1
for p, f, s in permutations(range(1, 8), r=3):
if p + s + f == 12 and p % 2 == 0:
print(f"{c:>3}: {p:^6} {f:^4} {s:^10}")
c += 1
if __name__ == '__main__':
solve()

Some files were not shown because too many files have changed in this diff Show more