Lista ordenada de sequências binárias de várias dimensões

8

Dado um número inteiro positivo n, produza as 2^nseqüências binárias de comprimento nclassificadas na seguinte ordem precisa.

Casos de teste:

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

etc.

Além disso, o padrão combinatório está relacionado ao triângulo de Pascal.

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

etc.

desarmar
fonte
1
Para mim acima poderia ser o resultado de um bug em uma triagem algo ...
RosLuP

Respostas:

3

Haskell, 78 bytes

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

Exemplo de uso: f 2-> [[0,0],[0,1],[1,0],[1,1]].

Como funciona:

         [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
nimi
fonte
Usei um compilador Haskell da Apple Store e não tenho certeza se isso não me permitirá executar esse código. Tirei uma captura de tela do que acontece quando a executo: m.imgur.com/VIByUah
defarm 4/16/16
@DreadVim: parece que você não possui a versão mais recente das bibliotecas ( Preludepara <$e Data.Listpara sortOn). Além disso: meu código não é um programa completo, portanto não será compilado.
N
Ah Isso faz sentido. Vou ter que fazer isso no meu laptop.
defarm
Até sobre sortOn. Vou sentir falta 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)],[])

Ainda estou trabalhando nisso, embora todas as sugestões sejam muito apreciadas!

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
Daniel
fonte
faça from itertools import*e depois apenas use permutationsno lambda. salva 1 byte
FlipTack 5/11
1

Python 2, 122 120 102 98 bytes

18 bytes economizados graças ao Flp.Tkc

4 bytes salvos graças ao xnor

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

Explicação

Isso cria todas as cadeias binárias de comprimento x com:

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

Eu os classifico de acordo com:

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

sorted(x)prioriza o número de 1s enquanto int(x[::-1],2)prioriza a segunda condição

Por fim, estas são associadas a novas linhas e impressas.

Caçador Ad Hoc Garf
fonte
Isto não é elegível.
defarm
@DreadVim It is now
Ad Hoc Garf Hunter
Acordado. Bom trabalho.
defarm
Isso parece reduzir os zeros à esquerda.
Xnor
A versão de 106 bytes parece dar uma ordem diferente para n = 4. O seu fornece 0110 e 1001, que é alternado para o caso de teste. Não tenho certeza de como a ordem correta é realmente especificada.
Xnor
1

Perl, 63 bytes

-4 graças a @Ton Hospel.
-2 graças a @Gabriel Benamy.

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

Execute com -E(que habilita o recurso say):

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


Breves explicações :

  • "{1,0}"x$_cria uma sequência composta de $_tempos {1,0}( $_é a entrada). Por exemplo, com 3: {1,1}{1,0}{1,0}.
  • Em seguida, globfaz alguma mágica e gera todas as combinações de um elemento de cada grupo de chaves (ou seja, todas as combinações que queremos imprimir).
  • E então a classificação: $b=~y/1//c-$a=~y/1//ccompara o número de 1em cada sequência e, se eles tiverem o mesmo número, $b-$aserão classificados de acordo com a segunda regra.
dada
fonte
Eu acredito que você pode salvar dois bytes mudando y/1//cpara y/0//ambas as vezes
Gabriel Benamy
@GabrielBenamy De fato, obrigado. Estou muito acostumado a usar y///c!
Dada
Substituir <=>por-
Ton Hospel 6/16
@TonHospel editado, obrigado!
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

Legível:

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

A subrotina econverte seu argumento em um valor binário, preenchido com zeros, para ser o comprimento da entrada (por exemplo, entrada de 5 blocos com zeros até os 5 caracteres). A sub f- rotina assume um valor binário e atribui um peso de classificação de acordo com a forma como deve ser processado.

O intervalo 0 .. [entrada] 2 -1 é então submetido a uma classificação estável, ordenando pelo peso (aqui, "stable" significa que quando dois valores têm o mesmo peso, eles são retornados na mesma ordem em que aparecem no entrada) e, em seguida, são retornados à sub-rotina ee à saída.

Alguns de vocês podem ter visto minha postagem original, mas ontem li errado o problema e o excluí imediatamente depois que percebi.

Gabriel Benamy
fonte
Isso não produz a saída requerida para n>=5. Por exemplo, com n>=5, 01101vem antes, 10011mas deve ser depois.
Dada
0

Raquete 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))))))

Teste:

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

Resultado:

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
rnso
fonte
1
No caso n = 3 acima, não é o mesmo que exercitar o texto 000 001 010 100 etc.
RosLuP 22/11/16
Este exercício estaria prestes a escrever a função certa para classificar uma lista de números (e do que imprimir o formulário binário)
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}}
freakyfelt
fonte
2
Bem-vindo à programação de quebra-cabeças e código de golfe! Infelizmente, isso não parece exatamente o que o desafio pede. Por exemplo, a entrada 5 imprime as cinco primeiras linhas da saída que correspondem a 3 .
Dennis
0

PHP, 49 bytes

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

Corra com -r.

Titus
fonte
0

MATLAB, 68 bytes

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

Bash, 65 bytes

Golfe

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

Teste

>./binseq 4

0000
0001
0010
0100
1000
0011
0101
0110
1001
1010
1100
0111
1011
1101
1110
1111
zepelim
fonte
É errado ... Eu copiar e colar a saída acima: 0011 0101 1001 0110 1010 1100 depois de 0101 há 1001 e não 0110
RosLuP
De fato, imgur.com/a/yxBLp , meu palpite, é que você provavelmente está apenas executando um sistema com um código de idioma diferente (eu uso "en_US.UTF-8"), então as diferentes regras de agrupamento se aplicam (o que é esperado e comportamento de "classificação" documentado). Tente mudar a localidade ou me diga a sua, e eu vou ver qual caractere você deve usar no lugar de ~.
zeppelin
Outra coisa que você pode tentar é fazer cumprir a ordem do dicionário em espécie com "d" (que deve produzir resultados concretos menos locale)
zeppelin
digo que seu resultado é impresso acima para n = 4 [0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111] é diferente do resultado da pergunta para n = 4 [0000 0001 0010 0100 1000 0011 0101 1001 0110 1010 1100 0111 1011 1101 1110 1111] na verdade, a 9ª posição desse array tem um valor diferente
RosLuP:
@RosLup Eu acredito que 0101 => 1001 é um erro nos dados do caso de teste, não na minha implementação. Consulte a discussão na resposta "Python 2" abaixo: "O seu fornece 0110 e 1001, que é alternado para o caso de teste. Eu não sou certeza de como a ordem correta é realmente especificado -. xnor" 'meu erro é realmente capotou ... -. Dread Vim' (OP)
zeppelin