プログラミングのお題スレ Part22 (854レス)
上下前次1-新
抽出解除 レス栞
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
771(22): デフォルトの名無しさん [sage] 2025/07/25(金) 12:30:11.02 ID:CjDQVF2B(1) AAS
【問題】
整数のリストが与えられたとき、そのリストを昇順に安定ソートした時の各要素のインデクス(0開始)を対応させたリストを作成せよ
【例】
入力: 1 100 10 10000 1000
出力: 0 2 1 4 3
入力: 3 1 4 1 5 9 2
出力: 3 0 4 1 5 6 2
入力: 0 1 0 1 0 1 0 1
出力: 0 4 1 5 2 6 3 7
実際に必要になって実装したけどスマートな方法があったら知りたい
772(1): デフォルトの名無しさん [sage] 2025/07/25(金) 20:46:23.28 ID:dyl0C+2U(1) AAS
>>771
例がおかしい
わかりやすい最後の例で示すと
入力: 0 1 0 1 0 1 0 1
出力: 0 4 1 5 2 6 3 7 間違い
出力: 0 2 4 6 1 3 5 7 正解
安定ソートなので同値は順序を保ってこうなる
773: デフォルトの名無しさん [sage] 2025/07/25(金) 21:30:28.86 ID:Z69qH9vG(1) AAS
>>771 C++ 特にひねりは無い
外部リンク:ideone.com
775: デフォルトの名無しさん [] 2025/07/26(土) 15:08:13.56 ID:T78ZrTu7(1/2) AAS
>>771
SQL
select
row_number() over(order by arrayValue, arrayIndex) - 1
from
arrayTable
order by
arrayIndex
776(1): デフォルトの名無しさん [] 2025/07/26(土) 19:25:22.74 ID:T78ZrTu7(2/2) AAS
>>771
Java 24
外部リンク:text.is
777(1): デフォルトの名無しさん [sage] 2025/07/27(日) 10:09:36.80 ID:vFJ24xnO(1/3) AAS
>>771 ocaml
外部リンク:ideone.com
>>771 octave
外部リンク:ideone.com
>>771 ruby
外部リンク:ideone.com
778: デフォルトの名無しさん [sage] 2025/07/27(日) 17:05:48.29 ID:vFJ24xnO(2/3) AAS
>>771 c
外部リンク:ideone.com
779: デフォルトの名無しさん [sage] 2025/07/27(日) 17:08:58.25 ID:vFJ24xnO(3/3) AAS
>>771 ruby 2.6以降?
sorti = ->a {a.map.with_index.sort.map &:last}
f = sorti << sorti
g = method(:p) << f
780: デフォルトの名無しさん [] 2025/07/27(日) 20:19:17.79 ID:uFbo+/2v(1) AAS
>>771
R
外部リンク:ideone.com
統計用言語だけあってライブラリ関数rankを呼び出すだけ。ties.method = "min"を指定すれば
同値を同順位(例えば2番目の例では出力が3 0 4 0 5 6 2となる)にもできる。
781: デフォルトの名無しさん [sage] 2025/07/27(日) 21:43:59.43 ID:w39E9j9Q(1) AAS
>>771
Rust
既に色々と出ているため別の観点からのコード
一時作業メモリ最小 & ソートは1回 & ジェネリック
fn f<T: std::cmp::Ord>(input: &[T]) -> Vec<usize> {
let len = input.len();
// ポジションのリスト [0, 1, 2, 3, ... , len-1] を作成
let mut pos_list: Vec<usize> = (0..len).collect();
// inputを利用してそのポジションだけをソート
pos_list.sort_by_key(|&pos| &input[pos]);
// 返すべきランクのリスト
let mut rank_list: Vec<usize> = vec![0; len];
// ポジション⇔ランクは逆写像なのでソートは不要
(0..len).for_each(|rank| rank_list[pos_list[rank]] = rank);
rank_list
}
fn main() {
assert_eq!(f(&[1, 100, 10, 10000, 1000]), [0, 2, 1, 4, 3]);
assert_eq!(f(&[3, 1, 4, 1, 5, 9, 2]), [3, 0, 4, 1, 5, 6, 2]);
assert_eq!(f(&[0, 1, 0, 1, 0, 1, 0, 1]), [0, 4, 1, 5, 2, 6, 3, 7]);
}
782: 777 [sage] 2025/07/27(日) 22:54:22.66 ID:YfUjoiLt(1) AAS
>>771 octave ソート一回
外部リンク:ideone.com
>>771 ruby 2.5 ソート一回
外部リンク:ideone.com
783: 警備員[Lv.11] [] 2025/07/28(月) 23:30:37.16 ID:uO5vEij8(1) AAS
>>771
>>776をKotlinに変換してKotlinらしくなるように色々省略しただけのもの。
やはり最初からラムダとか考慮されている言語だと色々省略できて分り易くなるね。
外部リンク:paiza.io
784: デフォルトの名無しさん [sage] 2025/07/29(火) 00:12:31.56 ID:9AXsNEm+(1) AAS
>>771
Rust
外部リンク:ideone.com
バイナリヒープ使うとソート過程で直接リスト作れるけどコード量増えるしヒープソート遅いから実用性は微妙か
C言語ならありかもしれない
785(1): デフォルトの名無しさん [sage] 2025/07/30(水) 21:50:10.50 ID:Ug40aZKP(1) AAS
>>771 java
外部リンク:ideone.com
788: 785 [sage] 2025/07/31(木) 21:15:09.63 ID:R3hgrYP8(1) AAS
>>771 java compose乱用
外部リンク:ideone.com
789(1): デフォルトの名無しさん [sage] 2025/08/03(日) 22:00:37.87 ID:1jv9m6G7(1) AAS
>>771
java >>786を修正。javaが古いねぇ。
外部リンク:ideone.com
790(1): デフォルトの名無しさん [sage] 2025/08/04(月) 22:42:57.64 ID:A9zbJQ8U(1/2) AAS
>>771
java >>789を修正。何度もすいませんね。classをメソッド内に移動。
外部リンク:ideone.com
791: デフォルトの名無しさん [sage] 2025/08/04(月) 23:09:28.79 ID:A9zbJQ8U(2/2) AAS
>>771
java >>790修正。classだったらメソッドの引数がみえるので修正。recordではできない。
外部リンク:ideone.com
793: デフォルトの名無しさん [] 2025/08/06(水) 17:17:53.29 ID:qE4NV2ND(1) AAS
>>771
JavaScript
外部リンク:paiza.io
795: デフォルトの名無しさん [sage] 2025/08/10(日) 23:18:32.78 ID:FODtZCg5(1) AAS
>>771 scala
外部リンク:ideone.com
>>771 swift
外部リンク:ideone.com
796: デフォルトの名無しさん [sage] 2025/08/11(月) 20:38:34.09 ID:frWpQyFA(1) AAS
>>771 dart 2.3
外部リンク:ideone.com
・拡張メソッドはDart2.7から
・ideone現状はDart (dart 2.3.0)
797: デフォルトの名無しさん [] 2025/08/12(火) 21:05:08.06 ID:uRUBTkGF(1/2) AAS
>>771
PowerShell 6以降
function rank($a)
{
$n = $a.length
$r = [int[]]::new($n)
if ($n) {0..($n - 1) | sort-object -stable {$a[$_]} |% {$i = 0} {$r[$_] = $i++}}
$r
}
function PrintArray($a)
{
if ($a.length -le 1) {return $a}
"[$(($a |% {PrintArray $_}) -join ", ")]"
}
$q =
(1, 100, 10, 10000, 1000),
(3, 1, 4, 1, 5, 9, 2),
(0, 1, 0, 1, 0, 1, 0, 1),
@(),
1,
((1, 1), (1, 1), (1, 0, 1), (1, 0))
$q |% {
"入力: $(PrintArray $_)"
"出力: $(PrintArray (rank $_))"
""
}
810: デフォルトの名無しさん [sage] 2025/08/19(火) 21:28:38.04 ID:ahVErwF8(1) AAS
>>771 scheme (chicken 4.13)
外部リンク:ideone.com
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.036s