Skolem dizileri oluşturma


10

Skolem dizileri

Bir Skolem dizisi arasında bir dizi olduğunda 2n, her sayı numaraları iarasında 1ve ntam olarak iki kez olduğu ve iki oluşum arasındaki mesafe itam olarak iadım. Skolem dizilerinin bazı örnekleri:

1 1
1 1 4 2 3 2 4 3
16 13 15 12 14 4 7 3 11 4 3 9 10 7 13 12 16 15 14 11 9 8 10 2 6 2 5 1 1 8 6 5

Aşağıdaki diziler Skolem dizileri değildir :

1 2 1 2      (The distance between the 1's is 2, not 1)
3 1 1 3      (The number 2 is missing)
1 1 2 1 1 2  (There are four 1's)

Amaç

Belirli bir uzunluktaki tüm Skolem dizilerinin sayısını saymak için bir program, işlev veya ifade yazın. Daha açık bir şekilde, ngirdiniz bir tamsayıdır ve çıktınız Skolem uzunluk dizilerinin sayısıdır 2n. Bu sekansın bir OEIS girişi vardır . Çünkü n = 0, ya 0da geri dönebilirsiniz 1. İlk birkaç değerleri başlayarak 0vardır

0, 1, 0, 0, 6, 10, 0, 0, 504, 2656, 0, 0, 455936, 3040560, 0, 0, 1400156768

Kurallar ve puanlama

Bu kod golf. Çıktı formatı mantıklı.


Sadece merak ediyorum, ama 0, 1, 0, 0, 6...sorunuz nedir? Bu kod pasajı mı, eğer öyleyse bu hangi dildir?
PhiNotPi

2
Çıktınızdaki ilk ürün neden 0? 0Geçerli bir giriş olarak kabul edecekseniz , çıktı olmalıdır 1.
Peter Taylor

1
Bazıları (kodum dahil) sıfır boş dizi olduğuna inanıyor. 1 sizi daha iyi hissettirirse, iade edin.
boothby

2
AFAIK, varsaydığınız her bağlamda bir ve yalnızca bir boş dizi / boş nesne / boş küme vb.
Bakuriu

1
@ boothby, Knuth'u aptal mı dedin?
Peter Taylor

Yanıtlar:


8

GolfScript, 48 46 karakter

:b,1,{)2\?){{.2$&!{.2$|@@}*.+.4b?<}do;;}+%}@/,

Daha hızlı sürüm ( çevrimiçi deneyin ) - makul hızlı çalışır, örneğin n=8yaklaşık iki saniye sürer. Ve seçilen yaklaşım çok az karakter gerektirir.

Bu sürüm ayrıca bitmasklerle çalışır. Olası sonuç dizisini 1'den yukarı doğru oluşturur, yani n=3:

1: 000011        000110 001100 011000 110000
2: 010111 101011 101110        011101 110101 111010

Bazı sonuçların (000011 gibi) iki olası sürekliliği olsa da, diğerlerinin (yani 001100) hiçbiri yoktur ve sonuç dizisinden çıkarılır.

Kodun açıklaması:

:b           # save the input into variable b for later use
,            # make the list 0..b-1 (the outer loop)
1,           # puts the list [0] on top of the stack - initially the only possible
             # combination
{)           # {...}@/ does the outer loop counting from i=1 to b
  2\?)       # computes the smalles possible bit mask m=2^i+1 with two bits set 
             # and distance of those equal to i (i.e. i=1: 11, i=2: 101, ...)
  {          # the next loop starts with this bitmask (prepended to code via
             # concatination {...}+
             # the loop itself iterates the top of the stack, i.e. at this point 
             # the result array                 
             # stack here contains item of result array (e.g. 00000011)
             # and bitmask (e.g. 00000101)
    {        # the inner-most loop tries all masks with the current item in the result set
      .2$&!  # do item and result set share not single bit? then - {...}*
      {
        .2$| # then generate the new entry by or-ing those two
        @@   # push it down on the stack (i.e. put working items to top)
      }*
      .+     # shift the bit mask left by one
      .4b?<  # if still in the range loop further
    }do;;    # removes the remainders of the loop (i.e. item processed and mask)
  }+%        # stack now contains the new result array
}@/
,            # length of result array, i.e. the number of Skolem sequences

Bağlı çözümlerin daha hızlı kabul edilmesi.
boothby

6

J ifadesi, 47 karakter

 +/*/"1((=&{:+.2-#@])#;.2)\"1~.(i.!+:y)A.,~>:i.y

Misal:

    y=:5
    +/*/"1((=&{:+.2-#@])#;.2)\"1~.(i.!+:y)A.,~>:i.y
10

Makinemde yaklaşık 30 saniye sürüyor y=:5.

