したらば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であれば、『;』が付いた時点で改行入れる感じ。
・動くことを確認してね♪

2名無しサンム:2005/06/10(金) 01:55:40 ID:n9S71JaM
>>1
知るか!タコ!

3名無しサンム:2005/06/10(金) 01:58:52 ID:dbHHZRuI
暇人やね

4名無しサンム:2005/06/10(金) 02:14:17 ID:G3nVMlaI
ガチで解答してみるテスツ

<?php

/* 引数のマッピング */
//列数。つまり横の長さ。
$col = $argv[1];
//行数。つまり縦の長さ。
$row = $argv[2];
//□だの■だの開始フラグ。trueだと先手、□。
$pcFlag = (bool) $argv[3];

//負けた希ガス
$numFlag = $col % 2;

//四角の最大個数
$count = $row * $col;

for ($i = 1;$i <= $count;$i++){
$square = $pcFlag ? '□' : '■';
if (($i % $col) == 0) {
$square .= "<BR>\n";
if (!$numFlag) $pcFlag = !$pcFlag;
}

print $square;

$pcFlag = !$pcFlag;
}

?>
とりあえずキモ
・データを一本のストリーム(流れ)として見立てている。
多分皆、出力結果が表形式だから、多分2次元配列とかを考えているだろうけど改行コードも所詮は文字。
つまり、何行改行が入ろうがストリーム的には1次元なのですよ。

改行なんて所詮見た目です。エロい人にはそれが判らんのです。

・フラグの扱い
素だの玄だの言ってる訳ですが、要は出力を入れ替えられりゃ良いだけっしょ?
計算なんて面倒くさい事やんないで、判定を反転させりゃいいじゃん。

薀蓄
「タコ」って愛すべきLinux初心者を指す言葉だったりする訳だが、
そこらへんは理解してるのかな?>>2は。
平たく言うと逆効果。

5名無しサンム:2005/06/10(金) 11:23:43 ID:mtdRaiWE
やりゃできるもんだ。
1行。

多分Cでも逝ける。Javaだと無理な筈。
<?php for ($i = 1, $row = 5, $col = 11, $beginFlag = true, $length = $row * $col, $returnFlag = $col % 2; $i <= $length; print $beginFlag ? '□' : '■', print ($i % $col) == 0 ? "\n" : "", $beginFlag = (!$returnFlag && (($i % $col) == 0)) ? $beginFlag : !$beginFlag, $i++); ?>

コマンドラインでやったりするなら・・・
<?php for ($i = 1, $row = $argv[1], $col = $argv[2], $beginFlag = $argv[3], $length = $row * $col, $returnFlag = $col % 2; $i <= $length; print $beginFlag ? '□' : '■', print ($i % $col) == 0 ? "\n" : "", $beginFlag = (!$returnFlag && (($i % $col) == 0)) ? $beginFlag : !$beginFlag, $i++); ?>

エラー処理まで入ったお徳用1行。
<?php for ($errorMessage = "", $errorMessage .= 3 < $_SERVER['argc'] ? "" : "引数の数が正しくありません。行数(int)、列数(int)、開始色(bool)の3つの引数が必要です。\n", $errorMessage .= 0 < $_SERVER['argv'][1] && $_SERVER['argv'][1] < 65535 ? "" : "行数の指定が正しくありません。行数は0〜65535の範囲内の整数のみ指定できます。\n", $errorMessage .= 0 < $_SERVER['argv'][2] && $_SERVER['argv'][2] < 65535 ? "" : "列数の指定が正しくありません。列数は0〜65535の範囲内の整数のみ指定できます。\n", $errorMessage .= is_bool((bool)$_SERVER['argv'][3]) ? "" : "開始色の指定が正しくありません。開始色はtrueもしくはfalseのみ指定できます。\n", $error = true, $error = $errorMessage != "" ? print $errorMessage : false, $error ? exit : "", $i = 1, $row = $_SERVER['argv'][1], $col = $_SERVER['argv'][2], $beginFlag = $_SERVER['argv'][3], $length = $row * $col, $returnFlag = $col % 2; $i <= $length; print $beginFlag ? '□' : '■', print ($i % $col) == 0 ? "\n" : "", $beginFlag = (!$returnFlag && (($i % $col) == 0)) ? $beginFlag : !$beginFlag, $i++); ?>

6名無しサンム:2005/06/10(金) 13:12:09 ID:rH4ZL2oE
↑とりあえず、お前バカだろw
(最大級の讃辞)

