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 .

Mr. Xcoder
fonte
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.

Robin Ryder
fonte
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.

Joel
fonte
-1 byte:+0 if[]else 1
Nishioka
@Nishioka Thanks. Atualizada.
Joel
11

Bash , 31 bytes

trap echo\ $[RANDOM%++n?1:n] 0;

Experimente online!

trap ... 0executará o código contido na saída. trapS repetidos sobrescreverão os antigos. O não citado $[arithmetic expansion]é executado toda vez que uma nova armadilha é definida.


O Zsh pode salvar um byte com <<<:

trap "<<<$[RANDOM%++n?1:n]" 0;
GammaFunction
fonte
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

Pâris Douady
fonte
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
1
-1 byte: tio.run/##K6gsycjPM/7/…
Nishioka
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
3

Gaia , 17 15 14 13 bytes

Øgl13÷:(1w&+ṛ

Experimente online!

Notei aleatoriamente o comportamento de Øgontem ao examinar os documentos, o que ajudou imensamente.

Giuseppe
fonte
3

Perl 5, 28 26 bytes

-2 bytes graças a @Grimy

1 if!++$x;say 1<rand$x||$x

TIO

Nahuel Fouilleul
fonte
26:1 if!++$x;say 1<rand$x||$x
Grimmy
Obrigado, boa variação
Nahuel Fouilleul 7/09
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.

Draco18s
fonte
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
Shaggy
fonte
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.)

tsh
fonte
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

C # (Compilador interativo do Visual C #) , 133 114 112 bytes

Esta é a primeira (e espero que última) vez que eu usei diretivas de pré-processador C #.

#if!I
#define I
static int i;
class p{~p()=>Console.Write(new Random().Next(i)<1?i:1);}p s=new p();
#endif
i++;

Experimente online!

meu pronome é monicareinstate
fonte
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
Neil
fonte