Evrensel bir tamsayı dizisi oluşturma


22

Tanım

Bitişik bir sıra olarak her sonlu tam sayı dizisini içeriyorsa, evrensel bir (sonsuz) tamsayı dizisi diyelim.

Başka bir deyişle, tamsayı dizisi (a 1 , a 2 ,…) eğer ve sadece, her sonlu tamsayı dizisi (b 1 ,…, b n ) için , eğer böyle bir ofset k ise (a + 1 ) evrenseldir. ,…, Bir k + n ) = (b 1 ,…, b n ) .

Örneğin, pozitif asal sayılar dizisi, aşağıdaki nedenlerle diğerleri arasında evrensel değildir.

  • Negatif tamsayı, 1 veya bileşik sayı içermez .

  • 3 içermesine rağmen , bitişik bir alt dizilim içermez (3, 3, 3) .

  • 2 ve 5 içermesine rağmen , bitişik alt diziyi içermez (2, 5) .

  • Bitişik alt diziyi (7, 11, 13) içermesine rağmen, bitişik alt diziyi içermez (13, 11, 7) .

Görev

Seçim herhangi tek evrensel tamsayı dizisi (a 1 , a 2 , ...) ve aşağıdaki kurallara uyan, sizin seçtiğiniz bir programlama dilinde uygulamak.

  • Tam bir program veya bir işlev gönderebilirsiniz.

  • G / Ç için üç seçeneğiniz var:

    1. Giriş yapmayın ve dizinin tamamını yazdırın veya geri gönderin.

    2. Girdi olarak n bir dizin alın ve bir n yazdırın veya döndürün .

    3. Girdi olarak n bir dizin alın ve yazdırın veya geri dönün (a 1 ,…, a n ) .

  • G / Ç seçenekleri 2 ve 3 için , isterseniz 0 tabanlı dizinlemeyi kullanabilirsiniz .

  • Gönderiminiz belirleyici olmalıdır: aynı girdiyle birden çok kez çalıştırıyorsanız, aynı çıktıyı vermelidir.

Ayrıca, hemen belli olmadıkça, lütfen seçtiğiniz dizinin evrensel olduğunu kanıtlayın. Kanıtın kanıtlanmamış varsayımlara bağlı olmayabilir.

Standart kuralları geçerlidir. Bayt cinsinden en kısa kod kazanabilir!


Kanıtın kanıtlanmamış varsayımlara bağlı olmayabilir. Bunun ima edildiğini düşündüm: p
Outgolfer Erik

ve bir sayıdaki sayı listesini nasıl kaydedersiniz?
RosLuP

Yanıtlar:


13

Kabuğu , 5 bayt

Bu sonsuz bir liste yazdırır

ΣṖ…ݱ

Çevrimiçi deneyin! veya dizinizin ilk dizinini bulun . (Çoğu sekans için çok fazla hafıza alır)

Açıklama:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

Husk'ta sonsuz listeler için güzel davranır. Burada davranışını görebilirsiniz


Nasıl Qçalıştığını açıklamak isteyebilirsiniz . (Sanırım anladım, ancak emin değilim.)
Dennis,

@Dennis istediğim ortaya çıktı , değilQ
H.PWiz

9

Python 2 , 49 46 43 bayt

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)döner bir n sadece. Bu , daha yüksek basamaklardan birini çıkarmak için ntabandaki en küçük basamağı kullanır d.

