探検


オブジェクト指向はオワコン? part3

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2026/08/26(水) 11:55:23.86ID:JrGcaWVK
過去スレ
オブジェクト指向はオワコン (2023/08/26~)
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
オブジェクト指向はオワコン? (2024/07/19~)
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
オブジェクト指向はオワコン? part2 (2026/08/13~)
https://mevius.5ch.io/test/read.cgi/tech/1786599483/
2デフォルトの名無しさん
垢版 |
2026/08/26(水) 11:58:05.83ID:sdi3yqbK
>>1乙
3デフォルトの名無しさん
垢版 |
2026/08/26(水) 12:01:22.50ID:JrGcaWVK
訂正
オブジェクト指向はオワコン (2023/08/26~)
https://itest.5ch.net/mevius/test/read.cgi/tech/1693054853
4デフォルトの名無しさん
垢版 |
2026/08/26(水) 15:38:25.94ID:UKAdFl7a
このスレ要るか?
2026/08/26(水) 21:29:21.56ID:g57AhbG+
use feature 'current_sub';
@a = map{[split]} <DATA>;
($m, $n) = (20, 1);
sub {
 $s = '';
 map{0 == $n % $$_[0] and $s .= $$_[1]} @a;
 $s ||= $n;
 print "$s\n";
 $n++, goto __SUB__ if $n < $m;
}->(1);
__DATA__
3 fizz
5 buzz
7 Pop
11 Jazz


注) Perl の「goto 関数」は continuation
2026/08/26(水) 21:47:43.21ID:eZJQS97n
>>https://mevius.5ch.io/test/read.cgi/tech/1786599483/599 ocaml
https://ideone.com/eaBULr
・Java版のRuby移植のOCaml移植
・連結済文字列じゃなくて、文字列のリストを返すようにしたのは単に気まぐれ
 "FizzBuzz"じゃなくて["Fizz"; "Buzz"]を返してる

>>https://mevius.5ch.io/test/read.cgi/tech/1786599483/599 ocaml
https://ideone.com/Q1I3uT
・Woofの303がFizzFizzFizz版
・String.fold_leftは4.13以降
・今のideoneは OCaml (ocamlopt 4.05.0)
2026/08/26(水) 23:18:18.65ID:g57AhbG+
>>5
}->(1);
は1イラネ
}->();
でおk
2026/08/27(木) 02:59:48.53ID:mXhKqiYf
>>5
お題がFizzBuzzのバリエーション6種類に対応できるコードを実装に変わってるよ
バリエーションに対応できつつコードの共通化で6倍のコードになるのを防ぐ感じ
2026/08/27(木) 03:28:54.64ID:2duuU1zk
対応すべきバリエーションはこれらしい
https://xapn.github.io/fizz-buzz/#fizz-buzz-variations
従来の割れるか classic
文字列化して含むか digits
割れるか含むか boom
割れると含む回数 woof
7と11を加えた popwhack
7,8,11,13を加えた zingchop
2026/08/27(木) 04:52:02.85ID:ZLNF9QnK
最大公約数の人がピンチ
2026/08/27(木) 05:24:18.52ID:ZLNF9QnK
120120通りの表を作れば行けるはず
12デフォルトの名無しさん
垢版 |
2026/08/27(木) 08:57:42.39ID:cR01dGum
場のオブジェクト指向おじさん星になる
2026/08/27(木) 14:06:06.68ID:MPTEZ6Aa
バリエーションと圏論は相性良さそうな気がするけど出て来ないね
2026/08/27(木) 15:22:19.20ID:zRz8ZAFs
最小限の射へ分解
2026/08/27(木) 18:36:24.91ID:690S30xg
なんだろうね、素数だから数学的におもしろかったのに、
割れると含むとか入ってきて、
さらに8ってのはどこからでてきたものなんだか、2^3ということかな?
「場のオブジェクト指向」では、すべが計算済の「場」とするので、
どうやるかは量子計算での加法の扱いにかかってくる。考え中。まあ、
できたらフィールズとかノーベルとかのレベルだから考えて楽しんでいるだけ笑。
問題は、場の量子論で「加法」をどのようなものとして扱うか、ということ。
2026/08/27(木) 18:40:27.89ID:orbJGS24
>>15
zingchopで8で割り切れる時を扱わなければいけなくなって場のオブジェクト指向は破綻したのか~
2026/08/27(木) 18:54:44.95ID:690S30xg
場のオブジェクト指向は考え中のものだから、破綻はしていない、むしろ、
今回のようなルールが無限に増える場合に対応するものとして構想している。
ルールに割れるだけはなく、含むが加わった。
しかも、どうやら指数すらも含まれるような感じ。
自然数を表現可能なすべての表記が入るのだろう。n進数も。
自然数限定だが表現論の問題になっている。
2026/08/27(木) 19:02:05.64ID:D3cdieEZ
>>17
「含む」は10進数で表現した時すなわち文字列化した時に含まれるかどうかが今回の仕様だね
人間が扱う自然な仕様は10進数だけだろうけど
2026/08/27(木) 19:52:18.64ID:oWHoRr+4
>>9
ざっと縦読み目を通したけどmethoc chainで呼んだ場合の処理とカ書いてあって
結局、各方式ごとの関数なりmethodが要るってことになるし
昨日関数間でコードの共通化できるとことはあんまりない感じだな
2026/08/27(木) 19:55:08.94ID:Fm6ww48Z
今回の件は全体が見やすいように3つの部分に分けるとプログラムはこれだけだね
type Count = fn(usize, usize) -> usize;
const DIV: Count = |t, n| (t % n == 0) as usize;
const IN: Count = |t, n| t.to_string().contains(&n.to_string()) as usize;
const DIV_OR_IN: Count = |t, n| (t % n == 0 || t.to_string().contains(&n.to_string())) as usize;
const DIV_AND_MULTI_IN: Count = |t, n| (t % n == 0) as usize + t.to_string().split(&n.to_string()).count() - 1;

