Aynı renkte aritmetik ilerleme


15

Van der Waerden'in teoremi şöyle der :

Herhangi bir pozitif tamsayı için rve k, Neğer tamsayılar {1, 2, ..., N}renklendirilmişse, her biri r farklı renklerden birine sahipse, o zaman karitmetik ilerlemede aynı rengin en azından tamsayıları olacak şekilde bir sayı vardır. En azı NVan der Waerden sayısıdır W(r, k).

Amacınız W(r, k)pozitif tamsayı girdiler verilen Van der Waerden sayısını hesaplamak rve k. En az bayt kazanır.

Bu fonksiyonun çok hızlı büyüdüğünü ve hesaplanması zaman aldığını unutmayın . Hatta W(4, 4)bilinmiyor. Kodunuzun sınırsız kaynaklara (zaman, bellek, yığın derinliği, vb.) Sahip ideal bir bilgisayarda çalıştığını varsayabilirsiniz. Kodunuz, cevabının bilinmediği değerler için bile teorik olarak doğru cevabı vermelidir.

Bu işlevi hesaplayan yerleşik öğelere izin verilmez.

Misal

İçin r = 2renk ve uzunluğunun ilerlemeler k = 3, bir uzunluk- vardır 8Bu tür bir ilerlemesini önler dizisi, örneğin, 3aynı renkteki aynı aralıklı elemanlar:

B R R B B R R B

Ancak, böyle bir uzunluk 9sırası yoktur , bu yüzden W(2, 3) == 9. Örneğin,

R B B R B R R B R
  ^     ^     ^      

3gösterilen uzunlukta aynı renkte aritmetik ilerleme içerir .

Test senaryoları

Muhtemelen sadece küçük vakaları test edebileceksiniz.

+-----+-----+-----+-----+-----+-----+------+
|     | k=1 | k=2 | k=3 | k=4 | k=5 | k=6  |
+-----+-----+-----+-----+-----+-----+------+
| r=1 |   1 |   2 |   3 |   4 |   5 |    6 |
| r=2 |   1 |   3 |   9 |  35 | 178 | 1132 |
| r=3 |   1 |   4 |  27 | 293 |     |      |
| r=4 |   1 |   5 |  76 |     |     |      |
+-----+-----+-----+-----+-----+-----+------+

Yanıtlar:


7

Python 3.5, 125 124 119 bayt

f=lambda r,k,*L:any(L[:x*k:x]==k*(*{*L[:x*k:x]},)for x in range(1,len(L)+1))*len(L)or max(f(r,k,i,*L)for i in range(r))

Bu komik çünkü, golf boyunca, program aslında daha verimli oldu. Öte yandan, ötesindeki f(2,4)ya da f(3,3)yine de sonsuza dek süren bir şey .

açıklama

İlk sürüm, ktüm olası başlangıç ​​indekslerini ve adımlarını deneyerek bir sekansın uzunluk ilerlemesi içerip içermediğini kontrol etti .

def f(r,k,L=[]):
 for i in range(len(L)):
  for j in range(len(L)):
   if len(set(L[i::j+1]))==1 and len(L[i::j+1])==k:
    return len(L)
 return max(f(r,k,L+[i])for i in range(r))

Golfed sürümü sadece o zamandan beri tüm olası adımları deneyin gerekiyor prepends yeni dizisi elemanlarını. x*kKapak gibi durumlarda dikkat almaktır [0, 0, 1]uzunluğu 2'nin bir ilerleme içeriyor ama tekliği çek kapağını açıp tatmin olmaz, hangi.

Çek gelince

L[:x*k:x]==k*(*{*L[:x*k:x]},)

Golf halindeki versiyonun ilk geçişinde Lboş len(L)olduğunda 0 olur. Böylece ikinci yarı orher zaman yapılır. Bundan sonra Lboş değil, yani{*L[:x*k:x]} (sadece Python 3.5 için set(L[:x*k:x])) en az bir öğeye sahip olacak.

Yana L[:x*k:x]en olabilir kelemanları ve için Lboş olmayan k*(*{*L[:x*k:x]},)sahip olan en az ktam olduğunda elemanları, sadece iki eşit olabilir khem de elemanları. Bunun gerçekleşmesi {*L[:x*k:x]}için tam olarak bir unsur olmalı, yani ilerlememizde sadece bir renk var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.