Як рандомізувати букви в слові


55

Згідно з деякою суперечливою історією , одрер ltteres у wrod deos не значить багато для raednig, настільки lnog, як frist та lsat lteter macth з оригінальним wrod.

Отже, для розваги, яка найкоротша функція рандомізувати порядок букв у слові, зберігаючи першу та останню букви на місці?

Ось мій удар по ньому з 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 символів.
Арлен

3
Чи варто оновити специфікацію, щоб вимагати рівномірного розподілу результатів? Це заборонить 4-символьне рішення Haskell. Це також заборонить ваш приклад рішення Javascript (перетасовування, роблячи подібне, що не є рівномірним).
Томас Едінг

2
+1 для першого речення: насправді мені знадобилося кілька секунд, щоб зрозуміти, що це написано неправильно XP
Нейт Коппенгавер

Відповіді:


21

Хаскелл, 4 символи

Пропонована функція триніта фактично відповідає специфікації:

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
"незадоволений розподілом ймовірності перестановок" змусив мене сміятися. :)
Томалак

@Rotsor як ти називаєш цю функцію?
Арлен

Я додав приклад до своєї публікації.
Ротсор

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

3
Перше рішення слід усунути, оскільки воно не відповідає критеріям виклику. В описі виклику написано "рандомізувати". Відповідно до мета, випадковий не завжди може мати однаковий вихід .
mbomb007

19

J, 26 24 23 символів

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

Відповідно до загальних правил коду для гольфу, вам не потрібно прив’язувати фразу до імені.
FUZxxl

#?#є на один char коротше ніж?~@#
randomra

15

Рубі, 44 символи

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

Працює також для коротких слів, тобто слова з одним, двома або трьома символами повертаються без змін.

Редагувати: Використовуючи ідею матриці за допомогою матриці Ventero, зберігається ще одна діаграма.


Це насправді 44 символи. Я врешті-решт придумав таку саму відповідь, точно налаштувавши свою - тепер я відчуваю себе котом-копією, прочитавши вашу.
Aleksi Yrttiaho

@ user2316 Звичайно, ти маєш рацію. Дякую.
Говард

11

Рубін 1,9, 46 символів

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

+1 Таке використання сплетку масиву врятувало і мене. Чудова ідея.
Говард

Я не знаю рубіну - він не працює на моєму ruby1.8, тож я думаю, мені потрібна версія ніколи? Це працює з введенням типу "Я"?
користувач невідомий

@user: Там написано "Ruby 1.9". ;) - Вентеро - Однією з розсудливих вимог, яку я забув згадати, є те, що воно не повинно провалюватися при довжині слова 0 і 1. Вибачте.
Томалак

11

Гольфскрипт

Як "функція" (названа кодовим блоком): 20 символів

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

При роботі над самим верхнім елементом стеку: 16 символів

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

Це не дуже добре переміщення, але, мабуть, добре для цього завдання. (Тобто це буде "виглядати досить випадково".) Тим не менш, ціною ще двох символів, ви можете отримати набагато краще переміщення, замінивши 9на 9.?.
Ільмарі Каронен

Це не вдається для однолітерних слів, і я також не думаю, що функції слід дозволити повертати рядок, масив рядків, рядок (на відміну від однієї рядка).
Мартін Ендер

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

Використовуючи пропуск за посиланням замість повернення результату, слід знищити ще 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;
}

Мораль: не будуйте того, що вже є. Ох, і перевірка на переповнення призначена для жінок.


Приємно, std::random_shuffleось це для мене нове. btw Я думаю, ти забув #include<string>у своєму повному коді.
Скотт Логан

1
Щось таке, що я мав на увазі спочатку. На жаль, в JS немає вбудованого для переміщення рядків на місці.
Томалак

Не підходить для дуже коротких струн.
користувач невідомий

Це правда, вам не вистачає перевірки довжини (я теж зробив). Відповідь BTW @ Арлена також варто переглянути.
Томалак

