Geordnete Liste von Binärsequenzen mit mehreren Dimensionen


8

Geben Sie bei einer positiven Ganzzahl ndie 2^nbinären Längenfolgen aus, ndie in der folgenden genauen Reihenfolge sortiert sind.

Testfälle:

0:

0 or 1 (defining this is a matter of debate)

1:

0
1

2:

00
01
10
11

3:

000
001
010
100
011
101
110
111

4:

0000
0001
0010
0100
1000
0011
0101
1001
0110
1010
1100
0111
1011
1101
1110
1111

usw.

Zusätzlich ist das Muster der Kombinatorik mit Pascals Dreieck verwandt.

0:

1 (this is given regardless of the definition given to 2^0)

1:

1
1

2:

1
2
1

3:

1
3
3
1

4:

1
4
6
4
1

usw.


1
Für mich könnte oben das Ergebnis eines Fehlers in einem Sortieralgo sein ...
RosLuP

Antworten:


3

Haskell, 78 Bytes

import Data.List
f n=sortOn(\x->sum x:reverse(map(1-)x))$mapM id$[0,1]<$[1..n]

Anwendungsbeispiel: f 2-> [[0,0],[0,1],[1,0],[1,1]].

Wie es funktioniert:

         [0,1]<$[1..n]  -- make n copies of the list [0,1]
     mapM id            -- make all lists where the ith element is from the ith list.
                        -- that gives us all binary sequences
sortOn                  -- sort this list of list
    sum x               -- first by number of ones
      reverse(map(1-)x) -- then by the reversed list with bits flipped

Ich habe einen Haskell-Compiler aus dem Apple Store verwendet und bin mir nicht sicher, ob ich diesen Code dadurch nicht ausführen kann. Habe einen Screenshot von dem gemacht, was passiert, wenn ich es starte
defarm

@DreadVim: Es scheint, dass Sie nicht die neueste Version der Bibliotheken haben ( Preludefür <$und Data.Listfür sortOn). Außerdem: Mein Code ist kein vollständiges Programm, daher wird er nicht kompiliert.
Nimi

Ah. Das macht Sinn. Ich muss es auf meinem Laptop machen.
Entschärfen Sie den

Bis ungefähr sortOn. Ich werde vermissen sortBy (compare `on` f).
Angs

2

Python 2, 146 Bytes

from itertools import*
lambda i:sum([sorted({''.join(b)for b in permutations((i-n)*"0"+"1"*n)},key=lambda x:x[::-1])[::-1]for n in range(i+1)],[])

Ich arbeite noch daran, aber alle Vorschläge wären sehr dankbar!

Ungolfed

i=input()   
import itertools
p=[]
for n in range(i+1):
    x=(i-n)*"0"+"1"*n
    t=[]
    for b in itertools.permutations(x):t+=[''.join(b)] if ''.join(b) not in t else []
    p.append(sorted(t, key=lambda x:x[::-1])[::-1])

p=sum(p,[])
print
for line in p:print line

tun from itertools import*und dann einfach permutationsim Lambda verwenden. spart 1 Byte
FlipTack

1

Python 2, 122 120 102 98 Bytes

18 Bytes dank Flp.Tkc gespeichert

4 Bytes dank xnor gespeichert

lambda x:sorted([bin(i)[2:].zfill(x)for i in range(2**x)],key=lambda x:(sorted(x),int(x[::-1],2)))

Erläuterung

Dies macht alle binären Zeichenfolgen der Länge x mit:

[bin(i)[2:].xfill(x)for i in range(2**x)]

Ich sortiere sie dann nach:

lambda x:(sorted(x),int(x[::-1],2))

sorted(x)priorisiert die Anzahl von 1s, während int(x[::-1],2)die zweite Bedingung priorisiert wird

Zuletzt werden diese mit Zeilenumbrüchen verbunden und gedruckt.


Dies ist nicht förderfähig.
Defarm

@DreadVim Es ist jetzt
Ad-hoc-Garf Hunter

Einverstanden. Gut gemacht.
Defarm

Dies scheint führende Nullen zu trimmen.
xnor

Die 106-Byte-Version scheint eine andere Reihenfolge für n = 4 anzugeben. Ihre gibt 0110 dann 1001, die aus dem Testfall geschaltet wird. Ich bin nicht sicher, wie die richtige Reihenfolge tatsächlich angegeben wird.
xnor

1

Perl, 63 Bytes

-4 danke an @Ton Hospel.
-2 danke an @Gabriel Benamy.

