Cara mengacak huruf dalam sebuah kata

55

Menurut beberapa kisah kontroversial , bau tak sedap dalam satu wrod deos tidak terlalu berpengaruh pada raednig, sama besarnya dengan para penganut dan pengajar yang macth dengan orignial wrod.

Jadi, untuk bersenang-senang, apa fungsi terpendek untuk mengacak urutan huruf dalam sebuah kata sambil mempertahankan huruf pertama dan terakhir?

Inilah tikaman saya dengan JavaScript. Semua spasi dihapus pada 124 130 karakter.

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 lebih pendek selalu diterima.


  • Edit: pemeriksaan panjang ditambahkan. Fungsi tidak boleh gagal untuk kata-kata pendek.
Tomalak
sumber
3
Haskell, 4 karakter: r=id.
Thomas Eding
2
Iya. Ini mengembalikan hal yang sama persis dengan input. Pada catatan lain, apa yang kita lakukan dengan tanda baca? Apakah kita hanya beroperasi dengan kata-kata yang hanya terdiri dari huruf?
Thomas Eding
1
@trinithis tidak yakin apa yang Anda bicarakan, tetapi idadalah fungsi identitas. Saya masih ingin melihat solusi Haskell untuk masalah ini dalam waktu kurang dari 100 karakter.
Arlen
3
Haruskah spesifikasi diperbarui untuk mensyaratkan distribusi hasil yang seragam? Ini akan melarang solusi Haskell 4 karakter. Itu juga akan melarang contoh solusi Javascript Anda (menyeret dengan melakukan semacam itu tidak seragam).
Thomas Eding
2
+1 untuk kalimat pertama: sebenarnya saya butuh beberapa detik untuk menyadari bahwa itu salah dieja XP
Nate Koppenhaver

Jawaban:

21

Haskell, 4 karakter

Fungsi trinithis yang diusulkan sebenarnya sesuai dengan spesifikasi:

s=id

Ini mengembalikan string tidak berubah, sehingga menjaga karakter pertama dan terakhir tetap di tempatnya dan melakukan permutasi semua karakter lainnya.

Jika seseorang tidak puas dengan distribusi probabilitas permutasi, berikut adalah solusi yang menghasilkan distribusi yang lebih baik. Ini jelas jauh lebih kompleks:

Haskell, 110 120 107 karakter

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

Contoh program yang menggunakan fungsi ini:

main = getLine >>= s >>= putStrLn
Rotsor
sumber
18
"Tidak puas dengan distribusi probabilitas permutasi" membuatku tertawa. :)
Tomalak
@Rotsor bagaimana Anda memanggil fungsi itu?
Arlen
Saya telah menambahkan contoh ke posting saya.
Rotsor
fmap((a:t!!i:).tail)
FUZxxl
3
Solusi pertama harus dihapus karena tidak sesuai dengan kriteria tantangan. Deskripsi tantangan mengatakan "acak". Menurut meta, acak tidak selalu dapat memiliki output yang sama .
mbomb007
19

J, 26 24 23 karakter

