Ters Ekleme sıralaması


19

Amaç

Ekleme Sıralamasının sıralamak için yapacağı hareketlerden orijinal şifreli listeyi oluşturun . Orijinal listesinden tüm numaraları sahip olacak 0kadar N-1(dahil) Ngirdi boyutudur.

Giriş

Listeyi sıralamak için gerekli hareketleri içeren bir liste. Her değer, orijinal (karıştırılmış) sayının doğru konumunda olması için yer değiştiren yuva miktarını temsil eder, bu işlemin soldan sağa olduğunu unutmayın. Giriş listesindeki
(0 dizinli) konumdaki değer iarasında 0ve ikapsayıcı olacaktır.
Geçersiz girişleri işlemenize gerek yoktur, bu durumda herhangi bir davranış kabul edilebilir (çökme, sonsuz döngü, vb.).

Çıktı

Şifreli liste

Hareketleri oluşturmak için adım adım

Scrambled List | Moves to sort
[4,0,2,1,3,5]  | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5]  | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5]  | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5]  | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5]  | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5]  | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]

Yani, girdi [0,1,1,2,1,0]için programınızın çıktı alması gerekir [4,0,2,1,3,5].
Hareketlerin (son) sıralı listedeki değil, sıralı segmentteki (kalın bölüm) konum olduğunu unutmayın.

Test Durumları

[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]

Kazanan

Bu , bu yüzden en kısa cevap kazanır.

code-golf  array-manipulation  code-golf  code-golf  animation  code-golf  restricted-source  code-golf  java  code-golf  decision-problem  graph-theory  code-golf  conversion  electrical-engineering  code-golf  ascii-art  code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

1
Program listenin uzunluğunu girdi olarak da alabilir mi?
mbomb007

@ mbomb007 hayır.
Çubuk

Bunun yerine (n-1) adımlarını kullanabilir miyiz? İlki gereksizdir, çünkü her zaman sıfırdır.
GB

@GB emin, çıktı doğru olduğu sürece, herhangi bir algoritmayı kullanabilirsiniz
Rod

Yanıtlar:


14

Jöle , 12 bayt

L!_UÆ¡$œ?J’U

Çevrimiçi deneyin!

açıklama

Temel olarak iki listeyi (giriş ve çıkış) bir tamsayıyı kodlama olarak görebiliriz; girdi faktöriyel bazda bir tamsayıyı kodlar ve çıktı permütasyon olarak bir tamsayıyı kodlar. Neyse ki, Jelly zaten bu kodlamaların her ikisine de çok yakın olan yapılara sahiptir, bu yüzden bir tamsayıya, daha sonra diğer kodlamaya geri dönmek için küçük kod parçaları yazma meselesidir.

L!_UÆ¡$œ?J’U
   U           Reverse {the input}
    Æ¡         and convert from base factorial to integer;
  _   $        subtract that from
L!             the factorial of the length of {the input};
       œ?      then take the nth permutation of
         J     [1,2,...,l], where l is the length of {the input},
          ’    subtract 1 from every elevent,
           U   and reverse it

Temel faktöriyelde, listenin ilk elemanının 0, ikincisinin 0 veya 1, üçüncünün 0/1/2 ve benzeri olması gerektiğini gözlemleyebiliriz. Bu nedenle, öğelerini temel dönüştürme için normal yazma düzenine almak için girdiyi tersine çevirmeliyiz.

Ek olarak, faktöriyel dönüşümün ve permütasyon dönüşümünün ekleme sıralamasının kullandığı işlemle eşleşmesi için iki ayar yapmamız gerekir: permütasyonların sırasını tersine çevirme ve çıktı listesinin sırasını tersine çevirme. Çıktı listesini tersine çevirmek, Uprogramın sonunda yalnızca bir a'ya ihtiyaç duyacak kadar kolaydır . Permütasyon sırasını tersine çevirmek için, giriş uzunluğunun faktöriyelinden çıkarırız (bu çalışır, çünkü taban faktöriyeni 0 ila (uzunluk! -1) aralığında bir sayı üretir, ancak permütasyonlar Jelly tarafından 1'den uzunluğa kadar numaralandırılır! , bir faktöriyelden bir permütasyon indeksini çıkarırken normalde aldığınız tek tek iptal edilen bir örtülü tek tek üreterek).

Jelly , 9 bytes, @JonathanAllan ile işbirliği içinde

UÆ¡Nœ?J’U

Programın bu sürümü çok benzer, ancak permütasyon sırasını tersine çevirmek için farklı bir yöntem kullanır; girişi tersine çevirmek siparişi tersine çevirmek Niçin yeterlidir œ?. Bunun dışında önceki programla aynı şekilde çalışır.

Çevrimiçi deneyin!


4
O_O Ne sihirdir olan bu?
DLosc

Oh güzel - benim Æ¡ve œ?atomların bunun için işe yarayacağını biliyordum (bunları daha önce bu meydan okuma için kullanmaya çalışıyordum - çok yakındım, sadece L!orada ihtiyacım vardı).
Jonathan Allan

Mükemmel kod!
Greg Martin

1
Aslında, bunu 9 bayt olarak yapabilirsiniz, UÆ¡Nœ?L’Uçünkü œ?modüler olarak (ve Jelly listelerini kullanıyorlarmış gibi) hareket etmeyi (ve benzerini) uyguladım . NNegatif değeri ile sadece endeksler. Not: Değiştim Jiçin L- bu numara verilmiş bir dizi altında-luk zaten) yapar sırf olduğunu.
Jonathan Allan

6

Mathematica, 92 bayt