7名無しサンム:2005/06/11(土) 18:48:25 ID:utRy5YqY
他言語のも作ってみるテスト。
JavaScript
<SCRIPT LANGUAGE="JavaScript1.0">for (i = 1, row = 5, col = 11, beginFlag = true, length = row * col, returnFlag = col % 2; i <= length; beginFlag ? document.write('□') : document.write('■'), (i % col) == 0 ? document.write("<BR>\n") : document.write(""), beginFlag = (!returnFlag && ((i % col) == 0)) ? beginFlag : !beginFlag, i++);</SCRIPT>

Java
package test;
public class test {
public static void main(String[] args) {
for (int i = 1, row = 5, col = 10, beginFlag = true ? 1 : 0, length = row * col, returnFlag = (col % 2 == 0) ? 0 : 1; i <= length; System.out.print(beginFlag == 1 ? "□" : "■"), System.out.print((i % col) == 0 ? "\n" : ""), beginFlag = (returnFlag != 1 && ((i % col) == 0)) ? beginFlag : 1 ^ beginFlag, i++);
}
}

package test;
public class test {
public static void main(String[] args) {
for (int i = 1, row = Integer.parseInt(args[0]), col = Integer.parseInt(args[1]), beginFlag = "true".equals(args[2]) ? 1 : 0, length = row * col, returnFlag = (col % 2 == 0) ? 0 : 1; i <= length; System.out.print(beginFlag == 1 ? "□" : "■"), System.out.print((i % col) == 0 ? "\n" : ""), beginFlag = (returnFlag != 1 && ((i % col) == 0)) ? beginFlag : 1 ^ beginFlag, i++);
}
}

8名無しサンム:2005/06/12(日) 15:42:02 ID:YHD8j.Xo
お褒めに預かったからどんどん頭悪くなってみる。
C#
using System;
namespace ConsoleApplication1
{
class Test
{
[STAThread]
static void Main(string[] args)
{
{
for (int i = 1, row = 5, col = 10, beginFlag = true ? 1 : 0, length = row * col, returnFlag = (col % 2 == 0) ? 0 : 1; i <= length; Console.Write(beginFlag == 1 ? "□" : "■"), Console.Write((i % col) == 0 ? "\n" : ""), beginFlag = (returnFlag != 1 && ((i % col) == 0)) ? beginFlag : 1 ^ beginFlag, i++);
}
}
}
}

[STAThread]とかの言語固有のお約束と、メソッド名(System.out.printとConsole.Write)以外はJavaと全く同じでOKだった。
まぁ、言語なんざ数ある手段の一つにしか過ぎないからねぇ。

9名無しサンム:2005/06/12(日) 16:23:10 ID:nLLNIlYU
さすがだなw
いかにも産能って感じw

10名無しサンム:2005/06/13(月) 11:38:44 ID:iLVh86V6
さて、問題です。
産能が潰れるのはいつでしょう?

11サン:2005/06/15(水) 03:10:44 ID:MdrBqZ7A
産能大学は潰れません。
産能ユニオンとか言うけしからん組織が「産能大学は新入生が定員割れしている」
とか「産能大学は残務的に傾いている」とかいうけしからんことを言いふらしていますが、
そんなことはありません。定員割れなどしていません。財務的に傾いているわけでもありません。
もし万一、仮にそうだとしても、そういうことを言いふらすことによって産能に不利な状況を生み出すこと自体が
不届き千万です。学生なのにそんなことを言うなら、当然、退学処分が相当です。
我々はあなたがたが簡単に単位が取れるようにしているではありませんか。
授業に遅刻しても、寝ていても、私語をしても、携帯電話で話していても教員が叱ったりしないようにしているではありませんか。
あなたがたが楽に、簡単に卒業できるように、卒業論文だって必修から外しましたし、
英語だって一時期は必修から外しました。
今は少しだけ必修にしていますが、実際には、先生を選べばビデオ映画の感想文だけで単位が取れるようにしてあります。
数学なんか勉強しなくてもいいのです。それだってちゃんと卒業できるのです。
コンピュータは数学なんか知らなくたって使えます。
情報処理技術者資格が取れなくったって、就職には困りません。
なのに、どうしてそんなに産能大学の悪口を言うのですか。
ここはあなたがたが楽しく過ごせるようにしてある大学なのですよ。
レジャーランドなどと悪口を言う人間たちなど、放っておけばいいではありませんか。
大学は、レジャーランドでいいのです。ひいひい言いながら何かを身につける必要などないのですよ。
そんなことを要求する不心得な教師はすてべ追い出しました。
なのに、どうしてあなた方は産能の悪口を言うのですか。
私は悲しい。

12名無しサンム:2005/06/15(水) 07:49:12 ID:Dnc9yoiY
>>11
産能ユニオンとか言うけしからん組織から遙々お疲れ様です。


読もうよ、空気。オトナなんだし。

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(省略可)

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

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

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

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