วิธีการสุ่มตัวอักษรในคำ


55

ตามที่มีการถกเถียงกันเรื่องความขัดแย้งของ ltteres ใน wrod deos ไม่ mttaer มากสำหรับ raednig ขณะที่ lnog เป็นคนแรก

ดังนั้นเพื่อความสนุกอะไรคือฟังก์ชั่นที่สั้นที่สุดในการสุ่มลำดับตัวอักษรในคำโดยใช้ตัวอักษรตัวแรกและตัวสุดท้ายแทน

นี่คือแทงของฉันด้วย JavaScript ช่องว่างทั้งหมดนำออกที่124 130 ตัวอักษร

function r(w) {
  var l=w.length-1;
  return l<3?w:w[0]+w.slice(1,l).split("").sort(function(){return Math.random()-.5}).join("")+w[l];
}

JavaScript ที่สั้นกว่ายินดีต้อนรับเสมอ


  • แก้ไข: เพิ่มการตรวจสอบความยาว ฟังก์ชั่นไม่ควรล้มเหลวสำหรับคำสั้น ๆ

3
Haskell 4 r=idตัวอักษร:
Thomas Eding

2
ใช่. มันส่งคืนสิ่งเดียวกับอินพุต ในบันทึกอื่นเราจะทำอย่างไรกับเครื่องหมายวรรคตอน? เราใช้คำที่ประกอบด้วยตัวอักษรเท่านั้นหรือไม่?
Thomas Eding

1
@trinithis ไม่แน่ใจว่าสิ่งที่คุณพูดถึง แต่idเป็นฟังก์ชั่นตัวตน ฉันยังต้องการเห็นวิธีแก้ปัญหา Haskell สำหรับปัญหานี้ด้วยอักขระน้อยกว่า 100 ตัว
Arlen

3
ข้อมูลจำเพาะควรได้รับการปรับปรุงให้ต้องมีการกระจายผลลัพธ์อย่างสม่ำเสมอหรือไม่? สิ่งนี้จะไม่อนุญาตให้ใช้โซลูชัน Haskell 4 ตัวอักษร นอกจากนี้ยังจะไม่อนุญาตให้ใช้โซลูชัน Javascript ของคุณตัวอย่าง
Thomas Eding

2
+1 สำหรับประโยคแรก: จริง ๆ แล้วฉันใช้เวลาสองสามวินาทีในการรู้ว่ามันสะกดผิด XP
Nate Koppenhaver

คำตอบ:


21

Haskell, 4 ตัวอักษร

ฟังก์ชัน trinithis ที่เสนอนั้นตรงกับข้อกำหนดจริง:

s=id

มันส่งกลับสตริงไม่เปลี่ยนแปลงดังนั้นการรักษาตัวอักษรตัวแรกและตัวสุดท้ายในสถานที่และทำการเปลี่ยนแปลงของตัวละครอื่น ๆ ทั้งหมด

หากมีคนไม่พอใจกับการกระจายความน่าจะเป็นของพีชคณิตนี่คือวิธีแก้ปัญหาที่ให้การกระจายที่ดีกว่า เห็นได้ชัดว่ามันซับซ้อนมากขึ้น:

Haskell, 110 120 107 ตัวละคร

import Random
s l=randomRIO(1,length l-2)>>=g.($l).splitAt
g(a:b,c:d)=fmap(a:).s$c:b++d
g(a,b)=return$a++b

ตัวอย่างของโปรแกรมที่ใช้ฟังก์ชั่นนี้:

main = getLine >>= s >>= putStrLn

18
"ไม่พอใจกับการกระจายความน่าจะเป็นของพีชคณิต"ทำให้ฉันหัวเราะ :)
Tomalak

@Rotsor คุณเรียกฟังก์ชันนั้นได้อย่างไร
Arlen

ฉันได้เพิ่มตัวอย่างในโพสต์ของฉัน
Rotsor

fmap((a:t!!i:).tail)
FUZxxl

3
ควรลบโซลูชันแรกเนื่องจากไม่ตรงกับเกณฑ์ความท้าทาย คำอธิบายความท้าทายบอกว่า "สุ่ม" ตามเมตาดาต้าการสุ่มไม่สามารถมีเอาต์พุตเดียวกันได้เสมอ
mbomb007

19

J, 26 24 23 ตัวอักษร

