(def tmp = [ 1 2 3 9 4 8])
私は 2 のペアを作成しようとしています。次に、各ペアについて、最初の数字から 2 番目の数字を引きます。望ましい結果: (1 6 4)
これが私が試していたものです:
(map #(apply - %2 %1) (partition 2 tmp))
これどうやってするの?
(def tmp = [ 1 2 3 9 4 8])
私は 2 のペアを作成しようとしています。次に、各ペアについて、最初の数字から 2 番目の数字を引きます。望ましい結果: (1 6 4)
これが私が試していたものです:
(map #(apply - %2 %1) (partition 2 tmp))
これどうやってするの?
Partition はシーケンスのシーケンスを生成するため、それらにマップする関数は 2 つの項目のシーケンスを想定する必要があります。これを表現するにはいくつかの方法があります。
(def tmp [ 1 2 3 9 4 8])
user> (map #(- (second %) (first %)) (partition-all 2 tmp ))
(1 6 4)
user> (map #(apply - (reverse %)) (partition-all 2 tmp ))
(1 6 4)
user> (map (fn [[small large]] (- large small)) (partition-all 2 tmp ))
(1 6 4)
apply を使用するバージョンは、長さが奇数のリストでも「機能する」ため、異なります。
user> (map #(apply - (reverse %)) (partition-all 2 [1 2 3 4 5 6 7] ))
(1 1 1 -7)
他のものは無効な入力でクラッシュしますが、これを好むかもしれません。
これがを使用した解決策ですreduce
(reduce #(conj %1 (apply - (reverse %2))) [] (partition-all 2 [1 2 3 9 4 8]))
=> [1 6 4]
なぜこの解決策が見落とされたのだろうか...
減算の順序を切り替えることは、単純に元の減算のマイナス (ab=-(ba)) であるため、解はより効率的になります (この特定の場合のみ!!)。
(map #(- (apply - %)) (partition-all 2 [1 2 3 9 4 8]))
教育的には、アーサーの解決策は正しいです。これは、特定の質問により適したソリューションにすぎません。