1
@userunknown Це те, що я мав на увазі під "перевірки на переповнення для жінок". Але щоб бути справедливим, так це роблять майже всі інші рішення.
Конрад Рудольф

8

Пітон, 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
кабінка

Невдачі на коротких струнах; моя відповідь python була б 75 символів, якщо вона не вдалася до коротких рядків ( from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]).
д-р Джимбоб

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

EDIT : виправлено помилку, коли s складається з менш ніж 3 символів (завдяки невідомому користувачеві, який помітив це!)


1
У glibc існує (була?) Нестандартна функція бібліотеки strfry.
Механічний равлик

кумедний досвід, якщо я його годуюchar s[] = "na"; // not anticipated
користувач невідомий

@user невідомо: Я щойно відредагував код і виправив його, дякую, що помітив помилку! (Я щойно додав> 0 в умові циклу "," коштував мені "ще два, але потрібні символи :)"
Гаррі К.

1
@ Механічний равлик: Я думаю, що strfy все ще знаходиться в glibc.
Гаррі К.

7

пітон, 87 79 75 93 92 символів (обробні струни довжиною 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: Спочатку думав, що він повинен був розділити рядкові слова (що це робилося на 128 символів; зараз це вимагає 87 символів). Аргу, моє погане розуміння читання.

EDIT 2: Перехід від def до функції лямбда з def, щоб зберегти 6 символів. Якщо припустити, що зразок вже імпортований у простір імен ( from random import sample), це може звести до ~ 60).

EDIT 3: "len (w [1: -1])" (12 chars) to "len (w) -2" (8 chars) за приємну пропозицію gnibbler.

EDIT 4: JBernando врятував одну таблицю (вважав from random import *і бачив, що це рівнозначно - не усвідомлювати простір у import *зайвому); Користувач невідомо додав 19 символів, w if len(w)<4 elseщоб правильно обробляти 0 та 1 рядок символів.

EDIT 5: Збережено ще один знак на код гольф-трюку. if len(w)<4 elseдо if 4>len(w)else.


Однак питання визначало лише введення як слово, а не рядок слів. :)
Бен Річардс

1
@ sidran32: Дякую, погано. Я щойно помітив (перечитавши), а потім побачив ваш коментар; видалено - відредаговано - і відмінено.
dr Jimbob

Ідея - ви можете обрізати 3 символи, виконавши це .... def f (w): j = w [1: -1]; return w [0] + ''. join (r.sample (j, len (j))) + w [-1]
arrdem

@rmckenzie: Гарна ідея. Однак безпосередньо перед тим, як я побачив ваш коментар відразу після того, як я прирізав його до функції лямбда (заощаджуючи 6 символів), тому я більше не можу використовувати ваш метод визначення проміжних змін.
dr Jimbob

3
len(w)-2замість len(w[1:-1])?
гніблер

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 Дуже приємно. :) Насправді ви можете скинути обрізку (), а в регулярному виразі ви можете зняти якір і використовувати .замість цього \w.
Томалак

@Tomalak запропонував спробувати переписати це рішення в Perl. Включаючи його пропозиції, я зрозумів це: use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}це 87 символів . Без рядка використання - це 62 символи .
Бен Річардс

Чи можете ви надати демонстрацію роботи? Бо я не можу ...
Стів Роббінс

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

EDIT Було запропоновано спробувати виконати метод реалізації @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 Звичайно, я спробую це.
Бен Річардс

1
скоротили версію регексу на 3 символи:use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
mbx

Приємно. Я занадто звик використовувати чіткість дужок для чіткості. Погана звичка при гольфі. : P
Бен Річардс

5

Рубі, 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 трохи меншою мовою. Я ніяким чином не є експертом Рубі, тому, мабуть, є можливість для вдосконалення.


Ого. Працює з "Я", як ваше рішення Scala.
користувач невідомий

5