r=:{.,({~?~@#)&}.&}:,{:

ตามกฎทั่วไปของการตีกอล์ฟคุณไม่ต้องผูกวลีกับชื่อ
FUZxxl

#?#เป็นหนึ่งในถ่านที่สั้นกว่า?~@#
randomra

15

Ruby, 44 ตัวอักษร

r=->w{w[h=1..-2]=[*w[h].chars].shuffle*"";w}

ใช้ได้กับคำศัพท์สั้น ๆ เช่นคำที่มีอักขระหนึ่งสองหรือสามตัวจะถูกส่งคืนโดยไม่เปลี่ยนแปลง

แก้ไข:การใช้แนวคิดอาร์เรย์ของ Ventero จะบันทึกอักขระอื่น


นั่นคือ 44 ตัวอักษรจริงๆ ในที่สุดฉันก็พบคำตอบเดียวกันโดยการปรับจูนของตัวเองตอนนี้ฉันรู้สึกเหมือนแมวลอกเลียนแบบหลังจากอ่านของคุณ
Aleksi Yrttiaho

@ user2316 แน่นอนคุณพูดถูก ขอขอบคุณ.
Howard

11

Ruby 1.9, 46 ตัวอักษร

r=->w{w[0]+[*w[1..-2].chars].shuffle*""+w[-1]}

+1 การใช้ array-splat นี้ช่วยฉันด้วยอักขระตัวเดียว ความคิดที่ดี.
โฮเวิร์ด

ฉันไม่รู้ทับทิม - มันล้มเหลวใน ruby1.8 ของฉันดังนั้นฉันเดาว่าฉันต้องมีรุ่นที่ไม่เคยใช้เลยใช่ไหม ทำงานกับอินพุตเช่น 'I' หรือไม่
ไม่ทราบผู้ใช้

@user: มันบอกว่า "Ruby 1.9" ตรงนั้น ;) - Ventero - หนึ่งในข้อกำหนดที่สมเหตุสมผลที่ฉันลืมพูดถึงคือมันไม่ควรล้มเหลวสำหรับความยาวของคำ 0 และ 1 ขออภัย
Tomalak

11

Golfscript

ในฐานะ "function" (ชื่อ codeblock): 20 ตัวอักษร

{1/(\)\{;9rand}$\}:r

เมื่อใช้งานองค์ประกอบสูงสุดบนสแต็ก: 16 ตัวอักษร

1/(\)\{;9rand}$\

นั่นไม่ใช่การสับเปลี่ยนที่ดีมาก แต่อาจโอเคสำหรับงานนี้ (นั่นคือมันจะ "มองสุ่มพอ".) ยังคงที่ค่าใช้จ่ายของทั้งสองตัวอักษรมากขึ้นคุณจะได้รับมากสับเปลี่ยนที่ดีขึ้นโดยการแทนที่ด้วย9 9.?
Ilmari Karonen

สิ่งนี้ล้มเหลวสำหรับคำที่เป็นตัวอักษรเดียวและฉันก็ไม่คิดว่าฟังก์ชันควรได้รับอนุญาตให้ส่งคืนสตริงอาร์เรย์ของสตริงสตริง (ซึ่งต่างจากสตริงเดี่ยว)
Martin Ender

11

C ++, 79 ตัวอักษร( พร้อมการตรวจสอบช่วง )

string f(string s){if(s.size()>3)random_shuffle(&s[1],&s.end()[-1]);return s;}

C ++ 8165 ตัวอักษร( โดยไม่ตรวจสอบช่วง )

string f(string s){random_shuffle(&s[1],&s.end()[-1]);return s;}

การใช้ pass โดยการอ้างอิงแทนการส่งคืนผลลัพธ์จะลบอักขระอีก 10 ตัวออกจากโซลูชันทั้งสอง

โปรแกรมเต็มรูปแบบการอ่านคำศัพท์และการสับการแปลง:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <ctime>
#include <string>

using namespace std;    
string f(string s){if(s.size()>3)random_shuffle(&s[1],&s.end()[-1]);return s;}

int main() {
    std::srand(std::time(0));
    std::string s;
    while(std::cin >> s)
        std::cout << f(s) << " ";
    std::cout << std::endl;
}

กำลังใจในการทำงาน: อย่าสร้างสิ่งที่มีอยู่แล้ว โอ้และการตรวจสอบมากเกินไปสำหรับ wusses


ดีstd::random_shuffleว่าเป็นหนึ่งใหม่ให้ฉัน btw ฉันคิดว่าคุณลืม#include<string>รหัสเต็มของคุณ
Scott Logan

1
อย่างนี้เป็นสิ่งที่ฉันมีอยู่ในใจเดิม น่าเสียดายที่ไม่มี built-in สำหรับการสับสตริงใน JS
Tomalak

ล้มเหลวสำหรับสตริงสั้น ๆ
ผู้ใช้ไม่รู้จัก

เป็นเรื่องจริงคุณขาดการตรวจสอบความยาว (เช่นกัน) คำตอบของ BTW @ Arlenก็คุ้มค่ากับการดู
Tomalak

1
@userunknown นั่นคือสิ่งที่ฉันหมายถึงโดย "เช็คล้นสำหรับ wusses" แต่ก็ยุติธรรมแล้วทำโซลูชันอื่นเกือบทั้งหมด
Konrad Rudolph

8

Python 86 ตัวอักษร

import random as r
def f(w):t=list(w[1:-1]);r.shuffle(t);return w[0]+''.join(t)+w[-1]

และนี่คือตัวอย่างการใช้งาน:

for x in ["ashley", "awesome", "apples"]:
    print f(x)

นี่คือการฝึกซ้อมกอล์ฟรหัสแรกของฉัน หลังจากแก้ปัญหาฉันตัดสินใจที่จะดูคำตอบและมันก็ไม่แปลกใจที่คำตอบของฉันจะไม่ซ้ำกัน แม้ว่าจะสนุก: o)

ฉันทำการเปลี่ยนแปลงหนึ่งครั้งหลังจากดูคำตอบอื่น ๆ และมันเป็นการเปลี่ยนคำสั่งการนำเข้าของฉันเพื่อใช้นามแฝง ความคิดที่ดี. ; o)


