Code Golf die beste Permutation

14

Herausforderung

Bei einer Ganzzahl n ≥ 4 wird eine Permutation der Ganzzahlen [0, n-1] mit der Eigenschaft ausgegeben , dass keine zwei aufeinander folgenden Ganzzahlen nebeneinander liegen. Der Wert einer Permutation piist die Summe abs(pi[i] - i)aller Indizes i.

Beispiele

  • (1, 3, 0, 2) hat Wert 6
  • (0, 2, 4, 1, 3) hat Wert 6
  • (0, 2, 4, 1, 3, 5) hat Wert 6
  • (0, 2, 4, 1, 5, 3, 6) hat Wert 8

Ergebnis Ihrer Antwort

Die Punktzahl Ihrer Antwort ist die Summe der Werte Ihrer Permutationen n = 4 .. 14plus der Anzahl der Bytes, die Ihr Code benötigt. Je niedriger die Punktzahl, desto besser. Ihr Code muss eine gültige Ausgabe für alle diese Werte von geben n.

Sie müssen in der Lage sein, Ihre Übermittlung vollständig auf Ihrem Computer auszuführen.

Bei Unentschieden entscheidet der Zeitpunkt der letzten Bearbeitung, der zur entsprechenden Punktzahl geführt hat.

Ist das nicht die gleiche Frage wie diese ?

Antworten auf die verknüpfte Frage sind für diese Frage nicht konkurrenzfähig, da sie keine Anstrengungen unternehmen, um den Wert einer Permutation zu optimieren. Zum Beispiel ergibt n=10die Permutation, [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]die von den meisten Antworten dort angegeben wird, einen Wert von 30. Sie können viel besser als das tun.

Für den Permutationsteil der Frage ist insgesamt höchstens der optimale Wert 120. (Danke an @Laikoni.) Während Dennis 'Antwort auf die vorherige Frage 222 Punkte bringt . (Danke an @ user202729.)

Anush
quelle
4
@JoKing Jede Antwort kann ohne Änderungen portiert werden, würde aber bei dieser Herausforderung furchtbar schlecht abschneiden. Das Posten dieses Codes in dieser Herausforderung entspricht dem Posten des Codes von der Codeüberprüfung zu einer Code-Golf-Herausforderung.
Stewie Griffin
2
Das Mischen verschiedener Mengen in der Partitur kann in der Tat problematisch sein. Die Antwort mit dem besten Algorithmus kann in der Regel auf eine beliebige Sprache übertragen werden. In diesem Fall reduziert sich die Bewertung auf normales Code-Golf.
Angs
4
Die optimalen Werte sind [6,6,6,8,10,12,12,12,14,16,18]für eine Punktzahl von 120. Interessanterweise ist dieses Muster in A078706 zu finden .
Laikoni
3
Ok, es beginnt sich von A078706mit zu unterscheiden n=17, die eine Punktzahl von haben können 20.
Laikoni
4
Ich kann die Herausforderung klar und eindeutig verstehen. Wenn Sie nicht einverstanden sind und zum Schließen abstimmen, hinterlassen Sie hier einen Kommentar.
user202729

Antworten:

7

Jelly , 36 34 33 32 31 30 Bytes, Ergebnis: 120

Danke an Dennis für -1 Byte! (implizit durch Beheben eines Jelly-Fehlers, obwohl das Feature die Herausforderung datiert)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

Neues Feature: akkumulierte Summe ( Ä).

Probieren Sie es online!

Verwenden Sie die 1-Indizierung.

Dauert auch linear.


Dieses C ++ - Programm erzeugt die lexikographisch kleinste Permutation unter der Annahme, dass | i - p i | ≤ width (wobei width eine fest codierte Konstante ist) für alle 0 ≤ i <n , mit einer zeitlichen Komplexität von etwa O (width 2 × 2 2 × width × n) (dies ist nur O (n) für eine feste Breite ): Probieren Sie es online aus !


