Você tem uma moeda que produz 0
ou 1
. Mas você suspeita que a moeda possa estar enviesada , o que significa que a probabilidade de 0
(ou 1
) não é necessariamente 1/2.
Um procedimento bem conhecido para "transformar" uma moeda tendenciosa em uma moeda justa (ou seja, para obter resultados igualmente prováveis), como proposto por von Neumann, é o seguinte. Produza blocos (sem sobreposição) de dois lançamentos de moedas até que os dois valores de um bloco sejam diferentes; e gera o primeiro valor nesse bloco (o segundo valor também funcionaria, mas, para os propósitos desse desafio, escolhemos o primeiro). Intuitivamente, 1
pode ser mais provável que 0
, mas 01
e 10
será igualmente provável.
Por exemplo, a entrada 1110...
descartaria o primeiro bloco e produziria um a 1
partir do segundo bloco, ...
Esse procedimento é caro , porque vários sorteios são consumidos para gerar um único resultado.
O desafio
Pegue uma sequência finita de zeros e uns, representando lançamentos da moeda original, e produza o número máximo de resultados de acordo com o procedimento acima, até que toda a entrada seja consumida.
O último bloco pode estar incompleto, se o número de valores de entrada for ímpar. Por exemplo, a sequência de entrada 11111
não produziria resultado (os dois primeiros blocos têm valores iguais e o terceiro bloco está incompleto).
Regras
A entrada pode ter qualquer número não negativo de valores, não necessariamente positivo ou uniforme.
O formato de entrada pode ser:
- uma matriz de zeros e uns;
- uma sequência de zeros e outros com um separador opcional.
O formato de saída pode ser:
- uma sequência de zeros e uns, com ou sem separadores;
- uma matriz de zeros e uns;
- strings contendo um único zero ou um, separados por novas linhas;
- qualquer formato semelhante e razoável que seja adequado ao seu idioma.
Código de golfe. Menos bytes ganha.
Casos de teste
Entrada e saída são aqui consideradas como seqüências de caracteres.
Input --> Output
'1110' --> '1'
'11000110' --> '01'
'1100011' --> '0'
'00' --> ''
'1' --> ''
'' --> ''
'1101001' --> '0'
'1011101010' --> '1111'
Respostas:
Gelatina, 6 bytes
Experimente online!
Como funciona
fonte
Retina ,
1614 bytesExperimente online!
Explicação
Isto é bastante simples. O código define uma única substituição de regex substituindo todas as correspondências (sem sobreposição) de
(.)\1|(.)?.
qualquer que seja o segundo grupo capturado. Isso combina três casos diferentes em um:Se dois dígitos repetidos forem iguais, removemos-os da string (porque o grupo 2 não é utilizado).
Caso contrário, se conseguirmos corresponder dois caracteres, remova o segundo, substituindo os dois pelo primeiro. Se não for esse o caso
?
, o grupo será omitido:Isso só acontece se houver um caractere final não emparelhado, que também será removido.
fonte
Labirinto ,
2112 bytesUm exemplo raro de um programa compacto de labirinto que também não possui opcionais.A|
versão anterior era completamente desnecessária, e a remoção maciça reduziu o tamanho do programa. De fato, o laboratório está superando a Retina!Experimente online!
O canto inferior esquerdo
"
também pode ser um espaço, mas tê-lo lá simplifica bastante a explicação.Explicação
Este é um pouco mais complicado, por isso é acompanhado por imagens. Mas primeiro, uma cartilha rápida:
Configuração
O programa inicia no canto superior esquerdo
"
, o que é um no-op. Então nós executamos:Isso deixa a pilha com um único 0, que é tão bom quanto vazio para os propósitos do Labirinto.
Leitura de entrada e finalização
,
lê um char da entrada, retornando 48 ou 49 para0
ou1
respectivamente, e -1 no EOF. Como esse número é diferente de zero, de qualquer maneira nos tornamos o:
, o que duplica o topo da pilha.O processo
:
está em um beco sem saída, então nos voltamos e executamos,
mais uma vez. Agora, se a última entrada foi EOF, então vire à esquerda e terminar com@
, senão viramos à direita, com a pilha parecendo[a a b]
(ondea
,b
são os dois caracteres).Interpretando o sorteio
Se não terminamos, nosso próximo passo é executar
$
(bit a bit xor) novamente. Isso gera 0 se os caracteres de entrada forem iguais, 1 caso contrário. Em seguida, multiplicamosa
esse resultado, fornecendo 0 oua
. Desde o*
está em uma junção, esse valor da pilha superior determina o que acontece a seguir.No caso 0, seguimos em frente e executamos três
"
no-ops, antes de executar um(
decremento. Como na configuração, isso nos faz girar e executar"*$
, deixando-nos prontos para ler mais caracteres.Caso contrário, no
a
caso, vire à direita no cruzamento, poisa
é positivo (48 ou 49)..
gera o caractere, deixando a pilha vazia e(
diminui o topo da pilha, transformando um 0 em -1. Mais uma vez, isso nos faz virar à esquerda, executando"*$
como na configuração, também nos deixando prontos para ler mais informações.fonte
(
e.
gera char 255 (-1 módulo 256). Por isso, já está errado a partir daí, infelizmente: PCJam,
108 bytesTeste aqui.
Explicação
Esta é uma solução muito simples: em cada par, remova todas as instâncias do último caractere. Os dígitos repetidos e os dígitos finais não emparelhados serão removidos, assim como o segundo dígito em qualquer par de dígitos desiguais:
Isso deixa apenas os dígitos que estamos procurando. Aqui está como o código calcula isso:
Quando a lista é impressa automaticamente no final do programa, as cadeias vazias são simplesmente omitidas.
fonte
Perl,
191817 bytesA solução @Martin Büttner Retina inspirou um ganho de 2 bytes
Inclui +1 para
-p
Corra com a entrada no STDIN, por exemplo
perl -p fair.pl <<< 11000110
fair.pl
:Não há muito a explicar aqui, pois é uma tradução (indireta) da especificação:
(.)\1
Se os 2 primeiros dígitos forem iguais, solte-os.\K.
Caso contrário, os dois primeiros dígitos são diferentes. Mantenha (\K
) o primeiro.?\K.
Exceto que o primeiro.
é opcional. Isso permite uma única correspondência no final da string, que é descartada, pois a parte mantida está vaziafonte
Mathematica, 36
38bytes-2 após roubar a função de @ LegionMammal978 para determinar se uma lista de 2 elementos é {0,1} ou {1,0}
Espera-se que o argumento seja uma lista de números inteiros.
fonte
Hexagonia ,
2321 bytesDesdobrado:
Isso termina com um erro, mas a mensagem de erro vai para STDERR.
Experimente online!
A julgar pelo número de espelhos, pode ser possível encaixá-lo no comprimento lateral 3, mas até agora não tive sorte.
Explicação
Aqui está o diagrama usual, gerado com o HexagonyColorer de Timwi :
O programa usa apenas três bordas da memória, rotuladas como A , B e C aqui (diagrama cortesia do EsotericIDE de Timwi ):
A execução começa no caminho azul. O
/
são apenas espelhos que redirecionam o ponteiro de instrução (IP), o código real é:O
,
definirá a borda para, em-1
vez do código de caractere, se clicarmos em EOF. Como estamos incrementando as duas entradas, isso não muda se são iguais ou não, mas transforma o EOF em0
.Usamos o módulo para verificar a igualdade, porque é
1
ou49
(positivo) para caracteres desiguais e0
para caracteres iguais. Também serve como o final do programa, porque quando temos o0
EOF, a tentativa de divisão por zero causará um erro.Agora o
<
distingue zeros dos resultados positivos. O mais simples primeiro: se os caracteres forem iguais, o IP seguirá o caminho vermelho._
é um espelho,\
também é um espelho, mas é ignorado e>
desvia o IP de forma que ele se enrole nas bordas e recomeça a partir do topo. No entanto, nessa iteração, as funções de A , B e C são trocadas ciclicamente ( C agora assume o papel de A e assim por diante).Se os caracteres forem diferentes, o caminho verde será seguido. Este é um pouco mais confuso. Primeiro, ele pula um no-op com
$
, depois passa para a/
borda esquerda, depois atravessa a penúltima linha da direita para a esquerda e finalmente entra novamente na parte interessante do código-fonte no{
. Existe um código essencialmente linear, que explicarei em um segundo, antes$
que o IP salte sobre o>
para mesclar os dois caminhos novamente.Aqui está esse trecho de código linear:
Observe que, nesse caso, as funções das arestas para a próxima iteração também são trocadas ciclicamente, mas com B assumindo a função de A e assim por diante.
fonte
Haskell,
714429 bytesGolfe extremo por nimi .
fonte
> <> , 11 bytes
> <> é bastante adequado para desafios de ler um caractere de cada vez :) Experimente online!
Isso tudo acontece em um loop, já que o ponteiro da instrução é contornado quando chega ao final de uma linha.
fonte
>
ou<
Python, 42 bytes
Diversão com recursão e xor bit a bit. Toma uma lista de 1s e 0s como entrada.
fonte
JavaScript (ES6), 33 bytes
Como funciona
fonte
Prelúdio , 12 bytes
Isso pressupõe um intérprete que lê e imprime caracteres. Você pode tentar online. Mas esse intérprete imprime números inteiros, portanto, para cada
0
que você obtém48
e para cada1
um49
(em vez de um avanço de linha).Explicação
É muito raro você poder escrever um programa não trivial em uma única linha no Prelude (porque o Prelude precisa de mais de uma linha para ter a conclusão de Turing).
fonte
Perl,
2721 bytesByte adicionado para o
-n
sinalizador.Teste:
Obrigado a @TonHospel por 6 bytes!
fonte
say grep$_-chop,/../g
Entre 93 , 16 bytes
Uma linha para compacidade. Testado usando este intérprete online .
A última parte faz uso do fato de que pular de uma pilha vazia do Befunge-93 gera 0 .
Se
a != b
, realizamosCaso contrário, se
a == b
executarmos:fonte
Pitão,
109 bytesAlgoritmo descaradamente roubado da resposta de Dennis's Jelly .
fonte
Python 2, 48 bytes
Experimente online
Obrigado a Dennis e vaultah por apontar coisas que eu perdi
fonte
zip(*[iter(n)]*2)
Mathematica,
4139 bytesMenos complicado e mais curto que a outra resposta. A caixa é um caractere de transposição.
fonte
JavaScript (ES6), 33 bytes
Porta chata da resposta da Retina.
fonte
sed,
3433 bytesTeste:
fonte
fold(1)
comando para dividir em pares. Isso também saiu aos 34!fold -s2|sed 's+01+0+p;s+10+1+p;d'
fold -s2
equivale afold -2
, fazendo com que 33 bytes ... que é o que eu acabei de usar como solução sed pura. : Ps/../& /g;s/00\|11\|.\b\| //g
Labirinto , 31 bytes
Não tão curto e arrumado quanto a solução do Sp3000, mas pensei em publicar isso de qualquer maneira como uma abordagem diferente:
Explicação
O primeiro loop é simplesmente
que lê dois caracteres de cada vez (
"
não há operações). Após o EOF,,
retornará-1
, mas verifique apenas o EOF a cada segundo caractere. Isso significa que, em qualquer caso, o topo da pilha será-1
e o valor abaixo será-1
código de caractere com o qual não nos importamos, porque é um lançamento de moeda não emparelhado.Então
)*
transforma o-1
valor abaixo em um único, do0
qual precisamos: a) livrar-se desses dois valores eb) para inserir o próximo loop corretamente. Esse próximo loop é simplesmenteQue muda todos os valores para a pilha auxiliar. Isso é necessário porque queremos começar a processar os pares que lemos primeiro. Agora, o loop final:
O
)
apenas incrementa algum valor fictício para garantir que seja positivo e o ponteiro da instrução vire para o norte.{
puxa o primeiro dígito do próximo par e:
duplica. Agora, quando terminarmos o processamento, isso terá ocorrido0
na parte inferior da pilha auxiliar. Caso contrário, é48
ou49
. No caso de um zero, saímos do loop e terminamos@
, caso contrário, o IP vira para o leste.{
encosta o outro dígito do par atual.$
leva o XOR entre eles. Se for 0, ou seja, os dois forem iguais, o IP continuará se movendo para o sul,;
descarta o zero e o IP se transforma em oeste na próxima iteração. Se o XOR era1
, ou seja, era diferente, o IP vira para oeste, descarta o1
com;
e imprime o primeiro dígito com.
.fonte
MATL ,
1198 bytesEntrada e saída são números separados por novas linhas. Termina com um erro (permitido por padrão) quando todas as entradas foram consumidas.
Experimente online!
Abordagem antiga, 11 bytes
Entrada é uma sequência. Saída são números separados por novas linhas.
Experimente online!
fonte
Ruby, 46 bytes
Isso separa
l[0]
,l[1]
el[2..{end}]
comoa
,b
ec
. Em seguida, ele cria uma sequência coma
ifa!=b
ou''
não ef[c]
sec[0]
existe ou''
não.Ungolfed:
fonte
brainfuck, 33 bytes
Comparado ao Java, isso é muito compacto, no entanto, eu tenho medo de responder a um jogador que gosta de cérebro. E fique à vontade para mencionar se há algum erro. Supondo que EOF seja 0, a entrada não contém entrada inválida, a célula é inicialmente zero e o intervalo de valores da célula é finito e cíclico. Nenhuma outra suposição está presente.
Explicação:
Mapa da célula de memória
Instrução
fonte
Mathematica, 41 bytes
Função anônima que insere e gera listas de zeros e uns.
fonte
#&@@a
é 1 byte menor quea[[1]]
.RuleDelayed
.Transpose
:(Pitão, 10 bytes
Suíte de teste
fonte
!q
porn
e depois filtrarfnFT
pornF#
. (hMnF#cz2
; Esta foi a coisa que pensei quando vi o desafio, mas o seu é perto o suficiente para mim não postá-lo separadamente)1
C, 66 bytes
Assumindo
sizeof(int) == sizeof(char *)
solução "inteligente" -
8481 bytesFunciona em máquinas little-endian, assumindo que
short
são 2 bytes. A entrada é passada como argumento. O programa itera sobre pares de caracteres e imprime 0 para 0x3130 e 1 para 0x3031. No big endian, o resultado será revertido (substitua48|c&1
por49^c&1
para corrigir isso).fonte
C, 57 bytes
Tentativamente, copiamos um caractere da entrada
p
para o resultador
, mas somente avançamos or
ponteiro se ele diferir do próximo caractere. Caso contrário, substituí-lo-emos no próximo par não correspondido ou comNUL
no final.Programa de teste:
Saída de teste:
fonte
Befunge-93 , 40 bytes
Você pode tentar aqui . Cole o código no espaço abaixo do botão "show", pressione "show", defina a entrada, pressione "run". Nós usamos o botão "step" para ver como o programa funciona.
fonte
Lote DOS / Windows,
201162 bytesEntrada é uma sequência separada por espaço, por exemplo
1 0 0 1 1
. Comece pelo cmd, caso contrário, a tela sai imediatamentefonte
cera de abelha ,
4535 bytesEu poderia dar um golpe de 10 bytes - nada mal.
Adotei a leitura de uma abordagem completa de lançamentos de moedas , o que torna o programa bastante grande. A simples leitura de números inteiros um a um tornaria o programa menor - talvez cerca de 22 bytes -, mas também seria muito inconveniente de usar.
Exemplos:
Meu repositório GitHub de cera de abelha.
Meus exemplos de cera de abelha no Código Rosetta.
fonte