aboutsummaryrefslogtreecommitdiff
path: root/challenge-097/paulo-custodio/forth/ch-2.fs
blob: e19b02f48b6ab16262b1444edd4b49e44363b243 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /usr/bin/env gforth

\ Challenge 097
\
\ TASK #2 › Binary Substings
\ Submitted by: Mohammad S Anwar
\ You are given a binary string $B and an integer $S.
\
\ Write a script to split the binary string $B of size $S and then find the
\ minimum number of flips required to make it all the same.
\
\ Example 1:
\ Input: $B = “101100101”, $S = 3
\ Output: 1
\
\ Binary Substrings:
\     "101": 0 flip
\     "100": 1 flip to make it "101"
\     "101": 0 flip
\ Example 2:
\ Input $B = “10110111”, $S = 4
\ Output: 2
\
\ Binary Substrings:
\     "1011": 0 flip
\     "0111": 2 flips to make it "1011"


\ count number of flipped chars
: flipped-chars     { str1 str2 len -- count }
    0               ( count )
    len 0 ?DO
        str1 I + C@
        str2 I + C@
        <> IF 1+ THEN
    LOOP
;

\ count number of flips in sequence
: flipped-sequence  { str len n -- count }
    0 str                   ( count cur-str )
    BEGIN
        n +                 \ advance to next subtring
        DUP str len + <
    WHILE                   \ for each substring
        str OVER n flipped-chars    ( count str delta )
        ROT + SWAP                  ( count str )
    REPEAT DROP
;

\ main
NEXT-ARG                            ( str len )
NEXT-ARG S>NUMBER? 0= THROW DROP    ( str len n )
flipped-sequence . CR
BYE