Wie?

  1. Schreiben Sie ein C ++ - Programm, das versucht, das Problem optimal zu lösen.
  2. Beobachten Sie das Muster. Wir stellen fest, dass die Reihenfolge aller Elemente mit Ausnahme der letzten vier ein Präfix von ist

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. Berechnet die inkrementelle Differenz der Sequenz.

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    Beachten Sie die Periode 5.

  4. Die Jelly-Implementierung:

    • Die ersten n-4 Elemente sind der obigen Sequenz entnommen. O (n) .
    • Für 4 letzte Elemente zwinge einfach alle 24 Möglichkeiten . O (1) .

      (Anmerkung: Ich zwinge nicht mehr alle 24 Möglichkeiten der 32-Byte-Version)

user202729
quelle
Ah, du bist mit einem anderen Präfix zu mir gegangen. Meine beginnt 0 2 4 1 3 5 8 6und hat einen größeren Verzweigungsfaktor, aber kein so einfaches Muster.
Peter Taylor
7

CJam (60 Bytes + 120 = 180 Punkte)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

Online-Testsuite mit integrierter Wertung

Verlängerung bis n = 24

Präparation

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}
Peter Taylor
quelle
Sehr beeindruckend! Ich freue mich darauf zu entdecken, wie Sie es gemacht haben.
Anush
Ist es bis zu 24 optimal?
Anush
@Anush Nach meinem Programm wahrscheinlich.
user202729
@Anush, ich habe es nicht bewiesen, aber ich halte es für wahrscheinlich.
Peter Taylor
Ihr Algorithmus fasziniert mich noch mehr!
Anush
6

Haskell , 146 + 89 Punkte + Bytes

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

Wiederholt Muster [1,3,0,2], letzte mod i 4Elemente werden von Hand gestimmt.

Vorheriger Algorithmus (132 + 116):

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

Bruteforces die richtige Anzahl von Sprüngen mit einer Länge von ± 2 oder ± 3. Wählt die letzte aus, die die richtigen Zahlen enthält, gut zu funktionieren scheint und viel billiger ist als die Umsetzung der Partitur. Tio läuft gerade die Zeit vor der letzten Punktzahl aus, die 18 ist.

Probieren Sie es online!

Angs
quelle
2

Japt, 120 + 20 = 140

(Wenn ich eine meiner Lösungen aus der anderen Herausforderung kopiere, hätte ich 227 Punkte bekommen.)

o á k_äa d¥1ÃñxÈaYÃg

Probieren Sie es aus oder verwenden Sie diese Version , um die Ergebnisse zu überprüfen. Beide Versionen könnten gegen 9 Uhr anfangen, auf dich zu scheißen.


Erläuterung

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array
Zottelig
quelle
9
" Sie müssen in der Lage sein, Ihre Übermittlung bis zum Abschluss auf Ihrem Computer auszuführen . " Haben Sie es ernsthaft geschafft, 87E9-Permutationen von 14 Elementen in den zwei Stunden seit dem Posten der Frage zu verarbeiten?
Peter Taylor
3
Bedenken Sie außerdem, dass Japt auf Javascript basiert. Kann es wirklich 87E9-Permutationen verarbeiten? Diese Frage besagt, dass das Javascript-Array eine Länge von höchstens ~ 4E9 haben kann. Hat Japt eine generierende Funktion oder etwas ... \
user202729
2

Ruby , 120 Punkte + 112 106 91 82 Bytes

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

Probieren Sie es online!

Die Reihenfolge ist grundsätzlich (a-2)+(a+2)%5 .

Wenn n mod 5 nicht 0 oder 1 ist, sind die letzten 3 oder 4 Elemente unterschiedlich.

Dies ist immer noch halb-hardcodiert, findet immer die beste Lösung, vielleicht könnte man ein bisschen mehr Golf spielen, aber mir sind die Ideen ausgegangen.

GB
quelle
1

JavaScript (Node.js) , 148 Punkte + 109 73 Bytes

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

Probieren Sie es online!Erläuterung: lVerfolgt die zuletzt generierte Nummer und mdie nächste Nummer der entgegengesetzten Parität zu l. einmal lüberschritten, werden m+2die Variablen ausgetauscht. Zu Beginn der Sequenz wird eine Anpassung vorgenommen, damit Sequenzen, deren Länge kein Vielfaches von 5 ist, keine Zahlen verpassen, und eine weitere Anpassung wird für vorgenommen n=4.

Neil
quelle