Yan yana iki ardışık tam sayı olmadan permütasyon verin


18

Meydan okuma

N ≥ 4 tamsayısı verildiğinde , iki ardışık tamsayı (mutlak fark 1 olan tamsayılar) yan yana olmaması özelliğiyle [0, n-1] tamsayılarının permütasyonunu verin .

Örnekler

  • 4[1, 3, 0, 2]
  • 5[0, 2, 4, 1, 3]
  • 6[0, 2, 4, 1, 3, 5]
  • 7[0, 2, 4, 1, 5, 3, 6]

Bunun yerine 1 dizinleme kullanabilirsiniz ( [0, n-1] yerine [1, n] tamsayılarını kullanarak ).

Kodunuz n cinsinden polinom zamanında çalıştırılmalıdır , böylece tüm permütasyonları deneyemez ve her birini test edemezsiniz.


"Bir permütasyon çıkar" dediğinde, bir liste olarak mı demek istiyorsun? Veya permütasyon eşlemesini uygulayan bir fonksiyon üretebilir miyiz?
xnor

@xnor Bazı insan tarafından okunabilir biçimde çıkarılmalıdır. Tam olarak nasıl umurumda değil.
Anush

Kabul [[1,3],[0,2]]edilebilir bir çıktı biçimi olurdu ?
Shaggy

@Shaggy Harika değil. 1,3,0,2 anlamına mı geliyor?
Anush

Yanıtlar:


31

Jöle , 3 2 bayt

ḂÞ

[1, ..., n] içindeki tam sayıları LSB'lerine göre sıralar .

Çevrimiçi deneyin!


Vaov! Bu harika.
Anush

2
“LSB'ye göre sırala”, her birinin başına hareket ettiği anlamına gelir, ancak Jelly tanımı, her yarıdaki sayıların orijinal sıralarında kalmasını gerektirir mi? Değilse, 100 (4) 101'in (5) yanında olabilir ve yine de “LSB'ye göre sıralanabilir”. Kodunuzda hata oluşmuyor, ancak açıklayıcı açıklama tam değil mi?
WGroleau

1
@WGroleau Evet, Þkararlı sıralama, çünkü kararlı olduğu garanti edilen Python sortedişlevi kullanılarak uygulanmıştır .
user202729

3
Algoritma benim için zeki olmasıyla küçük boyuttan daha etkileyici. Ayrıca, sanırım, bit sırasını tersine çevirebilir, sıralayabilir ve geri döndürebilirsiniz.
WGroleau

4
Sadece 65536 farklı iki bayt Jelly programı olabilir. Öyle şaşırtıcı olanların birçoğu ppcg tehlikelere çözümler haline yüzden.
Anush




6

Haskell, 22 bayt

f, uygun bir sıralı liste döndüren n'nin bir fonksiyonudur. 1 dizinleme seçeneğini kullanıyorum.

f n=[2,4..n]++[1,3..n]

6

Oktav , 17 bayt

@(x)[2:2:x,1:2:x]

Çevrimiçi deneyin!

Bu, diğer birçok yöntemle aynı yaklaşımı kullanır. İki vektörü, biri 2 ... x dahil çift sayısında ve 1 ... x dahil aralığındaki tüm tek sayıları içeren iki vektör birleştirin . Sözdizimi oldukça açık olmalıdır, bu yüzden bunu açıklamayacağım.


1
Değil misin 3ve 2birbirlerine in yanındaki f(4)?
pajonk

Hata! Sabit. Aynı bayt sayısı. :-)
Stewie Griffin

5

JavaScript (ES6), 40 bayt

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

Düzenleme: @Arnauld sayesinde 1 bayt kaydedildi.


5

Gaia , 2 bayt

r∫

Çevrimiçi deneyin!

Bu sadece bir (kararlı) aralığındaki tamsayıları ORTS [1, giriş] kendi pa ile R ity.


Jelly ile aynı yorum: Algoritma veya dilin tanımı, iki yarının her birinin orijinal düzeninde kalmasını garanti ediyor mu?
WGroleau

@WGroleau Evet, Gaia'da sıralama meta-operatörü kararlı.
Bay Xcoder



4

Japt, 4 bayt

Farklı bir sipariş almak için uile de değiştirebilirsiniz v.

õ ñu

Dene

Veya 2 diziden oluşan bir diziyi çıkarabilirsek:

õ ó

Dene


Teknik olarak ikincisi virgülle ayrılmış sayıların bir listesini çıkarır ;-) 4Ne yazık ki her ikisi de başarısız olur ; Eğer değiştirerek ilkini düzeltebilirsiniz uiçin vya ohiç õ.
ETHproductions

3

Mathematica, 50 -> 47 -> 42 bayt

p = Join[Range[2, #, 2], Range[1, #, 2]] &

Çevrimiçi deneyin!

İki kat optimizasyon potansiyelini belirtmek için user202729 sayesinde Flatten [] insteaed [] 'a katılın ve saf fonksiyonları kullanın.

İki açıklama eklemek istiyorum.

1) OP'de talep edildiği gibi n> = 4 için art arda veya yükselme olmadan belirli bir permütasyon oluşturmak oldukça basittir.

Birbirini takip eden iki listeden oluşur.

N için bile bunlar şunlardır:
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)

Tek n için elimizdeki:
list1 = (2,4, ..., Kat [n / 2])
Listesi 2 = (1,3, ..., Kat [n / 2])

Bu "algoritma" için sadece bir karar verilmelidir (n çift veya tek), geri kalanı ise n sayı yazıyor.

Üstte olası bir Mathematica çözümü sağlanmıştır.

2) İlgili bir soru, n'nin bir fonksiyonu olarak bu tür kaç permütasyonun var olduğudur.

Mathematica, 124 Bayt

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

