Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2019-09-20

なでしこでナンプレを解いてみようと「配列複製」のこと

| 01:06

 なでしこ1の最新版がリリースされましたね!ヽ(^o^)ノ

https://nadesi.com/top/index.php?%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9


 と、ゆうわけで、久々のなでしこ1。

 クジラ飛行机さまの『Pythonでナンプレを解いてみよう』とゆう記事が、ついったーで流れてきたので、通常は、なでしこ以外の記事はスルーすることが多いんだけど、なでしこで同じようにやってみようと思い立った。

https://news.mynavi.jp/article/zeropython-54/

 ぱいんさんは分からないし、アルファベットは見たくないが、イメージで! なんかまあ、こんなこったろう・・・って感じで、なでしこ1では、わりとすぐに出来たように思います。

 一応、ダウンロードしたての最新版で、記事と答えが合うことを確認。

 他の問題、解いてみてないけどねー(^▽^;

#ナンプレ(なでしこ1)
# 問題データを読む --- (*2)
問題=「 , ,5, ,3, ,6, ,
8, , ,4, , ,3, ,
4, , , , ,9, ,2,
 , , , , , ,9, ,6
 , , ,1, , , ,8,
7, , , , ,8, , ,
3, , ,5, , ,8, ,
2, ,1, ,7,3, , ,
 ,9, , ,1,2, , ,」をCSV取得。
9
 x=回数-1。
 9
  y=回数-1。
  問題[x][y]が数字か判定。
  もしそれいいえならば、問題[x][y]=0。
「--- 問題データ ---」を表示。
問題を表示。
「--- 完成データ ---」を表示。

問題の0をナンプレ解答検索。
# 白の部分を再帰的に解く --- (*3)
●ナンプレ解答検索(元データのNoを)
 # 終了判定 --- (*4)
 もし、No≧81ならば、元データを表示はい戻る。

 # 白があるか調べる --- (*5)
 #(既に数値が入っていたら、次のマス。)
 行とは整数=No/9を整数変換。列とは整数=No%9。
 もし、元データ[行][列]=0でなければ、元データの(No+1)をナンプレ解答検索。はい戻る。

 # どの数字が利用可能か調べる --- (*6)
 #(除外して良い数字を検索)
 除外数とは配列。
 9。
  除外数[元データ[回数-1][列]]=はい。
  除外数[元データ[行][回数-1]]=はい。

 # 3x3のマスの中も数字が重複しないか確認
 小行とは整数=行/3を整数変換*3。小列とは整数=列/3を整数変換*3。
 3
  x=回数-1。
  3
   y=回数-1。
   除外数[元データ[小行+x][小列+y]]=はい。

 # 利用可能な数値を順に入れて再帰 --- (*7)
 Cとは整数。
 9
  C=回数。
  もし、除外数[C]=はいならば、
   続ける。
  違えば、
   仮データとは配列=元データ。
   仮データ[行][列]=C。
   仮データの(No+1)をナンプレ解答検索。
   もしそれが0ならば続ける。
 いいえ戻る

注:表示されるまで数秒かかります;


 ところがですよ!

 コレをなでしこ3でも動かそうとしたら、たちまちはまりました(´д`)

 いちおう、v3に合わせて必要な「ここまで」を追加し、ローカル変数の宣言もちゃんと変更して、エラーは出ないし内容はv1で動いたのままなのに、何故だ、何故なんだ~~~と、悩みまくった結果。

 v1では、仮データに元データを複製するのは、代入するだけでOKだったのですが、v3では、それでは戻った時に、データが戻らないっぽいとゆうことが分かりました。

 再帰で、行き着くとこまで調査して完了~ではなく、うまくいかなかったら戻ってやり直し~、となるので、ちゃんとデータも元に戻ってくれないと、困っちゃうわけです。


 さてこで、「配列複製」です!

 なでしこ1には無い命令で(たしか)、何するもんだか分からぬと思ってたんだけど、コレを使ったらできました。一発解決☆

 元のぱいんさんのコードでも、代入ではなく何やらコピーのコマンドが使われているので、なでしこ1のは特有の便利仕様であって、本来はこうゆう物なのかも知れない

#ナンプレ(なでしこ3)
# 問題データを読む --- (*2)
問題=「 , ,5, ,3, ,6, ,
8, , ,4, , ,3, ,
4, , , , ,9, ,2,
 , , , , , ,9, ,6
 , , ,1, , , ,8,
7, , , , ,8, , ,
3, , ,5, , ,8, ,
2, ,1, ,7,3, , ,
 ,9, , ,1,2, , ,」をCSV取得。
9
 x=回数-1。
 9
  y=回数-1。
  問題[x][y]が数字か判定。
  もしそれいいえならば、問題[x][y]=0。
 ここまで。
ここまで。
「--- 問題データ ---」を表示。
問題を表CSV変換それ表示。
「--- 完成データ ---」を表示。

問題の0をナンプレ解答検索。
# 白の部分を再帰的に解く --- (*3)
●ナンプレ解答検索(元データのNoを)
 # 終了判定 --- (*4)
 もし、No≧81ならば、
  元データを表CSV変換それ表示はい戻る。
 ここまで。

 # 白があるか調べる --- (*5)
 #(既に数値が入っていたら、次のマス。)
 行とは変数=No/9を整数変換。列とは変数=No%9。
 もし、元データ[行][列]=0でなければ、
  元データの(No+1)をナンプレ解答検索。はい戻る。
 ここまで。

 # どの数字が利用可能か調べる --- (*6)
 #(除外して良い数字を検索)
 除外数とは変数配列。
 9。
  除外数[元データ[回数-1][列]]=はい。
  除外数[元データ[行][回数-1]]=はい。
 ここまで。

 # 3x3のマスの中も数字が重複しないか確認
 小行とは変数=(行/3を整数変換)*3。小列とは変数=(列/3を整数変換)*3。
 3
  x=回数-1。
  3
   y=回数-1。
   除外数[元データ[小行+x][小列+y]]=はい。
  ここまで。
 ここまで。

 # 利用可能な数値を順に入れて再帰 --- (*7)
 Cとは変数。
 9
  C=回数。
  もし、除外数[C]=はいならば、
   続ける。
  違えば、
   仮データとは変数=元データを配列複製。  //配列複製!!
   仮データ[行][列]=C。
   仮データの(No+1)をナンプレ解答検索。
   もしそれが0ならば続ける。
  ここまで
 ここまで。
 いいえ戻るここまで。

 簡易エディタでお試し出来ます。

https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E7%B0%A1%E6%98%93%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190920