Update all new Tasks
This commit is contained in:
parent
00a190b0a6
commit
91df62d461
5697 changed files with 93386 additions and 804 deletions
25
Task/ABC-Problem/PL-I/abc-problem-1.pli
Normal file
25
Task/ABC-Problem/PL-I/abc-problem-1.pli
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
ABC: procedure options (main); /* 12 January 2014 */
|
||||
|
||||
declare word character (20) varying, blocks character (200) varying initial
|
||||
('((B O) (X K) (D Q) (C P) (N A) (G T) (R E) (T G) (Q D) (F S)
|
||||
(J W) (H U) (V I) (A N) (O B) (E R) (F S) (L Y) (P C) (Z M))');
|
||||
declare tblocks character (200) varying;
|
||||
declare (true value ('1'b), false value ('0'b), flag) bit (1);
|
||||
declare ch character (1);
|
||||
declare (i, k) fixed binary;
|
||||
|
||||
do word = 'A', 'BARK', 'BOOK', 'TREAT', 'COMMON', 'SQuAd', 'CONFUSE';
|
||||
flag = true;
|
||||
tblocks = blocks;
|
||||
do i = 1 to length(word);
|
||||
ch = substr(word, i, 1);
|
||||
k = index(tblocks, uppercase(ch));
|
||||
if k = 0 then
|
||||
flag = false;
|
||||
else /* Found a block with the letter on it. */
|
||||
substr(tblocks, k-1, 4) = ' '; /* Delete the block. */
|
||||
end;
|
||||
if flag then put skip list (word, 'true'); else put skip list (word, 'false');
|
||||
end;
|
||||
|
||||
end ABC;
|
||||
121
Task/ABC-Problem/PL-I/abc-problem-2.pli
Normal file
121
Task/ABC-Problem/PL-I/abc-problem-2.pli
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
*process source attributes xref or(!) options nest;
|
||||
abc: Proc Options(main);
|
||||
/* REXX --------------------------------------------------------------
|
||||
* 10.01.2013 Walter Pachl counts the number of possible ways
|
||||
* translated from Rexx version 2
|
||||
*-------------------------------------------------------------------*/
|
||||
|
||||
Dcl (ADDR,HBOUND,INDEX,LEFT,LENGTH,MAX,SUBSTR,TRANSLATE) builtin;
|
||||
Dcl sysprint Print;
|
||||
Dcl (i,j,k,m,mm,wi,wj,wlen,ways,lw) Bin Fixed(15);
|
||||
Dcl blocks(20) Char(2)
|
||||
Init('BO','XK','DQ','CP','NA','GT','RE','TG','QD','FS','JW',
|
||||
'HU','VI','AN','OB','ER','FS','LY','PC','ZM');
|
||||
Dcl blk Char(2);
|
||||
Dcl words(8) Char(7) Var
|
||||
Init('$','A','baRk','bOOk','trEat','coMMon','squaD','conFuse');
|
||||
Dcl word Char(7) Var;
|
||||
Dcl c Char(1);
|
||||
Dcl (show,cannot) Bit(1) Init('0'b);
|
||||
Dcl poss(100,0:100) Pic'99'; poss=0;
|
||||
Dcl s(20,100) char(100) Var;
|
||||
Dcl str Char(100);
|
||||
Dcl 1 *(30) Based(addr(str)),
|
||||
2 strp Pic'99',
|
||||
2 * Char(1);
|
||||
Dcl ns(20) Bin Fixed(15) Init((20)0);
|
||||
Dcl ol(100) Char(100) Var;
|
||||
Dcl os Char(100) Var;
|
||||
wlen=0;
|
||||
Dcl lower Char(26) Init('abcdefghijklmnopqrstuvwxyz');
|
||||
Dcl upper Char(26) Init('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
|
||||
Do wi=1 To hbound(words);
|
||||
wlen=max(wlen,length(words(wi)));
|
||||
End;
|
||||
Do wi=1 To hbound(words);
|
||||
word = translate(words(wi),upper,lower);
|
||||
ways=0;
|
||||
lw=length(word);
|
||||
cannot='0'b;
|
||||
poss=0;
|
||||
ns=0;
|
||||
ol='';
|
||||
iloop:
|
||||
Do i=1 To lw; /* loop over the characters */
|
||||
c=substr(word,i,1); /* the current character */
|
||||
Do j=1 To hbound(blocks); /* loop over blocks */
|
||||
blk=blocks(j);
|
||||
If index(blk,c)>0 Then Do; /* block can be used in this pos( */
|
||||
poss(i,0)+=1; /* number of possible blocks for pos i */
|
||||
poss(i,poss(i,0))=j;
|
||||
End;
|
||||
End;
|
||||
If poss(i,0)=0 Then Do;
|
||||
Leave iloop;
|
||||
End;
|
||||
End;
|
||||
If i>lw Then Do; /* no prohibitive character */
|
||||
ns=0;
|
||||
Do j=1 To poss(1,0); /* build possible strings for char 1 */
|
||||
ns(1)+=1;;
|
||||
s(1,j)=poss(1,j);
|
||||
End;
|
||||
Do m=2 To lw; /* build possible strings for chars 1 to i */
|
||||
mm=m-1;
|
||||
Do j=1 To ns(mm);
|
||||
Do k=1 To poss(m,0);
|
||||
ns(m)+=1;
|
||||
s(m,ns(m))=s(mm,j)!!' '!!poss(m,k);
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
Do m=1 To ns(lw);
|
||||
If valid(s(lw,m)) Then Do;
|
||||
ways+=1;
|
||||
str=s(lw,m);
|
||||
Do k=1 To lw;
|
||||
ol(ways)=ol(ways)!!blocks(strp(k))!!' ';
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
/*--------------------------------------------------------------------
|
||||
* now show the result
|
||||
*-------------------------------------------------------------------*/
|
||||
os=left(''''!!word!!'''',wlen+2);
|
||||
Select;
|
||||
When(ways=0)
|
||||
os=os!!' cannot be spelt.';
|
||||
When(ways=1)
|
||||
os=os!!' can be spelt.';
|
||||
Otherwise
|
||||
os=os!!' can be spelt in'!!ways!!' ways.';
|
||||
End;
|
||||
Put Skip List(os);
|
||||
If show Then Do;
|
||||
Do wj=1 To ways;
|
||||
Put Edit(' '!!ol(wj))(Skip,a);
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
Return;
|
||||
|
||||
valid: Procedure(list) Returns(bit(1));
|
||||
/*--------------------------------------------------------------------
|
||||
* Check if the same block is used more than once -> 0
|
||||
* Else: the combination is valid
|
||||
*-------------------------------------------------------------------*/
|
||||
Dcl list Char(*) Var;
|
||||
Dcl i Bin Fixed(15);
|
||||
Dcl used(20) Bit(1);
|
||||
str=list;
|
||||
used='0'b;
|
||||
Do i=1 To lw;
|
||||
If used(strp(i)) Then
|
||||
Return('0'b);
|
||||
used(strp(i))='1'b;
|
||||
End;
|
||||
Return('1'b);
|
||||
End;
|
||||
|
||||
End;
|
||||
Loading…
Add table
Add a link
Reference in a new issue