และยังแก้ปัญหาของคุณได้รับการโหวตไปข้างหน้าของฉัน! : p
Boothby

ล้มเหลวกับสตริงสั้น ๆ คำตอบหลามของฉันจะเป็น 75 ตัวอักษรถ้ามันล้มเหลวในสตริงสั้น ๆ ( from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1])
dr jimbob

7

C (K&R) - 88 86 87ตัวอักษร

r(char*s){int m,j,l=strlen(s)-2,i=l;while(--i>0){j=rand()%l+1;m=s[j];s[j]=s[1];s[1]=m;}}

ไม่มีฟังก์ชั่นการสลับหรือการสับเปลี่ยนใน C ดังนั้นฉันต้องทำด้วยตนเอง :(

โปรแกรมตัวอย่างที่มี Ungolfed r ():

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>

// -----------------------------------------------------------------------
r( char *s )
{
    int m, j, l=strlen(s)-2, i=l;

    while (--i>0)
    {
        j = rand() % l + 1;

        m = s[j];
        s[j] = s[1];
        s[1] = m;
    }

}
// -----------------------------------------------------------------------
int main()
{
    char s[] = "anticipated";

    srand( time(0) );
    r( s );
    puts( s );

    return 0;
}

แก้ไข : แก้ไขข้อผิดพลาดเมื่อ s ประกอบด้วยน้อยกว่า 3 ตัวอักษร (ขอบคุณผู้ใช้ uknown สำหรับการสังเกตเห็น!)


1
ใน glibc, มี (เป็น?) strfryฟังก์ชั่นห้องสมุดที่ไม่ได้มาตรฐาน
หอยทากเครื่องกล

ประสบการณ์ที่ตลกถ้าฉันป้อนด้วยchar s[] = "na"; // not anticipated
ไม่ทราบผู้ใช้

@user uknown: ฉันเพิ่งแก้ไขรหัสและแก้ไขมันขอบคุณที่สังเกตเห็นข้อผิดพลาด! (ฉันเพิ่งเพิ่ม> 0 ในเงื่อนไขของลูป while, "คิดต้นทุนฉัน" เพิ่มอีกสองตัว แต่จำเป็นต้องใช้ตัวอักษร :))
Harry K.

1
@ หอยทากเครื่องกล: ฉันคิดว่า strfy ยังอยู่ใน glibc
Harry K.

7

python, 87 79 75 93 92 chars (การจัดการสตริงที่มีความยาว 0,1)

from random import*
f=lambda w:w if 4>len(w)else w[0]+''.join(sample(w[1:-1],len(w)-2))+w[-1]

แก้ไข: เดิมคิดว่ามันควรจะแบ่งคำสตริง (ซึ่งมันที่ 128 ตัวอักษร; ตอนนี้ที่ 87 ตัวอักษรไม่ต้องการ) โอ๊ะฉันเข้าใจการอ่านไม่ดี

แก้ไข 2: เปลี่ยนจากฟังก์ชั่น def เป็นแลมบ์ดาจาก def เพื่อบันทึก 6 ตัวอักษร สมมติว่าตัวอย่างถูกนำเข้าสู่เนมสเปซ ( from random import sample) แล้วสามารถลดขนาดลงเหลือ ~ 60)

แก้ไข 3: "len (w [1: -1])" (12 ตัวอักษร) ถึง "len (w) -2" (8 ตัวอักษร) ต่อคำแนะนำที่ดีของ gnibbler

