Genereer de reeks permutaties vooraf-toevoegen en toevoegen in lexicografisch gesorteerde volgorde

Joe Z. 03/06/2015. 10 answers, 658 views
code-golf combinatorics

Definieer een prepend-append sequence van lengte n als een permutatie van de getallen 1, 2, ..., n die kan worden gegenereerd door de volgende procedure:

  • Begin met nummer 1 .

  • Plaats voor elk nummer van 2 tot n dit nummer aan het begin of het einde van de reeks ( append het append of append het toe, vandaar de naam van de reeks).

Dit is bijvoorbeeld een geldige manier om een ​​prepend-append sequentie van lengte 4 te genereren:

1
21     [beginning]
213    [end]
2134   [end] 

Je taak is om een ​​programma of functie te maken waarbij een getal n van 3 tot 30 als invoer wordt gebruikt en alle prepend-append sequenties met lengte n in lexicografische volgorde wordt afgedrukt of geretourneerd (als je tekenreeksen en geen lijsten uitvoert, getallen hierboven 9 wordt weergegeven als letters a-u , om de tekenreekslengte te behouden). Dit is bijvoorbeeld die volgorde voor n = 4 :

1234  [RRR]
2134  [LRR]
3124  [RLR]
3214  [LLR]
4123  [RRL]
4213  [LRL]
4312  [RLL]
4321  [LLL] 

Over het algemeen zijn er 2 n-1 prepend-append permutaties van lengte n .

U mag in uw code geen ingebouwde sorteerfuncties in uw taal gebruiken. Het kortste programma om dit in elke taal te doen, wint.

5 Comments
xnor 03/06/2015
Ik ben geen fan van de vereiste uitvoerformaten, met name de conversie naar letters a-u . Kunnen we gewoon cijferlijsten produceren?
3 Optimizer 03/06/2015
Misschien wilt u het antwoord na enige tijd accepteren, omdat sommige mensen geneigd zijn een vraag niet te beantwoorden als deze een geaccepteerd antwoord heeft.
1 Optimizer 03/06/2015
Dus je hebt verkeerd geaccepteerd antwoord ..
2 Joe Z. 03/06/2015
FryAmTheEggman plaatste zijn antwoord 21 minuten voordat je de jouwe bewerkte.
2 Joe Z. 03/06/2015
@Optimizer Ik denk niet dat dit de raarste manier is - het antwoord van FryAmTheEggman was 19 bytes lang 21 minuten voordat het jouwe was. Dat is het vroegste geplaatste kortste antwoord.

10 Answers


Optimizer 03/06/2015.

CJam, 22 20 19 17 bytes

]]l~{)f+_1fm>|}/p 

Code expansion :

]]                   "Put [[]] onto stack. What we will do with this array of array is";
                     "that in each iteration below, we will first append the next";
                     "number to all present arrays, then copy all the arrays and";
                     "move the last element to first in the copy";
  l~                 "Read input number. Lets call it N";
    {         }/     "Run this code block N times ranging from 0 to N - 1";
     )f+             "Since the number on stack starts from 0, add 1 to it and append";
                     "it to all arrays in the array of array beginning with [[]]";
        _1fm>        "Copy the array of array and move last element from all arrays";
                     "to their beginning";
             |       "Take set union of the two arrays, thus joining them and eliminating";
                     "duplicates. Since we started with and empty array and started adding";
                     "numbers from 1 instead of 2, [1] would have appeared twice if we had";
                     "simply done a concat";
                p    "Print the array of arrays"; 

How it works :

Dit is een foutopsporingsversie van de code:

]]l~ed{)edf+ed_ed1fm>ed|ed}/edp 

Laten we eens kijken hoe het werkt voor input 3 :

[[[]] 3]                                 "]]l~"            "Empty array of array and input";
[[[]] 1]                                 "{)"              "First iteration, increment 0";
[[[1]]]                                  "{)f+"            "Append it to all sub arrays";
[[[1]] [[1]]]                            "{)f+_"           "Copy the final array of array";
[[[1]] [[1]]]                            "{)f+_1fm>"       "shift last element of each";
                                                           "sub array to the beginning";
