O gato comeu sua entrada novamente!


30

Crie um programa para gatos, também conhecido como programa que recebe uma entrada e a imprime.

... Exceto que o programa retirará aleatoriamente os caracteres da sua entrada e os imprimirá.

Cada caractere na entrada deve ter probabilidades geralmente iguais para serem removidas com o programa, porém, como é difícil fazer isso, as probabilidades para cada caractere podem variar em 10%, no máximo.

Seu programa deve receber a entrada, remover aleatoriamente caracteres da entrada e imprimir essa versão novamente. (Você pode imprimir com novas linhas à direita ou outros caracteres, caso o seu idioma precise imprimir novas linhas.)

Se a entrada foi BOOOWL, ela não deve remover todos os O com uma chance igual: cada caractere (não único) deve ser considerado; portanto, em vez de cada O combinado ter uma chance de 1/5 (por exemplo), cada O deve ter 1 / 5 chance, então, em vez de haver uma chance de 1/5 BWL, deve haver uma chance de 1/5 BOWL, BOOWL.

A entrada é restrita a STDIN ou equivalente mais próximo.

Cada personagem deve ter no mínimo 10% e no máximo 30% de chance de ser removido.

As probabilidades de cada personagem devem ser calculadas individualmente.

Você pode usar qualquer componente do seu idioma que suporte ações aleatórias, sejam elas funções ou qualquer outra coisa.

A saída deve ser através de STDOUT ou o equivalente mais próximo. Se o seu idioma tiver STDOUT, não faça saída de nenhuma outra maneira. Se o seu idioma não puder gerar seqüências de caracteres como texto, use o equivalente mais próximo (a saída da matriz de caracteres de C está OK aqui).

Isso é código de golfe. O programa mais curto vence.


4
Sempre deve haver entre 10% e 30% de chance de um personagem específico ser removido? Ou isso é apenas para o propósito do exemplo?
attinat 11/08

2
o que você quer dizer com "conjuntos de um caractere"? se a entrada for, BOWL OF SOUPtodos poderão Oser excluídos de uma só vez?
roblogic

1
todas as respostas até agora usam uma chance fixa de 20% de remoção de um personagem. Não sei se a intenção da pergunta é que todos os personagens tenham as mesmas chances.
Nzall

3
Output must be through STDOUT, as a text. Do not output a character array.<- Eu tenho uma linguagem que permite a saída de uma matriz de caracteres (ela é achatada antes da saída). Isso não é permitido? E linguagens como C, onde uma string é basicamente uma matriz de caracteres?
Ismael Miguel

1
Use o equivalente mais próximo. As seqüências de caracteres de matriz de C estão OK, pois são o equivalente mais próximo ao texto.
Andrew

Respostas:


10

Japonês -f , 2 bytes

O -fsinalizador "executa o programa em cada elemento na primeira entrada, produzindo uma matriz daqueles que retornam um valor verdadeiro". retorna um número aleatório entre 0 (inclusive) e 5 (exclusivo). Como o JavaScript, 0 é falso no Japt.

Tente


2
Estou voltando no tempo, criando um idioma onde está esse desafio e depois voltando e enviando minha resposta, ou talvez faça a sequência vazia que: p
Andrew

Os sinalizadores da linha de comando não devem contar para o número de bytes?
Daniel Vestøl

1
@ DanielVestøl Clique em -f, no título.
Ismael Miguel


1
foi brincadeira, mas ok
Andrew

8

Python 3 , 63 bytes

from random import*
for c in input():print(end=c[random()<.2:])

Experimente online!

Python 2 , 67 65 bytes

from random import*
print''.join(c for c in input()if.8>random())

Experimente online!

Cada personagem tem 20% de chance de ser derrubado.

Abordagem diferente, mesmo comprimento:

from random import*
print''.join(c[random()<.2:]for c in input())

Experimente online!


63 bytes em python 2 com uma função
attinat 11/08

As regras declaram explicitamente para escrever um programa completo:Create a cat program, a.k.a a program that takes an input and prints it.
movatica

Isso lê apenas a primeira linha de entrada.
AKX

O problema não afirma que ele teve que ler várias linhas.
movatica

8

Carvão , 4 bytes

ΦS‽⁵

Experimente online! Link é a versão detalhada do código. Explicação:

 S      Input a string