แก้ไข 4: JBernando บันทึกหนึ่ง char (ได้พิจารณาfrom random import *แล้วเห็นว่ามันเทียบเท่า - ไม่ตระหนักถึงพื้นที่ในimport *ไม่จำเป็น); ผู้ใช้ที่ไม่รู้จักเพิ่ม 19 ตัวอักษรw if len(w)<4 elseเพื่อจัดการ 0 และ 1 อักขระถ่านอย่างถูกต้อง

แก้ไข 5: บันทึกตัวละครอื่นต่อการเล่นกอล์ฟรหัสของบูธ ไปยังif len(w)<4 elseif 4>len(w)else


อย่างไรก็ตามคำถามได้กำหนดอินพุตเป็นคำเท่านั้นไม่ใช่สตริงคำ :)
Ben Richards

1
@ sidran32: ขอบคุณฉันไม่ดี ฉันเพิ่งสังเกตเห็น (เมื่ออ่าน) แล้วเห็นความคิดเห็นของคุณ; ถูกลบ - แก้ไข - และถูกลบ
dr jimbob

แนวคิด - คุณสามารถตัด 3 ตัวอักษรโดยทำเช่นนี้ .... def f (w): j = w [1: -1]; return w [0] + '' เข้าร่วม (r.sample (j, len (j))) + w [-1]
arrdem

@rmckenzie: ความคิดที่ดี อย่างไรก็ตามก่อนที่ฉันจะเห็นความคิดเห็นของคุณหลังจากที่ฉันตัดมันไปยังฟังก์ชั่นแลมบ์ดา (ประหยัด 6 ตัวอักษร) ดังนั้นฉันจึงไม่สามารถกำหนดวิธีการกำหนด vars กลางได้อีกต่อไป
dr jimbob

3
len(w)-2แทนlen(w[1:-1])?
gnibbler

6

C ++, 111 97 ตัวอักษร

std::string f(std::string s){for(int i=s.size()-1;i>1;std::swap(s[rand()%i+1],s[--i]));return s;}

นี่คือโปรแกรมเต็มรูปแบบสำหรับผู้ที่ต้องการทดสอบ:

#include<string>
#include<iostream>

std::string f(std::string s){for(int i=s.size()-1;i>1;std::swap(s[rand()%i+1],s[--i]));return s;}

int main(){
    for(int i = 0; i<100; ++i)
    std::cout<<f("letters")<<std::endl;
}

แก้ไข

ตระหนักว่าไม่จำเป็นต้องสุ่มดัชนีการสลับทั้งสองบันทึกตัวแปรและอีกไม่กี่ตัวอักษร


ยอดเยี่ยม การแก้ปัญหาส่วนใหญ่ล้มเหลวในการป้อนข้อมูลขนาดเล็กมาก ของคุณไม่ได้
ผู้ใช้ไม่รู้จัก

6

php (68 ตัวอักษร)

$r=preg_replace('/^(\w)(\w+)(\w)$/e','$1.str_shuffle($2).$3',trim($w));

สั้นกว่า (60 ตัวอักษร)

$r=preg_replace('/(.)(.+)(.)/e','$1.str_shuffle($2).$3',$w);

+1 ดีมาก :) คุณสามารถดรอป trim () จริง ๆ แล้วและใน regex คุณสามารถลบจุดยึดและใช้.แทน\wได้
Tomalak

@ Tomalak แนะนำให้ฉันลองเขียนวิธีนี้ใน Perl รวมทั้งข้อเสนอแนะของเขาผมได้รับนี้: use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}นั่นเป็น87 ตัวอักษร ไม่มีสายการใช้งานก็62 ตัวอักษร
เบ็นริชาร์ดส์

คุณสามารถให้ตัวอย่างการทำงานนี้ได้หรือไม่? เพราะฉันไม่สามารถ ...
Steve Robbins

6

Perl - 96 (หรือ 71) อักขระ 84 (หรือ 59) อักขระ

นี่คือสิ่งที่ฉันมาด้วยใน Perl ลองทำหลายวิธี แต่สิ่งนี้ดูสั้นที่สุดจากสิ่งที่ฉันคิดได้จนถึง 97 ตัวอักษร

use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop(@w);return$b.join('',shuffle@w).$e;}

