Bir kelimedeki harfleri nasıl randomize edersiniz?


55

Tartışmalı bazı öykülere göre, bir değirmenin içindeki odun akıntısı, orkinal öbürle frist ve lsat litre macn gibi lnog, raednig için çok daha fazla değil.

Peki, eğlence için, ilk ve son harfi yerinde tutarken harf sırasını bir kelimede rastgele seçen en kısa işlev ne olurdu?

İşte JavaScript ile bıçaklarım. Tüm boşluklar kaldırıldı, 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];
}

Daha kısa JavaScript her zaman beklerim.


  • Düzenleme: uzunluk kontrolü eklendi. İşlev kısa kelimeler için başarısız olmamalıdır.

3
Haskell, 4 karakter: r=id.
Thomas Eding,

2
Evet. Girdiyle aynı şeyi döndürür. Başka bir notta, noktalama işaretleri hakkında ne yaparız? Sadece harflerden oluşan kelimelerde mi çalışıyoruz?
Thomas Eding,

1
@trinith, neden bahsettiğinden emin değil, ama idkimlik işlevi. Haskell'in bu soruna çözümünü 100 karakterden daha az görmek istiyorum.
Arlen

3
Spesifikasyon sonuçların düzgün bir şekilde dağıtılmasını gerektirecek şekilde güncellenmeli mi? Bu 4 karakterli Haskell çözümüne izin vermezdi. Aynı zamanda örnek Javascript çözümünüze de izin vermez (böyle bir sıralama yaparak karışık değildir).
Thomas Eding

2
İlk cümle için 1: aslında bunu anlamam için bir kaç saniye sürdü yanlış XP yazıldığından edildi
Nate Koppenhaver

Yanıtlar:


21

Haskell, 4 karakter

Önerilen trinithis işlevi aslında özelliklerle eşleşiyor:

s=id

Böylece yerinde ilk ve son karakterlerini tutmak ve yaptığını, dize değişmeden döndüren bir permütasyon diğer tüm karakterlerin.

Birisi permütasyonların olasılık dağılımından memnun değilse, burada daha iyi bir dağıtım sağlayan bir çözüm var. Açıkçası çok daha karmaşık:

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

Bu işlevi kullanan bir program örneği:

main = getLine >>= s >>= putStrLn

18
“permütasyonların olasılık dağılımından memnun değil” beni güldürürdü. :)
Tomalak

@Rotsor, bu işlevi nasıl çağırırsınız?
Arlen

Gönderime bir örnek ekledim.
Rotsor

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

3
İlk çözüm, zorluk kriterlerine uymadığından kaldırılmalıdır. Zorluk açıklaması "randomize" diyor. Metaya göre, rasgele her zaman aynı çıktıya sahip olamaz .
mbomb007

19

J, 26 24 23 karakter

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

Genel kod golf kurallarına göre, ifadeyi bir isme bağlamak zorunda değilsiniz.
FUZxxl

#?#daha kısa olan bir karakterdir?~@#
randomra

15

Yakut, 44 karakter

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

Kısa kelimeler için de çalışır, yani bir, iki veya üç karakterden oluşan kelimeler değiştirilmeden döndürülür.

Düzenleme: Ventero dizi uyarısı fikrini kullanarak başka bir karakter kaydeder.


Bu aslında 44 karakter. Sonunda kendime göre ince ayar yaparak aynı cevabı buldum - şimdi sizinkini okuduktan sonra bir kopya-kedi gibi hissediyorum.
Aleksi Yrttiaho

@ user2316 Elbette haklısın. Teşekkür ederim.
Howard

11

Yakut 1.9, 46 karakter

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

+1 Dizi uyarısı kullanımı beni de bir karakter kurtardı. İyi fikir.
Howard,

Ruby'yi bilmiyorum - benim ruby1.8'imde başarısız oluyor, bu yüzden sanırım hiç bir sürüme ihtiyacım yok? 'I' gibi girdilerle çalışıyor mu?
kullanıcı bilinmeyen

@ user: Burada "Ruby 1.9" yazıyor. ;) - Ventero - Söylemeyi unuttuğum mantıklı gereksinimlerden biri, 0 ve 1 kelime uzunlukları için başarısız olmamalıdır.
Tomalak

11

Golfscript

Bir "işlev" olarak (adlandırılmış kod bloğu): 20 karakter

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