say~~reverse for sort{$b=~y/0//-$a=~y/0//||$b-$a}glob"{1,0}"x<>

Ausführen mit -E(wodurch die Funktion aktiviert wird say):

perl -E 'say~~reverse for sort{$b=~y/0//-$a=~y/0//||$b-$a}glob"{1,0}"x<>' <<< 5


Kurze Erklärungen :

  • "{1,0}"x$_Erstellt eine Zeichenfolge aus $_Zeiten {1,0}( $_ist die Eingabe). Zum Beispiel mit 3: {1,1}{1,0}{1,0}.
  • Dann globzaubert man etwas und generiert alle Kombinationen eines Elements aus jeder Gruppe von Klammern (dh alle Kombinationen, die wir drucken möchten).
  • Und dann die Sortierung: $b=~y/1//c-$a=~y/1//cvergleicht die Anzahl der 1Zeichenfolgen in jeder Zeichenfolge und $b-$asortiert nach der zweiten Regel , wenn sie dieselbe Nummer haben .

Ich glaube, Sie können zwei Bytes sparen, indem Sie y/1//czu y/0//beiden Zeiten wechseln
Gabriel Benamy

@ GabrielBenamy In der Tat, danke. Ich bin es zu gewohnt zu benutzen y///c!
Dada

Ersetzen <=>durch-
Ton Hospel

@ TonHospel bearbeitet, danke!
Dada

0

Perl, 116 106 105 102 Bytes

sub e{sprintf"%0$%b",@_}sub f{$_=e@_;/0*$/;$%*y/1//-$-[0]}map{say e$_}sort{f($a)<=>f$b}0..2**($%=<>)-1

Lesbar:

sub e{
    sprintf"%0$%b",@_
}
sub f{
    $_=e@_;/0*$/;$%*y/1//-$-[0]
}
map{
    say e$_
} sort {
    f($a)<=>f$b
} 0..2**($%=<>)-1

Das Unterprogramm ekonvertiert sein Argument in einen mit Nullen aufgefüllten Binärwert als Eingabelänge (z. B. Eingabe von 5 Pads mit Nullen, bis es 5 Zeichen lang ist). Das Unterprogramm fnimmt einen solchen Binärwert und gibt ihm eine Sortiergewichtung entsprechend der Art und Weise, wie er verarbeitet werden soll.

Der Bereich 0 .. [Eingabe] 2 -1 wird dann durch eine stabile Sortierung nach Gewicht sortiert (hier bedeutet "stabil", dass zwei Werte, die das gleiche Gewicht haben, in der Reihenfolge zurückgegeben werden, in der sie in der erscheinen Eingabe), und dann werden sie an das Unterprogramm zurückgeführt eund ausgegeben.

Einige von Ihnen haben vielleicht meinen ursprünglichen Beitrag gesehen, aber ich habe das Problem gestern völlig falsch verstanden und es sofort gelöscht, nachdem ich es erkannt habe.


Dies erzeugt nicht die erforderliche Ausgabe für n>=5. Zum Beispiel kommt mit n>=5, 01101kommt vorher, 10011aber es sollte nach sein.
Dada

0

Schläger 109 Bytes

(let loop((s ""))(if(= n(string-length s))(displayln s)(for((i '("0" "1")))(loop(string-append s i)))))

Ungolfed:

(define (f n)
  (let loop ((s ""))
    (if (= n (string-length s))
        (displayln s)
        (for ((i '("0" "1")))
          (loop (string-append s i))))))

Testen:

(f 2)
(println "-------------")
(f 3)
(println "-------------")
(f 4)

Ausgabe:

00
01
10
11
"-------------"
000
001
010
011
100
101
110
111
"-------------"
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

1
Falls n = 3 oben nicht dasselbe ist, um Text 000 001 010 100 usw.
auszuüben

Diese Übung würde im Begriff sein, die richtige Funktion zu schreiben, um eine Liste von Zahlen zu sortieren (und dann die Binärform auszudrucken)
RosLuP

0

Ruby 2.x, 129 Bytes

f=->(n){z='0';p=n.bit_length;(0..n).map{|i|sprintf("%0#{p}d",i.to_s(2))}.sort{|a,b|a=a.delete(z).size-(b=b.delete(z).size)||b-a}}

2
Willkommen bei Programming Puzzles & Code Golf! Leider scheint dies nicht ganz das zu tun, was die Herausforderung verlangt. Beispielsweise druckt Eingabe 5 die ersten fünf Zeilen der Ausgabe, die 3 entsprechen .
Dennis

0

PHP, 49 Bytes

while($i<1<<$n=$argv[1])printf("%0${n}b\n",$i++);

Laufen Sie mit -r.


0

MATLAB, 68 Bytes

d=@(n)dec2bin(sortrows([sum(dec2bin(0:2^n-1)');0:2^n-1]')*~eye(2,1))

0

Bash, 65 Bytes

Golf gespielt

seq -f "obase=2;%g+2^$1-1" $[2**$1]|bc|cut -c2-|tr 0 ~|sort|tr ~ 0

Prüfung

>./binseq 4

0000
0001
0010
0100
1000
0011
0101
0110
1001
1010
1100
0111
1011
1101
1110
1111

Es ist falsch ... Ich kopiere und füge die obige Ausgabe ein: 0011 0101 1001 0110 1010 1100 nach 0101 gibt es 1001 und nicht 0110
RosLuP

Imgur.com/a/yxBLp ist meiner Meinung nach wahrscheinlich , dass Sie wahrscheinlich nur ein System mit einem anderen Gebietsschema ausführen (ich verwende "en_US.UTF-8"), daher gelten die verschiedenen Sortierregeln (was zu erwarten ist) und dokumentiertes "Sortier" -Verhalten). Versuchen Sie, das Gebietsschema zu ändern, oder sagen Sie mir Ihr Gebietsschema, und ich werde sehen, welches Zeichen Sie anstelle von ~ verwenden sollten.
Zeppelin

Eine andere Sache, die Sie versuchen können, ist, die Wörterbuchreihenfolge beim Sortieren mit "-d" zu erzwingen (was weniger länderspezifische Ergebnisse liefern sollte)
Zeppelin

Ich sage, Ihr Ergebnisdruck oben für n = 4 [0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111] unterscheidet sich vom Ergebnis der Frage für n = 4 [0000 0001 0010 0100 1000 0011 0101 1001 0110 1010 1100 0111 1011 1101 1110 1111] infact die 9. Position dieses Arrays hat einen anderen Wert
RosLuP

@RosLup Ich glaube, 0101 => 1001 ist ein Fehler in den Testfalldaten, nicht in meiner Implementierung. Siehe Diskussion zur Antwort "Python 2" unten: "Ihre gibt 0110 dann 1001, die für den Testfall umgeschaltet wird. Ich bin es nicht sicher, wie die richtige Reihenfolge tatsächlich angegeben wird. - xnor "" Mein Fehler. Es ist tatsächlich umgedreht ... - Dread Vim "(das OP)
Zeppelin

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.