แม้ว่าถ้าคุณตัดบรรทัด 'ใช้' (ซึ่งฉันคิดว่าถูกต้องเนื่องจากคนอื่น ๆ ยกเว้น #include บรรทัดในโปรแกรม C ของพวกเขา) ฉันสามารถตัดมันได้มากถึง71 อักขระ :

sub r{($b,@w)=split//,$_[0];$e=pop(@w);return$b.join('',shuffle@w).$e;}

แก้ไข ขอแนะนำให้ฉันลองใช้วิธีการใช้ @tobius นี้ ด้วยวิธีนี้ฉันได้รับมันถึง84 ตัวอักษรหรือโดยการลบบรรทัดใช้59 ตัวอักษร :

use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}

2
ย่อรุ่นของคุณลงเหลือ 87:use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
mbx

1
@ sidran32 คุณสามารถใช้ Perl ชุดคำตอบของ@tobiusเพื่อการเปรียบเทียบได้หรือไม่?
Tomalak

@ Tomalak แน่นอนฉันจะลองดู
เบ็นริชาร์ดส์

1
ทำให้รุ่น regex ของคุณสั้นลง 3 ตัวอักษร:use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
mbx

ดี ฉันชินกับการใช้วงเล็บที่ซ้อนทับกันเพื่อความชัดเจน นิสัยไม่ดีเมื่อเล่นกอล์ฟ : P
Ben Richards

5

Ruby, 77 75 ตัวอักษร

def r(s);f=s.size-2;1.upto(f){|i|x=rand(f)+1;t=s[i];s[i]=s[x];s[x]=t};s;end

โซลูชัน Scala ของฉันในภาษา verbose น้อยกว่าเล็กน้อย ฉันไม่ใช่ผู้เชี่ยวชาญทับทิมไม่ว่าด้วยวิธีใดดังนั้นอาจมีช่องว่างสำหรับการปรับปรุง


ว้าว. ทำงานร่วมกับ 'ฉัน' เป็นวิธีแก้ปัญหาในแบบสกาล่าของคุณ
ผู้ใช้ไม่รู้จัก

5

Ruby 1.9, 77 48 46 44 ตัวอักษร

r=->w{w[h=1..-2]=[*w[h].chars].shuffle*"";w}

ข้อจำกัดความรับผิดชอบ: ฉันปรับตามคำตอบอันดับสูงสุด - สังเกตเห็นคำตอบที่เหมือนกันในภายหลัง คุณสามารถตรวจสอบประวัติที่ฉันได้เก็บจริงกับความคิดเดิมของฉัน แต่เปลี่ยนจากทับทิม 1.8 ทับทิม 1.9 สำหรับ lambdas shuffleสั้นและ

หากอนุญาตให้ใช้คำว่างเปล่าได้56 54 ตัวอักษร

r=->w{w.empty?||w[h=1..-2]=[*w[h].chars].shuffle*"";w}

ไม่มีใครคาดว่าชาวสเปนจะเป็น 'I'
ผู้ใช้ไม่รู้จัก

พยายามจัดการคดีด้วยตัวอักษร 0 หรือ 1 ตัว
Aleksi Yrttiaho

5

Python 3, 94 93 91 ตัวอักษร

ใช้เทคนิคที่แตกต่าง อาจทำงานใน Python 2

from random import*
s=lambda x:x[0]+''.join(sample(x[1:-1],len(x)-2))+x[-1]if x[0:-1]else x

การ... if x[0:-1] else xให้xถ้าความยาวของมันคือ 1 (มิฉะนั้นมันจะซ้ำกัน) ฟังก์ชันใช้งานได้กับสตริงที่มีความยาว 0 และ 1

sample()จากhttps://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366

เพราะมันเป็นหนึ่งในการแสดงออกของเราสามารถใช้lambda(กำจัดreturn, defและคู่ของวงเล็บ)

แก้ไข: from random import*เพื่อบันทึก 1 ตัวอักษรหลังจากการส่ง Python อื่น


ฉันรู้ว่าฉันดึกมากแล้วที่นี่ แต่จะx[0:-1]กลายเป็นx[:-1]?
Zacharý

4

JavaScript - 118 122 ตัวอักษร

ตัวย่อ JavaScript - 118 ตัวอักษรโดยไม่มี white space ใช้อัลกอริทึมเดียวกับ OP โดยประมาณ แต่ใช้การผูกมัดน้อย ฉันพยายามสอบถามซ้ำหลายครั้งและพยายามทำซ้ำ แต่พวกเขามักจะจมอยู่กับอะไรไม่ทางใดก็ทางหนึ่ง

function s(w)
{
    w = w.split('');
    var a = w.shift(),
        z = w.pop();
    return z?a + (w.sort(function() { return Math.random() - .5}).join('')) + z:a;
}

ไม่ผ่าน 'ฉันกำลังทดสอบ
ผู้ใช้ไม่รู้จัก

@Ryan ใช้return z?a+...+z:w;เป็นตรวจสอบความยาวโดยนัยจะอยู่ในลำดับ สมมติฐานที่เงียบคือฟังก์ชันจะรับเฉพาะคำที่ "ถูกต้อง"
Tomalak

จุดดียกเว้นว่ามีการปรับเปลี่ยน w ดังนั้นฉันต้องใช้aในส่วนelseที่สาม แก้ไขและสูงสุด 122 ตัวอักษร
Ryan Kinal

@ ไรอัน: ฉันเชื่อว่าaมันจะผิดสำหรับการป้อนสองตัวอักษร : - \ Damn ครั้งต่อไปฉันจะแยกแยะความต้องการให้ละเอียดยิ่งขึ้น
Tomalak

ฉันไม่คิดว่ามันจะจริง zจะไม่ถูกกำหนดถ้าคำนั้นเป็นตัวอักษรหนึ่งตัว (หรือน้อยกว่า)
Ryan Kinal

4

D, 62 ตัวอักษร

import std.random;void s(char[] s){randomShuffle(s[1..$-1]);}

โอเคฉันโกงด้วยอักขระถ่านธรรมดาแทนที่จะเป็นสตริงจริง (ซึ่งเป็นอักขระที่ไม่เปลี่ยนรูป [] ดังนั้นจึงไม่มีการสับแบบแทนที่)

แก้ไขด้วยการตรวจสอบความยาวต้องใช้อีก 14

import std.random;void s(char[] s){if(s.length>1)randomShuffle(s[1..$-1]);}

และมันจะส่งคืนอะไรสำหรับอินพุตเช่น 'I'
ผู้ใช้ไม่รู้จัก

มันจะยุติธรรมกว่า (= เปรียบได้ดีกว่า) เพื่อส่งคืนผลลัพธ์
Konrad Rudolph

@user ข้อผิดพลาดช่วง @ konrad ที่จะต้องใช้return s;และ char [] return type 11 chars เพิ่มเติม
ratchet freak

@ ratchet คุณช่วยโพสต์โปรแกรมทั้งหมดได้ไหม? BTW ฉันไม่เข้าใจว่าทำไมคุณถึงนับimport std.random;และไม่ใช่แค่ฟังก์ชั่น
Arlen

ฉันเดาว่าคุณสามารถประหยัด 1 ไบต์ได้โดยใช้การเว้นช่องว่างในchar[] s(เพื่อทำchar[]s) แต่ฉันไม่ได้ใช้ D เป็นเวลาหลายปี
ทิม Decas

4

php 5.3 (60 ตัวอักษร)

$r=!$w[2]?:$w[0].str_shuffle(substr($w,1,-1)).substr($w,-1);

ปรับปรุงเป็น 56 ตัวอักษรและไม่ต้องการเวอร์ชั่น 5.3 อีกต่อไป:

$r=substr_replace($w,str_shuffle(substr($w,1,-1)),1,-1);

+1 ทางเลือกที่ดีสำหรับคำตอบ PHP อื่น ๆ ไม่สั้น แต่ไม่มี regex เป็นข้อดี
Tomalak

อัปเดตด้วยโซลูชันที่สั้นกว่าซึ่งไม่ต้องใช้เวอร์ชัน 5.3
migimaru

เวอร์ชันเก่าไม่ถูกต้อง: ส่งคืนtrueสตริงสั้น ๆ
Titus

3

Perl - 111 ตัวอักษร (โดยไม่ใช้ฟังก์ชั่นห้องสมุดใด ๆ )

sub r{($f,@w)=split//,shift;$l=pop@w;while(@w){if(rand(9)>1){push@w,shift@w}else{push@t,pop@w}}join'',$f,@t,$l}

การใช้งาน :

$in="randomizethis";
$out = &r($in);
print "\nout: $out";
sub r{($f,@w)=split//,shift;$l=pop@w;while(@w){if(rand(9)>1){push@w,shift@w}else{push@t,pop@w}}join'',$f,@t,$l}

3

หลาม

มันคือ90 89 112 ตัวละครของไพ ธ อน!

แก้ไข 1: เป็นฟังก์ชั่นในครั้งนี้!

(ขอบคุณ gnibbler)

แก้ไข 2: ตอนนี้จัดการกับคำศัพท์สั้น ๆ

(ขอบคุณผู้ใช้ที่ไม่รู้จัก)

import random as r
def q(s):
 a=list(s)
 b=a[1:-1]
 r.shuffle(b)
 if len(s)<4:
  return s
 return a[0]+''.join(b)+a[-1]

แม้แต่น้อยถ้าคุณทำตามสเปคและเขียนฟังก์ชั่น :)
gnibbler

อา, สับเปลี่ยนสงสารไม่ทำงานกับสาย
gnibbler

1
โมดูลสุ่มนั้นเหมือนฉันที่ไนท์คลับ ... เราทั้งคู่แค่สับเปลี่ยนกัน! :)
Andbdrew

ไม่สามารถใช้งานอินพุตได้เช่น 'I'; ส่งคืน 'II'
ผู้ใช้ไม่รู้จัก

ขอบคุณ! ตอนนี้จัดการกับคำศัพท์สั้น ๆ แต่จะยาวขึ้นอีกเล็กน้อย :)
Andbdrew

