Indice di permutazione back-to-front


12

La sfida

Dato il numero di elementi, nin un elenco ordinato non vuoto viene prodotto l'indice, i(n)in cui la sua
" Permutazione back-to-front "
risiederebbe in un elenco di tutte le permutazioni se tali permutazioni fossero ordinate lessicograficamente.

I risultati possono essere basati su 0 o 1, basta dire quale (cioè ino n).

La permutazione back to front

... è il risultato della costruzione di un elenco di elementi prendendo ripetutamente indietro (a destra) quindi davanti (a sinistra) di un elenco in avanti (da sinistra a destra) fino a quando tutti gli elementi sono stati spostati nel nuovo elenco, in questo modo :

Input being consumed     Output being built
----------------------+----------------------
[1,2,3,4,5,6,7]       |   []
[1,2,3,4,5,6]         |   [7]
  [2,3,4,5,6]         |   [7,1]
  [2,3,4,5]           |   [7,1,6]
    [3,4,5]           |   [7,1,6,2]
    [3,4]             |   [7,1,6,2,5]
      [4]             |   [7,1,6,2,5,3]
       []             |   [7,1,6,2,5,3,4]
----------------------+----------------------
                Result:   [7,1,6,2,5,3,4]

L'indice di permutazione

Se nè 7(come nell'esempio Back-to-Front sopra) ci sono 7! = 5040possibili permutazioni degli elementi (distinti).

Il primo (o zeroth se preferisci) nella lista lessicograficamente ordinata di tutte quelle permutazioni sarebbe [1,2,3,4,5,6,7]essa stessa.
Il secondo elemento sarebbe [1,2,3,4,5,7,6].
Il penultimo oggetto sarebbe [7,6,5,4,3,1,2].
L'ultimo elemento sarebbe [7,6,5,4,3,2,1].

Da qualche parte nell'elenco c'è [7,1,6,2,5,3,4]la permutazione Back-To-Front.
In realtà risiede all'indice 4421 (o 4420, basato su 0).

I primi 100 termini della serie (1-based) di i(n)affermazione con n=1sono:

[1, 2, 5, 20, 101, 620, 4421, 35900, 326981, 3301820, 36614981, 442386620, 5784634181, 81393657020, 1226280710981, 19696509177020, 335990918918981, 6066382786809020, 115578717622022981, 2317323290554617020, 48773618881154822981, 1075227108896452857020, 24776789629988523782981, 595671612103250915577020, 14915538431227735068422981, 388375922695377900515577020, 10500493527722974260252422981, 294387851083990886241251577020, 8547374142655711068302364422981, 256705485669535347568006115577020, 7966133168508387470157556764422981, 255164703765185142697060455395577020, 8428152915046701352821133945884422981, 286804646124557439494797475697635577020, 10046343320261587490171853861825564422981, 361946983469639629977827594289009635577020, 13401806107756705416338151987291892764422981, 509620811358844406343669072112782398435577020, 19888261269838598952296612667790114958364422981, 796027021978059135393314656928325779313635577020, 32656499591185747972776747396512425885838364422981, 1372349618161694150570365858847999144050545635577020, 59042913445212141486784766209665998363213966364422981, 2599228661343236626556841044804949891956424561635577020, 117022992204136957935406320450852765172427309198364422981, 5385599167607951991914899108349402127789224443761635577020, 253237642343560228651049456045262577841408407945358364422981, 12160677950192512442211239591328112460680077946732401635577020, 596121186084075048430040923729967264426872753432477838364422981, 29817972015629302995182567242334801579950768815528034161635577020, 1521300781271752977229060449226968409483308951201458077838364422981, 79136874389672125594431576407176798565806196489681819746161635577020, 4195746409670353438703582176982222851124537591877131904925838364422981, 226647950929571027033389160506045358232154026979930809227362161635577020, 12469755402728704898931711687060471601348167024469505953048477838364422981, 698528832402134746955113935776664478135149811856698952734398562161635577020, 39828390672475082008725487969655657656845234984369903192450082717838364422981, 2310732940610403489820749422545419026172017083196773021228249831522161635577020, 136372385605079432248118270297843987319730859689490659519593045108637838364422981, 8184614727136310712028222912925520393434441746671755292929684651300962161635577020, 499395599150088488088828589263699706832570087241364247806476254829684637838364422981, 30970577661237849037564293765687064381179710710016867944356691992991422562161635577020, 1951637737743202215078582414596211073163593979517251760161922907619738331037838364422981, 124935294448140961888354806920565269729701922195027940438639971467594965899362161635577020, 8122715297634329704834815499864930982456556629150409552483483162921360809076637838364422981, 536222223779808734298894424747977821661836507759648464980376643706749720339339362161635577020, 35934888694408876553950964671857486605505798806289876128721251856561212716604532637838364422981, 2444100653742421723047039453897314094441893402549077796242989486161660232995578763362161635577020, 168678351774398889649421299427375524997828651490971291597405051437095619521145068660637838364422981, 11809893318195492906423362422261723211461109491055454565957957813190913963268700251019362161635577020, 838668695249666824614744281817664287077123498629740781320472805575397766414810317446260637838364422981, 60395789681636420036909326103457008453700968286067588202502542158402987220806878956757899362161635577020, 4409719671831047920854347812021594101623099731996837427616577550212019116846376438060145780637838364422981, 326378824480107593305098680409232188044060152088938133742995349285199216584125189021190726539362161635577020, 24482761986915290498641378436184801472882183734481184704052899163370643460988742220422624697460637838364422981, 1861011939679134964489290882424961756757512351644848150968435083798473400034549180897307347526539362161635577020, 143322080088606734669581493203883323226982866872563510695813139604263517949121870899167900513721460637838364422981, 11180959098117691096787939665528162905504766712615688479353149686064571807285078895345918312663622539362161635577020, 883437253980179837588356231874303489164303450066956218734514913541773418886216781638015892528346553460637838364422981, 70686019792283622457223177491312228676420353892298796358374930144685265836593932061030928974752467526539362161635577020, 5726440000955084363422511054086796876735936890839327162387490119571704913857298124195153605274993472953460637838364422981, 469637893700329090478715695935318149767077357177154001454773443957172289821041850488811978203204173646406539362161635577020, 38985601803506257421418755484185292421669426050466292273769584084412579273175587484390779961900566697260473460637838364422981, 3275254532761847009577968823645945995578996860191583194845076448298646552018541276645494943006816186458917446539362161635577020, 278435156905293180685369975402415213484477637470382623210256836304261379607777392174394791509334107831816205753460637838364422981, 23948660226767439201080153228038844501800392914958999127628507660415900870134672884615069843391985357739844389446539362161635577020, 2083808638152760278012520365471350750727983345146397213195344003554238214857458501196068353393022808146994627392953460637838364422981, 183398833619245678836784325280074933629492985604252949471226236983335323969170740817904072891411479020269638889458246539362161635577020, 16324556327289215402380134937173544376210173250892288905442294470849835710409338998582008497896189183708810744110298553460637838364422981, 1469391408154472281907142598683652193509359788033796478036774569234135557383656537547410122872987870461908423725867813446539362161635577020, 133730761359685823973259426160811489954077506688872881313704960027919535214176338228137873831877461557289259913042140378553460637838364422981, 12304683293281621431502064899712741587623914209186541475526534622910218175769343180214908250005163885795818227069614613285446539362161635577020, 1144467823788359953327703097406527694627129315367226993710615746590336588945697972034988381266839681418043178062317463477466553460637838364422981, 107592147841885948074037582159380073309559674264815645313786758687454863280472229658194120833316575777142822473140067877053221446539362161635577020, 10222386340397173314525664517235347022088186665852557223898463812546839124314230895213571254552107892786139414391086539473362138553460637838364422981, 981455548530552515895045737024658454136095461985415238220477591025945383684777269092475904782448641089288955324574667766166512421446539362161635577020, 95211304133951567337433380212539040258207718457187560919883999728307800228797098229713403270806624010171995234355103499880901319898553460637838364422981, 9331679144749296178288752362844703433551486045621764102574354777566399269794426700653262755936922495813433855354253356929531746247461446539362161635577020, 923930475294692230638703636199822301473608196598194450583355284174609600662504729388761377005628260366723545352917984225582320362921178553460637838364422981, 92402284968649460451060535220066878189242360067783427018009608611042990392567410879552702599150890025886974375474305774025602890553942821446539362161635577020

( i(0)=i(1)=1, ma la sfida stessa riguarda solo elenchi non vuoti)

Al momento della pubblicazione, questa sequenza non è stata visualizzata nell'OEIS .

L'output deve solo funzionare in teoria (non preoccuparti di overflow di numeri interi o di esaurire le risorse, ad esempio).

Questo è , quindi vince la risposta più breve in byte.

Tuttavia, non lasciare che le lingue del code-golf ti dissuadano: anche le buone soluzioni dovrebbero ottenere voti positivi!


1
Spero che vada tutto bene: è rimasto nella sandbox per oltre un mese senza feedback.
— Jonathan Allan,


Questi sono fattoriali alternati con ogni altra voce aumentata di 1.
— xnor

@xnor sì, la permutazione fronte-retro ha l'indice precedente a quello fronte-retro.
— Jonathan Allan,

Risposte:


8

Haskell , 32 byte

f 1=1
f n=product[1..n]+1-f(n-1)

Provalo online!

Usa la relazione f(n-1) + f(n) = n! + 1. I membri adiacenti delle sequenze aggiungono ai fattoriali più uno:

1,   2,   5,   20,   101,   620,   4421, ...
  3     7    25    121    721   5041  ...
 2!+1  3!+1  4!+1  5!+1   6!+1  7!+1 

6

Gelatina , 6 byte

R!ḅ-_Ḃ

0-based. Provalo online!

Fortemente ispirato dalla risposta ES6 di @ Neil .

Spiegazione

R!ḅ-_Ḃ
R       Create the range [1..N].
 !      Take the factorial of each.
  ḅ-    Convert from base -1; that is, sum, but alternate between adding and subtracting.
    _Ḃ  Subtract N%2.

Ma come?

Spiego nella mia risposta ES6 una tecnica correlata per il calcolo di ogni numero. La formula è questa:

(n-1)(n-1)! + (n-3)(n-3)! + (n-5)(n-5)! + ...

Una realizzazione mi ha colpito leggendo la risposta ES6 di @ Neil . Questa formula può essere semplificata in questo modo:

(n-1)(n-1)!        + (n-3)(n-3)!            + (n-5)(n-5)!            + ...
(n(n-1!) - (n-1)!) + ((n-2)(n-3!) - (n-3)!) + ((n-4)(n-5)! - (n-5)!) + ...
(n!      - (n-1)!) + ((n-2)!      - (n-3)!) + ((n-4)!      - (n-5)!) + ...
n! - (n-1)! + (n-2)! - (n-3)! + (n-4)! - (n-5)! + ...

Il codice Jelly R!ḅ-calcola questa formula. Tuttavia, ogni valore dispari di navrà un extra + 0!alla fine, di cui ci occupiamo sottraendo n%2.


1
Complimenti hai trovato la mia soluzione! (notare che è basato su 0).
— Jonathan Allan

Figure che useresti ḅ-prima o poi ...: P Bel lavoro!
— Dennis

@JonathanAllan Non appena ho visto che avevi pubblicato la sfida, avrei saputo che ci sarebbe stata una risposta subdola a Jelly. Tuttavia, ci è voluto del tempo perché qualcuno lo trovasse. Grande sfida :-)
— ETHproductions

4

JavaScript (ES6), 38 byte

f=(n,x=n%2,y=1)=>n-x&&f(n,++x,y*=-x)+y

0-indicizzati. (Nessuna spiegazione perché in realtà non so perché funzioni, scusa.)


1
Oh, è geniale. La mia risposta prende (n-1)*(n-1)! + (n-3)*(n-3)! + (n-5)*(n-5)! + ..., che equivale a (n! - (n-1)!) + ((n+2)! - (n-3)!) + ((n-4)! - (n-5)!) + ...quale è la tua risposta.
— ETHproductions

3

JavaScript (ES6), 44 byte

f=(x,n=0,g=1)=>x-n&&(x-n&1)*g*n+f(x,++n,g*n)

0-based. Ciò sfrutta il fatto che i numeri possono essere rappresentati come somme di fattoriali nel seguente modello:

       1   2   6  24 120 720
   0:                       
   1:  1
   4:      2
  19:  1       3
 100:      2       4
 619:  1       3       5
4420:      2       4       6

Perché? Le permutazioni possono essere rappresentati bene in basso fattoriale : prendere il n ° elemento fuori le corrisponde lista rimanenti per una cifra di n in quella posizione. Alterniamo tra prendere l' ultimo elemento (cifra più alta) e il primo elemento (zero); pertanto, nella base fattoriale, questi numeri possono essere rappresentati come:

0
10
200
3010
40200
503010
6040200

e così via.


2

MATL , 17 byte

:t"&0)P]vG:Y@!=Af

L'output è 1 indicizzato.

Provalo online!

Spiegazione

Il codice applica la definizione: crea la permutazione back-to-front, genera tutte le permutazioni, confronta la prima con tutte le seconde e genera l'indice della corrispondenza.

:        % Input n implicitly. Push [1 2 ... n]
t        % Duplicate
"        % For each: do the following n times
  &0)    %   Push the last element and then the rest of the array
  P      %   Reverse
]        % End
v        % Concatenate the whole stack vertically. This produces into a column vector
         % with the back-to-front permutation