r=:{.,({~?~@#)&}.&}:,{:
Eric
sumber
Menurut aturan golf kode umum, Anda tidak harus mengikat frasa ke nama.
FUZxxl
#?#adalah satu char lebih pendek dari?~@#
random
15

Ruby, 44 karakter

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

Juga berfungsi untuk kata-kata pendek, yaitu kata-kata dengan satu, dua atau tiga karakter dikembalikan tidak berubah.

Sunting: Menggunakan ide array-splat Ventero menyimpan char lain.

Howard
sumber
Itu sebenarnya 44 karakter. Saya akhirnya datang dengan jawaban yang sama persis dengan menyetel sendiri - sekarang saya merasa seperti kucing tiruan setelah membaca milik Anda.
Aleksi Yrttiaho
@ user2316 Tentu saja Anda benar. Terima kasih.
Howard
11

Ruby 1.9, 46 karakter

r=->w{w[0]+[*w[1..-2].chars].shuffle*""+w[-1]}
Ventero
sumber
+1 Penggunaan array-percikan ini menyelamatkan saya juga satu karakter. Ide yang hebat.
Howard
Saya tidak tahu ruby ​​- gagal pada ruby1.8 saya, jadi saya kira saya perlu versi yang tidak pernah ada? Apakah ini berfungsi dengan input seperti 'Saya'?
pengguna tidak diketahui
@ pengguna: Dikatakan "Ruby 1.9" di sana. ;) - Ventero - Salah satu persyaratan masuk akal yang saya lupa sebutkan adalah tidak boleh gagal untuk panjang kata 0 dan 1. Maaf.
Tomalak
11

Naskah Golf

Sebagai "fungsi" (bernama kode kunci): 20 karakter

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

Saat beroperasi pada elemen paling atas di tumpukan: 16 karakter

1/(\)\{;9rand}$\
Ventero
sumber
Itu bukan shuffle yang sangat bagus, tapi mungkin oke untuk tugas ini. (Artinya, itu akan "melihat cukup acak".) Namun, pada biaya dua karakter lebih, Anda bisa mendapatkan banyak lebih baik mengocok dengan mengganti 9dengan 9.?.
Ilmari Karonen
Ini gagal untuk kata-kata satu huruf, dan saya juga tidak berpikir bahwa fungsi harus dibolehkan mengembalikan string, array string, string (sebagai lawan dari string tunggal).
Martin Ender
11

C ++, 79 karakter ( dengan rentang periksa )

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

C ++, 8165 karakter ( tanpa rentang periksa )

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

Menggunakan referensi lewat alih-alih mengembalikan hasilnya mengurangi 10 karakter dari solusi mana pun.

Program lengkap, membaca serangkaian kata dan mengacaknya:

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

Semangat: jangan membangun apa yang sudah ada di sana. Oh, dan cek melimpah adalah untuk wusses.

Konrad Rudolph
sumber
Bagus ,, std::random_shufflebaru bagi saya. btw saya pikir Anda lupa #include<string>kode lengkap Anda.
Scott Logan
1
Sesuatu seperti itulah yang ada dalam pikiran saya pada awalnya. Sayangnya tidak ada built-in untuk mengacak string di tempat di JS.
Tomalak
Gagal untuk string yang sangat pendek.
pengguna tidak diketahui
Itu benar, Anda melewatkan cek panjang (saya juga,). Jawaban BTW @ Arlen juga patut dilihat.
Tomalak
1
@ Penggunaunknown Itulah yang saya maksud dengan "cek overflow adalah untuk hadiah". Namun agar adil, demikian juga hampir semua solusi lainnya.
Konrad Rudolph
8

Python, 86 karakter

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

Dan inilah contoh menggunakannya:

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

Ini adalah latihan golf kode pertama saya. Setelah menyelesaikan masalah saya memutuskan untuk melihat jawabannya dan tidak heran jawaban saya tidak unik. Ini menyenangkan: o)

Saya memang membuat satu perubahan setelah melihat tanggapan lain dan itu mengubah pernyataan impor saya untuk menggunakan alias. Ide yang hebat. ;Hai)

Ashley Grenon
sumber
Namun, solusi Anda akan menjadi milik saya! : p
boothby
Gagal pada string pendek; jawaban python saya akan menjadi 75 karakter jika gagal pada string pendek ( 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 karakter

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

Tidak ada fungsi built-in swap atau shuffle di C, jadi saya harus melakukannya secara manual :(

Contoh Program dengan 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;
}

Sunting : perbaiki bug ketika s terdiri dari kurang dari 3 karakter (terima kasih kepada pengguna karena memperhatikannya!)

Harry K.
sumber
1
Dalam glibc, ada (adalah?) Fungsi perpustakaan non-standar strfry.
Siput mekanik
pengalaman lucu, jika saya memberi makan denganchar s[] = "na"; // not anticipated
pengguna tidak diketahui
@user uknown: Saya baru saja mengedit kode dan memperbaikinya, terima kasih telah memperhatikan bug! (Saya baru saja menambahkan> 0 dalam kondisi loop sementara, "membebani saya" dua lagi, tetapi diperlukan, karakter :))
Harry K.
1
@ Siput mekanik: Saya pikir strfy masih dalam glibc.
Harry K.
7