[[[1]]]                                  "{)f+_1fm>|}"     "Take set based union";
[[[1]] 2]                                "{)"              "2nd iteration. Repeat";
[[[1 2]]]                                "{)f+"
[[[1 2]] [[1 2]]]                        "{)f+_";
[[[1 2]] [[2 1]]]                        "{)f+_1fm>";
[[[1 2] [2 1]]]                          "{)f+_1fm>|}";
[[[1 2] [2 1]] 3]                        "{)";
[[[1 2 3] [2 1 3]]]                      "{)f+"
[[[1 2 3] [2 1 3]] [[1 2 3] [2 1 3]]]    "{)f+_";
[[[1 2 3] [2 1 3]] [[3 1 2] [3 2 1]]]    "{)f+_1fm>";
[[[1 2 3] [2 1 3] [3 1 2] [3 2 1]]]      "{)f+_1fm>|}";
[[[1 2 3] [2 1 3] [3 1 2] [3 2 1]]]      "{)f+_1fm>|}/"; 

Probeer het hier online


alephalpha 03/06/2015.

Haskell, 47 bytes

f 1=[[1]]
f n=(\x->map(++[n])x++map(n:)x)$f$n-1 
3 comments
1 nimi 03/06/2015
Overschakelen naar lijstbegrip bespaart een paar bytes: f n=[[n:x,x++[n]]|x<-f$n-1]>>=id (met behulp van de code golfers concat-functie >>=id ).
1 proud haskeller 03/07/2015
@nimi maar het is in de verkeerde volgorde r
nimi 03/08/2015
@proudhaskeller: Oh lieverd, heb de specificatie niet zorgvuldig genoeg gelezen. Ik heb geprobeerd het te repareren en vond vier enigszins verschillende manieren van dezelfde lengte als de versie van @ alephalpha, dus ik kan geen verbetering bieden. f n=[x++[n]|x<-f$n-1]++[n:x|x<-f$n-1] , f n=map(++[n])(f$n-1)++[n:x|x<-f$n-1] , f n=map(++[n])(f$n-1)++map(n:)(f$n-1) , f n=(++[n])#n++(n:)#n;p#i=map p$f$i-1

xnor 03/06/2015.

Python 2, 68

 f=lambda n:[[1]]*(n<2)or[x*b+[n]+x*-b for b in[1,-1]for x in f(n-1)] 

Voert een lijst met cijferlijsten uit.

Een recursieve oplossing. Voor n==1 , output [[1]] . Voeg anders n aan het begin of einde van alle (n-1) -permutaties. Voorbereiden maakt de permutatie later lexicografisch dan toevoegen, dus de permutaties blijven gesorteerd.

De "Boolean" b codeert of [n] aan het begin of einde moet worden gezet. Eigenlijk verplaatsen we de rest van de lijst x in de uitdrukking x*b+[n]+x*-b . Als je b als -1 of 1 instelt, kun je flip by negating gebruiken, omdat een lijst vermenigvuldigd met -1 de lege lijst is.


FryAmTheEggman 03/06/2015.

Pyth, 19

usCm,+dH+HdGr2hQ]]1 

Probeer het hier online

Dit is een volledig programma dat input van stdin inneemt.

Dit werkt op dezelfde manier als de oplossing van xnor, maar genereert de waarden een beetje uit orde, dus ze moeten opnieuw worden gerangschikt. Wat er op elk niveau gebeurt, is dat aan elke vorige lijst met waarden de nieuwe waarde is toegevoegd aan het einde en aan het begin en deze zijn elk verpakt in een 2-tuple die samen in een lijst zijn gewikkeld. Bijvoorbeeld, de eerste stap doet dit:

[[1]]
[([1,2], [2,1])] 

Vervolgens wordt deze lijst met tupels gecomprimeerd (en vervolgens gesommeerd om de meest buitenste lijst te verwijderen). In het eerste geval geeft dit gewoon de onverpakte waarde van boven, omdat er maar één waarde in de lijst staat.

Stappen met 2-> 3:

([1,2], [2,1])
[([1,2,3],[3,1,2]),([2,1,3],[3,2,1])]
([1,2,3],[2,1,3],[3,1,2],[3,2,1]) 