algoritma olabildiğince yavaştır:

  • ~.(i.!+:y)A.,~>:i.y1 2 .. y 1 2 .. yyinelenen girişlerin her bir permütasyonunu oluşturur ve kaldırır
  • ((=&{:+.2-#@])#;.2)\"1 değerlerini hesaplar:
    • (...)\"1 her satırın her öneki için:
      • #;.2 son elemanın her oluşumundan önce elemanları sayar
      • #@] sayma sayısını sayar (yani son elemanın meydana gelme sayısını)
      • =&{: sayım listesinin ve orijinal listenin "" son eleman "larının" eşitliğini "" belirler.
      • +.mantıklı bir OR. =&{:+.2-#@]"sayım listesinin ve orijinal listenin son öğeleri [eşittir veya ikiden çok yalnızca [sayım listesinde] bir öğe vardır" ifadesini okur.
  • */"1 hangi permütasyonların Skolem dizileri olduğunu belirleyerek koşul tablosunun satırları üzerinde (mantıksal AND) çarpar.
  • +/ olanları ve sıfırları bir araya getirir.

6

GolfScript (46 karakter)

:&1,\,{0,2@)?)2&*{2${1$^}%@+\2*}*;+}/{4&?(=},,

Bu, yığına girdi alan bir ifadedir. Stdin ile girdi alan tam bir programa dönüştürmek için~

Oldukça verimsiz - ungolfed 56 karakterden aşağı golf yaparken yaptığım tasarrufların çoğu, döngü aralığını yanlış sonuçlar vermeyen ancak atık hesaplama yapan yollarla genişletmekti.

Yaklaşım Kartezyen ürünlerin bitsel olarak maskelenmesidir. Örneğin (maskeler için ikili kullanılarak) n=4çözülmemiş kod için Kartezyen üründeki her elemanın xor'unu hesaplardı [00000011 00000110 ... 11000000] x [00000101 00001010 ... 10100000] x ... x [00010001 ... 10001000]. 8 bitlik herhangi bir sonuç yalnızca örtüşmeyen maskeler ile elde edilebilir.

Hızdan ziyade boyutu optimize etmek için kod, kısmi ürünleri ( S1 u S1xS2 u S1xS2xS3 ...) biriktirir ve her bir ürünü , geçerli bir sıralamaya gerçekten katkıda bulunabileceklerinden 2nziyade , öğelerden biri haline getirir 2n-1-i.

hız

Golfçül sürüm n=5bilgisayarımda 10 saniye ve 5 dakikadan fazla çalışır n=6. Orijinal çözülmemiş versiyon n=5bir saniyeden daha kısa sürede ve n=6yaklaşık 1 dakika içinde hesaplanır . Ara sonuçlarda basit bir filtre ile n=830 saniye içinde hesaplanabilir . Döngüleri olabildiğince kısıtlı tutarken ve ara çarpışmalara filtre uygularken 66 karaktere (bir program olarak - bir ifade olarak 65 karakter) golf yaptım:

~:&1,\,{0,\).2\?)2&*@-{.{[\].~^.@~+<{;}*}+3$%@+\2*}*;\;}/{4&?(=},,

Lanet olsun. Tam 48char J çözümümün gönderilebilecek kadar iyi olduğunu düşündüğümde.
John Dvorak

Lanet olsun. 47 karakterli bağımız çok uzun sürmedi. +1
John Dvorak

5

GolfScript, 49 karakter

~:/..+?:d(,{d+/base(;:w;/,{.w?)w>1$?=},,/=},,/1=+

nSTDIN üzerindeki sayıyı bekler . Bu kod golf - n5'ten büyük kodu denemeyin .


Ah, 5'ten fazla değil mi?
boothby

@boothby Bu ilk, doğrudan girişimdi. Genellikle karar hızını boyuta karşı almak zorundayız - ve kod golf boyutu hakkında. Bu yüzden başlangıçta çok daha uzun ama şimdi daha kısa olan hızlı sürümü de ekledim.
Howard

0

Adaçayı, 70

Bu benim orijinalimden biraz daha kısa.

sum(1for i in DLXCPP([(i-1,j,i+j)for i in[1..n]for j in[n..3*n-i-1]]))

Nasıl çalışır:

Bir 0/1 matrisi verildiğinde, bu matris için kesin kapak problemi, all-ler vektörüne toplanan (tamsayılar olarak) satırların bir alt kümesini bulmaktır. Örneğin,

11001
10100
01001
00011
00010

bir çözümü var

10100
01001
00010

Sorunlara en sevdiğim yaklaşım, onları tam bir kapak sorununa dönüştürmektir. Skolem dizileri bunu etkili bir şekilde kolaylaştırır. Çözümlerin Skolem uzunluk dizileri ile birleştiği yerde tam bir kapak problemi yapıyorum 2n. Örneğin, sorun bir sıra için n=6bir

  a   |  b  
001000|001001000000 # S[b] = S[b+a+1] = a

burada 1 konumu a < n, o sembolün akullanıldığı anlamına gelir . Kalan pozisyonlar, dizideki gerçek konumlara karşılık gelir. Tam bir kapak, tam olarak bir kez kullanılan her sembole karşılık gelir ve her yer tam olarak bir kez doldurulur. Yapım gereği k, bir konumdaki herhangi bir sembol k, ortağından uzakta olan boşluklardır.

Sage, DLXCPPbir "dans linkler" uygulaması - tam kapak sorununu son derece zarif bir şekilde çözer. Şimdiye kadarki en sevdiğim algoritmalardan biri ve Sage'deki yüzeyde olmak kombinatoryal numaralandırmayı bir zevk haline getiriyor.


Vay canına, dans eden bağlantı. Kullanım len(list(...))4 karakter kaydeder.
Ray

@Ray len(list(...))n = 16 için hesaplarsam bilgisayarım ölürdü . Ve çalışma zamanını tamamen öldürecekti.
boothby

Bu doğru, çünkü bir jeneratörü bir listeye dönüştürmek birçok belleğe mal oluyor.
Ray
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.