単語のランダムなスペルミス


16

このCRの質問に触発されました (CRの閲覧で私を殺さないでください)

スペック

単語のスペルミスの確率は次のとおりです。

  • 1/3の時間は出力を変更しません
  • 1/3の時間でランダムな文字が削除されます
  • 1/3の時間がランダムキャラクターを複製する

入力の特定の文字を削除/複製する機会は、すべての文字で同じでなければなりません。

2つの連続する文字が同じ場合(大文字と小文字が区別されます)、そのうちの1つが変更される確率は、1文字である場合と同じである必要があります。つまり、AAAAまたはAorである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、の2倍の可能性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

これは楽しかったです-Pipの正規表現と可変文字列機能を使用することになりました。コマンドライン引数を介して入力を受け取ります。

説明:

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のみで簡潔なゴルフラングを
おめでとう

3

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

未ゴルフ&テストケース:

ここで試してみてください。

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バイト

これは実際には、連続したcharを持つ特殊なケースを正しく処理します。

 XZOKrz8Or_1 2r9K

テストスイート


これは16バイトですか?先頭のスペースは正しいですか?そうでない場合、これは15バイトですか?
ダウンゴート

@Downgoatいいえ、先頭のスペースは正しいです。確かに17バイトだと確信しています。
マルティセン

1

APL、21

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

これは、ランダムな位置に1を持つゼロのベクトルを作成することから始まります。次に、1と3の間の乱数を乗算します。+ 1とmod 3は、すべて1で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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.