Yığındaki en üstteki eleman üzerinde çalışırken: 16 karakter

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

Bu çok iyi bir karıştırma değil, bu görev için muhtemelen tamamdır. Yine de, iki karakter pahasına (Yani, bu "yeterince rastgele bak" gerekir. Olduğu), bir alabilir çok değiştirerek daha iyi karıştır 9ile 9.?.
Ilmari Karonen

Bu tek harfli kelimeler için başarısız olur ve ayrıca işlevin dizge, dizge dizisi, dizge (tek dizgenin tersine) döndürülmesine izin verilmesi gerektiğini düşünmüyorum.
Martin Ender

11

C ++, 79 karakter ( aralık kontrolü ile )

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

C ++ 8165 karakter ( aralık kontrolü olmadan )

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

Sonucu döndürmek yerine referansa göre geçmek, her iki çözümden de 10 karakter daha alır.

Tam program, bir kelime dizisi okumak ve bunları dönüştürmek için karıştırmak:

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

Moral: zaten orada olanı yapma. Oh, ve taşma kontrolleri mazeretler içindir.


Güzel, std::random_shufflebu benim için yeni bir tane. BTW #include<string>tam kodunuzu unuttuğunuzu düşünüyorum .
Scott Logan

1
Bunun gibi bir şey aslında aklımdaki şeydi. Ne yazık ki, JS'de yerinde bir dize shuffling için yerleşik yoktur.
Tomalak

Çok kısa dizeler için başarısız.
kullanıcı bilinmeyen

Bu doğru, bir uzunluk kontrolünü kaçırıyorsunuz (ben de yaptım). BTW @ Arlen'in cevabı da bir göz atmaya değer.
Tomalak

1
@ userunknown “Taşma kontrolleri wusses içindir” ile kastediyorum. Ancak adil olmak gerekirse, diğer tüm çözümleri de yapın.
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]

Ve işte bunu kullanmanın bir örneği:

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

Bu benim ilk kod golf exerise. Problemi çözdükten sonra cevaplara bakmaya karar verdim ve bunun şaşırtıcı olması benim cevabımın benzersiz olmaması. Bu olsa da eğlenceliydi: o)

Diğer cevaplara baktıktan sonra bir değişiklik yaptım ve takma adı kullanmak için import ifademi değiştiriyordum. İyi fikir. ;Ö)


Ve yine de, çözümün benim önümde oy aldı! : p
stand

Kısa dizelerde başarısız olur; Benim piton cevap kısa dizeleri başarısız olursa 75 karakter olacaktır ( 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;}}

C yerleşik bir takas takma veya karıştırma işlevi yok, bu yüzden el ile yapmak zorundaydım :(

Ungolfed r () ile Örnek Program:

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

DÜZENLEME : s 3 karakterden az olduğunda hatayı düzeltti (fark etmesi için kullanıcı uknown sayesinde!)


1
Glibc'de standart olmayan bir kütüphane işlevi vardır (?) strfry.
Mekanik salyangoz 23

komik bir deneyim, eğer beslenirsemchar s[] = "na"; // not anticipated
kullanıcı bilinmeyen

@ kullanıcı uknown: Ben sadece kodu düzenledi ve bu hatayı fark ettiğiniz için teşekkürler! (Sadece iki tane daha, ancak gerektiğinde, karakter :) "Beni mal", while döngüsünün durumda> 0 eklendi)
Harry K.

1
@ Mekanik salyangoz: Sanırım strfy hala glibc'de.
Harry K.

7

python, 87 79 75 93 92 karakter (0,1 uzunlukta uzunluk telleri)

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: Başlangıçta sicim kelimeleri ayırması gerektiğini düşündü (128 karakterde; şimdi 87 karakterde şart). Argh, okuduğunu anlamadaki kötüyüm.

EDIT 2: def'den lambda fonksiyonuna, def'den 6 karaktere kadar tasarruf edin. Numunenin zaten ad alanına ( from random import sample) alındığını varsayarsak, bunu ~ 60'a indirebiliriz.

EDIT 3: gnibbler'ın hoş önerisi başına "len (w [1: -1])" (12 karakter) - "len (w) -2" (8 karakter).