Çevrimiçi deneyin! Bu senaryo (Dennis'in izniyle) herhangi bir sonlu diziyi alır ve size nbu dizinin başladığı yeri verir .

açıklama

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

Örneğin, için naralığında 3141592650için 3141592659, d=10ve son rakam nseçer Diğer basamak biri. Sonra -d/2negatif değerleri almak için ekleriz .

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

Bağımsız alternatif, ayrıca 43 bayt:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

Sen kullanabilirsiniz len(`n`)yerine len(str(n)).
Dennis,

@Dennis teşekkürler. Birisi ihtiyaç duyarsa daha fazla açıklama ekleyebilirim.
japh

Sonlu bir dizi verildiğinde, sıranızda bir uzaklık bulan bir işlev yazdım. Çevrimiçi deneyin!
Dennis,

Bu çok havalı.
histocrat

Güzel. Tek şey, n=2**63-1temsile eklenmesinden bu yana ayrılacağıdır L( str(n)gerekirse üç bayt için de geçerlidir).
Jonathan Allan

5

Brachylog 2, 11 bayt

≜~×-₂ᵐ~ȧᵐ≜∋

Çevrimiçi deneyin!

Ayrıca listedeki ek bölümleri kullanarak bir algoritma denedim, fakat daha kısa değildi. Bu, çıktı olarak sonsuz bir tamsayı akışı üreten bir jeneratördür; TIO bağlantısının ilk on binini basmak için bir başlığı var.

açıklama

Program, tüm olası tam sayıları sırayla deneyerek başlar ( varsayılan tüm sayılar için kalan tüm olasılıkları dener). Bu 0, 1, -1, 2, -2 vb. (Negatif tamsayılar programın sonuna ulaşmasa da). Bu, programın tek "sonsuz" adımıdır; diğerleri ise sonlu.

daha sonra tamsayının tüm olası çarpanlaştırmasını üretir, farklı sıraları farklı olarak ele alır ve sadece 2 yukarı doğru olan değerleri kullanır (bu yüzden sadece sonlu sayıda vardır); Bileşik sayıların sadece asallamalara değil, çarpanlara ayırmaya izin verildiğini unutmayın. Bu, ≥2 tamsayılarının tüm olası dizilerinin, bu adımda, işlevin yürütülmesinde bir noktada üretileceği anlamına gelir (bu nedenle, bir dizinin mutlaka bir ürüne sahip olması ve bu ürünün bir noktada başlangıçta üretilmesi gerekir ).

Daha sonra, bu dizilerin kümesini iki adımda yapılan tüm tam sayı dizilerinin kümesine eşlememiz gerekir -₂: her elemandan ( ) ( 2 ) çıkarılması , bize tüm negatif olmayan tam sayı dizilerinin kümesini vererek, sonra artı ya da eksi alma ( yani "mutlak değeri" olan bir değer ") her öğe (). İkinci adım açıkça belli değildir, bu nedenle Brachylog bunu bir jeneratör olarak değerlendirir, elemanları artı ya da eksi giriş listesinin karşılık gelen elemanını ekleyen tüm olası listeleri oluşturur. Bu, artık tüm olası tamsayı sekansları için bir jeneratöre sahip olduğumuz anlamına gelir ve onları, hepsi oluşturuldukları anlamına gelen bir sırayla oluşturur (özellikle, her bir öğenin mutlak değerini alırsanız elde ettiğiniz sıra, her birine 2 ekler) eleman ve sonra ortaya çıkan elemanların çarpımına göre sıralanır).

Ne yazık ki, soru bir dizi dizisi değil tek bir dizi istiyor, bu yüzden iki komuta daha ihtiyacımız var. İlk olarak, Brachylog'dan açıkça dizilerin dizisini kesin olarak oluşturmasını talep eder (bu yöntemle üretilen bir dizinin kavramını tanımlayan bir veri yapısı oluşturmanın aksine, gerçekte gerekli olana kadar dizileri oluşturmaz); Bu, bu durumda programı daha hızlı hale getirir ve çıktının istenen sırada üretilmesini sağlar. Son olarak, jeneratörün ayrı ayrı dizilerin elemanlarını bir seferde birer birer vermesine neden olur (bir önceki dizinin tüm elemanlarını çıktığında bir sonraki diziye ilerler).

Sonuç: olası her tam sayı dizisi üretilir ve çıkar, her seferinde bir öğe ve hepsi birlikte tek bir evrensel dizide birleştirilir.


ais523… bu siz misiniz?
17'de 6

Eğer onlar değilse , silinmiş hesaplarından gelen yayınların aynı hesap numarasını gösterdiğini göz önünde bulundurmak bir tesadüf .
tamamen insan


4

Python 2 , 100 99 bayt

  • Ovs sayesinde bir bayt kurtarıldı ; Bir itertoolsdahili üzerinde süresiz olarak yineleme .
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

Çevrimiçi deneyin!

Süresiz olarak tüm negatif olmayan tamsayılar için n-times tekrarlanan tamsayı aralığının tüm permütasyonlarını yazdırır . Bu değiştirilmiş sürümü kullanarak herhangi bir sıra için ilk dengeyi arayabilirsiniz .[-n; n)n
k


while~0:. Heh heh ...
Chas Brown

99 byte kullanmaitertools.count
ovs 19:17

@ovs Teşekkürler; Bu yerleşik bilmiyordum.
Jonathan Frech

2

Perl 6 , 91 bayt

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

Çevrimiçi deneyin!

Bu, diğer cevapların bazılarına benzer bir yöntem kullanır. Elemanları (-1,0,1), sonra tüm elemanların sıralı çiftlerini (-2,-1,0,1,2), sonra tüm elemanların sıralı üçlelerini (-3,-2,-1,0,1,2,3), vb . Basmak için Kartezyen ürünlerini kullanır .

Perl için yeniyim, bu yüzden yapılabilecek daha fazla golf olabilir.

Daha okunabilir sürüm:

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
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.