G:       % Push [1 2 ... n] again
Y@!      % Permutations of [1 2 ... n]. Gives a matrix. Each column is a permutation
=        % Test for equality, element-wise with broadcast
A        % All: true for columns that have all entries equal to true. Gives a row vector
f        % Find: index of non-zero value. Implicitly display

2

Gelatina , 9 byte

RU;¥/ỤUŒ¿

Provalo online!

Eh, stavo cercando di farlo. Si scopre che @Dennis ha pubblicato per primo, ma questo è più breve.

Spiegazione

RU;¥/ỤUŒ¿
R           List of numbers from 1 to {the input}
   ¥/       Left-fold the list by
 U;         prepending the reverse of the list to the next element
     Ụ      Invert permutation
      U     Reverse the list
       Œ¿   Find index of permutation

Avere Œ¿come built-in è abbastanza utile qui permettendoci di convertire una permutazione nel suo indice, quindi gli altri 7 byte sono responsabili della costruzione della permutazione back-to-front.

Il modo in cui lo facciamo è prima di costruire una permutazione diversa, attraverso il seguente schema:

1
1 2
2 1 3
3 1 2 4
4 2 1 3 5
5 3 1 2 4 6
6 4 2 1 3 5 7

Ogni volta, invertiamo l'elenco che abbiamo finora, quindi aggiungendo il numero intero successivo. Ciò non produce la permutazione back to front, ma è chiaramente correlata.