DÜZENLEME 4: JBernando bir karakter kurtardı ( from random import *eşdeğer olduğunu düşündü ve gördü - içindeki boşluğun import *gereksiz olduğunu fark etmeden ) .; bilinmeyen kullanıcı, w if len(w)<4 else0 ve 1 karakter dizilerini doğru kullanmak için 19 karakter ekledi .

DÜZENLEME 5: Her kabinin kod golf hilesi başına başka bir karakter kurtardı. if len(w)<4 elseiçin if 4>len(w)else.


Ancak, soru girişi bir sözcük dizisi olarak değil bir sözcük olarak tanımladı. :)
Ben Richards,

1
@ sidran32: Teşekkürler, benim hatam. Sadece farkettim (yeniden okuduktan sonra) ve sonra yorumunuzu gördüm; silindi - düzenlendi - ve geri alındı.
dr jimbob

Fikir - bunu yaparak 3 karakter kırpabilirsiniz .... def f (w): j = w [1: -1]; w [0] + '' ile geri dönün (r.sample (j, len (j))) + w [-1]
arrdem

@ rmckenzie: İyi fikir. Ancak, yorumlarınızı lambda işlevine kestikten hemen sonra görmeden hemen önce (6 karakter kaydederek), bu nedenle artık ara değişkenleri tanımlama yönteminizi artık yapamam.
dr jimbob

3
len(w)-2yerine 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;}

Test etmek isteyenler için tam bir program:

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

Düzenle

Değişken ve birkaç karakterden oluşan her iki takas endeksini de rasgele düzenlemeye gerek olmadığı fark edildi.


Mükemmel. Çoğu çözüm çok küçük girdilerde başarısız olur. Seninki değil.
kullanıcı bilinmeyen

6

php (68 karakter)

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

daha kısa (60 karakter)

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

+1 Çok hoş. :) Aslında trim'i () düşürebilir ve regex'te sabitleyicileri çıkarabilir ve .yerine kullanabilirsiniz \w.
Tomalak

@Tomalak Önerilen Bu çözümü Perl'de yeniden yazmaya çalışıyorum. Önerileri dahil, şunu anladım: use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}Bu 87 karakter . Kullanım çizgisi olmadan, 62 karakterdir .
Ben Richards,

Bu çalışmanın bir demosunu sağlayabilir misiniz? Çünkü yapamam ...
Steve Robbins

6

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

Perl’de bulduğum şey buydu. Bunu yapmak için birkaç farklı yoldan geçtim, ancak bu şu ana kadar 97 karakterde düşünebildiklerimden daha kısa görünüyordu.

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

Yine de, 'kullanım' satırını kestiyseniz (ki diğerleri geçerlidir, çünkü diğerleri C programlarına satırları eklemez) çünkü bunları 71 karakterden daha fazla kesebilirim :

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

EDIT Bu uygulamayı @tobius yöntemini yapmaya çalışmam önerildi. Bu şekilde onu 84 karaktere indirdim veya kullanım çizgisini kaldırarak 59 karaktere düşürdüm :

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

2
Sürümünüzü 87'ye düşürdü:use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
mbx

1
@ sidran32 Perl'i sadece karşılaştırma amacıyla @tobius'un cevabını değiştirebilir misiniz ?
Tomalak

@Tomalak Tabii, deneyeceğim.
Ben Richards,

1
regex sürümünüzü 3 karakter kısalttı:use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
mbx

Güzel. Ben de netlik için parantez yığın yardımı kullanmaya alışkınım. Golf yaparken kötü alışkanlık. : 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

Scala çözümüm biraz daha ayrıntılı bir dilde. Ben hiçbir şekilde bir Ruby uzmanı değilim, bu yüzden muhtemelen iyileştirmeye yer var.


Vay. Scala çözümünüz olarak 'I' ile çalışır.
kullanıcı bilinmeyen

5

Ruby 1.9, 77 48 46 44 karakter

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

Feragatname: Bunu en yüksek dereceli cevaba göre ayarladım - aynı cevabı daha sonra farkettim. Özgün fikrime sadık kaldığım, ancak kısa lambdalar için yakut 1.8'den yakut 1.9'a değiştirdiğim tarihi kontrol edebilirsiniz shuffle.

Boş kelimelere izin verilirse, 56 karakter

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

Kimse ispanyolca 'ben' beklemiyor.
kullanıcı bilinmeyen

0 veya 1 harfli davaları da ele
almaya çalıştım

5

Python 3, 94 93 91 karakterler