3

สกาลา, 135 139 142 156ตัวอักษร

def r(s:String)={var(x,o,t,f)=(0,s.toArray,' ',s.size-2)
for(i<-1 to f){t=o(i)
x=util.Random.nextInt(f)+1
o(i)=o(x)
o(x)=t}
o.mkString}

-7: ถูกลบออก ': สตริง' (สามารถส่งคืนชนิดของข้อสรุปได้)
-7: ลบแล้ว 'กลับ' (นิพจน์สุดท้ายคือค่าที่ส่งคืน)
-3: แฟคตอริ่งs.size-2ออก
-4: toCharArray->toArray


ทำงานร่วมกับ 'I' และ 'Verwürfel' โดยไม่มีตัวอักษร Python :) อย่างไรก็ตามโซลูชันของฉันที่ใช้ 'shuffle' สั้นกว่าเล็กน้อย
ผู้ใช้ไม่รู้จัก

ไม่ทราบ @ ผู้ใช้ขอบคุณสำหรับการแก้ไข :-)
Gareth

3

Python 86 ตัวอักษร

Slnicig ปลอดภัยดังนั้นจึงไม่มี bnouds ckhnceig คือ neeacrssy Wkros ในทุก leghtns

from random import*
def f(x):x=list(x);t=x[1:-1];shuffle(t);x[1:-1]=t;return''.join(x)

