Случайно неправильно написано слово


16

Вдохновленный этим вопросом CR (пожалуйста, не убивайте меня за просмотр CR)

спекуляция

Вероятности неправильного написания слова:

  • 1/3 времени не меняйте выход
  • 1/3 времени удалить случайного персонажа
  • 1/3 времени дублирует случайный символ

Вероятность удаления / дублирования заданного символа на входе должна быть одинаковой для всех символов.

Если два последовательных символа одинаковы (с учетом регистра), вероятность изменения одного из них должна быть такой же, как если бы они были одним символом. Т.е. выходы для AA(которые являются AAили Aили AAA) должны иметь одинаковую вероятность.


Ввод будет содержать только буквы для простоты.

Примеры

Первая строка - это ввод, следующие строки - все возможные ошибки. Каждая строка должна иметь одинаковую вероятность вывода, входные данные исключены в примерах, но все равно должны иметь 1/3 вероятности вывода.

foo

fo
oo
ffoo
fooo
PPCG

PPC
PPG
PCG
PPPCG
PPCCG
PPCGG

Это хороший вызов, но если каждая строка имеет одинаковую вероятность вывода, не означает ли это, что вероятность того, что слово останется прежним, не равна 1/3?
Стоимость чернил

@ValueInk хорошо, это недостатки с примерами. позвольте мне исправить
Downgoat

3
Подождите, если каждая строка будет иметь одинаковую вероятность вывода, не будет ли распределение символов неравномерным? Например, с помощью foo: если вы удалите символ, он может стать (-f) oo, f (-o) o и fo (-o). Так что foдолжно быть в два раза чаще oo, но вы говорите, что каждая строка имеет равную вероятность.
Деусови

2
@Deusovi есть целый параграф, объясняющий это, я скопирую это здесь на всякий случайIf two consecutive characters are the same (case-sensitive), the probability of one of them being modified should be the same as if they are one character. I.e. the outputs for AA (which are AA or A or AAA) should all have the same probability.
edc65

1
@DJMcMayhem нет, более одного символа, как правило, написаны с ошибками; _;
Вниз

Ответы:


5

Пип , 38 27 байт

a@:`(.)\1*`YRR#aa@y@0X:RR3a

Это было весело - использовать возможности регулярных выражений Пипа и изменяемые строки, которые я давно не использовал. Принимает ввод через аргумент командной строки.

Объяснение:

a@:`(.)\1*`                  Split a into runs of identical chars using regex match
           YRR#a             Yank randrange(len(a)) into y (randomly choosing one such run)
                a@y@0        Take the first character of that run
                     X:RR3   Modify in place, string-multiplying by randrange(3):
                               If RR3 is 0, character is deleted
                               If RR3 is 1, no change
                               If RR3 is 2, character is duplicated
                          a  Output the modified a

Попробуйте онлайн!


1
Вау, поздравляю с кратким гольфом только с ASCII
Downgoat

3

Руби, 64 55 + 1 (p флаг) = 56 байт

Ввод - это строка STDIN, переданная без завершающей строки.

a=[]
gsub(/(.)\1*/){a<<$&}
a.sample[-1]*=rand 3
$_=a*''

2

CJam (21 байт)