python, 87 79 75 93 92 karakter (menangani string dengan panjang 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]

EDIT: Awalnya pikir itu seharusnya membagi kata string (yang dilakukan pada 128 karakter; sekarang pada 87 karakter diperlukan). Argh, buruknya kemampuan membaca saya.

EDIT 2: Ubah dari fungsi def ke fungsi lambda dari def untuk menyimpan 6 karakter. Mengasumsikan sampel sudah diimpor ke namespace ( from random import sample) dapat membawa ini ke ~ 60).

EDIT 3: "len (w [1: -1])" (12 chars) menjadi "len (w) -2" (8 chars) per saran bagus gnibbler.

EDIT 4: JBernando menyelamatkan satu char (telah mempertimbangkan from random import *dan melihat itu setara - tidak menyadari ruang import *tidak diperlukan); pengguna tidak dikenal menambahkan 19 karakter w if len(w)<4 elseuntuk menangani 0 dan 1 string char dengan benar.

EDIT 5: Menyelamatkan trik golf kode char lain per booth. if len(w)<4 elseuntuk if 4>len(w)else.

dr jimbob
sumber
Namun, pertanyaannya hanya mendefinisikan input sebagai kata, bukan serangkaian kata. :)
Ben Richards
1
@ sidran32: Terima kasih, salahku. Saya baru saja memperhatikan (saat membaca ulang) dan kemudian melihat komentar Anda; dihapus - diedit - dan tidak terhapus.
dr jimbob
Ide - Anda dapat memotong 3 karakter dengan melakukan ini .... def f (w): j = w [1: -1]; return w [0] + ''. join (r.sample (j, len (j))) + w [-1]
arrdem
@rmckenzie: Ide bagus. Namun, tepat sebelum saya melihat komentar Anda tepat setelah saya memangkasnya menjadi fungsi lambda (menyimpan 6 karakter), jadi saya tidak bisa lagi melakukan metode Anda mendefinisikan varsing menengah.
dr jimbob
3
len(w)-2bukan len(w[1:-1])?
gnibbler
6

C ++, 111 97 karakter

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

Ini adalah program lengkap untuk mereka yang ingin mengujinya:

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

Sunting

Sadar tidak perlu acak kedua indeks swap, menyimpan variabel dan beberapa karakter lagi.

Scott Logan
sumber
Luar biasa. Sebagian besar solusi gagal pada input yang sangat kecil. Milikmu tidak.
pengguna tidak diketahui
6

php (68 karakter)

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

lebih pendek (60 karakter)

$r=preg_replace('/(.)(.+)(.)/e','$1.str_shuffle($2).$3',$w);
tobius
sumber
+1 Sangat bagus. :) Anda bisa drop trim (), benar-benar, dan dalam regex Anda dapat menghapus jangkar dan menggunakan .bukan \w.
Tomalak
@ Tomalak Disarankan Saya mencoba menulis ulang solusi ini di Perl. Termasuk sarannya, saya mendapatkan ini: use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}Itu 87 karakter . Tanpa garis penggunaan, itu 62 karakter .
Ben Richards
Bisakah Anda memberikan demo ini berfungsi? Karena saya tidak bisa ...
Steve Robbins
6

Perl - 96 (atau 71) karakter 84 (atau 59) karakter

Inilah yang saya temukan di Perl. Pergi melalui beberapa cara berbeda untuk melakukannya tetapi ini tampaknya terpendek dari apa yang dapat saya pikirkan sejauh ini, yaitu 97 karakter.

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