La permutazione che stiamo cercando di ottenere è 7 1 6 2 5 3 4. Come è correlato? Bene, l'elemento nella 7a posizione della permutazione che abbiamo è un 7; l'elemento in 1a posizione è un 6; l'elemento in sesta posizione è un 5; l'elemento in seconda posizione è un 4 e così via. In altre parole, è l'inverso della permutazione che abbiamo (con gli elementi in ordine inverso). Come tale, dopo la riduzione, possiamo invertire la permutazione con Ụe invertire il risultato con Uper ottenere la permutazione back-to-front che vogliamo.

È possibile che ci siano risparmi qui, perché è stato scritto in fretta e sembra che abbia almeno un potenziale per riorganizzare le cose. Non sono sicuro che sia possibile salvare un intero byte, comunque.


2

Gelatina , 10 8 byte

RṚżRFQŒ¿

Grazie a @ ais523 per giocare a golf con 2 byte e un'eccezionale velocità!

Provalo online!

Come funziona

RṚżRFQŒ¿  Main link. Argument: n

R         Range; yield [1, ..., n].
 Ṛ        Reverse; yield [n, ..., 1].
   R      Range; yield [1, ..., n] again.
  ż       Zip; yield [[n, 1], ..., [1, n]].
    F     Flatten.
     Q    Unique; deduplicate the results.
      Œ¿  Compute the permutation index of [n, 1, n-1, 2, ...].