3

C ++ 11: - 68 66 ตัวอักษร

auto f=[&](){if(s.size()>2)random_shuffle(s.begin()+1,s.end()-1);};

โปรแกรมเต็มรูปแบบ:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[]){

  string s = "SomestrinG";
  auto f=[&](){if(s.size()>2)random_shuffle(s.begin()+1,s.end()-1);};

  f();
  cout << s << endl;
  return 0;
}

การเข้ารหัสในสตริงป้อนข้อมูลถูกกฎหมายหรือไม่?
Thomas Eding

@trinithis ฉันคิดว่าเราเกี่ยวข้องกับฟังก์ชั่นของตัวเองเท่านั้น โปรแกรมแสดงวิธีใช้งานฟังก์ชั่นเท่านั้น ไม่ว่าการเข้ารหัสจะไม่สร้างความแตกต่างในกรณีนี้อย่างหนัก เพิ่งเพิ่มstring s; cin >> s;
Arlen

3

Ruby 1.9, 43 ตัวอักษร

r = W [0] + [* W [1 ..- 2] .chars] .shuffle.join + W [-1]

ยังไม่สามารถใช้งานได้กับความยาว 1 อักขระสตริง (ซ้ำอักขระนั้น) และล้มเหลวสำหรับสตริงว่าง



3

R, 104 (126)

f=function(w){s=strsplit(w,"")[[1]];paste(c(s[1],sample(s[2:(length(s)-1)]),s[length(s)]),collapse="")}

การใช้งาน:

for (i in 1:10) print(f("parola"))
[1] "plraoa"
[1] "prolaa"
[1] "praola"
[1] "parloa"
[1] "plaora"
[1] "palroa"
[1] "porlaa"
[1] "ploraa"
[1] "porlaa"
[1] "ploraa"

ฟังก์ชั่นด้านล่างทำงานร่วมกับคำที่มีความยาวน้อยกว่า 3:

f=function(w){s=strsplit(w,"")[[1]];ifelse(length(s)<3,w,paste(c(s[1],sample(s[2:(length(s)-1)]),s[length(s)]),collapse=""))}

f("pl")
[1] "pl"
f("a")
[1] "a"

ส่วนหนึ่งของภารกิจนี้คือการไม่ย้ายตัวอักษรตัวแรกและตัวสุดท้าย
Tomalak

@Tomalak แก้ไขแล้ว!
เปาโล

ใช้ได้กับคำที่มีความยาวต่ำกว่า 3 หรือไม่
Tomalak

@ Tomalak ทีนี้มันก็โอเคนะ! ขอบคุณสำหรับการแก้ไข!
เปาโล

3

Python, 102 ตัวอักษร

def f(x):t=list(x)[1:-1];k='';exec'k+=t.pop(id(7)%len(t));'*len(t);return[x[0],x[0]+k+x[-1]][len(x)>1]

ไม่มีการนำเข้า! ทำงานสำหรับคำที่ 1 ตัวละครขึ้นไป นี่คือรายการกอล์ฟแห่งแรกของฉันและฉันได้รับแรงบันดาลใจจากรายการ BlueEyedBeast จากรหัสที่สั้นที่สุดในการผลิตการส่งออกที่ไม่ได้กำหนดความคิดของการใช้ID (Object)