Farklı bir teknik kullanmak. Python 2'de de çalışabilir.

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 xVerir xuzunluğu 1 ise (aksi takdirde çoğaltılabilir olurdu). Böylece işlev, 0 ve 1 uzunlukta diziler için çalışır.

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

O bir ifade olduğundan, bunu bir kullanabilir lambda(ortadan kaldırarak return, defparantez ve bir çift).

Düzenleme: from random import* Diğer Python gönderiminden sonra 1 karakter kaydetmek için.


Ben biliyorum Bu kadar geç saatte çok çok, ama olabilir x[0:-1]haline x[:-1]?
Zacharý

4

JavaScript - 118 122 karakter

Daha kısa JavaScript - beyaz boşluksuz 118 karakter. OP ile yaklaşık olarak aynı algoritmayı kullanır, ancak daha az zincirleme ile kullanır. Çok fazla özyinelemeyi denedim ve bazı yinelemeleri denedim, ancak hepsi bir şekilde ya da başka şekilde tıkanmaya meyilli.

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

'Testini geçemez.
kullanıcı bilinmeyen

@Ryan return z?a+...+z:w;Bir örtülü uzunluk kontrolü olarak kullanmak sıralı olacaktır. Sessiz varsayım, işlevin yalnızca "geçerli" kelimeler alacağıydı.
Tomalak

İyi nokta, bunun dışında w değiştirildi, bu yüzden üçlünün aiçinde kullanmak zorundayım else. Düzenlendi ve en fazla 122 karakter.
Ryan Kinal,

@Ryan: aİki harfli giriş için yanlış olacağına inanıyorum . : - \ Lanet olası bir dahaki sefere gereksinimleri daha dikkatli sıralayacağım.
Tomalak

Aslında olacağını sanmıyorum. zsadece kelime bir harf (veya daha az) ise tanımsız olacaktır.
Ryan Kinal

4

D, 62 karakter

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

tamam ben gerçek bir dize yerine normal bir karakter dizisi ile aldattı (ki değişmez karakter [] yani yerinde karıştırma yok)

düzenlemek o 14 fazlasını gerektirir kontrol uzunluğunda

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

Ve 'I' gibi bir giriş için ne döner?
kullanıcı bilinmeyen

Sonucu döndürmek daha adil olurdu (= daha iyi karşılaştırılabilir).
Konrad Rudolph

@ kullanıcı bir aralık hatası. gerektirecek @ konrad return s;ve char [] dönüş türü 11 ​​karakter daha
cırcır

@ratchet Tüm programı gönderir misiniz lütfen? BTW, neden saydığınızı anlamıyorum import std.random;, sadece işlevden değil.
Arlen

Sanırım boşluk bırakarak char[] s( byte) kullanarak 1 byte tasarruf edebileceğinizi tahmin ediyorum char[]s, fakat yıllardır D kullanmıyorum.
Tim,

4

php 5.3 (60 karakter)

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

56 karaktere geliştirildi ve artık sürüm 5.3 gerektirmiyor:

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

Diğer PHP cevabına +1 güzel bir alternatif. Daha kısa değil, ancak herhangi bir regex bir artı değildir.
Tomalak

Sürüm 5.3 gerektirmeyen daha kısa bir çözümle güncellendi
migimaru

Eski sürüm doğru değil: truekısa dizeler için döner .
Titus

3

Perl - 111 karakter (hiçbir kütüphane işlevini kullanmadan)

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}

Kullanım :

$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

piton

Bu var 90 89 pitonun 112 karakter!

Düzenleme 1: bu sefer bir işlev olarak!

(teşekkürler gnibbler)

Düzenleme 2: şimdi kısa kelimeleri ele alıyor

(teşekkürler bilinmeyen kullanıcı)

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]

Eğer şartnameye
uyuyor

ah, yazık shuffle dizeleri üzerinde çalışmaz
gnibbler

1
Rastgele modül bir gece kulübünde benim gibiydi ... ikimiz de sadece yer değiştirmişiz! :)
Andbdrew

'I' gibi girdiler için çalışmıyor; 'II' döndür.
kullanıcı bilinmeyen

Teşekkürler! şimdi kısa kelimeleri kullanıyor, ama biraz daha uzun :)
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: Sökülmüş ': Dize' (dönüş türü çıkarılabilir)
-7: Sökülmüş 'dönüş' (son ifade dönüş değeridir)
-3: faktörlü s.size-2çıkış
-4: toCharArray->toArray


