Arka fon
3Blue1Brown'un kolye bölme problemi (veya çaldığı kolye problemi olarak adlandırdığı gibi) ve Borsuk-Ulam teoremiyle ilişkisi hakkındaki son videosundan ilham aldım .
Bu problemde, iki hırsız çeşitli mücevher türlerinden oluşan değerli bir kolye çaldı. Her mücevher türünün çift sayısı vardır ve hırsızlar her mücevher türünü ikisi arasında eşit olarak bölmek ister. Yakalama, kolyeyi bir dizi bitişik parçaya bölerek ve segmentleri ikisi arasında dağıtarak yapmaları gerektiğidir.
Burada gösterilen dört mücevher tip bir örnektir S
, E
, D
ve R
(sırasıyla safir, yakut, elmas ve yakut, için). Diyelim ki kolye aşağıdaki gibidir:
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
Orada 8
safir, 10
zümrüt, 4
elmas ve 6
yakut. Kolyeyi aşağıdaki gibi bölebiliriz:
[[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
Sonra bir hırsıza birinci, üçüncü ve beşinci bölümleri ve diğer hırsıza ikinci ve dördüncü bölümleri verirsek, her biri 4
safir, 5
zümrüt, 2
elmas ve 3
yakutla sonuçlanır :
[S], [S,E,S,D,E,R,S], [R,R,D,E,E,E]
[S], [R,E,S,S,S,D,R,E,E,R,E,D,E],
0
-İndexing kullanarak , bu kesimler endekslerde meydana gelir [1,2,9,22]
.
Hedef
Böyle adil bir bölünmenin , mücevher türlerinin sayısı olan çoğu n
kesimde her zaman yapılabileceği ortaya çıkıyor n
. Göreviniz, bir kolyeyi giriş olarak alan ve minimal bir bölünme (en az sayıda kesim) sağlayan eksiksiz bir program veya işlev yazmaktır.
Giriş
Giriş herhangi bir uygun biçimde olabilir. Kolye bir dizi mücevher olmalı ve daha fazlası değil; örn. tamsayıların listesi, mücevher türlerini temsil eden anahtarlı sözlük ve indekslerin listesi olan değerler. İsteğe bağlı olarak kolyenin uzunluğunu veya farklı mücevher türlerinin sayısını dahil edebilirsiniz, ancak başka herhangi bir girdi almamalısınız.
Giriş kolyesinin geçerli olduğunu varsayabilirsiniz. Belirli bir türde garip sayıda mücevher bulunan veya kolyenin boş olduğu durumda işlem yapmanıza gerek yoktur.
Çıktı
Yine, çıktı herhangi bir uygun formatta olabilir; örneğin, bir parça listesi, bir kesme pozisyonları listesi, iki hırsızı temsil eden anahtarları ve parça listesi olan değerleri içeren bir sözlük, vs. bunların uzunlukları, vb kullanabilir 0
- veya 1
- indeksleme. Sıralama biçiminiz için önemli değilse, çıktınız herhangi bir sırada olabilir. Yukarıdaki çıktı birkaç farklı formatta:
list of segments: [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
list of cuts: [1,2,9,22]
list of lengths: [1,1,7,13,6]
dictionary: {'thief1' : [(R,R,D,E,E,E),(S),(S,E,S,D,E,R,S)], 'thief2' : [(S),(R,E,S,S,S,D,R,E,E,R,E,D,E)]}
Düzenin, segmentler listesinde (hırsızlar arasında değişen segmentler) ve uzunluklar listesinde (segmentleri tanımlamak için) önemli olduğunu, ancak kesim listesinde veya sözlükte önemli olmadığını unutmayın. Edit: Greg Martin bu adil bir bölüm iki kesimde elde edilebilir beri geçerli çıktılar olmayacağına dikkat çekti
Test senaryoları
[1,2,1,2,1,3,1,3,3,2,2,3] -> [[1,2,1],[2,1,3,1],[3,3,2],[2,3]]
[1,1,1,1,2,2,3,3,3,3,3,3] -> [[1,1],[1,1,2],[2,3,3,3],[3,3,3]]
[1,1,1,1,1,1,1,1,1,1,1,1] -> [[1,1,1,1,1,1],[1,1,1,1,1,1]]
[1,1,1,1,2,3,4,2,3,4,2,2] -> [[1,1],[1,1,2,3,4,2],[3,4,2,2]]
notlar
- Standart boşluklar yasaktır.
- Bu kod golfü ; en kısa cevap (bayt cinsinden) kazanır.
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
, çıktı [[S,S,S,E,S,D,E,R],[S,R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
daha az kesime sahip olduğu için çıktı olması gerektiği anlaşılıyor [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
. Spesifikasyonu doğru anlıyor muyum?