Sobre a série
Primeiro, você pode tratar isso como qualquer outro desafio de código de golfe e respondê-lo sem se preocupar com a série. No entanto, existe uma tabela de classificação em todos os desafios. Você pode encontrar a tabela de classificação junto com mais informações sobre a série no primeiro post .
Buraco 8: embaralhar uma lista infinita
Você deve escrever uma função ou programa que use uma lista infinita como entrada e retorne uma versão aleatória dessa lista.
Sobre E / S infinita
Existem várias maneiras pelas quais você pode receber e produzir resultados para este desafio:
- Você pode fazer uma lista de números inteiros positivos ou uma representação de sequência, ou uma sequência ou lista de caracteres ASCII imprimíveis (0x20 a 0x7E, inclusive). O formato de saída deve corresponder ao formato de entrada. Vou me referir aos dados como "a lista" a partir de agora, independentemente da opção que você escolher.
- Você pode ler a lista de um fluxo de entrada padrão infinito e gravar a saída continuamente em um fluxo de saída padrão infinito. A solução não deve depender de nenhum valor específico ou sequência de valores para garantir que o fluxo de saída seja gravado e liberado regularmente (por exemplo, você não pode simplesmente gravar a saída sempre que houver uma
5
na lista de entrada). Obviamente, se você ler uma representação de string de uma lista, não há problema em esperar até encontrar o separador de listas. - Nos idiomas que os suportam, você pode escrever uma função que pega e retorna uma lista ou sequência lenta e infinita.
- Nas linguagens que os suportam, você pode implementar um gerador infinito que aceita outro gerador como entrada.
- Como alternativa, você pode escrever uma função que não aceita argumentos e retorna um valor de saída cada vez que é chamado. Nesse caso, você pode assumir que uma função foi definida que não aceita argumentos e retorna o próximo valor de entrada cada vez que é chamada. Você pode escolher livremente o nome dessa função.
Você pode supor que seu programa seja executado para sempre e que haja memória infinita disponível. (É possível resolver isso com uma quantidade finita de memória, mas o que isso significa é que você pode vazar memória.)
Sobre a aleatoriedade
Para qualquer valor v que seja lido na posição i da entrada infinita, deve haver uma probabilidade positiva para que ele termine em qualquer uma das posições i-9 a i + 9 da saída infinita (a menos que essa posição seja negativa ) Essas probabilidades não precisam ser as mesmas para diferentes posições de saída ou mesmo para diferentes posições de entrada. Tudo bem se sua solução também puder embaralhar os valores para outras posições mais distantes.
Portanto, não é necessário que sua solução possa embaralhar o primeiro valor muito abaixo da lista ou embaralhar um valor muito tardio até a primeira posição, embora seja bom se o fizer, desde que todas as posições a 9 passos da entrada é possível.
Por exemplo, se você pegou a seguinte string como entrada, ___
indica todas as posições que X
devem ser capazes de terminar na saída:
___________________
abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...
Se seu idioma não possui um gerador de números aleatórios embutido ou você não deseja usá-lo, você pode usar um valor adicional de semente como entrada e implementar seu próprio RNG adequado usando a semente. Esta página pode ser útil para isso.
Independentemente da distribuição real que sua solução usa, ela quase certamente deve produzir o próximo valor após um tempo finito (mas arbitrário).
Inclua uma breve explicação sobre como sua implementação atende a esses requisitos.
Pontuação
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
Entre os melhores
O primeiro post da série gera uma tabela de classificação.
Para garantir que suas respostas sejam exibidas, inicie todas as respostas com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(O idioma não é mostrado no momento, mas o snippet exige e o analisa, e eu posso adicionar um cabeçalho por idioma no futuro.)
fonte
Respostas:
Python 3 , 78 bytes
Experimente online!
Pega a entrada de STDIN (uma por linha), imprime em STDOUT.
Mantém um buffer
l
de até 10 elementos. O buffer é embaralhado a cada etapa. Quando seu comprimento é 10, o último elemento é impresso e removido.Se um elemento for impresso assim que foi inserido, ele saltou à frente de outros 9 elementos aguardando no buffer e, portanto, aparece 9 pontos restantes. Um elemento pode esperar arbitrariamente no buffer por muito tempo, para que sua posição possa mover qualquer valor certo.
Não parece haver uma boa maneira de produzir e remover um elemento aleatório de uma lista. Baralhar parece exagero. É 2 bytes mais longo para usar
l.pop(randint(0,9))
(que usa que a lista possui 10 elementos).Ele não é melhor é fazer
x=choice(l);l.remove(x)
a linguagem .A compoprandom
comopoderia muito bem fazer
fonte
Befunge ( sabor quirkster ), 4 bytes
,
lê um caractere do fluxo e o coloca na pilha.~
aparece o caractere superior da pilha (se houver) e o imprime.?
randomiza qual comando será executado a seguir. Portanto, o algoritmo aqui é "Em um loop infinito, com probabilidade igual de pressionar um caractere ou exibir um caractere". Acho que isso satisfaz os requisitos: um personagem pode ver arbitrariamente muitos caracteres adicionados acima dele na pilha, para que possa se mover arbitrariamente para a direita e pode ser impresso quando a pilha é arbitrariamente grande, para que possa se mover arbitrariamente para longe. a esquerda.fonte
>> document.getElementById("output").innerHTML = "a\0b"
>> document.getElementById("output").innerHTML
"ab"
C (gcc) , 94 bytes
Experimente online!
Ok, um link TIO não faz muito sentido. Para facilitar o teste, criei o seguinte programa C que produzirá caracteres aleatórios ascii ou repetirá uma sequência infinitamente.
Este programa será referido como
iro
.Correção do programa
O que faço aqui é ler
9
valores em um buffer. Depois disso, os índices aleatórios são escolhidos nessa matriz e são gerados e substituídos pelo próximo caractere no fluxo.fonte
SILOS , 149 bytes
Experimente online!
Essencialmente, ele continua recebendo informações (no intérprete on-line por meio de argumentos, mas no intérprete oficial off-line, ele permite que você digite no console (infinitamente)) em blocos de 15 por vez (30 no primeiro bloco).
Ele carrega a entrada em uma fila temporária e escolhe 15 sortudos (aleatoriamente, mas não igualmente distribuídos em termos de probabilidade ou distribuição).
O restante permanece enquanto novas entradas preenchem a fila, a primeira entrada pode ser embaralhada até o fim (basicamente acho que os caracteres seguem uma distribuição normal). É interessante notar que este programa é apenas duas vezes mais detalhado que o python e talvez "mais golfista" que o Java.
Para ver melhor os resultados, eu tenho uma versão não compatível que recebe a entrada como uma string (no entanto, pode conter apenas 8.000 caracteres).
Experimente online!
Apenas por diversão, aqui está este post alimentado através da versão string.
fonte
Aceto , 24 bytes, não concorrente
Não concorrente porque tive que corrigir um erro no intérprete.
Pega um fluxo infinito de linhas e as produz em uma ordem aleatória. Todo elemento tem uma chance de ocorrer em qualquer ponto aleatório.
Começamos com um
?
no canto inferior esquerdo, o que nos move em uma direção aleatória. Se isso é baixo ou esquerdo, somos empurrados para trás.Se formos movidos para cima,
r
calculamos um valor, embaralhamos a pilha (Y
) e voltamos aoO
rigin.Se formos movidos para a direita,
d
duplicamos o valor da pilha superior, pressionamos a0
e testamos a igualdade (já que estamos lendo strings, nunca podemos ter o número inteiro 0). Se os valores forem iguais, isso significa que alcançamos a parte inferior da pilha (da qual não queremos imprimir). Nós negar a comparação (!
), ep
Rint somente se (`
) as coisas não eram iguais. Depois, também voltamos aoO
rigin.fonte
Ruby, 43 bytes
Minha resposta original usou uma lista infinita avaliada preguiçosamente, mas é mais curta. Ah bem.
fonte
MATL , 11 bytes
Experimente online!
Porto da resposta Befunge do histocrata .
Explicação: (Agradecimentos a Luis Mendo por -1 byte)
Isso produz quase certamente em tempo finito e quase certamente requer apenas memória finita .
Para completar, eis uma versão de 15 bytes que mantém um buffer de 10 elementos e gera um elemento aleatório a partir disso:
Eu gosto desta versão pelo muito idiomático (na medida em que os idiomas do golfe podem ser idiomáticos)
tn...Yr&)
, que exibe um elemento aleatório da lista e retorna a lista sem esse elemento. No entanto, a logística específica desse desafio adiciona muitos bytes (o necessáriow
para a exibição,t9>?
para verificar se a lista está cheia o suficiente ...).fonte
Alice , 7 bytes
Experimente online!
Isso deve funcionar em uma entrada infinita com tempo e memória infinitos, mas não é tão fácil de testar na prática :)
Explicação
A cada iteração, 10 caracteres são lidos na entrada e apenas um vai para a saída; portanto, o uso da memória aumenta linearmente durante a execução. Com uma entrada finita, isso atinge rapidamente o EOF, do qual dez -1 serão enviados para a pilha a cada iteração. Tentar produzir -1 como um caractere não tem efeito, mas é improvável que todos os caracteres da entrada sejam impressos em um período de tempo razoável.
A posição i da saída pode ser tomada por qualquer caractere na entrada até a posição 10i , isso está de acordo com o desafio que requer pelo menos um intervalo de i-9 a i + 9 .
fonte
C, 214 bytes
Como funciona
Experimente on-line (UNIX)
fonte
Vi
é permutado comVj
ondej = RAND [ i-9, i+9 ]
a satisfazer os critérios de interrogaçãov which is read at a position i of the infinite input, there must be a positive probability for it to end up in any of the positions i-9 to i+9 of the infinite output
05AB1E , 13 bytes
Experimente online! (modificado para receber 20 elementos)
fonte
Bash , 17 bytes
Experimente online!
xargs pega continuamente 9 letras de STDIN e as envia para embaralhar
uma lista infinita pode ser gerada por:
que imprime abcde .. z infinitas vezes.
O teste pode ser realizado por:
fonte
xargs shuf -e
satisfaz os requisitosR, 70 bytes
Inicia com um vetor vazio
x
. Em um loop infinito, ele pega um novo valor de STDIN e embaralha o vetor. Em seguida, verifica se o comprimento da lista criada é 10 ou superior. Se for, pode começar a imprimir. Dessa forma, o vetor possui um buffer de 10 entradas, cada uma sendo embaralhada a cada iteração. Portanto, é possível que a entrada seja impressa 10 lugares antes e infinitamente muitos lugares depois (seguindo uma distribuição geométrica comp=1/10
). Quando o buffer é longo o suficiente, o primeiro elemento é impresso e removido do vetor.fonte
Javascript, 78 bytes
Usa o mesmo método da resposta do xnor.
fonte
Perl 5 , 39 bytes
38 bytes de código +
-n
sinalizador.Experimente online!
Adicione cada elemento à
@F
matriz (compush@F,$_
). Quando@F
contém 10 elementos (push
retorna o número de elementos na matriz, portanto9<push...
), um elemento aleatório é removido e impresso (splice@F,rand 10,1
para remover o elemento,print
imprimi-lo).A saída começa a acontecer após o 10º elemento ter sido lido. Portanto, cada elemento pode começar a aparecer pelo menos 9 posições antes do original e pode ser deslocado para a direita infinitamente.
fonte
SmileBASIC,
6158 bytesCada caractere da lista infinita é adicionado ao final do buffer. Quando o tamanho do buffer é 11, um caractere aleatório é impresso e removido.
Função
R
gera o próximo caractere.fonte
Prolog, 70 bytes
fonte