トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

11-10 まま子立て

SQLパズル

子供を30人持った母親がいたが、子のうち15人は実子、15人はまま子だった。

ある日、母親はこの子らを円形に並べ、十番目、十番目にあたる者を順に除いていって、
一番最後に残った者にこの家を継がせると申し渡した。

いざ数えてみると、まま子ばかりが除かれていき、このままだと最後の一人も除かれることになった。
そこでその子は、「これではあまりにも不公平です。こんどは私から数え始めて下さい」と言った。

言い分がもっともなので、母親がその通りにすると、
今度は実子ばかり除かれて、結局まま子が最後に残ったという。

まま子立て


SQL

declare
    type defineArray is table of pls_Integer index by binary_integer;
    AnsArray defineArray;

    soeji pls_Integer:= 1;
    counter pls_Integer;
    mamakocount pls_Integer:= 0;
begin
    for i in 1..30 Loop
        AnsArray(i) := 0;
    end Loop;

    while mamakocount < 15 Loop

        counter:= 0;

        Loop
            if AnsArray(soeji) = 0 then
                counter:= counter+1;
            end if;

            exit when counter=10;

            soeji:= case soeji+1 when 31 then 1 else soeji+1 end;
        end Loop;

        AnsArray(soeji) := 1;

        Loop
            soeji:= case soeji+1 when 31 then 1 else soeji+1 end;
            if AnsArray(soeji) = 0 then
                exit;
            end if;
        end Loop;

        mamakocount := mamakocount+1;
    end Loop;

    for i in 1..30 Loop
        DBMS_Output.Put_Line(to_char(i) || '番目は' ||
                             case AnsArray(i) when '0' then '○' else '×' end);
    end Loop;
end;
/


解説

case式で添字が、31を超えた場合に対処してます。