Comment detail

仲間はずれの判定 (Nested Flatten)
Squeak Smalltalk で。

念のため、set は重複を許さないコレクションで、bag は内部的に要素を要素種とその個数の組で管理するコレクションです。言語・ライブラリによっては後者のことを multiset と呼ぶこともあるようです(今やこう呼ぶほうがメジャー?)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
| homoCheck |
homoCheck := [:xs |
	| bag |
	bag := xs asBag.
	bag asSet size caseOf: {
		[1] -> [{'homo'. xs anyOne}].
		[2] -> [{'quasi-homo'}, (bag sortedCounts collect: [:assoc | assoc value])]}
		otherwise: [{'hetero'}]].

homoCheck value: #(1 1 1 1 1).   "=> #('homo' 1) "
homoCheck value: #(1 1 2 1 1).   "=> #('quasi-homo' 1 2) "
homoCheck value: #(2 1 1 1 1).   "=> #('quasi-homo' 1 2) "
homoCheck value: #(2 1 4 1 1).   "=> #('hetero') "
noeta さんの #2667 の変形で、均一、あるいは、仲間はずれがあるときは要素種を配列(要素数は前者は 1、後者は 2)で、そうでないときは false を返すようにしてみました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
| homoCheck |
homoCheck := [:xs |
	| elems |
	elems := xs asBag sortedCounts collect: [:assoc | assoc value].
	elems size > 2 ifTrue: [false] ifFalse: [elems asArray]].

homoCheck value: #(1 1 1 1 1).   "=> #(1) "
homoCheck value: #(1 1 2 1 1).   "=> #(1 2) "
homoCheck value: #(2 1 1 1 1).   "=> #(1 2)"
homoCheck value: #(2 1 4 1 1).   "=> false "

Index

Feed

Other

Link

Pathtraq

loading...