Eu multiplico a fonte, você (provavelmente) multiplica a saída!


18

Tarefa

A tarefa é escrever um programa que produza um número inteiro positivo consistente, mas arbitrário, x (tão estritamente maior que 0). Aqui está o problema: quando a fonte é repetida N vezes (o código é anexado / concatenado N1 a si mesmo), o programa deve ter 1NProbabilidade de N de emitirNxe a probabilidade restante deN1N de saídaxinalterado.

Exemplo

Vamos supor que sua fonte inicial seja XYZe produz o número inteiro 3. Então:

  • Para N=2 : XYZXYZdeve produzir 3 com uma probabilidade de 12 (50% do tempo) e23=6 com uma probabilidade de 12 também (50% do tempo).

  • Para N=3 : XYZXYZXYZdeve produzir 3 com uma probabilidade de 23 (66,666% do tempo) e33=9com uma probabilidade de13 (33,333% do tempo)

  • Para N=4 : XYZXYZXYZXYZdeve produzir 3 com uma probabilidade de 34 (75% do tempo) e43=12 com uma probabilidade de14 (25% do tempo)

e assim por diante....

Regras

Nota: Este desafio é uma versão (muito) mais difícil deste .


O programa pode ler seu código fonte?
meu pronome é monicareinstate

3
@ alguém Sim, é permitido.
Mr. Xcoder 6/09

Respostas:


16

R , 66 bytes 35

-29 bytes graças a digEmAll .

-2 bytes graças a Giuseppe .

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

Experimente online!

Verifique a distribuição para N = 4.

A chave é a atribuição à direita ->. Quando o código é multiplicado N vezes, as primeiras chamadas N1sample serão atribuídas aA e apenas a última chamada será impressa.

Solução original e mais complicada:

R , 66 bytes

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

Experimente online!

Experimente online (repetido 3 vezes)!

Utiliza dois truques: 1) chama a função principal de interesse ?, para que possamos chamá-la sem terminar o programa com colchetes; e 2) usa variáveis Te TT, com o código que começa com Te termina com?T .

Fé o contador de iterações. ?é redefinido como uma função que recebe um argumento booleano: se a entrada de ?é TRUE(ou T), faz a amostragem aleatória necessária; se a entrada for FALSE(ou 0), não fará nada. O valor de TTé definido como 0, para que ?Tfaça a amostragem, mas ?TTnão faça nada.

Quando a fonte é repetida, fica assim:

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

portanto, a chamada do meio ?TTnão gera nada, mas a chamada final ?Tgera o resultado aleatório.


5
Acho que nunca vi o ->código usado em uma situação em <-que não podia estar; isso é tão legal !!
Giuseppe

PS: Eu vou dar uma recompensa a isso em algum momento.
Giuseppe

2
Absolutamente incrível!
digEmAll


@digEmAll Muito mais arrumado, obrigado!
Robin Ryder em

11

Python 3 , 81 79 bytes

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

Experimente online!

-1 byte graças a @Nishioka

Esta é uma solução Python 3 que não acessa diretamente a fonte do programa. Fazer isso no Python 3 é mais desafiador do que o Python 2 porque as instruções de impressão normais terminam com um parêntese de fechamento, portanto não há muitas opções para alterar seu comportamento no próximo bloco da fonte inicial. Seria interessante ver soluções mais criativas no Python 3.


-1 byte:+0 if[]else 1
Nishioka

@Nishioka Thanks. Atualizada.
Joel




4

Python 3 , 78 76 75 bytes

Usando o mesmo truque do link postado, aqui está o Python (com x = 1).

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

Experimente online!

-2 bytes graças ao Sr. Xcoder por sua (n-1)fórmula com a ~-nqual tem maior precedência que *
-1 byte graças a Nishioka


1
Parece bom para mim! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#deve funcionar para -2 bytes
Sr. Xcoder 6/09

1
Eu nunca tinha visto essa maneira de fazer n-1! Eu gosto, obrigado :)
Pâris Douady 6/09


Outro byte de -1, mas com uma abordagem um pouco diferente: tio.run/##K6gsycjPM/7/…
Nishioka

sim eu faço por causa do random()<1/n;-)
Pâris Douady





2

Encantos Rúnicos , 31 bytes

UwR'10<;$\
I+:'RA0)?/1$;
1
l;
y

Experimente online!

Usa a mesma estrutura que esta resposta para contar quantas vezes a fonte foi duplicada:

Fluxo de execução

Em vez de emitir o enésimo número em uma lista, usamos esse valor para gerar um número aleatoriamente, se o resultado não for 0, imprima 1, ou imprima esse número.


2

Japonês , 9 8 bytes

(°Tö)ΪT

Testá-lo | Dobrado | Triplicado
Verifique a distribuição de 10.000 execuções após 10 repetições

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

Original, 13 11 10 9 bytes

Observe o espaço à direita.

NoÎp°T ö 

Testá-lo | Dobrado | Triplicado
Verifique a distribuição de 10.000 execuções após 10 repetições

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N

2

JavaScript ( shell 71 do JavaScript ), 78 bytes

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

Nenhum link tio, spidermonkey no tio é muito antigo ...

O Firefox (Spidermonkey) considera o comentário como parte da função f. Como resultado, (''+f).lengthseráb+79n onde b <78 e (n + 1) são os tempos do código fonte repetidos.

Esse comportamento do buggy (? Não tenho certeza. Prefiro que seja um erro de especificação do JavaScript do que qualquer intérprete ) foi enviado ao BMO por outra pessoa logo após a resposta: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Nem o tópico bmo nem o tweet são publicados por mim.)


O que há com o (async x=>x)()? Por que é assíncrono?
Tomáš Zato - Restabelecer Monica

@ TomášZato É literalmente asynchronous. Portanto, o retorno de chamada x=>f(...)será chamado após a função fser definida.
tsh 10/09


1

Carvão , 12 bytes

⎚I⎇‽L⊞Oυω¹Lυ

Experimente online! Com base na minha resposta à pergunta vinculada. Saídas ncom probabilidade ¹/ₙ, caso contrário 1. Explicação:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.