前スレ
オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
オブジェクト指向はオワコン? part2
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2026/08/13(木) 14:38:03.02ID:pdAcKRXu276デフォルトの名無しさん
2026/08/18(火) 11:39:15.61ID:mY9waEio 凝った技術を使って 後退している感じ
まあ遊びとしてはありかな
まあ遊びとしてはありかな
277デフォルトの名無しさん
2026/08/18(火) 11:44:50.67ID:FI1FzRN/278デフォルトの名無しさん
2026/08/18(火) 11:58:25.60ID:s6UVuJiP >>277
この内容で関数分けは逆にやりすぎだよ
この内容で関数分けは逆にやりすぎだよ
279デフォルトの名無しさん
2026/08/18(火) 12:03:00.45ID:mr91AiPO280デフォルトの名無しさん
2026/08/18(火) 12:09:50.58ID:s6UVuJiP >>279
レビューポイントがずれてるところ見ると例の人か
レビューポイントがずれてるところ見ると例の人か
281デフォルトの名無しさん
2026/08/18(火) 12:12:44.41ID:yVjtC2wq ビュー部分とロジック部分は分けるべきだろうね
282デフォルトの名無しさん
2026/08/18(火) 12:12:55.79ID:mY9waEio レビュー言ってる人が書くともっとヒデ―んだろうな…
283デフォルトの名無しさん
2026/08/18(火) 12:22:41.95ID:zZZZox/S ノウハウが盗まれないように最初から難読化しているのに、
それをextendsがevilだといわれちゃうと心外ですよねぇ笑。
それは単なるtrapだ。trapに引っかかるようなバカは不要という世界。
それをextendsがevilだといわれちゃうと心外ですよねぇ笑。
それは単なるtrapだ。trapに引っかかるようなバカは不要という世界。
284デフォルトの名無しさん
2026/08/18(火) 12:25:26.30ID:Wbf7Xhfh 少なくとも個別テストができるレベルでの関数分けは常に義務付けられる。
データ生成部分とデータ表示部分を分離しなさいという常識も、混在は可読性を下げるだけでなくテストを困難にするためだ。
データ生成部分とデータ表示部分を分離しなさいという常識も、混在は可読性を下げるだけでなくテストを困難にするためだ。
285デフォルトの名無しさん
2026/08/18(火) 12:30:03.24ID:zZZZox/S test firstはtestを先に書け、ということではなく、
testすること/できることを前提に設計しろ、ということ。
Unit testできないもの、integration testできないプログラムはゴミでしかない。
testすること/できることを前提に設計しろ、ということ。
Unit testできないもの、integration testできないプログラムはゴミでしかない。
286デフォルトの名無しさん
2026/08/18(火) 12:41:42.10ID:mY9waEio 結局、カルトな迷信から抜け出せないのね
287デフォルトの名無しさん
2026/08/18(火) 12:54:55.98ID:BvR5dCBy 文字列への変換はできる限り遅延させて可能なら表示の直前まで遅延させることが望ましいという原則
これは抽象的なデータとして持っていた方が可読性と保守性に勝るだけでなく
高速化や省メモリ化の観点からでもあるね
文字列にして持っていると格納メモリが増えて比較も遅くなっちゃう
これは抽象的なデータとして持っていた方が可読性と保守性に勝るだけでなく
高速化や省メモリ化の観点からでもあるね
文字列にして持っていると格納メモリが増えて比較も遅くなっちゃう
288デフォルトの名無しさん
2026/08/18(火) 12:56:42.55ID:zZZZox/S Fizz buzzについては、wikipediaのルールを基準として、それを仕様とみなせば、
仕様をみたしていないプログラムが多い(日本語版wikipediaを含む)。
これを試験に出すとすると、仕様というものを理解できていない会社が多い。
結果が同じであればよいのではなく、保守や運用を考えると仕様を満たしていることが必要。
仕様をみたしていないプログラムが多い(日本語版wikipediaを含む)。
これを試験に出すとすると、仕様というものを理解できていない会社が多い。
結果が同じであればよいのではなく、保守や運用を考えると仕様を満たしていることが必要。
289デフォルトの名無しさん
2026/08/18(火) 14:51:02.89ID:mY9waEio wikipediaのルールが実は違ったらどーすんの?
290デフォルトの名無しさん
2026/08/18(火) 16:49:24.64ID:CwdGUKcu >>288
FizzBuzzじゃなくてFizz Buzzが正しいんだとかそういうこと?
FizzBuzzじゃなくてFizz Buzzが正しいんだとかそういうこと?
291デフォルトの名無しさん
2026/08/18(火) 16:50:03.29ID:CwdGUKcu >>275
…はー…我慢!我慢!
…はー…我慢!我慢!
292デフォルトの名無しさん
2026/08/18(火) 17:04:30.03ID:mY9waEio もしかして頑張って書いてくれたんだ、ゴメンチャイ
293デフォルトの名無しさん
2026/08/18(火) 18:16:51.47ID:zZZZox/S wikipediaに仕様は書かれていないので、仕様は自分で書き起こすことになる。
そこでhttps://rosettacode.org/wiki/FizzBuzzあたりから仕様を持ってくる。
3の倍数のときはFizz、
5の倍数のときはBuzz、
3と5の倍数のときはFizzBuzz。
このルールの優先順位は不明だ。混乱する。
wikipediaではreplaceすることになっており、さらに混乱は増す。
3つ目のルールは1・2を前提にしておらず、仕様の変更によって別の文言になる可能性がある。
仕様の曖昧さとバージョンアップの可能性を、出題者に確認しないで作り進めた場合は、
0点だろう。
また、確認したら逆切れされた、とかいう場合は、その会社には行かない/やめることが重要だ笑。
そこでhttps://rosettacode.org/wiki/FizzBuzzあたりから仕様を持ってくる。
3の倍数のときはFizz、
5の倍数のときはBuzz、
3と5の倍数のときはFizzBuzz。
このルールの優先順位は不明だ。混乱する。
wikipediaではreplaceすることになっており、さらに混乱は増す。
3つ目のルールは1・2を前提にしておらず、仕様の変更によって別の文言になる可能性がある。
仕様の曖昧さとバージョンアップの可能性を、出題者に確認しないで作り進めた場合は、
0点だろう。
また、確認したら逆切れされた、とかいう場合は、その会社には行かない/やめることが重要だ笑。
294デフォルトの名無しさん
2026/08/18(火) 18:45:23.15ID:UHB640UT >>291
あのフリからのあのコードだから普通の人はネタだと分かるから心配しなさんな
あのフリからのあのコードだから普通の人はネタだと分かるから心配しなさんな
295デフォルトの名無しさん
2026/08/18(火) 19:03:06.87ID:mY9waEio >>293
かたいのはチンチンだけにした方がいいよ
かたいのはチンチンだけにした方がいいよ
296デフォルトの名無しさん
2026/08/18(火) 19:07:28.34ID:1F5abdGh >>278
関数分けされてないことだけが今回のコードの問題点だよ
少なくともテストができるように分離かな
テストではなくprintするだけにしてもメイン側に書いていいことは1から20までやprintのみ
関数分けされてないことだけが今回のコードの問題点だよ
少なくともテストができるように分離かな
テストではなくprintするだけにしてもメイン側に書いていいことは1から20までやprintのみ
297デフォルトの名無しさん
2026/08/18(火) 19:37:50.56ID:4nWkMale ネタで5chに晒すトイプログラムは、あれこれ欲張って機能付帯するよりエッセンスだけ凝縮したような物でいいと思うがな
極論だが、one linerでも話のネタになればそれでもいいんジャマイカと思う
極論だが、one linerでも話のネタになればそれでもいいんジャマイカと思う
298デフォルトの名無しさん
2026/08/18(火) 20:26:22.86ID:IKbB6EpN >>270は普通に書かれているだけでネタには全くなってない
299デフォルトの名無しさん
2026/08/18(火) 22:36:43.09ID:xbj6Xdrn >>295
そっちは硬くならない
そっちは硬くならない
300デフォルトの名無しさん
2026/08/19(水) 01:07:10.28ID:LbA7Fa3/ 結果だけなら無限ジェネレータ、イテレータ使うのがシンプルで無駄ないけど
初学者が分岐と文字列出力駆使してコーディングできるかのお題だから
経験者はあたたかくみまもるのが正解
初学者が分岐と文字列出力駆使してコーディングできるかのお題だから
経験者はあたたかくみまもるのが正解
301デフォルトの名無しさん
2026/08/19(水) 01:17:33.88ID:76BzD64w >>268
Rustはこんな感じ
use std::fmt;
struct FizzBuzz(usize);
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let fizz = self.0 % 3 == 0;
if fizz {
write!(f, "Fizz")?;
}
let buzz = self.0 % 5 == 0;
if buzz {
write!(f, "Buzz")?;
}
if !fizz && !buzz {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
Rustはこんな感じ
use std::fmt;
struct FizzBuzz(usize);
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let fizz = self.0 % 3 == 0;
if fizz {
write!(f, "Fizz")?;
}
let buzz = self.0 % 5 == 0;
if buzz {
write!(f, "Buzz")?;
}
if !fizz && !buzz {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
302デフォルトの名無しさん
2026/08/19(水) 05:08:00.70ID:jKqAYIeP use v5.26;
use feature 'signatures'; no warnings 'experimental::signatures';
# Y combinator
my $Y = sub ($f) {
(sub ($x) { $x->($x) })->(sub ($x) {
$f->(sub (@args) { $x->($x)->(@args) })
})
};
# generator
my $fizzbuzz_gen = sub ($recurse) {
sub ($n) {
return if $n > 20;
my $a = "";
$a = "fizz" if 0 == $n % 3;
$a .= "buzz" if 0 == $n % 5;
$a ||= $n;
print "$a\n";
$recurse->($n + 1);
}
};
$Y->($fizzbuzz_gen)->(1);
use feature 'signatures'; no warnings 'experimental::signatures';
# Y combinator
my $Y = sub ($f) {
(sub ($x) { $x->($x) })->(sub ($x) {
$f->(sub (@args) { $x->($x)->(@args) })
})
};
# generator
my $fizzbuzz_gen = sub ($recurse) {
sub ($n) {
return if $n > 20;
my $a = "";
$a = "fizz" if 0 == $n % 3;
$a .= "buzz" if 0 == $n % 5;
$a ||= $n;
print "$a\n";
$recurse->($n + 1);
}
};
$Y->($fizzbuzz_gen)->(1);
303デフォルトの名無しさん
2026/08/19(水) 05:27:50.54ID:jKqAYIeP use v5.26; use feature 'signatures'; no warnings 'experimental::signatures';
my $Y = sub($f){ (sub($x){ $x->($x) })->(sub($x){ $f->(sub(@a){ $x->($x)->(@a) }) }) };
$Y->(sub($r){ sub($n=20){
$n && $r->($n - 1) . print((('fizz')[$n%3].('buzz')[$n%5] || $n)."\n")
}})->();
my $Y = sub($f){ (sub($x){ $x->($x) })->(sub($x){ $f->(sub(@a){ $x->($x)->(@a) }) }) };
$Y->(sub($r){ sub($n=20){
$n && $r->($n - 1) . print((('fizz')[$n%3].('buzz')[$n%5] || $n)."\n")
}})->();
304デフォルトの名無しさん
2026/08/19(水) 05:53:05.29ID:jKqAYIeP >>299
添え木するか ト
添え木するか ト
305デフォルトの名無しさん
2026/08/19(水) 06:06:15.93ID:jKqAYIeP ttps://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF
306デフォルトの名無しさん
2026/08/19(水) 06:57:23.62ID:PkKxELQ5307デフォルトの名無しさん
2026/08/19(水) 09:25:42.01ID:zfDVRijx >>306
はよ
はよ
308デフォルトの名無しさん
2026/08/19(水) 09:26:57.21ID:AOQ3QAZ6309デフォルトの名無しさん
2026/08/19(水) 11:30:51.59ID:JEHGtM5b オブジェクト指向をバカにしてるやつ(≒苦手にしてるやつ)ほど役割分担下手だよな
310デフォルトの名無しさん
2026/08/19(水) 11:32:25.08ID:jKqAYIeP311デフォルトの名無しさん
2026/08/19(水) 12:47:31.88ID:6v15mJkM312デフォルトの名無しさん
2026/08/19(水) 13:00:20.84ID:IT0gHGzs313デフォルトの名無しさん
2026/08/19(水) 13:13:14.33ID:Wk2G6dYo314デフォルトの名無しさん
2026/08/19(水) 13:25:34.76ID:DVblsqcj315デフォルトの名無しさん
2026/08/19(水) 14:46:16.71ID:zfDVRijx316デフォルトの名無しさん
2026/08/19(水) 15:09:53.60ID:clBhGGD3 >>313
煽られただけだと思うよ
煽られただけだと思うよ
317デフォルトの名無しさん
2026/08/19(水) 16:47:55.93ID:GgmociGN やるとしたらfmt::Displayの実装とFizzBuzz判定の実装を別々に分担するくらいか?
あと個人的にはifじゃなくてmatchでよくね?と
あと個人的にはifじゃなくてmatchでよくね?と
318デフォルトの名無しさん
2026/08/19(水) 17:22:08.92ID:76BzD64w >>301は最小限のコードを書いたので
もう少しFizzBuzzオブジェクトに肉付けすると
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct FizzBuzz(usize);
impl FizzBuzz {
fn is_fizz(&self) -> bool {
self.0 % 3 == 0
}
fn is_buzz(&self) -> bool {
self.0 % 5 == 0
}
fn iter() -> impl Iterator<Item = FizzBuzz> {
(1..).map(|x| FizzBuzz(x))
}
}
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.is_fizz() {
write!(f, "Fizz")?;
}
if self.is_buzz() {
write!(f, "Buzz")?;
}
if !self.is_fizz() && !self.is_buzz() {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
もう少しFizzBuzzオブジェクトに肉付けすると
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct FizzBuzz(usize);
impl FizzBuzz {
fn is_fizz(&self) -> bool {
self.0 % 3 == 0
}
fn is_buzz(&self) -> bool {
self.0 % 5 == 0
}
fn iter() -> impl Iterator<Item = FizzBuzz> {
(1..).map(|x| FizzBuzz(x))
}
}
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.is_fizz() {
write!(f, "Fizz")?;
}
if self.is_buzz() {
write!(f, "Buzz")?;
}
if !self.is_fizz() && !self.is_buzz() {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
319デフォルトの名無しさん
2026/08/19(水) 17:27:41.72ID:76BzD64w320デフォルトの名無しさん
2026/08/19(水) 17:35:12.55ID:1B1Sgr4M // java21, import略, rosettacodeの仕様による。3と5の倍数の場合、3や5のwordと関係ないものとみなして独立。改行詰め,、改行が多いだと!
public class FizzBuzz {
private static final int IntMin = 1;
private static final int IntMaxClosed = 100;
private static final String Fizz = "Fizz";
private static final String Buzz = "Buzz";
private static final String FizzBuzz = "FizzBuzz";
private static final BigInteger bigInteger15 = BigInteger.valueOf(15);
private final int value;
private FizzBuzz(int value) { this.value = value; }
static Stream<FizzBuzz> generator() {
return IntStream.rangeClosed(IntMin, IntMaxClosed).mapToObj(FizzBuzz::new);
}
int gcd15() {
return BigInteger.valueOf(value).gcd(bigInteger15).intValue();
}
String toText() {
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
}
@Override
public String toString() { return Integer.toString(value); }
public static void main(String[] args) { generator().map(fb -> fb.toText()).forEach(System.out::println); }
}
public class FizzBuzz {
private static final int IntMin = 1;
private static final int IntMaxClosed = 100;
private static final String Fizz = "Fizz";
private static final String Buzz = "Buzz";
private static final String FizzBuzz = "FizzBuzz";
private static final BigInteger bigInteger15 = BigInteger.valueOf(15);
private final int value;
private FizzBuzz(int value) { this.value = value; }
static Stream<FizzBuzz> generator() {
return IntStream.rangeClosed(IntMin, IntMaxClosed).mapToObj(FizzBuzz::new);
}
int gcd15() {
return BigInteger.valueOf(value).gcd(bigInteger15).intValue();
}
String toText() {
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
}
@Override
public String toString() { return Integer.toString(value); }
public static void main(String[] args) { generator().map(fb -> fb.toText()).forEach(System.out::println); }
}
321デフォルトの名無しさん
2026/08/19(水) 18:32:05.09ID:h5yOG9hX これは想定外の重症度
汚コード複製おじさん酷すぎだろ
汚コード複製おじさん酷すぎだろ
322デフォルトの名無しさん
2026/08/19(水) 19:33:00.25ID:1B1Sgr4M immutableなclassとstreamでmonadicに、各methodは1行の式とした例。
改行制限と空白制限で、ちょっとおかしな表記になっている。
改行制限と空白制限で、ちょっとおかしな表記になっている。
323デフォルトの名無しさん
2026/08/19(水) 19:34:16.89ID:HQ3bB/34324デフォルトの名無しさん
2026/08/19(水) 19:40:28.85ID:1B1Sgr4M くすくす。仕様を満たすためだよ。
325デフォルトの名無しさん
2026/08/19(水) 19:48:00.60ID:yaDN1rR6 ここはオブジェクト指向でFizzBuzzを書くとどうなるかの話だよな
class FizzBuzzに属するものと外部のものを分けないとな
class FizzBuzzに属するものと外部のものを分けないとな
326デフォルトの名無しさん
2026/08/19(水) 20:06:36.33ID:1B1Sgr4M generator込みの完結したclassだがね。UnitTestにも対応してるし。
プログラム書いたことある?
プログラム書いたことある?
327デフォルトの名無しさん
2026/08/19(水) 20:31:50.49ID:xLZSPR7N328デフォルトの名無しさん
2026/08/19(水) 20:47:05.92ID:gE5f7kH9 糞言語ってことよ
329デフォルトの名無しさん
2026/08/19(水) 22:27:30.40ID:KYbvI00a >>320はgcd最大公約数を求めてるけど
その方が速いとか有利とか何かあるの?
その方が速いとか有利とか何かあるの?
330デフォルトの名無しさん
2026/08/19(水) 22:31:51.05ID:1B1Sgr4M https://paiza.io/projects/zW-QQAk1SV2qaU7Iv3Kqtw
FizzBuzz classがMain classになっちゃったけど、しかたない。
最大公約数で扱ったほうが楽だし、意味的にはGCD使ったほうが正しい。
FizzBuzz classがMain classになっちゃったけど、しかたない。
最大公約数で扱ったほうが楽だし、意味的にはGCD使ったほうが正しい。
331デフォルトの名無しさん
2026/08/19(水) 22:41:50.65ID:1B1Sgr4M generator().map(fb -> fb.toText()).forEach(System.out::println);
generator()で発生させたFizzBuzz(Main)オブジェクトをtoText()してprintlnの関手を与える。
ただそれだけ。
toText()は15とのGCD取って、結果でFizz,Buzz,FizzBuzz,その他の文字列を返すだけ。
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
generator()で発生させたFizzBuzz(Main)オブジェクトをtoText()してprintlnの関手を与える。
ただそれだけ。
toText()は15とのGCD取って、結果でFizz,Buzz,FizzBuzz,その他の文字列を返すだけ。
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
332デフォルトの名無しさん
2026/08/19(水) 22:58:17.52ID:Oc+7d+Ap >>330
class Mainとclass FizzBuzzに分けようぜ
class Mainとclass FizzBuzzに分けようぜ
333デフォルトの名無しさん
2026/08/19(水) 23:06:14.82ID:1B1Sgr4M plaza.ioは複数class書けるね。しばらくはこれを使おう。java18らしいし。
でも、本来はclass FizzBuzzひとつのオブジェクト指向の例なので、
MainはFizzBuzzに読み替えてほしい。
でも、本来はclass FizzBuzzひとつのオブジェクト指向の例なので、
MainはFizzBuzzに読み替えてほしい。
334デフォルトの名無しさん
2026/08/19(水) 23:32:28.93ID:DVblsqcj 1文字でFizzBuzz解ける言語があるらしいな
335デフォルトの名無しさん
2026/08/19(水) 23:59:25.63ID:iJ3dDJMB >>330
意味的にGCDを使うのは間違っている
さらにGCDは計算時間がかかり不利だ
途中で除数が定数でなくなるためDIV命令が必要になるためだ
普通に3で割る余りと5で割る余りの計算ならDIV命令が不要で速い
意味的にGCDを使うのは間違っている
さらにGCDは計算時間がかかり不利だ
途中で除数が定数でなくなるためDIV命令が必要になるためだ
普通に3で割る余りと5で割る余りの計算ならDIV命令が不要で速い
336デフォルトの名無しさん
2026/08/20(木) 00:06:45.18ID:QLX9OLVH 定数で割った時の余りは掛け算とシフトと引き算で済むから速いんだよな
337デフォルトの名無しさん
2026/08/20(木) 00:21:35.93ID:IBxNVMcV DIV命令? あったっけ?
338デフォルトの名無しさん
2026/08/20(木) 00:47:45.39ID:IBxNVMcV めんどくさいのでBigInteger#gcd(BigInteger)使ってるけど、
15とのGCDで3,5,15の判定だけなので自作すればもっと速いだろう。しかし、速さの指定は仕様にない。
意味的には15との最大公約数で振り分ける。保守しやすい。
if文が2つ以上あるとバグが出やすくなる笑。
15とのGCDで3,5,15の判定だけなので自作すればもっと速いだろう。しかし、速さの指定は仕様にない。
意味的には15との最大公約数で振り分ける。保守しやすい。
if文が2つ以上あるとバグが出やすくなる笑。
339デフォルトの名無しさん
2026/08/20(木) 00:56:39.43ID:QLX9OLVH CPUの割り算命令DIVは遅いんだよ
ただし定数での割り算は掛け算とシフトで代替できるから速い
ただし定数での割り算は掛け算とシフトで代替できるから速い
340デフォルトの名無しさん
2026/08/20(木) 01:32:57.14ID:ijUJjMtb その前にだな、
まともに見れるコードも書けんくせに
オブジェ指向で蘊蓄垂れていたのか君らは
まともに見れるコードも書けんくせに
オブジェ指向で蘊蓄垂れていたのか君らは
341デフォルトの名無しさん
2026/08/20(木) 01:36:09.50ID:IBxNVMcV GCDアルゴリズム実装ではなくCPUのDIVの話ね。
アルゴリズムならマルチコア上で速そうなのを考えてみよう。少しだけ思いついたので。
アルゴリズムならマルチコア上で速そうなのを考えてみよう。少しだけ思いついたので。
342デフォルトの名無しさん
2026/08/20(木) 01:56:28.80ID:aOa274Oy343デフォルトの名無しさん
2026/08/20(木) 02:00:43.32ID:aOa274Oy compactの前に.lazyわすれた
遅くなるけど概念的にそうしたい
遅くなるけど概念的にそうしたい
344デフォルトの名無しさん
2026/08/20(木) 03:02:21.65ID:PMhZJhSw FizzBuzzのように定数で割る時
商は魔法により掛け算とシフトで求まる
余りはさらに商に掛け直して元から引き算で求まる
ところがだ
FizzBuzzで余りを求める必要ないのだ
余りが0かどうか判ればいい
強力な魔法を使うと掛け算と比較で求まる
商は魔法により掛け算とシフトで求まる
余りはさらに商に掛け直して元から引き算で求まる
ところがだ
FizzBuzzで余りを求める必要ないのだ
余りが0かどうか判ればいい
強力な魔法を使うと掛け算と比較で求まる
345デフォルトの名無しさん
2026/08/20(木) 03:19:24.13ID:PMhZJhSw Fizz判定は x % 3 == 0 が真かどうか
xがeaxレジスタに入っている時
imul eax, -1431655765
cmp eax, 1431655766
この結果CFフラグ=1ならFizzだとわかる
強力な魔法のおかげで実は速い
xがeaxレジスタに入っている時
imul eax, -1431655765
cmp eax, 1431655766
この結果CFフラグ=1ならFizzだとわかる
強力な魔法のおかげで実は速い
346デフォルトの名無しさん
2026/08/20(木) 08:18:28.31ID:kHN2H/5S347デフォルトの名無しさん
2026/08/20(木) 09:08:56.05ID:q4+A3WuM オブジェクト指向じゃないほうがシンプルに作れるものを
オブジェクト指向で作ろうとするのは無駄でしかなく、オブジェクト指向の啓蒙にはならない
オブジェクト指向で作ろうとするのは無駄でしかなく、オブジェクト指向の啓蒙にはならない
348デフォルトの名無しさん
2026/08/20(木) 09:32:50.30ID:o7Pb5BUg AI時代に最適な言語とは
349デフォルトの名無しさん
2026/08/20(木) 09:39:55.23ID:m8+NKV8o >>348
英語、次点で日本語
英語、次点で日本語
350デフォルトの名無しさん
2026/08/20(木) 11:01:49.24ID:o7Pb5BUg 日本語は文字圧縮率高いからAIに向いてるよな
351デフォルトの名無しさん
2026/08/20(木) 12:05:54.04ID:vH5dPVEC >>350
向いてない
対AIの情報圧縮率は情報量/文字数じゃなくて情報量/トークン数なので日本語の情報圧縮率はむしろ低い
日本語に最適化された生成AIが出てきたとしても今の汎用生成AIで英語を使うのと同じレベルにはまずならない
ちなみに文字数ベースの情報圧縮率で言えば日本語より中国語のほうが上
向いてない
対AIの情報圧縮率は情報量/文字数じゃなくて情報量/トークン数なので日本語の情報圧縮率はむしろ低い
日本語に最適化された生成AIが出てきたとしても今の汎用生成AIで英語を使うのと同じレベルにはまずならない
ちなみに文字数ベースの情報圧縮率で言えば日本語より中国語のほうが上
352デフォルトの名無しさん
2026/08/20(木) 13:24:05.04ID:q4+A3WuM 言語ってやれることに縛りがないマシン語一択よ
353デフォルトの名無しさん
2026/08/20(木) 13:47:22.14ID:m8+NKV8o バイナリなんて扱いが面倒で
しかもCPUやOSによって全く使い物にならないから
それだけは無い
しかもCPUやOSによって全く使い物にならないから
それだけは無い
354デフォルトの名無しさん
2026/08/20(木) 14:18:30.50ID:s0ayJ18Z >>345
余りで場合分けしたりGCD求めるより素直に判定する方がええんか
余りで場合分けしたりGCD求めるより素直に判定する方がええんか
355デフォルトの名無しさん
2026/08/20(木) 16:44:10.19ID:qoBWelP1356デフォルトの名無しさん
2026/08/20(木) 16:59:35.71ID:Q5WTv99g 「FizzBuzzのプログラム書いて」の指示だけで済むのになに前時代的なことやってんの?www
357デフォルトの名無しさん
2026/08/20(木) 17:01:53.34ID:Z7Wddxg2 >>355
コンパイラは賢いから最適化するだろ
コンパイラは賢いから最適化するだろ
358デフォルトの名無しさん
2026/08/20(木) 19:35:41.56ID:v7D8p6Cq >>348
仕様そのものを検証できるプログラミング言語じゃない?
今までは人間が実装を書いてコンパイラに文法や型を検証させてたけどAIの能力が上がってからは人間が契約をまとめた仕様をAIに掲示してAIが実装するようになったからね
言うなれば人間が契約を所有しAIが実装を所有し検証器が両者の関係を所有する言語かな
気になって調べてみたらRustとVerusによる言語の二層化とかあるみたいね
仕様そのものを検証できるプログラミング言語じゃない?
今までは人間が実装を書いてコンパイラに文法や型を検証させてたけどAIの能力が上がってからは人間が契約をまとめた仕様をAIに掲示してAIが実装するようになったからね
言うなれば人間が契約を所有しAIが実装を所有し検証器が両者の関係を所有する言語かな
気になって調べてみたらRustとVerusによる言語の二層化とかあるみたいね
359デフォルトの名無しさん
2026/08/20(木) 19:40:52.66ID:IBxNVMcV >>346
まあ、モナドではあるが、厳密なモナド則には従わない。
と、思ったのですが、この限定的な状況では、モナド則を満たしていました。
また、そりゃ、void main(String[])内で、ベタに手続き型で書けば速いわけですが、
15と固定でGCDを作ってみたら、同じ速さになりました。手動展開するとベタなものと同じです。
オブジェクト指向設計の形式は同じとして計測。
まあ、モナドではあるが、厳密なモナド則には従わない。
と、思ったのですが、この限定的な状況では、モナド則を満たしていました。
また、そりゃ、void main(String[])内で、ベタに手続き型で書けば速いわけですが、
15と固定でGCDを作ってみたら、同じ速さになりました。手動展開するとベタなものと同じです。
オブジェクト指向設計の形式は同じとして計測。
360デフォルトの名無しさん
2026/08/20(木) 19:43:41.33ID:v7D8p6Cq >>356
trait implをあえて使うとそうなるっていう説明用サンプルじゃないの
trait implをあえて使うとそうなるっていう説明用サンプルじゃないの
361デフォルトの名無しさん
2026/08/20(木) 21:03:19.48ID:kHN2H/5S >>359
いやー俺も圏論詳しくないけど
君が言ってることはデタラメすぎる気がする
mapはただのファンクターじゃん
ファンクターとモナドは違うよね
モナドはflatMapの方だよ
圏論的構造のことをモナドと言ってる?
モナディックではなくてモナドチックってこと?
乙女チックみたいな話?
それならわかる
いやー俺も圏論詳しくないけど
君が言ってることはデタラメすぎる気がする
mapはただのファンクターじゃん
ファンクターとモナドは違うよね
モナドはflatMapの方だよ
圏論的構造のことをモナドと言ってる?
モナディックではなくてモナドチックってこと?
乙女チックみたいな話?
それならわかる
362デフォルトの名無しさん
2026/08/20(木) 21:48:07.29ID:kHN2H/5S 見せてやるよ、本物のモナドの力ってやつをな
C#
foreach (var i in Enumerable.Range(1, 100)) {
(int i, string s)[] ms = [
(3, "Fizz"),
(5, "Buzz"),
(7, "Pop"),
(11, "Jazz"),
(13, "Rock")
];
var s = string.Concat(ms
.SelectMany(m => i % m.i == 0 ? new[] { m.s } : [])
.DefaultIfEmpty(i.ToString()));
Console.WriteLine(s);
}
SelectManyがモナドです
ご清聴ありがとうございました
C#
foreach (var i in Enumerable.Range(1, 100)) {
(int i, string s)[] ms = [
(3, "Fizz"),
(5, "Buzz"),
(7, "Pop"),
(11, "Jazz"),
(13, "Rock")
];
var s = string.Concat(ms
.SelectMany(m => i % m.i == 0 ? new[] { m.s } : [])
.DefaultIfEmpty(i.ToString()));
Console.WriteLine(s);
}
SelectManyがモナドです
ご清聴ありがとうございました
363デフォルトの名無しさん
2026/08/20(木) 22:16:51.48ID:C4aTds+L error: Unexpected symbol `['
364デフォルトの名無しさん
2026/08/20(木) 22:20:08.69ID:IBxNVMcV >>361
モナドですけど何か?
モナドですけど何か?
365デフォルトの名無しさん
2026/08/20(木) 22:57:28.02ID:vi4f/pAg366デフォルトの名無しさん
2026/08/20(木) 23:13:28.71ID:z4h/0sw5367デフォルトの名無しさん
2026/08/20(木) 23:52:42.25ID:h+f/dAtq >>362の無能さは(1, 100)でよくわかる
100にするなら少なくともそこは105だろ
100にするなら少なくともそこは105だろ
368デフォルトの名無しさん
2026/08/21(金) 00:12:08.26ID:Gi1J9j3d >>364
違うと思うけど明日AIに聞いてみるわ、お休みモナ
違うと思うけど明日AIに聞いてみるわ、お休みモナ
369デフォルトの名無しさん
2026/08/21(金) 05:47:35.54ID:beX5364R >>362
生成AI製か
生成AI製か
370デフォルトの名無しさん
2026/08/21(金) 10:51:05.66ID:I6E5haBJ >>368
引っかかってるのはIEnumerable<T>やStream<T>がモナドかどうかではなく
それらがモナドとして使われてない処理をモナディックと言うかどうかでしょ?
俺は言わないと思うけど言う人がいてもその違いが重要じゃない限りスルーする
引っかかってるのはIEnumerable<T>やStream<T>がモナドかどうかではなく
それらがモナドとして使われてない処理をモナディックと言うかどうかでしょ?
俺は言わないと思うけど言う人がいてもその違いが重要じゃない限りスルーする
371デフォルトの名無しさん
2026/08/21(金) 11:31:05.64ID:Gi1J9j3d >>364
> モナドですけど何か?
AIに聞いてみたけど >>320 は値オブジェクトでStreamを使ってるだけでモナドではないそうだよ
全文はこちら
https://chatgpt.com/share/6a87b6cf-2020-83ee-b07e-f2e91e706ada
>>359
> モナド則を満たしていました
これも偽だよ
> モナドですけど何か?
AIに聞いてみたけど >>320 は値オブジェクトでStreamを使ってるだけでモナドではないそうだよ
全文はこちら
https://chatgpt.com/share/6a87b6cf-2020-83ee-b07e-f2e91e706ada
>>359
> モナド則を満たしていました
これも偽だよ
372デフォルトの名無しさん
2026/08/21(金) 11:47:36.75ID:Gi1J9j3d373デフォルトの名無しさん
2026/08/21(金) 11:48:44.92ID:ZIDlXGUM ( ´∀`)
374デフォルトの名無しさん
2026/08/21(金) 12:29:56.97ID:2CvgJbgX >>372
Functor, Applicative は合成も Functor, Applicative になるけど, Monad は閉じてない.
他言語知らぬが, Haskell では少なくともそう.
Functor, Applicative は合成も Functor, Applicative になるけど, Monad は閉じてない.
他言語知らぬが, Haskell では少なくともそう.
375デフォルトの名無しさん
2026/08/21(金) 12:58:18.07ID:r0Io5phJ >>371
モナドですけど何か?
モナドですけど何か?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【X】高市首相、米兵逮捕「極めて遺憾」 [少考さん★]
- 「運動音痴にとって、体育の授業は『公開処刑』」 運動嫌いを生みだす日本の教育の問題点★2 [征夷大将軍★]
- 「日本は刑罰が緩いと聞いた」と供述 中野2億円腕時計窃盗事件 チリ国籍の男2人再逮捕 [♪♪♪★]
- 夫婦の性行為は義務なのか 「したくない」と言ったら?法学者の見解 [おっさん友の会★]
- 4歳児ママ福田典子アナ ベビーカーでエレベーター→20代女性の「あまりにも無神経」「謝るくらいはするべきじゃ?」お説教 [muffin★]
- 【速報】高市首相の「寝てない」にSNS賛否「命がけで頑張っている」「アピールはもうけっこう」 海外メディアも注目 (共同通信) [少考さん★]
- 日本料理、アジアで一番不味いとの評価頂く。→日本人なぜか発狂 [668024367]
- ラメーンたえたい(´・ω・`)
- エッヂの認証できない人あつまれ~🙋🏡
- 



ハズレのお🏡




- 【動画あり】亜月ねね宅前?で街宣していた男性と撮影者、張っていたポリスに「110番通報があったからやめて」「わかった?」と制止さる [762037879]
- ZARD「負けんな」