私のマトリョーシカ人形を再構築


20

バックグラウンド

マトリョーシカ人形(またはロシアの入れ子人形)がお互いの内側に収まる人形のセットです。私は誤ってマトリョーシカ人形のコレクションを混同しましたが、どれがどの中に入ったのか覚えていません。

目的

一意の文字列のリストが与えられたら、それらをネストされたマトリョーシカ人形にソートします。各文字列は個々の人形であり、マトリョーシカ人形は文字列のリストです。

ルール

ましょうmin(a,b)文字列aとの辞書式の最小値になりbます。a ⊂ bそれaがの部分文字列であることを示しましょうb。次に、

  1. マトリョーシカ人形のリストは、辞書式にソートする必要があります
  2. 文字列がaでき収まる文字列にbあればa ⊂ b
  3. 場合a ⊂ ba ⊂ c、そのa内側に行こうmin(b,c)
  4. との両方a ⊂ cb ⊂ cあるがa ⊄ b b ⊄ a、の場合、min(a,b)内部のみになりますc
  5. との両方a ⊂ c、そしてb ⊂ c、もしそうなら、中に入るa ⊂ bだけです。つまり、マトリョーシカが途中で終了しないように、スーパーストリングがサブストリングの前に移動します。bc

In:
hahaha, hah, lol, lololol, bahaha, bah, haha, ah

Out:
bahaha, bah, ah
hahaha, haha, hah
lololol, lol

In:
aa, aaaa, a, aaaaaaaaaa

Out:
aaaaaaaaaa, aaaa, aa, a

3
ここに最初の投稿、愚かな/修正が必要なものを指摘してください。
sujeet

2
PPCGへようこそ!投稿が十分かどうかわからない場合は、最初にSandboxに投稿できます。
user202729

2
必須ではありません。ここに保管してください。それのようなコミュニティ。
user202729

2
@sujeetは将来、サンドボックスに投稿してみてください。メインサイトに投稿する前に、チャレンジに関するフィードバックを得ることができます。この問題は現状では問題ないように思えますが、今は気にしないでください。しかし、将来的には考慮すべき事項です。
Rɪᴋᴇʀ

3
何の結果ab, ba, aba, babでしょうか?ルール3により、両方abbaに行くべきaba、とルール4により、baどちらかに行くことができませんababab
ズガルブ

回答:


2

Python 2、298バイト

def f(x,E=enumerate):
 o=[]
 while any(x):
	for k,p in E(x):
	 e=0
	 if sum(i(p,j)for j in x)<1:
		for d,r in E(o):
		 if i(p,r[-1])*((r[-1]<e)or e==0):m,e=d,r[-1]
		if e:o[m]+=[p]
		else:o+=[[p]]
		x[k]=''
 print sorted(o)
i=lambda p,b:(b!=p)*any([p==b[j:j+len(p)]for j in range(len(b)-len(p)+1)])

オンラインでお試しください!

-28バイト、@ dylnanからのヒント、@ Dennisによるバグ検出、@ Mr.Xcoderによるバグ修正


1
301バイト。ちょうどなっiラムダ関数に、変数名を変更outしますo
ディルナン

1
297バイト(E = enumerate)
ディルナン

関数は再利用可能なければなりoutませんが、変数は決して変化しません。オンラインでお試しください!
デニス

この問題を解決するには、298バイトです。また、out3文字の変数名...真剣に:P?
Mr Xcoder
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.