re`_,mr_2$=3mr(a.+te~

Онлайн демо

рассечение

r     e# Read a line of input from stdin
e`    e# Run-length encode it
_,mr  e# Select a random index in the RLE array
_     e# Hang on to a copy of that index
2$=   e# Copy the [run-length char] pair from that index
3mr(  e# Select a uniformly random integer from {-1, 0, 1}
a.+   e# Add it to the run-length
t     e# Replace the pair at that index
e~    e# Run-length decode

2

JavaScript (ES6), 107

w=>(r=x=>Math.random()*x|0,a=w.match(/(.)\1*/g),a[p=r(a.length)]=[b=a[p],b+b[0],b.slice(1)][r(3)],a.join``)

Меньше гольфа

w=>(
  a = w.match(/(.)\1*/g),
  r = x => Math.random()*x | 0,
  p = r(a.length),
  b = a[p],
  a[p] = [b, b+b[0], b.slice(1)][r(3)],
  a.join``
)

Тестовое задание

f=w=>(r=x=>Math.random()*x|0,a=w.match(/(.)\1*/g),a[p=r(a.length)]=[b=a[p],b+b[0],b.slice(1)][r(3)],a.join``)

function update() { 
  O.innerHTML = Array(99)
  .fill(I.value)
  .map(x=>(
    r=f(x),
    r==x?r:r.length<x.length?'<b>'+r+'</b>':'<i>'+r+'</i>'
  
    )
  ).join` `
}

update()
#O { width:90%; overflow: auto; white-space: pre-wrap}
<input id=I oninput='update()' value='trolley'><pre id=O></pre>


2

Java 7, 189 180 178 байт

import java.util.*;String c(String i){Random r=new Random();int x=r.nextInt(2),j=r.nextInt(i.length());return x<1?i:i.substring(0,j-(x%2^1))+(x<2?i.charAt(j):"")+i.substring(j);}

Ungolfed и тестовые случаи:

Попробуй это здесь.

import java.util.*;
class M{
  static String c(String i){
    Random r = new Random();
    int x = r.nextInt(2),
        j = r.nextInt(i.length());
    return x < 1
            ? i
            : i.substring(0, j - (x%2 ^ 1)) + (x<2?i.charAt(j):"") + i.substring(j);
  }

  public static void main(String[] a){
    for(int i = 0; i < 5; i++){
      System.out.println(c("foo"));
    }
    System.out.println();
    for(int i = 0; i < 5; i++){
      System.out.println(c("PPCG"));
    }
  }
}

Возможный вывод:

foo
fooo
foo
foo
ffoo

PPCCG
PPCG
PPCCG
PPPCG
PPCG


1

Pyth - 17 байт

Этот на самом деле обрабатывает специальные случаи с последовательным символом правильно.

 XZOKrz8Or_1 2r9K

Тестовый пакет .


Это 16 байтов? Правильно ли ведущий пробел? Если нет, то это 15 байт?
Downgoat

@ Downgoat нет, пробел правильный. Я уверен, что его 17 байтов.
Maltysen

1

APL, 21

{⍵/⍨3|1+(?3)×(⍳=?)⍴⍵}

Это начинается с создания вектора нулей с 1 в случайном положении. Затем умножает его на случайное число от 1 до 3. +1 и мод 3 получает вектор со всеми 1 и одним случайным образом расположенным 0,1 или 2.

Наконец, ⍵ / ⍨ говорит, что каждая буква должна быть написана n раз, где n - числа в векторе.

Попробуйте это на tryapl.org


0

Python 2, 123 байта

from random import*
R=randint
s=input()
m=n=R(0,len(s)-1)
c=R(0,2)
m=[m,1+[-len(s),m][m>0]][c==1]
n+=c==2
print s[:m]+s[n:]

0

JavaScript (ES6), 103

w=>{w=w.split(''),r=Math.random,x=r(),i=r()*w.length|0;w.splice(i,x<.6,x>.3?w[i]:'');alert(w.join(''))}

0

APL, 27 байт

{⍵/⍨(?3)⌷1⍪2 0∘.|1+(⍳=?)⍴⍵}

Объяснение:

                        ⍴⍵  ⍝ length of ⍵
                   (⍳=?)    ⍝ bit vector with one random bit on 
                 1+         ⍝ add one to each value (duplicate one character)
           2 0∘.|           ⍝ mod by 2 and 0 (remove instead of duplicate)
         1⍪                 ⍝ add a line of just ones (do nothing)
    (?3)⌷                   ⍝ select a random line from that matrix
 ⍵/⍨                        ⍝ replicate characters in ⍵

Тестовое задание:

      {⍵/⍨(?3)⌷1⍪2 0∘.|1+(⍳=?)⍴⍵} ¨ 10/⊂'foo'
 fooo  foo  oo  foo  fo  fo  oo  fo  oo  fooo 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.