alephalpha 03/06/2015.

Mathematica, 57 54 49 bytes

f@1=NO 

Voorbeeld:

f[4] 

{{1, 2, 3, 4}, {2, 1, 3, 4}, {3, 1, 2, 4}, {3, 2, 1, 4}, {4, 1, 2, 3} , {4, 2, 1, 3}, {4, 3, 1, 2}, {4, 3, 2, 1}}


randomra 04/13/2017.

J, 26 bytes

0|:<:((,,.,~)1+#)@[&0,.@1:

   (0|:<:((,,.,~)1+#)@[&0,.@1:) 3
1 2 3
2 1 3
3 1 2
3 2 1 

Verbetering van 1 byte dankzij FUZxxl .

1 comments
FUZxxl 03/06/2015
Plaatsvervanger,. voor ,"1 voor één personage.

Pietu1998 04/13/2017.

Pyth, 343331 29

Eigenlijk een vertaling van xnor 's Python-antwoord . Ik ben nog steeds niet geweldig met Pyth, dus verbetersuggesties zijn welkom.

Definieert een functie y om een ​​lijst met lijsten met gehele getallen te retourneren.

L?]]1 

Update: 2 bytes opgeslagen dankzij FryAmTheEggman .

Uitleg:

L                                  define a function y with argument b that returns
 ?*]]1 
4 comments
FryAmTheEggman 03/06/2015
Sommige pyth-dingen: -b1 kan tb , [1_1) kan zijn ,1_1 (u kunt echter gewoon de close-haak laten vallen, want u hoeft alleen de bytes te tellen die nodig zijn om de functie te maken, ook al kunt u niet bellen het zonder het te sluiten), en je hoeft b in een lijst te wikkelen omdat pyth automatisch naar lijst converteert wanneer een lijst aan een int wordt toegevoegd.
FryAmTheEggman 03/06/2015
Ik bedacht een manier om verschillende bytes op te slaan door handmatig de tweede kaart boven [1,-1] . Ik kan bytes opslaan om zoiets kort te programmeren, vooral als je de logica vereenvoudigt. Ik krijg L?]]1
Pietu1998 03/06/2015
@FryAmTheEggman Misschien wil je dat als je eigen antwoord toevoegen. Dat is gewoon geweldig.
FryAmTheEggman 03/06/2015
OK, ik wilde CJam proberen te verslaan voordat ik het plaatste, maar ik denk dat de zip-truc interessant genoeg is om het posten ervan te verdienen. Veel succes met Pyth;)

edc65 03/07/2015.

JavaScript (ES6) 73 80

JavaScript-implementatie van de mooie oplossing van @ Optimizer.

Recursief (73):

 R=(n,i=1,r=[[1]])=>++i>n?r:r.map(e=>r.push([i,...e])+e.push(i))&&R(n,i,r) 

