สุ่มสะกดคำ


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แต่คุณบอกว่าทุกบรรทัดมีความน่าเป็นเท่า
Deusovi

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 ไม่เกินหนึ่งตัวอักษรมักจะสะกดผิด; _;
Downgoat

คำตอบ:


5

Pip , 38 27 ไบต์

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

สนุกมาก - ต้องใช้ความสามารถของ regex และสตริงที่เปลี่ยนแปลงได้ของ 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
Downgoat

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

น้อย golfed

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 ไบต์

อันนี้จริงจัดการกรณีพิเศษกับถ่านต่อเนื่องอย่างถูกต้อง

 XZOKrz8Or_1 2r9K

Test Suite


นี่คือ 16 ไบต์? พื้นที่ชั้นนำถูกต้องหรือไม่ หากไม่ใช่นี่คือ 15 ไบต์?
Downgoat

@ ลงไปไม่ได้พื้นที่นำถูกต้อง ฉันค่อนข้างแน่ใจว่ามันมีขนาด 17 ไบต์
Maltysen

1

APL, 21

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

สิ่งนี้เริ่มต้นด้วยการสร้างเวกเตอร์ของศูนย์ด้วย 1 ในตำแหน่งสุ่ม จากนั้นคูณด้วยจำนวนสุ่มระหว่าง 1 ถึง 3 +1 และ mod 3 ได้เวกเตอร์ที่มี 1s ทั้งหมดและหนึ่งตำแหน่งสุ่ม 0,1 หรือ 2

สุดท้าย⍵ / ⍨บอกว่าควรเขียนตัวอักษรแต่ละตัว n ครั้งโดยที่ n คือตัวเลขในเวคเตอร์

ลองใช้กับtryapl.org




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.