Φ       Filter where nonzero
  ‽⁵    Random number 0..4
        Implicitly print

Você pode usar qualquer número de 4para 10obter chances 25%da 10%respectivamente.


7

Befunge-98 (PyFunge) , 11 bytes

>#@~3j4???,

Experimente online!

Cada personagem tem 25% de chance de ser removido. Esta decisão é tomada nas três ?instruções.

?define o contador do programa para uma das quatro direções, com igual probabilidade. Nesse caso, as teclas up e down retornam para a mesma instrução, para que possamos ignorá-las como opções.

Existem duas maneiras de sair da floresta de ?s: à direita (saída) e à esquerda (sem saída). Esta situação é simétrica, por isso, se a partir do meio ?, existe uma p2=1/2 oportunidade de produzir. A possibilidade de produzir, se a partir da direita ?é p3=1/21+1/2p2=3/4 . Portanto, depois de ler um caracter, pulamos para a direita ?para determinar se a saída deve ou não.


5

Oitava , 23 bytes

Gera uma matriz do mesmo tamanho que a entrada (cadeias de caracteres em Octave são matrizes de caracteres), verifica cada um dos números aleatórios se é maior que 0.2e depois usa a indexação lógica para extrair os caracteres nas posições correspondentes.

@(s)s(rand(size(s))>.2)

Experimente online!


5

Geléia , 9 5 bytes

5X’µƇ

Experimente online!

Uma mônada que pega uma sequência Jelly como argumento e retorna a sequência Jelly processada. Quando usado como um programa completo, imprime implicitamente a saída. Cada personagem tem 20% de chance de ser removido.

Explicação

   µƇ | Filter using the following as a monad for each character:
5X    | - Random number between 1 and 5
  ’   | - Decreased by 1

5

Japonês , 3 bytes

Cada personagem tem 1 em 5 de chance de ser removido. O 5pode ser alterado para qualquer coisa entre 4& 9, inclusive, ou Apara 10alterar as probabilidades.

Æ5ö

Tente

Æ5ö     :Implicit input of string
Æ       :Filter by
 5ö     :  Random integer in the range [0,5), with 0 being falsey


5

05AB1E , 5 4 bytes

ʒ₄Ω≠

-1 byte graças a @Grimy .

Experimente online ou execute o mesmo programa 10 vezes .

Cada personagem tem uma mudança de 25% de ser descartado.

Explicação:

ʒ     # Filter the characters of the (implicit) input-string by:
     #  Push 1000
  Ω   #  Pop and push a random digit from it
     #  And check that it's NOT 1 (!=1)
      # (after which the result is output implicitly)

também poderia ser _( ==0).


2
5Lpode ser para -1 (altera a chance de 20% para 25%, o que ainda é aceitável).
Grimmy

@ Grimy Nice, obrigado! :)
Kevin Cruijssen

4

MATL , 9 bytes

t&n&r.2>)

Exaplanação:

t         implicitly take input and duplicate it
 &n       compute the size of the input and...
   &r     generate a random array of that size
     .2>  check which entries of that array are greater than 0.2
        ) and use the result using logical indices to extract certain characters of the input

Experimente online!


4

Pitão , 8 5 bytes

sfO4Q

Experimente online!

sfO4Q   Implicit: Q=eval(input())
 f  Q   Filter characters of Q where the following is truthy:
  O4      Random number in the range [0-4)
          Any non-zero value is truthy, so this will drop characters 25% of the time
s       Concatenate into string, implicit print

Versão anterior, 8 bytes:

s*Vm!!O4

Experimente online!

s*Vm!!O4QQ   Implicit: Q=eval(input())
             Trailing QQ inferred
   m    Q    Map each character in Q using:
      O4       Choose random integer in [0-4)
    !!         Logical NOT twice - maps 0 to 0, anything else to 1
             The result is a list of 0s and 1s, with 0 having 25% chance to appear
 *V      Q   Vectorised multiplication of the above with Q
s            Concatenate into string, implicit print

