O desafio
Dado o número de itens, n
em uma lista ordenada não-vazia, gera o índice, i(n)
no qual sua
" Permutação de trás para a frente "
residiria em uma lista de todas as permutações se essas permutações fossem classificadas lexicograficamente.
Os resultados podem ser baseados em 0 ou 1, basta dizer qual (ou seja i
, não n
).
A permutação de trás para frente
... é o resultado da construção de uma lista de itens, colocando repetidamente a parte traseira (direita) e a frente (esquerda) de uma lista ordenada para a frente (esquerda para a direita) até que todos os itens tenham sido movidos para a nova lista, assim :
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]
O índice de permutação
Se n
for 7
(como o exemplo de trás para frente acima), existem 7! = 5040
possíveis permutações dos itens (distintos).
O primeiro (ou zeroth, se você preferir) na lista lexicograficamente classificada de todas essas permutações seria ele [1,2,3,4,5,6,7]
próprio.
O segundo item seria [1,2,3,4,5,7,6]
.
O penúltimo item seria [7,6,5,4,3,1,2]
.
O item final seria [7,6,5,4,3,2,1]
.
Em algum lugar da lista está [7,1,6,2,5,3,4]
- a permutação Back-To-Front.
De fato, ele reside no índice 4421 (ou 4420, com base em 0).
Os primeiros 100 termos da série (com base em 1) de i(n)
declaração n=1
são:
[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
, mas o desafio em si só lida com listas não vazias)
No momento da postagem, essa sequência não apareceu no OEIS .
A saída precisa apenas trabalhar na teoria (não se preocupe com o excesso de números inteiros ou com a falta de recursos, por exemplo).
Isso é código-golfe , então a resposta mais curta em bytes vence.
No entanto, não deixe as linguagens de código-golfe dissuadi-lo - boas soluções também devem ser aprovadas!
fonte
Respostas:
Haskell , 32 bytes
Experimente online!
Usa o relacionamento
f(n-1) + f(n) = n! + 1
. Membros adjacentes das seqüências são adicionados aos fatoriais mais um:fonte
Gelatina , 6 bytes
Baseado em 0. Experimente online!
Fortemente inspirado pela resposta do @ Neil ES6 .
Explicação
Mas como?
Explico na minha resposta ES6 uma técnica relacionada para calcular cada número. A fórmula é esta:
Uma percepção me impressionou ao ler a resposta do @ Neil ES6 . Essa fórmula pode ser simplificada da seguinte forma:
O código Jelly
R!ḅ-
calcula essa fórmula. No entanto, cada valor ímpar den
terá um extra+ 0!
no final, o qual cuidamos subtraindon%2
.fonte
ḅ-
mais cedo ou mais tarde ...: P Bom trabalho!JavaScript (ES6), 38 bytes
Indexado a 0. (Nenhuma explicação, porque eu realmente não sei por que isso funciona, desculpe.)
fonte
(n-1)*(n-1)! + (n-3)*(n-3)! + (n-5)*(n-5)! + ...
, que é equivalente a(n! - (n-1)!) + ((n+2)! - (n-3)!) + ((n-4)! - (n-5)!) + ...
qual é a sua resposta.JavaScript (ES6), 44 bytes
Baseado em 0. Isso tira proveito do fato de que os números podem ser representados como somas de fatoriais no seguinte padrão:
Por quê? As permutações podem ser representados bem na base de fatorial : tomar o n th produto para fora do restante lista corresponde a um dígito n nessa posição. Alternamos entre pegar o último item (dígito mais alto) e o primeiro item (zero); portanto, na base fatorial, esses números podem ser representados como:
e assim por diante.
fonte
MATL , 17 bytes
A saída é indexada em 1.
Experimente online!
Explicação
O código aplica a definição: cria a permutação de trás para a frente, gera todas as permutações, compara a primeira com todas as últimas e gera o índice da correspondência.
fonte
Geléia , 9 bytes
Experimente online!
Huh, eu estava tentando fazer isso com FGITW. Acontece que @Dennis postou primeiro, mas isso é mais curto.
Explicação
Ter
Œ¿
como incorporado é bastante útil aqui, permitindo-nos converter uma permutação em seu índice; portanto, os outros 7 bytes são responsáveis pela construção da permutação de trás para a frente.A maneira como fazemos isso é primeiro construir uma permutação diferente, através do seguinte padrão:
Cada vez, invertemos a lista que temos até agora e, em seguida, anexamos o próximo número inteiro. Isso não produz a permutação de trás para frente, mas está claramente relacionado.
A permutação que estamos tentando obter é
7 1 6 2 5 3 4
. Como isso está relacionado? Bem, o elemento na 7ª posição da permutação que temos é um 7; o elemento na 1ª posição é um 6; o elemento na 6ª posição é um 5; o elemento na 2ª posição é um 4 e assim por diante. Em outras palavras, é o inverso da permutação que temos (com os elementos na ordem inversa). Assim, após a redução, podemos inverter a permutaçãoỤ
e reverter o resultadoU
para obter a permutação de trás para a frente que queremos.É possível que haja economia aqui, porque foi escrito com pressa e parece que ele tem pelo menos algum potencial para reorganizar as coisas. Não tenho certeza se é possível salvar um byte inteiro.
fonte
Geléia ,
108 bytesGraças a @ ais523 por jogar fora 2 bytes e uma tremenda aceleração!
Experimente online!
Como funciona
fonte
Œ¿
builtin. Seu método para construir a lista é um byte menor que o meu, portanto, se você puder substituí-loi@Œ!
por isso, poderá reduzi-lo a 8 bytes, superando a minha resposta.PHP, 86 bytes
Usa a extensão GNU Multiple Precision .
Esta função tira proveito do fato de que
i(n)
é igual an! - (n-1)! + (n-2)! - (n-3)! etc
Demolir
fonte
Lote, 79 bytes
Indexado a 0.
fonte
Pitão, 12 bytes
Indexado a 0.
Explicação
fonte