Iteratief (74):

 F=n=>(i=>NO 

Test in Firefox / FireBug-console

 R(4) 

[[1, 2, 3, 4], [2, 1, 3, 4], [3, 1, 2, 4], [3, 2, 1, 4], [4, 1, 2, 3] , [4, 2, 1, 3], [4, 3, 1, 2], [4, 3, 2, 1]]


Digital Trauma 03/06/2015.

Pure Bash, 103

Langer dan ik had gehoopt:

a=1..1
for i in {2..9} {a..u};{
((++c<$1))||break
a={${a// /,}}
a=`eval echo $a$i $i$a`
}
echo ${a%%.*} 

Brett Ryan 03/08/2015.

Mijn Java-oplossing:

public static void main(String[] args) {
    listPrependAppend(4);
}

private static void listPrependAppend(int n) {
    int total = (int) Math.pow(2, n - 1);
    int ps;
    boolean append;
    String sequence;
    String pattern;

    for (int num = 0; num < total; num++) {
        sequence = "";
        pattern = "";
        append = false;
        ps = num;
        for (int pos = 1; pos < n + 1; pos++) {
            sequence = append ? (pos + sequence) : (sequence + pos);
            append = (ps & 0x01) == 0x01;
            ps = ps >> 1;
            if (pos < n) {
                pattern += append ? "L" : "R";
            }
        }
        System.out.format("%s\t[%s]%n", sequence, pattern);
    }
} 
4 comments
Brett Ryan 03/08/2015
Oh fark, nu na het zien van de andere antwoorden, zie ik wat je bedoelt met het kortste antwoord.
2 Joe Z. 03/08/2015
Hoewel uw oplossing respectabel, beknopt en op zijn best gepresenteerd is, hebt u gelijk dat het niet echt een kandidaat is voor het probleem.
1 ProgramFOX 03/08/2015
@BrettRyan U kunt uw code veel korter maken door onnodige witruimten te verwijderen en variabelenamen van één variabele te gebruiken. Je kunt ook false vervangen door iets als 5<4 .
1 Brett Ryan 03/08/2015
Bedankt jongens. Het was mijn eerste poging om deel te nemen aan code-uitdagingen. Ik was alleen op zoek naar een aantal programmeeruitdagingen en realiseerde me niet dat het doel was om de kortste oplossing te krijgen. :) Bedankt dat je me hebt laten deelnemen.

HighResolutionMusic.com - Download Hi-Res Songs

1 The Chainsmokers

Beach House flac

The Chainsmokers. 2018. Writer: Andrew Taggart.
2 (G)I-DLE

POP/STARS flac

(G)I-DLE. 2018. Writer: Riot Music Team;Harloe.
3 Ariana Grande

​Thank U, Next flac

Ariana Grande. 2018. Writer: Crazy Mike;Scootie;Victoria Monét;Tayla Parx;TBHits;Ariana Grande.
4 Anne-Marie

Rewrite The Stars flac

Anne-Marie. 2018. Writer: Benj Pasek;Justin Paul.
5 Clean Bandit

Baby flac

Clean Bandit. 2018. Writer: Jack Patterson;Kamille;Jason Evigan;Matthew Knott;Marina;Luis Fonsi.
6 Nicki Minaj

No Candle No Light flac

Nicki Minaj. 2018. Writer: Denisia “Blu June” Andrews;Kathryn Ostenberg;Brittany "Chi" Coney;Brian Lee;TJ Routon;Tushar Apte;ZAYN;Nicki Minaj.
7 BlackPink

Kiss And Make Up flac

BlackPink. 2018. Writer: Soke;Kny Factory;Billboard;Chelcee Grimes;Teddy Park;Marc Vincent;Dua Lipa.
8 Imagine Dragons

Bad Liar flac

Imagine Dragons. 2018. Writer: Jorgen Odegard;Daniel Platzman;Ben McKee;Wayne Sermon;Aja Volkman;Dan Reynolds.
9 BTS

Waste It On Me flac

BTS. 2018. Writer: Steve Aoki;Jeff Halavacs;Ryan Ogren;Michael Gazzo;Nate Cyphert;Sean Foreman;RM.
10 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
11 Little Mix

Woman Like Me flac

Little Mix. 2018. Writer: Nicki Minaj;Steve Mac;Ed Sheeran;Jess Glynne.
12 Brooks

Limbo flac

Brooks. 2018.
13 Fitz And The Tantrums

HandClap flac

Fitz And The Tantrums. 2017. Writer: Fitz And The Tantrums;Eric Frederic;Sam Hollander.
14 Backstreet Boys

Chances flac

Backstreet Boys. 2018.
15 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
16 Diplo

Close To Me flac

Diplo. 2018. Writer: Ellie Goulding;Savan Kotecha;Peter Svensson;Ilya;Swae Lee;Diplo.
17 Rita Ora

Velvet Rope flac

Rita Ora. 2018.
18 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
19 Imagine Dragons

Machine flac

Imagine Dragons. 2018. Writer: Wayne Sermon;Daniel Platzman;Dan Reynolds;Ben McKee;Alex Da Kid.
20 Erika Sirola

Speechless flac

Erika Sirola. 2018. Writer: Teemu Brunila;Stefan Dabruck;Jürgen Dohr;Guido Kramer;Dennis Bierbrodt;Chris Braide;Robin Schulz.

Related questions

Hot questions

Language

Popular Tags