質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1586閲覧

PHPでのビンゴ作成アルゴリズムに少々困っております。

General

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/10/15 18:02

前提・実現したいこと

開発職未経験のものです。

PHPでワードビンゴを作成しています。
ビンゴカードのマスをSとし、S×Sのカードマスを作ります。
そのマスの中に、ワードを入力します。
例えば、S=3の場合、カードマスは
test1 test2 test3
test4 test5 test6
test7 test8 test9
と入力し、
次に、マスを開ける回数をNとしN回カードマスを入力します。
例、N=5
test1
test5
test8
test9
test6

ビンゴがあれば、「Yes」、なかったら、「No」と表示させるプログラムを作成したいです。

発生している問題・エラーメッセージ

カードの作成と、マスを開ける回数、縦横のビンゴはわかるのですが、
斜め時のビンゴアルゴリズムに少々時間を費やしています。

ここの処理をfor文か、while文で処理したいです。

何か綺麗な書き方、または、良い計算方法はございますでしょうか。

エラーメッセージ

該当のソースコード

<?php $bingoCard = []; $S = (int)(fgets(STDIN)); for ($i = 0; $i < $S; $i++) { $bingoCard[$i] = explode(' ', trim(fgets(STDIN))); } $N = (int)trim(fgets(STDIN)); $selected = []; $bingoLine = []; for ($i = 0; $i < $N; $i++) { $selected[] = trim(fgets(STDIN)); $bingoLine = [   $bingoCard[$i],   array_map(function($ary) { return $ary[$i]; }, $bingoCard),      /*3×3時のビンゴが斜めに揃った場合(**この斜め処理を手動ではなく、プログラム(forかwhileで処理したい)**)の処理   [$bingoCard[0][0], $bingoCard[1][1], $bingoCard[2][2]],    [$bingoCard[0][2], $bingoCard[1][1], $bingoCard[2][0]], */ ]; } $result = []; foreach ($bingoLine as $line) { if (count(array_intersect($line, $selected)) >= 3) { $result = $line; break; } } echo count($result) ? 'Yes' : 'No';

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/15 20:55

これ、どこかの競技用の課題では? 規約違反に巻き込まれる可能性があるので、問題ないモノであれば出典を明らかにしておいてください。 問題のあるものであれば、削除遺体してください。
m.ts10806

2020/10/15 22:28

現状の問題点は何でしょうか。要件通りに動いてるのかいないのか。
dodox86

2020/10/15 23:20

開発職未経験で現時点でこれだけの完成度のコード(<私自身は動かして試した訳じゃないですけど)ということは、何らかの課題っぽくは思えますね。要件通りに動いているのであれば、改良の相談なのでしょうか。速さだけで考えたら、固定の指定の方がループで回すより(微々たるものとはいえ)ループ脱出条件を判定しない分、速いですよね。
guest

回答1

0

縦横のロジックはできているが、斜めのロジックが思いつかない、ということでしょうか。

実際に3x3や4x4のカードを書いてみると法則性に気づくと思います。

右下がりの斜めの場合は、左上の1を起点として(S+1)づつ数字が増えています。
コーディングするとこんな感じです。

PHP

1$s = 3; 2 3$a = array(); 4for ($i = 0; $i < $s; $i++) { 5 $a[] = 1 + ($s + 1) * $i; 6} 7print_r($a); 8/* 9Array 10( 11 [0] => 1 12 [1] => 5 13 [2] => 9 14) 15*/

左下がりの斜めはご自身で考えてみてください。

投稿2020/10/16 08:18

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問