Salah Mengeja Kata Secara Acak


16

Terinspirasi oleh pertanyaan CR ini (tolong jangan bunuh saya karena menjelajahi CR)

Spec

Peluang salah mengeja kata adalah:

  • 1/3 dari waktu tidak mengubah output
  • 1/3 dari waktu menghapus karakter acak
  • 1/3 dari waktu duplikat karakter acak

Kesempatan untuk menghapus / menduplikasi karakter yang diberikan dalam input harus sama untuk semua karakter.

Jika dua karakter berurutan adalah sama (peka huruf besar kecil), kemungkinan salah satu dari mereka harus diubah sama seperti jika mereka adalah satu karakter. Yaitu output untuk AA(yang AAatau Aatau AAA) semua harus memiliki probabilitas yang sama.


Masukan hanya akan berisi huruf untuk kesederhanaan.

Contohnya

Baris pertama adalah input, baris berikut semuanya kemungkinan salah eja. Setiap baris harus memiliki probabilitas yang sama untuk menjadi output, input tidak termasuk dalam contoh tetapi masih harus memiliki probabilitas 1/3 dari output.

foo

fo
oo
ffoo
fooo
PPCG

PPC
PPG
PCG
PPPCG
PPCCG
PPCGG

Ini tantangan yang bagus, tetapi jika setiap baris memiliki probabilitas yang sama untuk menjadi output, bukankah itu berarti bahwa itu bukan peluang 1/3 bahwa kata tersebut tetap sama?
Nilai Tinta

@ ValueInk oke itu cacat dengan contoh. biarkan saya memperbaiki
Downgoat

3
Tunggu, jika setiap baris memiliki probabilitas yang sama untuk menjadi keluaran, maka bukankah distribusi karakter tidak akan seragam? Seperti, dengan foo: jika Anda menghapus karakter, karakter itu bisa menjadi (-f) oo, f (-o) o, dan fo (-o). Jadi foharus dua kali lebih mungkin oo, tetapi Anda mengatakan setiap baris memiliki probabilitas yang sama.
Deusovi

2
@Deusovi ada seluruh paragraf yang menjelaskan hal ini, saya akan menyalinnya di sini untuk berjagaIf 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 no, lebih dari satu karakter biasanya salah eja; _;
Downgoat

Jawaban:


5

Pip , 38 27 byte

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

Ini menyenangkan - harus menggunakan regex Pip dan kemampuan string yang bisa berubah, yang tidak saya tarik dalam beberapa saat. Mengambil input melalui argumen baris perintah.

Penjelasan:

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

Cobalah online!


1
Wow, selamat karena telah bermain golf singkat hanya dengan ASCII
Downgoat

3

Ruby, 64 55 +1 ( pbendera) = 56 byte

Input adalah garis STDIN yang disalurkan tanpa tertinggal baris baru.

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

2

CJam (21 byte)

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

Demo online

Pembedahan

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``)

Kurang golf

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``
)

Uji

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 byte

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);}

Kasus yang tidak disatukan & uji:

Coba di sini.

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"));
    }
  }
}

Output yang mungkin:

foo
fooo
foo
foo
ffoo

PPCCG
PPCG
PPCCG
PPPCG
PPCG

1

Python 2, 134 byte

from random import*
def f(s):
 p=c=0;M,L=[],list(s)
 for t in L:
  if t!=p:M+=c,;p=t
  c+=1
 L[choice(M)]*=randint(0,2);return''.join(L)

Spasi putih di dalam untuk loop adalah tab.

Cobalah di Ideone


1

Pyth - 17 byte

Yang ini benar-benar menangani kasus khusus dengan karakter berturut-turut dengan benar.

 XZOKrz8Or_1 2r9K

Test Suite .


Ini 16 byte? Apakah ruang utama benar? Jika tidak, ini adalah 15 byte?
Downgoat

@Downgoat no, ruang terdepan sudah benar. Saya cukup yakin itu 17 byte.
Maltysen

1

APL, 21

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

Ini dimulai dengan membuat vektor nol dengan 1 pada posisi acak. Kemudian gandakan dengan angka acak antara 1 dan 3. +1 dan mod 3 memperoleh vektor dengan semua 1s dan satu posisi acak 0,1 atau 2.

Akhirnya, ⍵ / ⍨ mengatakan bahwa setiap huruf harus ditulis n kali, di mana n adalah angka dalam vektor.

Cobalah di tryapl.org


0

Python 2, 123 byte

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 byte

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

Penjelasan:

                        ⍴⍵  ⍝ 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 ⍵

Uji:

      {⍵/⍨(?3)⌷1⍪2 0∘.|1+(⍳=?)⍴⍵} ¨ 10/⊂'foo'
 fooo  foo  oo  foo  fo  fo  oo  fo  oo  fooo 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.