Kod golf en iyi permütasyon


14

Meydan okuma

N ≥ 4 tamsayısı verildiğinde , birbiri ardına iki tamsayı olmaması özelliğiyle [0, n-1] tamsayılarının permütasyonunu verin . Bir permütasyonun değeri, tüm endekslerin pitoplamıdır .abs(pi[i] - i)i

Örnekler

  • (1, 3, 0, 2) değeri var 6
  • (0, 2, 4, 1, 3) değeri var 6
  • (0, 2, 4, 1, 3, 5) değeri var 6
  • (0, 2, 4, 1, 5, 3, 6) değeri var 8

Cevabınızın puanı

Yanıtınızın puanı, permütasyonlarınızın değerlerinin n = 4 .. 14artı kodunuzun aldığı bayt sayısının toplamıdır . Puan ne kadar düşükse o kadar iyidir. Kodunuz tüm bu değerleri için geçerli çıktı vermelidir n.

Gönderiminizi makinenizde tamamlayabilmeniz gerekir.

Beraberlik durumunda, ilgili puanla sonuçlanan son düzenleme zamanı karar vericidir.

Bu aynı soru değil mi bu bir ?

Bağlantılı sorunun cevabı, bir permütasyonun değerini optimize etmek için hiçbir çaba göstermedikleri için bu soru için rekabetçi olmayacaktır. Örneğin , cevapların çoğu tarafından verilen n=10permütasyonun [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]bir değeri vardır 30. Bundan daha iyisini yapabilirsin.

Sorunun permütasyon kısmı için en uygun değer genel olarak en fazladır 120. (@Laikoni'ye teşekkürler.) Dennis'in bir önceki soruya vereceği cevap 222 . (@ User202729 adresine teşekkürler.)


4
@ Her cevabı herhangi bir değişiklik yapmadan taşıyabilirsiniz, ancak bu meydan okumada çok kötü bir puan alacaktır. Bu kodda bu kodun yayınlanması, kod gözden geçirmeden kod-golf sorununa kod yayınlamakla eşdeğerdir.
Stewie Griffin

2
Skorda farklı miktarların karıştırılması gerçekten sorunlu olabilir. En iyi algoritma ile cevap genellikle herhangi bir dile aktarılabilir, bu durumda puanlama normal kod golfüne düşer.
Angs

4
En uygun değerler [6,6,6,8,10,12,12,12,14,16,18]120 puan içindir. İlginçtir, bu model A078706'da bulunabilir .
Laikoni

3
Tamam, A078706ile n=17bir puan olabilir , ile farklı olmaya başlar 20.
Laikoni

4
Bu meydan okumayı açık ve net bir şekilde anlayabiliyorum. Kabul etmiyorsanız ve kapanmak için oy verirseniz, buraya bir yorum bırakın.
user202729

Yanıtlar:


7

Jelly , 36 34 33 32 31 30 bayt, sonuç: 120

-1 bayt için Dennis'e teşekkürler! (özellik meydan okumadan sonra da olsa, bir Jelly hatasını düzelterek)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

Yeni özellik: birikmiş toplam ( Ä).

Çevrimiçi deneyin!

1 endeksleme kullanın.

Doğrusal zaman da alır.


Bu C ++ programı sözlükbilimsel olarak en küçük permütasyonu oluşturur ve | i - p i | 0 genişlik ( genişlik sabit kodlu bir sabittir) 0 ≤ i <n'nin tümü için , O ile ilgili zaman karmaşıklığı (genişlik 2 × 2 2 × genişlik × n) ( sabit genişlik için sadece O (n) ): Çevrimiçi deneyin !


Nasıl?

  1. Sorunu en iyi şekilde çözmeye çalışan bir C ++ programı yazın.
  2. Deseni gözlemleyin. Son 4 hariç tüm öğelerin sırasının,

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. Dizinin artımlı farkını hesaplar.

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    Döneme dikkat edin 5.

  4. Jelly uygulaması:

    • n-4 ilk elemanları yukarıdaki diziden alınır. O (n) .
    • İçin 4 son elemanları, sadece kaba 24 olanaklarını zorlamak . O (1) .

      (not: Artık 32 baytlık sürümdeki 24 olasılığı da kaba kuvvet yapmıyorum)


Ah, bana farklı bir önek ile gittin. Benimki başlar 0 2 4 1 3 5 8 6ve daha büyük bir dallanma faktörüne sahiptir, ancak bu kadar basit bir paterni yoktur.
Peter Taylor

7

CJam (60 bayt + 120 = 180 puan)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

Entegre puanlamaya sahip çevrimiçi test paketi

N = 24'e kadar uzatma

teşrih

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}

Çok etkileyici! Nasıl yaptığını keşfetmeyi dört gözle bekliyorum.
Anush

24'e kadar optimal mi?
Anush

@Anush Programıma göre, muhtemelen.
user202729

@Ahush, bunu kanıtlamadım, ama muhtemelen inanıyorum.
Peter Taylor

Algoritmanızdan daha da ilgiliyim!
Anush

6

Haskell , 146 + 89 puan + bayt

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

Deseni tekrarlar [1,3,0,2], son mod i 4elemanlar elle ayarlanır.

Önceki algoritma (132 + 116):

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

Brute, doğru uzunluktaki ± 2 veya ± 3 atlama sayısını güçlendirir. İçinde doğru sayılara sahip olan sonuncuyu seçer, iyi çalışır ve skoru uygulamaktan çok daha ucuzdur. Tio, son skordan önce 18 yaşında bitiyor.

Çevrimiçi deneyin!


2

Japon, 120 + 20 = 140

(Çözümlerimden birini diğer mücadeleden kopyalamak beni puanlandırırdı 227)

o á k_äa d¥1ÃñxÈaYÃg

Deneyin veya puanları kontrol etmek için bu sürümü kullanın. Her iki versiyon da size 9 civarında çıkmaya başlayabilir.


açıklama

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array

9
" Makinenizde tamamlanmaya sunumunuzu yürütebilmeniz gerekir. " Soru gönderildikten sonraki iki saat içinde 14 öğenin 87E9 permütasyonunu ciddi şekilde işlemeyi başardınız mı?
Peter Taylor

3
Ayrıca, Japt'un Javascript tabanlı olduğunu düşünün, gerçekten 87E9 permütasyonlarını işleyebilir mi? Bu soru Javascript dizisinin uzunluğu en fazla ~ 4E9 olabileceğini söylüyor. Japt işlevi veya başka bir şey üretiyor mu ... \
user202729 15:18 '

2

Yakut , 120 puan + 112106 91 82 bayt

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

Çevrimiçi deneyin!

Dizi temel olarak (a-2)+(a+2)%5.

N mod 5 0 veya 1 değilse, son 3 veya 4 eleman farklıdır.

Bu hala yarı-kodlanmış, her zaman en iyi çözümü bulur, belki biraz daha golf olabilir, ama fikirlerim tükendi.


1

JavaScript (Node.js) , 148 puan + 109 73 bayt

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

Çevrimiçi deneyin! Açıklama: lüretilen son sayının mkaydını tutar ve karşı paritenin bir sonraki sayısını takip eder l; bir kez laşıldığında m+2değişkenler değiştirilir. Dizinin başlangıcında, uzunlukları 5'in katları olmayan dizilerin hiçbir sayıyı kaçırmaması ve başka bir ayar yapılması için bir ayarlama yapılır n=4.

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.