Permute[Range[l=Length@#]-1,(c=Cycles@{#}&)@{}©##&@@c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]&

Giriş olarak negatif olmayan tamsayıların bir listesini alan ve negatif olmayan tamsayıların bir listesini döndüren saf işlev. Yukarıdaki kod ©, yanlış olan bir a içerir : bu, 3 baytlık U + F3DE sembolü için bir yer tutucudur; bu, Mathematica'nın içinde noktalı bir daire ile temsil ettiği ve permütasyonların bileşimini temsil eden bir dairedir.

c=Cycles@{#}&tamsayıların listesini Cyclespermütasyonu temsil eden bir nesneye dönüştüren bir işlevi tanımlar ; örneğin, c[{3,4}]bir listenin transpozisyon değiştirme elemanları 3 ve 4'tür. c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]girdi listesini alır ve ekleme sıralamasını geri almak için gerekli permütasyonları oluşturur. Daha sonra c@{}©##&@@kimlik permütasyonundan başlayarak tüm bu permütasyonları bir araya getirir c@{}. Son olarak, Permute[Range[l=Length@#]-1,...]bu permütasyon uygun uzunluktaki 0 ​​indeksli listeye uygulanır.


1
Dahili ne yok ?! Elbette ...
Jonathan Allan

3
@{#}&)@{}©##&@@Korkunç görünüyor.
Yytsi

6

Python 2, 79 68 bayt

10 bayt kazandığı için Krazor'a teşekkürler

1 bayt tasarruf için TuukkaX'a teşekkürler

a=input();b=range(len(a));print[b.pop(j-a[j])for j in b[::-1]][::-1]

Tersine hareketler oluşturarak çalışır


2
Bunu 66 yap ! Nasıl hakkında: a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]. Liste anlama ftw!
FMaz

1
@Krazor Daha önce kaldırılabilecek bir alanınız var for, o yüzden 65'i sanırım: D
Yytsi

@Krazor Liste anlama tam olarak işe yaramadı ortaya çıkıyor, ama b [:: - 1] kullanma fikrini sevdim!
matematik bağımlısı

Olmaz? Cep telefonuyla yorum yaptım, belki bir şeyler yanlış yazdım. Hangi kısım çalışmıyor? Benim için doğru yorumladı ve tüm test senaryolarını yerine getirdi.
FMaz

@Krazor Oh whoops, hayır haklısın. Test ederken yanlış yazmış olan benim.
matematik bağımlısı

5

JavaScript (ES6), 69 65 63 bayt

a=>a.reverse(b=[...a.keys()]).map(o=>+b.splice(~o,1)).reverse()

Can sıkıcı bir şekilde hem giriş hem de çıkış yanlış sırada. Düzenleme: @Arnauld sayesinde 4 bayt kaydedildi. @ETHproductions sayesinde 2 bayt tasarruf edildi.


Hala daha iyi bir yol bulmaya çalışıyordum ama sen çok daha hızlıydın. Güzel!
Arnauld

1
İhtiyacınız yok, değil imi?
Arnauld

@ Görünüşe göre hayır. Python cevabını anlamaya çalışarak başladım ve sadece gerçekten kullanmadığını fark ettim i...
Neil

1
Kolay -2:o=>+b.splice(~o,1)
ETHproductions

3

JavaScript (ES6), 73 71 bayt

ETHproductions sayesinde 2 bayt tasarruf

m=>(a=m.map((_,i)=>j=i)).map(_=>a.splice(j,0,+a.splice(j-m[j--],1)))&&a

Test senaryoları


Uzunluk ve menzili aynı anda almanın güzel bir yolu. Ben önerecektim a=m.map(_=>j++,j=0), ama bu aynı uzunlukta ve eminim zaten denedin.
ETHproductions

@ETHproductions Haklısın: Ben de denedim. :-) (Bu değer bu eşdeğer olmadığını belirterek çekebilir: Bu kuracak jiçin a.lengthyerine a.length-1ve gerektirecektir a.splice(--j,0,a.splice(j-m[j],1)[0]))
Arnauld

Heh, bunu ben de düşündüm, ama aynı uzunlukta olduğu için bahsetmeye değer olduğunu düşünmedim
ETHproductions 18:03

1
Kolay -2:+a.splice(j-m[j--],1)
ETHproductions

2

Haskell , 85 bayt

f x|n<-length x-1=reverse x#[n,n-1..0]
(n:r)#l=r#(take n l++drop(n+1)l)++[l!!n]
x#l=x

Çevrimiçi deneyin! Örnek kullanım: f [0,1,1,2,1,0]verim [4,0,2,1,3,5].

f xişlevi #liste xters çevrilmiş ve bir liste ile çağırır [length x - 1, length x - 2, ... , 0]. (n:r)#lgerçekleştirir ters ekleme sıralama yinelemeli alınarak nüzerinden filtre elemanından l, burada l!!nverimler ninci elemanı ve take n l++drop(n+1)lverimler listesi lile nçıkarıldı inci elemanı.


Haskell, çok güzel.
FMaz

1

perl, 61 bayt

@o=@p=0..@ARGV-1;splice@o,$_,0,splice@o,$_-pop,1for reverse@p

Çıkış @o dizisinde sona erer. Komut satırı bağımsız değişkenleri olarak girdi dizisine sahip örnek:

perl -le'@o=@p=0..@ARGV-1;splice@o,$_,0,splice@o,$_-pop,1for reverse@p;print@o' 0 1 1 2 1 0
402135

1

Ruby, 49 bayt

->l{(w=l.size).times{l.insert(l.shift+w-=1,w)};l}

En büyük sayıyla başlayarak, liste içinde "ters ekleme" işlemini gerçekleştirir.

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.