Çevrimiçi deneyin!

Misal:

a[#] & /@ Range[4, 12]

{2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034}

Bu permütasyonların sayısını saymak standart bir sorundur.

N = 4 için 2 vardır: {{2,4,1,3}, {3,1,4,2}}

N = 5 için 14 vardır: {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4,2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}

Bu permütasyonların a (n) sayısı hızla yükselir: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

Büyük n için a (n) / n oranı! 1 / e ^ 2 = 0.135335 limitine yaklaşıyor gibi görünüyor ... Kesin bir kanıtım yok ama sadece sayısal kanıtlardan bir varsayım. Programı çevrimiçi çalıştırmayı deneyerek test edebilirsiniz.

Yukarıdaki program (aşağıda verilen referansa dayanarak) bu sayıları hesaplar.

OEIS : A002464 ile ilgili sırada daha fazla bilgi bulabilirsiniz . Hertzsprung'un problemi: n X n panosunda, her sıra ve sütunda 1 olmak üzere, hücum etmeyen kralları düzenlemenin yolları. Ayrıca, art arda veya düşmeden art arda n permütasyon sayısı.


@ Stewie Griffin Burada yeni olduğum için, ne demek istediğinizi daha ayrıntılı olarak açıklayınız. İlk görüşümde, bir algoritma ve polinom zamanında problemi çözen bir kod sağladım. Bu nedenle, meydan okumaya bir çözüm olarak düşünülmelidir. İkinci bölüm ilginç problemi genişletiyor. Dolayısıyla bir yorum olarak görülmelidir.
Hintze

Mathematica kodunuz en üstte olacak şekilde gönderiminizi hafifçe değiştirme özgürlüğünü aldım. Kod-golf zorlukları ile gerçek kodu sağlamak zorunludur (mümkün olan en kısa). Biçimlendirdiğim gibi, muhtemelen istediğiniz gibi bir Mathematica yanıtı haline geliyor ve yine de orijinal açıklamasının altında. Bir şeyin eksik olduğunu düşünüyorsanız veya ilk cevabınızı yanlış düzenlediysem, tekrar kendiniz düzenlemekten çekinmeyin. PPCG'ye Hoşgeldiniz! :)
Kevin Cruijssen

@ Kevin Cruijssen Bu sıcak karşılama ve benim naif gönderimin düzenlenmesi için çok teşekkür ederim. Şimdi ikinci açıklama için bir Mathematica programı ekledim. Hangi muhtemelen lege artis değil. En önemlisi güzel "çevrimiçi deneyin" bağlantısını nasıl oluşturacağımı bilmiyorum.
Hintze

Herhangi bir bağlantı kullanılarak oluşturulabilir [some text](the_link). Özellikle "Çevrimiçi deneyin" bağlantısına gelince , kendi @Dennis tarafından barındırılan https://tio.run/ web sitesi her türlü programlama diline bağlantılar içerir. Wolfram Dili (Mathematica) bunlardan biridir. Üst kısımda kodu çalıştırmak için oynat düğmesini veya "Çevrimiçi deneyin" bağlantısını kopyalamak için köprü düğmesini tıklayabilirsiniz. (markup-) bağlanır. Ve kodunuzu gerçek "Kod" a (gönderiminiz) bölebilirsiniz, isteğe bağlı bir üstbilgi / altbilgi (hoş-) bir veya daha fazla test senaryosu yazdırmak için.
Kevin Cruijssen

Benim biraz künt yorum ve daha sonra cevap eksikliği için özür! Yanıt, inceleme sırasında ortaya çıktı ve biçimlendirme nedeniyle kodu fark etmedim. Yeni kullanıcıların, gerçek bir cevap vermeden zorluklara "ilginç gözlemler" göndermesi nadir değildir. İyi niyetle yapılırken, sitenin konusu bu değildir. Bunun böyle bir cevap olduğunu düşündüm. Yorumunuza cevap vermeliydim, ama acelem vardı ve yeni bir yorum yazamadım, bunun yerine eski olanı kaldırdım. Özür! Ve siteye hoş geldiniz! Umarım etrafta dolaşırsın! :)
Stewie Griffin



2

Boşluk , 161 bayt

İşte resmi, önerilmeyen gönderim: Çevrimiçi deneyin!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



Çevrimiçi deneyin!

Programın hatasız çalışabilmesi için birkaç bayt kurban ettim, yaklaşık 7-8 bayt kaybedebileceğime inanıyorum ve yine de doğru çıktı verecekti, ancak hata iletileri de çıktı ve kimse bunu istemiyor.

Tam Bayt Açıklaması:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

Golf için bazı şeyler: bir bayt kurtarmak push_0, read_STDIN_as_int, push_0, retrieveolabilir push_0, duplicate_0, read_STDIN_as_int, retrieve. Ve birinci etiket NSSNyerine boş bir etiket olabilir NSSSN(ve sonra ikinci etiket NSSSNüçüncü NSSTNve dördüncü olabilir NSSSSN). Bu da 8 bayt tasarruf etmelidir. Ayrıca, ilkini kaldırabilirsiniz, Jump_to_third_labelçünkü Set_third_labelzaten altında sağa sahipsiniz . Toplam: 140 bayt ; (veya yorumlarla: Çevrimiçi deneyin .) NNNÇıkışı kaldırırsanız -3 bayt .
Kevin Cruijssen


1

Gol> <> , 14 bayt

FL:2%Z}:3=?$|B

Çevrimiçi deneyin!

Örnek tam program & Nasıl çalışır

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

Java 8, 56 bayt

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

Bağlantı noktası @Neil JavaScript (ES6) yanıtı .

Çevrimiçi deneyin.


Eski 66 bayt cevap:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

Çevrimiçi deneyin.

Açıklama:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

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.