Padahal, jika Anda memotong baris 'use' (yang saya kira valid, karena orang lain mengecualikan #include baris dalam program C mereka) saya dapat memotongnya lebih jauh menjadi 71 karakter :

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

EDIT Disarankan agar saya mencoba melakukan ini dengan menerapkan metode @tobius. Dengan cara ini saya menurunkannya menjadi 84 karakter , atau dengan menghapus baris penggunaan , 59 karakter :

use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
Ben Richards
sumber
2
mempersingkat Versi Anda ke 87:use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
mbx
1
@ sidran32 Bisakah Anda menerapkan varian varian jawaban Perl , hanya untuk perbandingan?
Tomalak
@ Tomalak Tentu, saya akan mencobanya.
Ben Richards
1
dipersingkat versi regex Anda hingga 3 karakter:use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
mbx
Bagus. Saya terlalu terbiasa menggunakan bantuan tumpukan kurung untuk kejelasan. Kebiasaan buruk saat bermain golf. : P
Ben Richards
5

Ruby, 77 75 karakter

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

Solusi Scala saya dalam bahasa yang sedikit kurang verbose. Saya bukan ahli Ruby, jadi mungkin ada ruang untuk perbaikan.

Gareth
sumber
Wow. Bekerja dengan 'I', sebagai solusi scala Anda.
pengguna tidak diketahui
5

Ruby 1.9, 77 48 46 44 karakter

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

Penafian: Saya menyetel ini berdasarkan jawaban peringkat tertinggi - perhatikan jawaban yang sama persis di kemudian hari. Anda dapat memeriksa sejarah bahwa saya telah mempertahankan ide asli saya tetapi berubah dari ruby ​​1.8 ke ruby ​​1.9 untuk lambda pendek dan shuffle.

Jika kata-kata kosong diizinkan maka 56 54 karakter

r=->w{w.empty?||w[h=1..-2]=[*w[h].chars].shuffle*"";w}
Aleksi Yrttiaho
sumber
Tidak ada yang mengharapkan bahasa Spanyol 'Aku'.
pengguna tidak diketahui
Mencoba menangani kasus dengan 0 atau 1 surat juga
Aleksi Yrttiaho
5

Python 3, 94 93 91 karakter

Menggunakan teknik yang berbeda. Mungkin juga bekerja di 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

The ... if x[0:-1] else xmemberi xjika panjangnya adalah 1 (jika tidak akan diduplikasi). Fungsi dengan demikian bekerja untuk string dengan panjang 0 dan 1.

Ini sample()dari https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .

Karena itu salah satu ekspresi, kita bisa menggunakan lambda(menghilangkan return, defdan sepasang kurung).

Edit: from random import* untuk menyimpan 1 karakter, setelah pengiriman Python lainnya.

Siput mekanik
sumber
Saya tahu saya sangat terlambat di sini, tetapi bisakah x[0:-1]menjadi x[:-1]?
Zacharý
4

JavaScript - 118 122 karakter

JavaScript lebih pendek - 118 karakter tanpa spasi. Menggunakan algoritma yang kira-kira sama dengan OP, tetapi dengan sedikit rantai. Saya mencoba banyak rekursi, dan saya mencoba beberapa iterasi, tetapi mereka semua cenderung macet dalam beberapa cara.

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 Kinal
sumber
Tidak lulus 'I'-test.
pengguna tidak diketahui
@Ryan Menggunakan return z?a+...+z:w;sebagai pemeriksaan panjang implisit akan berurutan. Asumsi diam adalah bahwa fungsi tersebut hanya akan menerima kata-kata "valid".
Tomalak
Poin bagus, kecuali bahwa w telah dimodifikasi, jadi saya harus menggunakan adi elseternary. Diedit, dan hingga 122 karakter.
Ryan Kinal
@Ryan: Saya yakin aakan salah untuk input dua huruf. : - Sialan lain kali aku akan memenuhi persyaratan dengan lebih hati-hati.
Tomalak
Saya pikir itu tidak benar. zhanya akan ditentukan jika kata itu satu huruf (atau kurang).
Ryan Kinal
4

D, 62 karakter

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

oke saya curang dengan array char normal alih-alih string nyata (yang tidak berubah char [] jadi tidak ada pengocokan di tempat)

sunting dengan panjang periksa itu membutuhkan 14 lebih

import std.random;void s(char[] s){if(s.length>1)randomShuffle(s[1..$-1]);}
ratchet freak
sumber
Dan mengembalikan apa untuk input seperti 'Saya'?
pengguna tidak diketahui
Akan lebih adil (= lebih baik dibandingkan) untuk mengembalikan hasilnya.
Konrad Rudolph
@ pengguna kesalahan rentang. @ konrad yang akan membutuhkan return s;dan char [] mengembalikan tipe 11 karakter lainnya
ratchet freak
@ratchet Bisakah Anda memposting seluruh program? BTW, saya tidak mengerti mengapa Anda menghitung import std.random;, dan bukan hanya fungsinya.
Arlen
Saya kira Anda bisa menghemat 1 byte dengan menggunakan menghilangkan ruang dalam char[] s(untuk membuatnya char[]s), tapi saya belum pernah menggunakan D selama bertahun-tahun.
Tim Čas
4

php 5.3 (60 karakter)

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

Ditingkatkan menjadi 56 karakter dan tidak lagi membutuhkan versi 5.3:

$r=substr_replace($w,str_shuffle(substr($w,1,-1)),1,-1);
migimaru
sumber
+1 alternatif bagus untuk jawaban PHP lainnya. Tidak lebih pendek, tetapi tidak ada regex yang merupakan nilai tambah.
Tomalak
Diperbarui dengan solusi yang lebih pendek yang tidak memerlukan versi 5.3
migimaru
Versi lama tidak benar: mengembalikan trueuntuk string pendek.
Titus
3

Perl - 111 karakter (tanpa menggunakan fungsi pustaka)

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}