1
Sembra che ti sia perso il Œ¿builtin. Il tuo metodo per costruire la lista è un byte più corto del mio, quindi se puoi sostituirlo i@Œ!con quello, dovresti riuscire a ridurlo a 8 byte, battendo la mia risposta.

Dimenticato completamente che era una cosa. Grazie!
— Dennis il

0

PHP, 86 byte

for($i=$argv[1];$i>0;$i--)$o+=gmp_strval(gmp_fact($i))*($i%2==$argv[1]%2?1:-1);echo$o;

Utilizza l' estensione GNU Multiple Precision .

Questa funzione sfrutta il fatto che i(n)è uguale an! - (n-1)! + (n-2)! - (n-3)! etc

Abbattersi

for($i=$argv[1];$i>0;$i--) {        // Simple decreasing for loop (added { for readability)
    $o+=                            //  increment output with
        gmp_strval(gmp_fact($i))    //      $i!
    * ($i%2 == $argv[1]%2 ? 1 : -1) //      multiplied by -1 if ($i is odd when the input is even) or (if $i is even when the input is odd), else by 1
    ;
}
echo $o;                            // echoes output

0

Lotto, 79 byte

@set/ax=%1%%2-1,y=z=1
@for /l %%i in (-%1,1,%x%)do @set/az+=y*=x-=1
@echo %z%

0-indicizzati.


0

Pyth, 12 byte

x.pQ<Q.i_UQU

0-indicizzati.

Spiegazione

x.pQ<Q.i_UQU
      .i       Interleave
        _UQUQ  Reversed range and range
    <Q         Take first n
x              Find the index
 .pQ           In the list of permutations
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.