คำอธิบาย:มันทำให้รายการของตัวอักษรจากอินพุตไม่รวมตัวแรกและตัวสุดท้ายและจะปรากฏซ้ำ ๆ จากรายการนี้และผนวกเข้ากับตัวใหม่จนกว่าจะว่างเปล่า ดัชนีที่ปรากฏจากนั้นคือ id (7)% len (รายการที่เรากำลังโผล่จาก) เนื่องจาก id (7) เป็นที่อยู่หน่วยความจำของวัตถุ 7 จึงเป็นแบบสุ่ม ดังนั้นตอนนี้เรามีรายการตัวอักษรที่มีสัญญาณรบกวนแบบสุ่มจากศูนย์กลางของอินพุตต้นฉบับ สิ่งที่เราทำตอนนี้คือการเพิ่มตัวอักษรตัวแรกและตัวสุดท้ายของเอาท์พุทเดิมตามลำดับและเราได้ผลลัพธ์ที่เราต้องการ: (ตัวอักษรตัวแรก) + (สัญญาณรบกวนกลาง) + (ตัวอักษรตัวสุดท้าย)


3

R, 95 92 91 ตัวอักษร

f=function(w,a=el(strsplit(w,'')),b=length(a))cat(a[1],sample(a[c(1,b)],b-2),a[b],sep="")

ใช้การประเมินแบบขี้เกียจของ R เพื่อคำนวณ a และ b เป็นพารามิเตอร์ฟังก์ชันประหยัดพื้นที่ด้วยการใช้ซ้ำในภายหลัง แตกต่างจากคำตอบ R อื่น ๆ ซึ่งใช้ได้ผลกับทุกคำ> 1 อักขระ ตัวอย่างด้านล่าง:

> f("hippopotamus")
hpuoopaitmps

> f("dog")
dog

> f("az")
az

แก้ไข: แทนที่unlist()ด้วย[[]] แทนที่ [[1]] ด้วย el ()


2

D: 55 ตัวอักษร

void f(T)(T s){if(s.length>2)randomShuffle(s[1..$-1]);};

โปรแกรมเต็มรูปแบบ:

import std.stdio, std.random, std.conv;

void f(T)(T s){if(s.length>2)randomShuffle(s[1..$-1]);};

void main(){

  char[] s = to!(char[])("SomestrinG");

  f(s);
  writeln(s);
}

ฉันคิดว่าelse sส่วนนี้หายไปหรือไม่
Tomalak

1
@ Tomalak ไม่ไม่ใช่เพราะไม่จำเป็น ถ้าสตริงมีความยาว 2 หรือน้อยกว่าเราก็ปล่อยมันไว้ตามลำพัง ยังrandomShuffle()อยู่ในสถานที่
Arlen

ว้าว D กำลังแข่งขัน ฉันคิดว่าrandomShuffle(s[1..$-1])สามารถเป็นs[1..$-1].randomShuffleIIRC (เว้นแต่ว่าจะเป็นรุ่น D ที่เก่ากว่าโพสต์นี้)
Zacharý

2

Erlang, 188 172 132 ตัวอักษร

f([H|C=[_|_]])->T=[lists:last(C)],[H|s(C--T,T)];f(X)->X. s([],N)->N;s(D,N)->E=[lists:nth(random:uniform(length(D)),D)],s(D--E,E++N).

ฉันยังคงเรียนรู้ Erlang ดังนั้นคำแนะนำใด ๆ ในการทำให้สิ่งนี้สั้นลงนั้นเป็นที่น่ายินดี

รหัสเต็ม (โมดูล string_shuffle):

-module(string_shuffle).
-export([f/1]).

f([H|C=[_|_]])->
    T=[lists:last(C)],
    [H|s(C--T,T)];f(X)->X.
f(X)->X.

s([],N)->N;
s(D,N)->
    E=[lists:nth(random:uniform(length(D)),D)],
    s(D--E,E++N).

แก้ไข

นำส่วนสับเปลี่ยนออกมาเป็นฟังก์ชั่นแยกซึ่งไม่ต้องใช้หัวและส่วนท้ายของรายการที่จะส่งผ่าน

แก้ไข 2

ปรับโครงสร้างใหม่เพื่อลบหนึ่งในfรูปแบบฟังก์ชั่นเปลี่ยนฟังก์ชั่นสลับเพื่อยอมรับเพียงสองพารามิเตอร์เปลี่ยนlists:deleteสำหรับ--[]สลับlists:reverseสายสำหรับlists:last

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.