Penggunaan :

$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}
mbx
sumber
3

Python

Ini 90 89 112 karakter python!

Sunting 1: sebagai fungsi kali ini!

(terima kasih gnibbler)

Sunting 2: sekarang menangani kata-kata pendek

(terima kasih pengguna tidak diketahui)

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]
Andbdrew
sumber
apalagi jika Anda mengikuti spec dan menulis fungsi :)
gnibbler
ah, sayang mengocok tidak bekerja pada string
gnibbler
1
Modul acak seperti saya di klub malam ... kami berdua hanya semacam shuffle di tempat! :)
Andbdrew
Tidak berfungsi untuk input seperti 'Saya'; kembalikan 'II'.
pengguna tidak diketahui
Terima kasih! sekarang menangani kata-kata pendek, tetapi sedikit lebih lama :)
Andbdrew
3

Scala, 135 139 142 156 karakter

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: dihapus ': String' (tipe pengembalian dapat disimpulkan)
-7: dihapus 'kembali' (ekspresi terakhir adalah nilai balik)
-3: factored s.size-2out
-4: toCharArray->toArray

Gareth
sumber
Bekerja dengan 'I' dan 'Verwürfel' tanpa karakter Python mewah. :) Namun, solusi saya menggunakan 'shuffle' sedikit lebih pendek.
pengguna tidak diketahui
@ pengguna tidak diketahui Terima kasih atas suntingan :-)
Gareth
3

Python, 86 karakter

Slnicig aman, jadi tidak ada ckhnceig yang dapat dilakukan. Wkros di semua leghtn.

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

C ++ 11: - 68 66 karakter

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

program lengkap:

#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;
}
Arlen
sumber
Apakah hard coding dalam string input legal?
Thomas Eding
@trinithis Saya pikir kami hanya mementingkan fungsi itu sendiri. Program hanya menunjukkan cara menggunakan fungsi. Apapun, tidak sulit pengkodean input tidak akan membuat perbedaan dalam hal ini; tambahkan sajastring s; cin >> s;
Arlen
3

Ruby 1.9, 43 karakter

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

Belum berfungsi untuk 1 string panjang karakter (menduplikasi karakter itu), dan gagal untuk String kosong.

karatedog
sumber
3

Python - 76 karakter

import random as r
def f(w):m=list(w)[1:-1];r.shuffle(m);return w[0]+''.join(m)+w[-1]
Donald Wilson
sumber
Script users George menempatkan ini pada 85 karakter.
dmckee
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="")}

Pemakaian:

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"

fungsi di bawah ini berfungsi dengan kata-kata dengan panjang kurang dari 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"
Paolo
sumber
Bagian dari tugas itu bukan untuk memindahkan huruf pertama dan terakhir.
Tomalak
@ Tomalak diperbaiki!
Paolo
Apakah itu bekerja dengan kata-kata di bawah panjang 3?
Tomalak
@Tomalak Sekarang seharusnya tidak apa-apa! Terima kasih atas koreksinya!
Paolo
3

Python, 102 karakter

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]

Tidak ada impor! Berfungsi untuk kata-kata 1 karakter ke atas. Ini adalah entri golf pertama saya dan saya terinspirasi oleh entri BlueEyedBeast dari kode terpendek untuk menghasilkan output non-deterministik untuk ide menggunakan id (Object) .


Penjelasan: Itu membuat daftar huruf dari input mengecualikan yang pertama dan terakhir, dan berulang kali muncul dari daftar ini dan menambahkan yang baru sampai kosong. Indeks tempat ia muncul adalah id (7)% len (daftar kami muncul dari). Karena id (7) adalah alamat memori objek 7, itu pada dasarnya acak. Jadi sekarang kami memiliki daftar surat acak yang diacak dari pusat input asli. Yang kita lakukan sekarang adalah menambahkan huruf pertama dan terakhir dari output asli yang sesuai dan kita mendapatkan output yang kita inginkan: (huruf pertama) + (tengah acak) + (huruf terakhir).

jerapah
sumber
3

R, 95 92 91 karakter

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

Manfaatkan evaluasi malas R untuk menghitung a dan b sebagai parameter fungsi, menghemat ruang dengan digunakan kembali nanti. Juga tidak seperti jawaban R lainnya ini bekerja untuk semua kata> 1 karakter. Contoh di bawah ini:

> f("hippopotamus")
hpuoopaitmps

> f("dog")
dog

> f("az")
az

Sunting: Diganti unlist()dengan[[]] Digantikan [[1]] dengan el ()

Andrew Haynes
sumber
2

D: 55 karakter

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

program lengkap:

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);
}
Arlen
sumber
Saya pikir else sbagian itu hilang?
Tomalak
1
@ Tomalak Tidak, tidak, karena tidak perlu untuk itu. Jika string memiliki panjang 2 atau kurang, maka kita biarkan saja. Juga, randomShuffle()ada di tempat.
Arlen
Wow, D kompetitif. Saya pikir randomShuffle(s[1..$-1])bisa s[1..$-1].randomShuffleIIRC (kecuali itu dalam versi D lebih tua dari posting ini)
Zacharý
2

Erlang, 188 172 132 karakter

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

Saya masih belajar Erlang sehingga tips untuk membuat ini lebih pendek dihargai.

kode lengkap (modul 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).

Sunting

Mengambil bagian acak sebagai fungsi terpisah yang tidak lagi membutuhkan kepala dan ekor daftar untuk diedarkan.

Edit 2

Direstrukturisasi untuk menghapus salah satu fpola fungsi, mengubah fungsi acak untuk hanya menerima dua parameter, diubah lists:deleteuntuk --[], bertukar lists:reversepanggilan untuklists:last

Scott Logan
sumber