Qgerará um erro se a entrada não for do tipo python. Erros, por exemplo, de [1ou a/b. Q, we zfuncionará apenas para entrada de linha única, portanto a melhor opção provavelmente seriaj.z
ar4093

4

Cubix , 20 bytes

u$w\A|UDw@?;...>o._U

Experimente online!

Mais do que eu esperava, uma vez que tinha um número de no-ops das quais não consigo me livrar. A chance de largar um personagem é de 25%. Presumo que esteja tudo bem.

    u $
    w \
A | U D w @ ? ;
. . . > o . _ U
    . .
    . .

Assista correr

Breve explicação:

  • A|A isso inicializa a pilha, Input all, reflete novamente, Input all (apenas um EOI -1)
  • ;? pop para a pilha, teste para EOI (-1).
  • _?@ se negativo, reflita novamente no teste e termine na parada
  • $Dpule \para dentro do regulador de direção aleatório.
    • do setter de direção, 3 direções para a osaída e depois de volta para o loop, a pessoa perde o ocaminho e vai direto para o loop.

3

APL (dzaima / APL) , 10 9 bytes SBCS

Função de prefixo tácito anônimo. Cada personagem tem exatamente 20% de chance de ser removido.

⊢⌿⍨4≥∘?5¨

Experimente online!

 zero para cada caractere

? intervalo inteiro aleatório 1–5 para cada caractere

4≥ Máscara booleana para números inteiros menores ou iguais a 4

⊢⌿⍨ filtrar o argumento usando essa máscara


3

Retina , 15 bytes

/./_?(`.







Experimente online! Explicação:

/./_

Processe cada personagem individualmente.

?(`

Realize uma substituição aleatoriamente. A primeira substituição exclui o personagem, enquanto os outros três o deixam inalterado, dando a 25%chance de excluir o personagem. Isso pode ser diminuído conforme necessário, acrescentando pares adicionais de novas linhas.


3

R , 32 23 bytes

function(x)x[rt(x,3)<1]

Experimente online!

Uma função que recebe um vetor de caractere como entrada e retorna um vetor de caractere processado. Cada personagem tem 20% de chance de ser removido.

Agradecemos a @Roland e @Giueseppe por ajudar a economizar 7 bytes, e a @JDL por mais 2!


1
function(x)x[!rbinom(x,1,0.2)]
Roland

na mesma linha que @Roland function(x)x[rf(x,1,1)>1],; df(1,1,1)é sobre o 0.16que faz o truque.
Giuseppe

ou rt(x,3)>1(cerca de 20% de chance)
JDL

2
@JDL é <1, mas obrigado! Outros 2 salvos.
Nick Kennedy

3

T-SQL 2012, 83 bytes

Passando pela entrada da direita para a esquerda, removendo 0 ou 1 caractere.

25% de chance de cada personagem ser removido.

DECLARE @i varchar(max)='The cat ate my homework'

DECLARE @ int=len(@i)WHILE @>0SELECT
@i=stuff(@i,@,str(rand()*2)/2,''),@-=1PRINT @i

Explicação:

rand()*2retorna um ponto flutuante, que não pode ser usado no stuffcomando

O strconverte isso em um varchar após arredondar para o número inteiro mais próximo. O float está sendo convertido em um varchar (que também não é permitido como terceiro parâmetro stuff).

Esse varchar tem 25% de chance de ser '2', 50% de chance de ser '1', 25% de chance de ser '0'. Dividindo por 2, existe uma chance de 25% do resultado ser 1. Essa divisão converte o varchar em um número inteiro.

Inteiro é o terceiro parâmetro esperado na stufffunção.

Experimente online


Muito bom truque STR, vou ter que lembrar disso. Não tenho certeza se é justo pegar o seu (não contado) DECLAREno seu código (contado); mas mudar isso custaria apenas 1 byte, já que você pode eliminar o extra SETcomDECLARE @ INT=len(@i)
BradC

@BradC Eu concordo e tentarei lembrar de não
pegar

2

J , 10 bytes

#~5>6?@$~#

Experimente online!

Semelhante à resposta de Adam no APL, embora eu realmente tenha escrito antes de olhar para a dele.

  • 6.. $~ #Pegue o comprimento da entrada #e modele $~o número 6 em uma lista longa.
  • ?@Trate cada seis da lista como um dado e role ?-o.
  • >5O dado é menor que 5 (os valores possíveis são 0..5)? Use esse resultado booleano para criar uma máscara de bit.
  • #~ Filtre a entrada com essa máscara.


2

Javascript,  46   44  51 bytes

i=>alert([...i].filter(c=>Math.random()>.2).join``)

+7 bytes devido ao requisito STDOUT adicionado

-2 bytes obrigado a Birjolaxew


resposta original: 44 bytes sem o requisito STDOUT

i=>[...i].filter(c=>Math.random()>.2).join``

Como você não usa o nome da função, você pode fornecer apenas a própria função . A remoção f=reduz para 44 bytes. Você também pode entrada / saída como uma matriz, o que deve economizar bastante.
Birjolaxew

@Birjolaxew Eu não tenho certeza, mas como eu a entendo, a questão não permite o uso de array de caracteres se a linguagem tiver string
jonatjano

Sim, Andrew editou a pergunta com requisitos adicionais após o meu comentário. Isso geralmente é desaprovado, porque invalida respostas que eram válidas anteriormente (nesse caso, é até discutível se sua resposta inicial se encaixa no requisito "A saída deve ser feita por STDOUT").
Birjolaxew

O que join``significa isso ? Não pode encontrá-lo na especificação (porque eu realmente não sei o que é)
nick Zoum

1
@nickzoum em es6 é equivalente ajoin("") mdn revelent page
jonatjano

2

Scala , 51 46 30 bytes

s=>s.flatMap(x=>if(math.random>.2)Some(x)else None)

Experimente online!

PS. Como em muitas outras soluções, a probabilidade de deixar cair o carvão é de 20%.

Atualizar:

-5 bytes usando String em vez de Option [String] no flatMap

s=>s.flatMap(x=>if(math.random>.2)x+""else "")

30 bytes usando filtro

s=>s.filter(x=>math.random>.2)

1
Você pode cortar 7 bytes alterando scala.math.randompara math.randome 0.2para .2. Bom truque usando ^ assim.
Kjetil S.

@KjetilS, obrigado. Também publiquei literais de função em vez de definições de função como uma solução. É aceitável de acordo com isso: codegolf.stackexchange.com/questions/3885/…
Dr. Y Wit

2

C # (compilador interativo do Visual C #) , 71 bytes

var y=new Random();foreach(var k in ReadLine())if(y.Next(5)<4)Write(k);

Experimente online!


Eu acho que <1 está comendo demais. Talvez <3 ou <4 corresponda aos parâmetros do problema. De qualquer forma, isso não altera o tamanho do código.
Luca

Eu não tenho programado em C # há algum tempo, mas por que não é new Random().Next(5)diretamente possível?
Kevin Cruijssen 12/08

1
@KevinCruijssen Porque então a mesma semente será usada para cada número, então cada número será o mesmo. Apenas tente new Random().Next(5), tudo o que você terá é toda a entrada ou nada.
Modalidade de Ignorância

1
@KevinCruijssen ao usar new Random(), o valor inicial padrão é Environment.TickCount, que aumenta a cada milissegundo. Se todos eles forem criados no mesmo tick de milissegundo, todos terão a mesma semente. A resposta está usando apenas uma única instância do Random e, quando é chamada, atualiza o valor interno da propagação - portanto, toda vez que Next () é chamado, ele cria um valor de saída diferente. No entanto, o .Net Core usa um RNG singleton para gerar a semente, por isso não tem esse problema
Zac Faragher

1
@BenjaminUrquhart Corrigido, mas adicionamos 26 bytes. Além disso, alguém pode argumentar que o argumento não deve ser de entrada STDIN, mas restricted to STDIN or closest equivalentargumentos de função podem ser o equivalente mais próximo, mas eu não vou fazer isso
Modalidade de Ignorância


1

C (gcc) , 50 bytes

Este programa tem 20% de chance de deixar uma carta. Infelizmente, o gerador de números aleatórios não é propagado, então você obtém a mesma sequência em cada execução. Basicamente, o único truque é inverter o caractere de entrada para interromper o loop no EOF.

main(c){for(;c=~getchar();rand()%5&&putchar(~c));}

Experimente online!

C (gcc) , 64 59 bytes

Obrigado ao ceilingcat pelos -5 bytes.

Se você deseja que o RNG seja semeado em cada execução.

main(c){for(srand(&c);c=~getchar();rand()%5&&putchar(~c));}

Experimente online!


Você não precisa usar main()para envios do Code Golf, também pode definir uma função arbitrária que faz o que é necessário. Então você pode escrever f(c){...}.
G. Sliepen

1

Lua , 69 68 bytes

for c in io.lines(nil,1)do io.write(math.random()>.2 and c or '')end

Experimente online!

Meio simples, mas parece ser a versão mais curta: itere sobre stdin char por char (com io.lines… esse nome é enganoso) e, em seguida, com base no valor aleatório, imprime uma string vazia ou (por exemplo, nada).


1

Java

Sem finalização: 82 bytes

v->{for(int i;;i=System.in.read(),System.out.print(Math.random()<.2?"":(char)i));}

Terminando (TIO): 105 bytes

v->{var n=System.in;for(int i;n.available()>0;i=n.read(),System.out.print(Math.random()<.2?"":(char)i));}

É realmente necessário lidar com o stdout? Outras respostas apenas criam uma função apenas convertendo uma string. Parece injusto com Java. Se essa solução C # for válida, s->s.filter(c->Math.random()<.2)também será.
Holger

@Holger Input is restricted to STDIN or closest equivalent.e Output must be through STDOUT or the closest equivalent. If your language does have STDOUT, do not output in any other way.Portanto, não, essa resposta não é válida
Benjamin Urquhart

1

Zsh , 53 41 bytes

-12 , graças a GammaFunction

41 bytes: experimente online!

Converte a entrada em uma matriz de caracteres e tenta imprimir cada elemento c, a menos que seja comido pela ((RANDOM%4))avaliação como falso!

for c (${(s::)1})((RANDOM%4))&&echo $c\\c

53 bytes: experimente online!

Uma iteração mais direta, mas detalhada, sobre o comprimento da string.

for ((;i<$#1;i++)){((RANDOM%4>0))&&echo "${1[i]}\c";}

1
Uso inteligente de \c, eu não teria lembrado disso! Ainda há algumas otimizações a serem feitas ...
GammaFunction 13/08

Uso agradável e inteligente de RANDOMe conversão de matriz
roblogic 13/08

1

Zsh , 50 bytes

for c (${(s::)"$(<&0)"})
((RANDOM%5))&&echo -nE $c

Experimente online!

Semelhante à resposta do RobLogic, mas seguindo os requisitos de entrada mais de perto, e funciona para entradas com barras invertidas.

"$(<&0)"em vez de "<&0"ou $(<&0)porque o primeiro não funciona em substituições e o segundo come novas linhas. Os -nEsinalizadores são necessários para impedir que as barras invertidas sejam analisadas como seqüências de escape e para impedir a inserção de novas linhas.

echo -nE


1

MathGolf , 5 bytes

æƒ√∞*

Experimente online!

Explicação

æ       foreach character...
 ƒ      random float in range [0,1)
  √     take square root (making P(x < 0.5) = 0.25)
   ∞    pop a, push 2*a
    *   repeat character int(x) times

Cada caractere será repetido 0 ou 1 vezes, dependendo do valor aleatório. Como o valor esperado após a raiz quadrada é alterado, há uma probabilidade de 25% de que cada caractere seja removido.

Alternativa de 5 bytes

gÉ;4w

Filtre os caracteres por um número aleatório em [0, 4]. Devido a como a filtragem funciona, tenho que descartar o caractere real no loop de filtro, que adiciona 1 byte.


0

GFortran , 120 bytes

Não é tão ruim assim, se usarmos a RAN()função obsoleta , que é pseudo- aleatória, ou seja, você obtém a mesma sequência a cada vez. A maneira correta de gerar números aleatórios no GFortran é com CALL RANDOM_SEED()e CALL RANDOM_NUMBER(R)mas são muitos bytes!

character(99)S;read(*,'(A)')S;do i=1,len_trim(S)
if(ran(0)*5.gt.1)then;write(*,'(A)',advance="no")S(i:i)
endif;enddo;end

Experimente online!


1
A pseudo-aleatoriedade é permitida, se essa for a maneira mais próxima que você precisa para realizar ações aleatórias.
Andrew

0

Oracle SQL, 133 bytes

select listagg(decode(sign(dbms_random.value-0.2),1,substr(x,level,1)))within group(order by level)from t connect by level<=length(x)

Ele trabalha com a suposição de que os dados de entrada são armazenados em uma tabela t (x), por exemplo

with t(x) as (select 'The cat ate my homework' from dual)
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.