中高生にお題!「4×4の魔法陣」を生成せよ!!

中高生にお題!「4×4の魔法陣」を生成せよ!!

Viscuit原田さんが 次は魔法陣も面白いかも って言っていたので、4×4の魔法陣を生成してみようかと、でも安直に総当たりは 16!とおり(20兆ほど) !?

ひとまず「ランダムに当て込めばそのうちできるでしょ方式」がこちら、今回は実行速度重視ということでC/C++。

MagicArray magic;

魔法陣表を製造して、

while( !magic.isMagic() ) magic.shuffle();

魔法陣でない間、マス目を1回ランダムに入れ替える。

show( magic );

表示する、の3行でできあがり。

MagicArrayの設計図はこちら。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct MagicArray{
    int64_t a[4*4] = { 1, 2, 3, 4,
                       5, 6, 7, 8,
                       9,10,11,12,
                      13,14,15,16};
    bool isMagic(){
        int64_t i;
        i = 0;
        int64_t n0 = a[i+0]+a[i+1]+a[i+2]+a[i+3]; i=i+4;
        int64_t n1 = a[i+0]+a[i+1]+a[i+2]+a[i+3]; i=i+4;
        int64_t n2 = a[i+0]+a[i+1]+a[i+2]+a[i+3]; i=i+4;
        int64_t n3 = a[i+0]+a[i+1]+a[i+2]+a[i+3]; i=i+4;
        i = 0;
        int64_t m0 = a[i+0]+a[i+4]+a[i+8]+a[i+12]; i=i+1;
        int64_t m1 = a[i+0]+a[i+4]+a[i+8]+a[i+12]; i=i+1;
        int64_t m2 = a[i+0]+a[i+4]+a[i+8]+a[i+12]; i=i+1;
        int64_t m3 = a[i+0]+a[i+4]+a[i+8]+a[i+12]; i=i+1;
        int64_t x0 = a[0]+a[5]+a[10]+a[15];
        int64_t x1 = a[3]+a[6]+a[ 9]+a[12];
        return (n0==n1) && (n0==n2) && (n0==n3) && (n0==m0) && (n0==m1) && (n0==m2) && (n0==m3) && (n0==x0) && (n0==x1);
    }
    void shuffle(){
        int64_t last = sizeof(a)/sizeof(a[0])-1;
        int64_t r = rand()%last;
        int64_t tmp = a[r];
        a[r] = a[last];
        a[last] = tmp;
    }
};

void show(MagicArray& magic){
    int64_t i = 0;
    while(i < sizeof(magic.a)/sizeof(magic.a[0])){
        printf("%2lld%s", magic.a[i], ((i+1)%4)?" ":"\n");
        ++i;
    }
}



int main(){
    srand(time(NULL));

    MagicArray magic;
    while( !magic.isMagic() ) magic.shuffle();
    show( magic );
}

全体としてはこんな感じ、実行するにはmacのターミナルで、

$ g++ -std=c++14 -O3 magic.cpp

こうして、

$ ./a.out

こう。

16  2  9  7
11  5 14  4
 6 12  3 13
 1 15  8 10

数秒〜数十秒で1個出ますね、総当たりしたら何分かかる?

中高生にはこんなお題も楽しいですね、5×5や6×6はどうかな?










.

[P.S.]

体育館でクリスマス!?自分なりの「綺麗み」で光らせようツリーとステージ!

体育館でクリスマス!?自分なりの「綺麗み」で光らせようツリーとステージ!

なんどもお邪魔させていただいている鹿谷小学校、今回も5,6年生にプログラミング教室2コマ、まずは教室でこれまでの復習と今回のLチカの練習。

慣れたら体育館へ。

暗幕をひいてLEDロープの点滅、練習したLチカとプログラムは共通。

まずはツリーと、

ステージをLEDロープで飾りましょう。

絡まりやすいから要注意。

作ったプログラムを刺して完成!

さかなの形と星の形がGood!

スクールセットはどこでもプログラミングできて超便利!

体育館をLチカ、いいね!


今回の機材はこんな感じ。

IchigoDakeにLEDを2個接続、大きめのが可愛くていい。

長いLEDロープ(USB式 10m 100球 ¥880)を駆動するためにMapleSyrupを利用。

LED2個ついたまま刺しても大丈夫、どちらも点滅します。

プリントはこの2枚、ご自由にお使いください。(CC-BY PCN福井)

10 OUT1:WAIT20:OUT0:WAIT20
20 OUT1:WAIT20:OUT0:WAIT20
30 OUT1:WAIT20:OUT0:WAIT20
40 WAIT40
50 OUT16:WAIT20:OUT0:WAIT20
60 OUT16:WAIT20:OUT0:WAIT20
70 OUT16:WAIT20:OUT0:WAIT20
80 WAIT40
90 OUT1:WAIT20:OUT0:WAIT20
100 OUT16:WAIT20:OUT0:WAIT20
110 OUT1:WAIT20:OUT0:WAIT20
120 OUT16:WAIT20:OUT0:WAIT20
130 OUT1:WAIT20:OUT0:WAIT20
140 OUT16:WAIT20:OUT0:WAIT20
150 OUT17:WAIT20:OUT0:WAIT20
160 WAIT80
170 GOTO10