Süslü Python karakterleri olmadan 'I' ve 'Verwürfel' ile çalışır. :) Ancak, 'karışık' kullanarak benim çözüm biraz daha kısa.
kullanıcı bilinmeyen

@user unknown Düzenlemeler için teşekkürler :-)
Gareth

3

Python, 86 karakter

Slnicig güvende, bu yüzden hiçbir kimse ckhnceig neeacrssy değil. Bütün kızlara 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 karakter

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

tam program:

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

Giriş dizisindeki kodlama yasal mı?
Thomas Eding,

@trinithis Sadece fonksiyonun kendisiyle ilgilendiğimizi sanıyordum. Program sadece fonksiyonun nasıl kullanılacağını gösterir. Ne olursa olsun, kodlamanın zor olmaması girdilerde bu durumda bir fark yaratmayacaktır; sadece ekleyinstring s; cin >> s;
Arlen

3

Yakut 1.9, 43 karakter

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

Henüz 1 karakter uzunluğu için çalışmaz Dizeler (bu karakteri çoğaltır) ve boş Dize için başarısız olur.



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="")}

Kullanımı:

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"

Aşağıdaki işlev, uzunluğu 3'ten küçük sözcüklerle çalışır:

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"

Görevin bir kısmı, ilk ve son harfleri taşımak değildi.
Tomalak

@Tomalak düzeltildi!
Paolo

3 uzunluğun altındaki kelimelerle çalışıyor mu?
Tomalak

@Tomalak Şimdi tamam olmalı! Düzeltmeler için teşekkürler!
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]

İthalat yok! 1 karakter ve üzeri kelimeler için çalışır. Bu benim ilk golf girişim ve BlueEyedBeast'in en kısa koddan girişinden ilham aldım ve id (Object) kullanma fikri için deterministik olmayan bir çıktı elde ettim .


Açıklama: İlk ve son hariç tutulan girişten gelen harflerin bir listesini yapar ve tekrar tekrar bu listeden çıkar ve boş olana kadar yenisine eklenir. Açtığı dizin id (7)% len (haşhaş yaptığımız liste). İd (7) nesnenin 7 hafıza adresi olduğundan, esasen rastgeledir. Şimdi, orijinal girişin ortasından rastgele karıştırılmış harflerin bir listesi var. Şimdi tek yaptığımız, orijinal çıktının ilk ve son harflerini buna göre eklemek ve istediğimiz çıktıyı aldık: (ilk harf) + (orta şifreli) + (son harf).


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="")

A ve b'yi fonksiyon parametreleri olarak hesaplamak için R'nin tembel değerlendirmesini kullanır ve daha sonra yeniden kullanımla yer kazanmasını sağlar. Ayrıca diğer R cevaplarından farklı olarak, bu> 1 char uzunluğundaki tüm kelimeler için işe yarar. Aşağıdaki örnek:

> f("hippopotamus")
hpuoopaitmps

> f("dog")
dog

> f("az")
az

Düzenle: Değiştirilen unlist()ile[[]] [(1]] yerine el () kullanılır


2

D: 55 karakter

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

tam program:

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

Sanırım else sparça eksik?
Tomalak

1
@Tomalak Hayır, buna gerek yok çünkü buna gerek yok. İp uzunluğu 2 veya daha azsa, onu rahat bırakalım. Ayrıca, randomShuffle()yerinde.
Arlen

Vay, D rekabetçi olmak. IIRC randomShuffle(s[1..$-1])olabileceğini düşünüyorum s[1..$-1].randomShuffle(eğer bu
yazıdan

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

Ben hala Erlang'ı öğreniyorum, bu yüzden bu kısaltmanın ipuçlarını takdir ediyorum.

tam kod (string_shuffle modülü):

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

Düzenle

Karıştırma parçasını, artık listenin başının ve kuyruğunun etrafa geçirilmesini gerektirmeyen ayrı bir işlev olarak çıkardı.

Düzenle 2

fİşlev modellerinden birini kaldırmak için yeniden yapılandırıldı , yalnızca iki parametreyi kabul etmek üzere karışık işlevini değiştirdi, lists:deleteiçin değiştirildi --[], bir lists:reverseçağrıyı değiştirdi.lists:last

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.