したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

突然ですが、クイズです。

1名無し赤レンガ:2005/06/10(金) 01:34:29 ID:YNYAwOMM
こんなネタがあるんだが、お前等の知恵を借りたい。

このコードを、より短くし、かつ、ループを1回にするには、どうしますか?
<?php
$col = 11; //表の横幅
$row = 5; //表の縦幅
$d = true; //白から始めるか、黒からはじめるか。trueだったら白から始める。

for($i=1; $i<$row+1; $i++){
for($j=1; $j<$col+1; $j++){
$b = (bool)(($i + $j) % 2);
if(((!$b) && $d)||($b&&(!$d))) print "□";
else print "■";
}
print "\n";
}
?>

$colが11
$rowが5
$bがtrueだった場合
期待する結果は…

(出力結果)
□■□■□■□■□■□
■□■□■□■□■□■
□■□■□■□■□■□
■□■□■□■□■□■
□■□■□■□■□■□

$colが10
$rowが5
$bがfalseだった場合
期待する結果は…

(出力結果)
■□■□■□■□■□
□■□■□■□■□■
■□■□■□■□■□
□■□■□■□■□■
■□■□■□■□■□

条件は、
・自作関数とか使うのナシ。if for while と演算子と名のつくものでやってくださいね♪
・言語は問いませんが、産能の歴史上、授業で使われたことのないの不可。とりあえず、問題はPHPで作られてます。
・ひとりで解いても、みんなで解いてもOK。
・与えられる数値は、一度別の変数に代入してから使う
・スペース詰めるとか、命令自体に変化ないの不可
・最終行は改行されなくても良い
・ifやforの以下、命令が1行の場合、同じ行に書いて可。ただし2個以上不可。
 (例)
  ○ if(true) print "hoge";
  × while($bool) if(true) print "hoge"; else print "foo";
PHPであれば、『;』が付いた時点で改行入れる感じ。
・動くことを確認してね♪

13名無しサンム:2005/06/15(水) 13:54:33 ID:Z4NwjXbE
>>5で書かれたコードを多言語に移植するスレはこちらで宜しいですか?
VBAで書いてみました。
原型留めて無い気もしますが(苦笑

Private Sub CommandButton1_Click()

Range("4:65536").Clear

Row = Range("B1").Value
col = Range("B2").Value
beginFlag = Range("B3").Value
Length = Row * col
returnFlag = IIf(col Mod 2 = 0, 0, 1)

For i = 1 To Length
Cells(Int((i - 1) / col) + 4, i - (Int((i - 1) / col) * Row)).Value = IIf(beginFlag = 1, "□", "■")
beginFlag = IIf(((returnFlag <> 1) And ((i Mod col) = 0)), beginFlag, 1 Xor beginFlag)
Next i

End Sub

145:2005/06/15(水) 23:10:27 ID:XVxhpPTI
>>13
すげぇなw
座標、全部計算で出してるのかw

所で、同じ計算式が二箇所あるのは何故?
具体的にはこれ -> Int((i - 1) / col

1513:2005/06/16(木) 10:56:01 ID:UP.hgXt2
>>14
どうも(笑
配列と変数を使えばもっと見通しが良くなりそうだったのですが、
元ソースが計算して改行を入れていたので計算にこだわってみました。

同じ計算が2個所あるのはコードの行数を減らす為です。

さしずめこんな感じでしょうか?
now_row = Int((i - 1) / col
Cells(now_row + 4, i - (now_row * Row)).Value = IIf(beginFlag = 1, "□", "■")
beginFlag = IIf(((returnFlag <> 1) And ((i Mod col) = 0)), beginFlag, 1 Xor beginFlag)

たったの一行ですが(笑

16sage:2005/06/16(木) 22:59:50 ID:ynX11plk
>>15
なるほどねぇ。
VBだと1物理行に2論理行は書けないんだっけか?
VBつーかPascal系のシンタックスは読み難くて手を出してないから
こういうの見れると勉強になる。

1713:2005/06/17(金) 14:33:21 ID:v2kLInH.
>>16
そう言って頂けるとやりがいがあります。(笑
残念ながら、環境を持っていないのでDelphiは試せませんが・・・

>VBだと1物理行に2論理行は書けないんだっけか?
そうなります。

18sage:2005/07/13(水) 21:27:03 ID:l8MpmXWg
いまさらだけど、思いついたので…
「ひまわり」を使ってみるテスト。面倒だったのでXOR使っちゃったのは勘弁m(_)m

「何列表示しますか?」と、尋ねて、列の数に、入れる。
「何行表示しますか?」と、尋ねて、行の数に、入れる。
「どちらから始めますか?」が、「白|黒」の、どれか尋ねて、白黒に、入れる。
もし、白黒が、「白」ならば、白黒は、0。
違えば、白黒は、1。
行の数を、0から、行の数まで、繰り返す(
行は、「」。
列の数を、0から、列の数まで、繰り返す(
旗は、MOD((行の数+列の数),2)。
もし、XOR(白黒,旗)が、0ならば、行は、行&「□」。
違えば、行は、行&「■」。
)。
行を、表示。
)。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板