3,3,7拍子はこれ!


[ おまけ ]

  • 質問(1):プリントの「カウンティング」とはなんですか?
    • 返答:コンピュータの中に数を入れる箱Aがあるよ。「A=0」でAに0が入るよ、「A=A+1」でAにA+1、今だと0+1、つまり1が入るよ、GOTO20で戻って「A=A+1」に来るからまたAにA+1、今は1+1、つまり2が入るよ。(「?A」は「見せろ、Aの中身」の意味)
  • 質問(2):プリントの「IF」とはなんですか?
    • 返答:「IF」は「もし」、「IF A<10」は「もし A<10 なら」の意味だよ。

3学期にはこの辺もやろう!










.

55歳でBASICはこうなった!? OpenVBSで作るビンゴマシン!

55歳でBASICはこうなった!? OpenVBSで作るビンゴマシン!

Viscuitの原田さんが ビンゴシステム をやっていて面白そうなので自作の新言語「OpenVBS」でやってみた。

dim machine = BingoMachine({})

BingoMachineを製造して、

machine.shuffle(1000)

ビンゴ機を1,000回シャッフル。

dim taker = BingoTaker({}, machine)

BingoTakerを製造して、

doeach(taker.take, function(v) wscript.echo(v): end function)

順に玉を取り出しながら表示というソースコード4行、でできあがり。

BingoMachineとBingoTakerの設計図はこんな感じ、Objective-Cチック?

option explicit: randomize:

dim machine = BingoMachine({})
machine.shuffle(1000)

dim taker = BingoTaker({}, machine)
doeach(taker.take, function(v) wscript.echo(v): end function)



function BingoMachine(self)
    self.balls   = [ 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,56,57,58,59,60,
                    61,62,63,64,65,66,67,68,69,70,71,72,73,74,75]
    self.shuffle = function(n)
                    dim last = self.balls.length-1
                    do while n--
                        dim r = int(rnd()*last)
                        dim tmp = self.balls(r)
                        self.balls(r) = self.balls(last)
                        self.balls(last) = tmp
                    loop
                end function
    return self
end function

function BingoTaker(self, machine)
    self.machine = machine
    self.i       = machine.balls.length
    self.take    = function()
                    return if self.i then self.machine.balls(--self.i) else empty end if
                end function
    return self
end function

function doeach(eachee, dofunc)
    10 DIM E = EACHEE()
    20 IF ISEMPTY(E) THEN EXIT FUNCTION: END IF
    30 DOFUNC(E)
    40 GOTO 10
end function

全体としてはこんな感じ。

最後の「doeach」を、あえてクラシカルなBASICにしてみましたが、

function doeach(eachee, dofunc)
    dim e
    do until isempty(e := eachee())
        dofunc( e )
    loop
end function

こう描いた方が読みやすい人が多いかも、お好きな描き方でどうぞ。

今年で55歳の「BASIC」、JSONなどに加えてOptional Chaining: ” ?. “Nullish Coalescing: ” ?? “ も搭載してまだまだ進化中。最新版を make してお試しください (Windowsなら nmake)。










.

楽しい作品ができたら世界に公開しよう!サーバーサイドBASICで作る君だけのWebサイト!

楽しい作品ができたら世界に公開しよう!サーバーサイドBASICで作る君だけのWebサイト!

先日バージョンアップした OpenVBS、コアには「Jujubeエンジン」を搭載し、サーバーサイドBASIC「ISPページ」の機能も含まれています。

ちょっと使ってみましょう。まずはダウンロード、今回はmacで行いますがWindowsでもLinuxでもやることは同じです。

ダウンロードすると oscript.20191031.osx.tar.gz が手元に来ます。

ダブルクリックして解凍、フォルダ「oscript.20191031.osx」ができます。

中身はこんな具合、「wwwroot」というフォルダありますね。

さぁ、ターミナル(Windowsの場合は コマンドプロンプト)を開いてWebサーバーを起動しましょう。

ターミナルとはコンピュータにコマンドを送るための窓口、IchigoJamを起動した時の画面と同じです。

まずはダウンロードした OpenVBS のフォルダに移動、「cd」コマンドです。

フォルダを移動したら「oscript」コマンドを起動、Webサービスは「sample3.obs」に描かれているため、

$ ./oscript sample3.obs

として起動。

うまく起動するとこのようにWebサービスが開始。

さて、ISPページを作りましょう。ページ作りには「テキストエディタ」を使います。どんなものでも良いですが、ここではmicrosoft「Visual Studio Code」を利用しましょう。

起動するとこんな感じ、Cmd+N で新しいファイルの編集がはじまります。

まずは

PRINT "Hi ISP!"

と描いてみましょう。

Cmd+S やメニューから保存できます。保存名は「mypage.isp」、保存先は先ほどの「wwwroot」にしましょう。

ブラウザで「http://localhost:8000/mypage.isp」にアクセス、こんなページがでましたか?

ページに画像を出すには、wwwrootに好きな画像を保存して、