type Rule<'a> = (Count, &'a[(usize, &'a str)]);
const CLASSIC: Rule = (DIV, &[(3, "Fizz"), (5, "Buzz")]);
const DIGITS: Rule = (IN, &[(3, "Fizz"), (5, "Buzz")]);
const BOOM: Rule = (DIV_OR_IN, &[(3, "Fizz"), (5, "Buzz"), (7, "Boom")]);
const WOOF: Rule = (DIV_AND_MULTI_IN, &[(3, "Fizz"), (5, "Buzz"), (7, "Woof")]);
const POP_WHACK: Rule = (DIV, &[(3, "Fizz"), (5, "Buzz"), (7, "Pop"), (11, "Whack")]);
const ZING_CHOP: Rule = (DIV, &[(3, "Fizz"), (5, "Buzz"), (7, "Pop"), (8, "Zing"), (11, "Whack"), (13, "Chop")]);

struct FizzBuzz<'a>(usize, Rule<'a>);
impl<'a> std::fmt::Display for FizzBuzz<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let FizzBuzz(target, (count, list)) = self;
let mut is_done = false;
for &(number, name) in *list {
for _ in 0..count(*target, number) {
f.write_str(name)?;
is_done = true;
}
}
if !is_done {
write!(f, "{target}")?;
}
Ok(())
}
}
2026/08/27(木) 19:57:41.36ID:B+aurL2q
>>20のプログラムの検証
他のプログラムが通してる事例を参考にしました

