[過去ログ]
Perlについての質問箱 64箱目 (1002レス)
Perlについての質問箱 64箱目 http://mevius.5ch.net/test/read.cgi/tech/1548981877/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
836: デフォルトの名無しさん [sage] 2020/12/09(水) 08:45:38.11 ID:UMU4oc+t それで書けるなら、sort { } でも書けるよね http://mevius.5ch.net/test/read.cgi/tech/1548981877/836
837: デフォルトの名無しさん [sage] 2020/12/09(水) 09:35:02.27 ID:sn/SI4a+ >>833 こんな感じかな。デバッグはしていないが。 @newlist = sort compare @oldlist; sub compare{ my ($ap, $bp) = @_; ($ap1, $ap2) = $ap=~/([0-9]+)\-([0-9]+)/; ($bp1, $bp2) = $bp=~/([0-9]+)\-([0-9]+)/; return 1 if $ap1 > $bp1 return -1 if $ap1 < $bp1 # $ap1 == $bp1; return 1 if $ap2 > $bp2; return -1; } http://mevius.5ch.net/test/read.cgi/tech/1548981877/837
838: デフォルトの名無しさん [sage] 2020/12/09(水) 10:27:05.71 ID:LWKBPFtb >>836,>>837 それだと、要素の比較のたびに、値の変換処理が行われる。 比較は何度も行われるため、変換処理が軽くない場合、ソート全体としてかなり重くなりうる。 すくなくとも「スマート」とは言えない。 そこで、変換結果をキャッシュするような形になるのがシュワルツ変換。 知らんならググれ。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/838
839: デフォルトの名無しさん [sage] 2020/12/09(水) 10:46:35.52 ID:zREBomTd sort { s1($a) <=> s1($b) } keys %x; sub s1 { shift =~ /(¥d+)-(¥d+)/ && 100*$1+$2 } sortならこんなかんじ http://mevius.5ch.net/test/read.cgi/tech/1548981877/839
840: デフォルトの名無しさん [sage] 2020/12/09(水) 10:47:56.70 ID:UMU4oc+t 順番が変わるだけで処理量は変わらんでしょう どっちにしろ重い 次にソートする時はソート対象が変わっているんだから、キャッシュできない 有効な局面もあるんだろうけど、今回に関してはトリッキーなだけでメリットがない http://mevius.5ch.net/test/read.cgi/tech/1548981877/840
841: デフォルトの名無しさん [sage] 2020/12/09(水) 10:51:05.82 ID:UMU4oc+t 次のソートじゃなくて、1回のソート内部の複数の比較に対してか あー、確かに速くなりそうな気がする 処理系が気を利かせて変わらない気もする http://mevius.5ch.net/test/read.cgi/tech/1548981877/841
842: デフォルトの名無しさん [sage] 2020/12/09(水) 11:29:48.25 ID:LWKBPFtb >>841 ソートの内部処理が想像できんのか? もとの並び方にはよるが、ふつうは大きく異なる。 「処理系」とやらが気を利かせられる範疇ではない。 比較処理にsayでもいれて試してみろっつーんだよ。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/842
843: デフォルトの名無しさん [sage] 2020/12/09(水) 12:58:19.84 ID:UMU4oc+t 内部の話だからsayでは判らんだろ 関数で評価しないといけないと判っていて、動的に処理する必要も無いんだから、 評価済みのテーブルを内部に持たせようというのは自然な発想 http://mevius.5ch.net/test/read.cgi/tech/1548981877/843
844: デフォルトの名無しさん [sage] 2020/12/09(水) 13:12:15.55 ID:/81rDyGm >>843 試してから言え。 きっと、想像以上の出力が出てきて驚くから。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/844
845: デフォルトの名無しさん [sage] 2020/12/09(水) 13:44:43.94 ID:UMU4oc+t 判ってないのかな 処理速度に配慮した処理系があっても不思議ではないという話 手元で試して遅かったとしても、全ての処理系に対する証明にはならない http://mevius.5ch.net/test/read.cgi/tech/1548981877/845
846: デフォルトの名無しさん [sage] 2020/12/09(水) 14:16:41.19 ID:AA5LXV3h >>845 痛々しいからもうやめとけ http://mevius.5ch.net/test/read.cgi/tech/1548981877/846
847: デフォルトの名無しさん [sage] 2020/12/09(水) 14:32:22.15 ID:LWKBPFtb >>845 Perlの「全ての処理系」て。w http://mevius.5ch.net/test/read.cgi/tech/1548981877/847
848: デフォルトの名無しさん [sage] 2020/12/09(水) 15:17:55.01 ID:UMU4oc+t そもそも重いかどうかが疑問で、どっちでやっても一瞬で終わるのが普通 それなら読みやすい方が優れている 重くて困ってから対策を考えればいい http://mevius.5ch.net/test/read.cgi/tech/1548981877/848
849: デフォルトの名無しさん [sage] 2020/12/09(水) 16:44:07.55 ID:qaSCdqDS map { $_->[0]; } sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2]; } map { [$_, /(\d+)/g ]; } 読みにくい…かなあ? http://mevius.5ch.net/test/read.cgi/tech/1548981877/849
850: デフォルトの名無しさん [sage] 2020/12/09(水) 17:06:18.35 ID:8NKLSi5o >>849 他の言語の人が見たら発狂しそう http://mevius.5ch.net/test/read.cgi/tech/1548981877/850
851: デフォルトの名無しさん [sage] 2020/12/09(水) 18:15:36.35 ID:UMU4oc+t 別に短く書かなくていいんだよ @r = sort s2 @a; sub s1 { my $str = shift; $str =~ /(\d+)\-(\d+)/; return $1 * 100 + $2; } sub s2 { return s1($a) <=> s1($b); } http://mevius.5ch.net/test/read.cgi/tech/1548981877/851
852: デフォルトの名無しさん [sage] 2020/12/09(水) 18:16:58.18 ID:xAMitlRd 発狂しない人が使えば良いよ http://mevius.5ch.net/test/read.cgi/tech/1548981877/852
853: デフォルトの名無しさん [sage] 2020/12/09(水) 19:43:12.41 ID:LWKBPFtb >>848 おまえ、ハードな処理を実装したことがないやろ?w 慣れたPerl使いはわざわざ>>851みたいなコードは書かない。 遅いし、くどくて逆に読みにくいからな。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/853
854: デフォルトの名無しさん [sage] 2020/12/09(水) 19:45:15.15 ID:LWKBPFtb >>850 C#でも、タプルが使えるようになったので、似たようなコードは書く。 LINQなぶんだけPerlより読みやすいけど。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/854
855: デフォルトの名無しさん [sage] 2020/12/09(水) 22:17:09.12 ID:rsuX7ND7 ハッシュテーブルにs1($val)の戻り値を保存して、そのハッシュテーブルを使って比較関数を呼び出すとかするのが普通でしょ。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/855
856: 849 [sage] 2020/12/10(木) 06:03:00.77 ID:+FxPMgzN 読みやすい優れたコードが >>851 か。 自分のコードを出してくれた点は評価するが $1 * 100 + $2 って何? http://mevius.5ch.net/test/read.cgi/tech/1548981877/856
857: デフォルトの名無しさん [sage] 2020/12/10(木) 16:08:39.86 ID:smJEm1Fb 2桁前提なんだろうな http://mevius.5ch.net/test/read.cgi/tech/1548981877/857
858: デフォルトの名無しさん [sage] 2020/12/10(木) 19:59:40.99 ID:g17Qy/zb >>857 >>834なら4桁までイケる。w http://mevius.5ch.net/test/read.cgi/tech/1548981877/858
859: デフォルトの名無しさん [sage] 2020/12/11(金) 03:24:48.11 ID:lklp228q 考え方は同じだけど最初からソート用の値をデータに持たせてみる。 my %x = ( '3-1' => ['e', 301], '1-2' => ['b', 102], .... , ); sort { $x{$a}[1] <=> $x{$b}[1] } keys %x; http://mevius.5ch.net/test/read.cgi/tech/1548981877/859
860: デフォルトの名無しさん [sage] 2020/12/11(金) 03:42:00.36 ID:Hz2bdcAQ 複数キーでのソートに帰着させるべきなんだろうな 1-1-1 も許容する、とかになった瞬間に破綻する http://mevius.5ch.net/test/read.cgi/tech/1548981877/860
861: デフォルトの名無しさん [sage] 2020/12/11(金) 04:01:52.35 ID:Hz2bdcAQ sub s1 { my @a = split /\-/, $a; my @b = split /\-/, $b; my $dim = @a > @b ? @a : @b; for my $i (0 .. $dim) { my $cmp = $a[$i] <=> $b[$i]; return $cmp if $cmp; } return 0; } http://mevius.5ch.net/test/read.cgi/tech/1548981877/861
862: 856 [sage] 2020/12/11(金) 06:10:31.03 ID:LwDR4/oY >> 833 には数値の値域については何も書かれてないんだから 勝手に想定しない方がいいと想うよ。 どうしても比較を簡略化したいなら pack 関数で数値を全部 ビッグエンディアンで並べればいいんじゃないかな。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/862
863: デフォルトの名無しさん [sage] 2020/12/11(金) 10:41:01.46 ID:vQm1aiEb >>860 最初から想定されてるのでなければ、ひどい仕様変更なんだから、実装変更もやむなしやろ。 数字じゃなくてアルファベットにします、と言われただけでパーやし。w http://mevius.5ch.net/test/read.cgi/tech/1548981877/863
864: デフォルトの名無しさん [sage] 2020/12/11(金) 10:50:54.59 ID:vQm1aiEb >>862 勝手に想定するのもあたりまえ。 じゃないと、なんにも例示できなくなるで? 値域がどうこうなんか、自分でなんとでもすればいいだけ。 本題のソートには関係ない。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/864
865: デフォルトの名無しさん [sage] 2020/12/11(金) 11:20:18.13 ID:Hz2bdcAQ 1-1があるなら1-1-1もあると予測するのは自然な拡張 1-1-1-... に無限に対応できるように作っておいて、 その特殊ケースとして要件を満たす、で十分 アルファベットにも対応するのは次元が違う http://mevius.5ch.net/test/read.cgi/tech/1548981877/865
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 137 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.010s