PRINT IMG("flower.jpg")

と描きます。

ブラウザをリロードすると画像が出ますね。

別のページにリンクしたい場合は

PRINT LINK("http://pcn.club/")("PCNはこちら")

です。

こんな具合。

FOR文も使えますから、

こんなことも可能。

ページができたら世界中に公開しましょう。いろんな方法がありますが、今回は比較的簡単な ngrok を用いる方法。

まずは ngrok をインストール。

インストールしたら

$ ngrok http 8000

で起動しておきます。

起動すると、グローバルなURLがもらえます。

あとはスマホなどからアクセスするだけ、君だけのWebサイトのできあがり!

? RED("あか色")
? GREEN("midori色")
? BLUE("Blue色")
?
? LARGE("でかい")
? SMALL("ちっさ")
?
? CENTER("まん中")
? RIGHT("みぎ")

文字色や文字サイズ、文字の位置もアレンジ可能ですよ!

10 ?"ピザって10回言ってみて"
15 ?"---------"
20 I=0
30   ?"ピザ": I=I+1
40 IF I<10 THEN GOTO 30 END IF
45 ?"---------"
50 ?"ここは?"
60 ?IMG("hiji.jpg")
65 ?"---------"
70 ?RED(LARGE("ひざ"))

「サーバーサイドBASIC」らしく、行番号なんかつけてみても楽しい?中高生なら「さくらインターネット」でサーバー借りちゃえば ngrok 使わなくても済みますね!

プログラミングで楽しい作品できたら、自分だけのWebサイトで公開してみよう!そのままPCNプロコンにも応募してね!










.

さすだけ簡単 IchigoKamuy !¥100センサーで作るモバイル物体検知ソナー!

さすだけ簡単 IchigoKamuy !¥100センサーで作るモバイル物体検知ソナー!

shushu inc. より販売開始された「IchigoKamuy」。

ラップトップのUSBに刺して通信アプリを使うとすぐにプログラミングできます。

今回は CoolTerm というアプリを使いました。

5  VIDEO0
10 N=0
20 OUT1:OUT0
30 N=N+1
40 IF IN(1) GOTO30
50 IF N<8 BEEP N:WAIT6
60 GOTO10

アプリ越しにこんなプログラムを打ち込みましょう。今回はBASICですが、JavaScriptやRubyも選択可能。

そして最後に「SAVE 0」。

HC-SR04  IchigoKamuy
--------------------
GND      -       GND
VCC      -        5v
Trig     -      OUT1
Echo     -       IN1

さぁ、ラップトップからIchigoKamuyを抜いて距離センサー HC-SR04 と圧電サウンダーを取り付けましょう。

100均のUSBチャージャーに刺せば、モバイル物体検知ソナーの完成!

物が近いほど高い音で知らせてくれます。約100円/個な格安センサーなので、量産しやすいのがいいですね。展示会などでどの展示品に人がどれくらい近づいて滞留しているのか、データ回収にもいいかも!


いつのまにか5回目となる こどもプログラミングサミット、今回は金沢市で開催。鯖江市長、金沢市長も登壇して学校現場でのプログラミングへの取り組み状況を生の声で聞けそうです。

金沢市では同日に「第1回 加能ガニロボコン」も開催、記念すべき第1回の優勝は誰の手に?

12/26は金沢で、加能ガニと一緒に待ってます、ぜひどうぞ!










.

テオヤンセン蟹に魅せられたプログラミングするロボットスポーツ「かにロボコン2019」!次回は来月「金沢 加能ガニ ロボコン」にて!

テオヤンセン蟹に魅せられたプログラミングするロボットスポーツ「かにロボコン2019」!次回は来月「金沢 加能ガニ ロボコン」にて!

第3回越前がにロボコン

早朝より集まるこども達。

まずは車検、25 x 25 x 25cm以内

選手宣誓、スポーツマンシップに則り!

今回は予選のポイントで本戦トーナメントの位置決め。

固唾を呑んで見守る、本戦トーナメントの発表!

リトライ知らずの職人マシン!

決勝戦レベルの戦いを見せてくれたベスト8対決は同点によりじゃんけん!

写真がイマイチですいませんが、とにかく現場でないと伝わらないこの熱気。

こちらが高学年優勝マシン!なんと敦賀の公立小学校から担任の先生引率での参戦、ありがとう!

低学年の優勝マシンはこちら。今年はLEGOが強かった!

越前がにロボコンはロボット自由!LEGOもアーテックもタミヤも完全自作でもなんでもどうぞ。

次回は来月、金沢「第1回 加能ガニ ロボコン」12/26です!

2位でありながらとってもよかった「テオヤンセン蟹」こと「サターン」、なんとテオヤンセンさんのオープンソースな「ホーリーナンバー」をもとにアクリル板を切って自作したとのこと。ここにも ビースト菌 の感染者が!!

この滑らかな歩行は背中にコップを乗せてもきっとこぼれない!

準備いただいたみなさま、ありがとうございました!来年の 越前がにロボコン も、楽しみ!次回は中学生部門も!?みんな参加ありがとう!!










.