fn main() {
use itertools::Itertools;
assert_eq!((1..=15).map(|t| FizzBuzz(t, CLASSIC)).join(" "),
"1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz");
assert_eq!((1..=15).map(|t| FizzBuzz(t, DIGITS)).join(" "),
"1 2 Fizz 4 Buzz 6 7 8 9 10 11 12 Fizz 14 Buzz");
assert_eq!(FizzBuzz(35, DIGITS).to_string(), "FizzBuzz");
assert_eq!((1..=15).map(|t| FizzBuzz(t, BOOM)).join(" "),
"1 2 Fizz 4 Buzz Fizz Boom 8 Fizz Buzz 11 Fizz Fizz Boom FizzBuzz");
assert_eq!(FizzBuzz(7539, BOOM).to_string(), "FizzBuzzBoom");
assert_eq!((1..=15).map(|t| FizzBuzz(t, WOOF)).join(" "),
"1 2 FizzFizz 4 BuzzBuzz Fizz WoofWoof 8 Fizz Buzz 11 Fizz Fizz Woof FizzBuzzBuzz");
assert_eq!(FizzBuzz(35, WOOF).to_string(), "FizzBuzzBuzzWoof");
assert_eq!(FizzBuzz(303, WOOF).to_string(), "FizzFizzFizz");
assert_eq!((1..=15).map(|t| FizzBuzz(t, POP_WHACK)).join(" "),
"1 2 Fizz 4 Buzz Fizz Pop 8 Fizz Buzz Whack Fizz 13 Pop FizzBuzz");
assert_eq!(FizzBuzz(1155, POP_WHACK).to_string(), "FizzBuzzPopWhack");
assert_eq!((1..=15).map(|t| FizzBuzz(t, ZING_CHOP)).join(" "),
"1 2 Fizz 4 Buzz Fizz Pop Zing Fizz Buzz Whack Fizz Chop Pop FizzBuzz");
assert_eq!(FizzBuzz(120120, ZING_CHOP).to_string(), "FizzBuzzPopZingWhackChop");
}
2026/08/27(木) 20:04:52.73ID:B+aurL2q
なぜかIDが変わってるけど
>>20の検証部分が>>21ね
2026/08/27(木) 20:07:16.28ID:B+aurL2q
>>19
それは仕様を言葉で説明すると曖昧になりやすいからの理由でしょう
その通りのまま実装してる人は誰もいないから大丈夫だよ
2026/08/27(木) 21:26:28.84ID:8QFJ8g/P
結局ルール辞書作ってぶん回すだけ
2026/08/27(木) 21:44:42.61ID:jj+fH9nA
>>24
ルール辞書の作り方や構造が難問
様々な問題に対して自動的に汎化させることは難しい
2026/08/27(木) 22:15:46.22ID:5F56ltBp
>>9 ocaml
https://ideone.com/iRLbSx
・>>6から若干の改善
・判定につかってたcontains,countの実装が簡易的だったので整数比較版に差し替え
・結果のリストに対するinspect関数つくっといた
 to_s関数を`List xsに対応させてみたりしたけどなんか使い勝手が悪かったのでこっちにした
2026/08/27(木) 23:10:16.64ID:JGcFzlP+
もしやこのコードは

>>26
let count m n =
let m, n = abs m, abs n in
let d = if n = 0 then 10 else int_of_float (10. ** (1.0 +. (floor (log10 (float_of_int n))))) in
let rec aux acc = function
0 -> acc
| m -> aux (if m mod d = n then acc + 1 else acc) (m / 10)
in if m = n then 1 else aux 0 m
let contains m n = 0 < count m n
2026/08/28(金) 00:57:49.88ID:JtiuId7a
今のところ前スレ>>938が一番まともやな
変換辞書と変換ロジックのセットとして扱ってればなお良かった

にしても不必要なcount変数やflag変数を導入するやつとか
ToString()にドメインロジックを全部突っ込むやつとか
おかしなやつが多いな
2026/08/28(金) 01:03:24.74ID:G07hbVrD
938を見たら145行もあった
動作確認printしてるmain関数8行を除いても130行以上ある
2026/08/28(金) 01:14:03.41ID:V1qxHZLT
行数が多いとその分稼げるから
2026/08/28(金) 01:54:07.21ID:ejEAHwUa
>>28
これは文字列化する課題だよね
みんなが文字列化の関数にドメインロジックを書いているのは当たり前だと思いますが
32デフォルトの名無しさん
垢版 |
2026/08/28(金) 10:59:36.72ID:vRP1YcXq
>>20
これはRust? OCamlかと思った
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況