Рубін 1,9, 77 48 46 44 ч

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

Відмова: Я налаштував це на основі відповіді з найвищим рейтингом - саме таку відповідь помітив пізніше. Ви можете перевірити історію, яку я зберігав вірною моїй початковій ідеї, але змінив з ruby ​​1.8 на ruby ​​1.9 для коротких лямбда і shuffle.

Якщо пусті слова дозволені, то 56 54 символів

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

Ніхто не очікує іспанського "Я".
користувач невідомий

Спроба розглянути справи також з 0 або 1 літерами
Алексі Йрттіахо

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 символів без пробілу. Використовує приблизно той же алгоритм, що і ОП, але з меншою ланцюжком. Я спробував багато рекурсії, і я спробував певну ітерацію, але всі вони, як-то чи інше, зациклюються.

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;як неявна перевірка довжини буде в порядку. Мовчазне припущення полягало в тому, що функція отримуватиме лише "дійсні" слова.
Томалак

Хороший момент, за винятком того, що w був модифікований, тому мені доводиться використовувати aв elseтерміналі. Відредаговано та до 122 символів.
Райан Кінал

@Ryan: Я вважаю, що aбуло б неправильно для введення двох літер. : - \ Чорт наступного разу, я більш ретельно викладу вимоги.
Томалак

Я не думаю, що це насправді. zбуде невизначено, лише якщо слово є однією буквою (або меншою).
Райан Кінал

4

D, 62 символи

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

гаразд, я обманув звичайний масив char замість справжнього рядка (який є незмінним char [], так що немає місця переміщення)

редагування за допомогою перевірки довжини потрібно ще 14

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

І він повертає, що для введення типу "Я"?
користувач невідомий

Було б справедливіше (= краще порівняно) повернути результат.
Конрад Рудольф

@user помилка діапазону. @ konrad, що вимагатиме return s;і char [] повернути тип ще 11 символів
храповик виродка

@ratchet Чи можете ви опублікувати всю програму, будь ласка? До речі, я не розумію, чому ви рахуєте import std.random;, а не лише функцію.
Арлен

Я здогадуюсь, що ви можете зберегти 1 байт, використовуючи пропущення пробілу в char[] s(щоб зробити це char[]s), але я не використовував D у роках.
Тім Час

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. Не коротше, але ніякий регулярний вираз не є плюсом.
Томалак

Оновлено коротше рішення, яке не потребує версії 5.3
migimaru

Стара версія не вірна: повертає trueдля коротких рядків.
Тит

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: як функція цього разу!

(спасибі гніблер)

Редагувати 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

Не працює для введення типу "Я"; повернути '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


Працює з "Я" та "Верверфель" без фантазійних символів Python. :) Однак моє рішення з використанням «перетасувати» трохи коротше.
користувач невідомий

@user невідомо Дякуємо за зміни :-)
Гарет

3

Пітон, 86 символів

Slnicig є безпечним, тому жоден смик ckhnceig не є кривдним. Wkros на всі довжини.

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;
Арлен

3

Рубін 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 виправлено!
Паоло

Чи працює це зі словами нижче довжини 3?
Томалак

@Tomalak Тепер це повинно бути нормально! Дякуємо за виправлення!
Паоло

3

Пітон, 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 для обчислення а і 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частини бракує?
Томалак

1
@Tomalak Ні, це не так, тому що в цьому немає потреби. Якщо рядок завдовжки 2 або менше, ми залишаємо її в спокої. Крім того, randomShuffle()є на місці.
Арлен

Нічого собі, будучи конкурентоспроможними. Я думаю, що це randomShuffle(s[1..$-1])може бути s[1..$-1].randomShuffleIIRC (якщо це не версія D, старша за цю посаду)
Zacharý

2

Ерланг, 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).

Я все ще вивчаю Ерланг, тому будь-які поради щодо скорочення цього ціни вдячні.

повний код (string_shuffle module):

-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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.