Come randomizzare le lettere in una parola


55

Secondo una storia controversa , l'odore di lttere in un wrod deos non è molto alto per raednig, tanto quanto la frist e lsat lteter macth con l'originale wrod.

Quindi, per divertimento, quale sarebbe la funzione più breve per randomizzare l'ordine delle lettere in una parola mantenendo la prima e l'ultima lettera in atto?

Ecco la mia pugnalata con JavaScript. Tutto lo spazio bianco rimosso è di 124 130 caratteri.

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 più breve è sempre il benvenuto.


  • Modifica: controllo lunghezza aggiunto. La funzione non dovrebbe fallire per parole brevi.

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

2
Sì. Restituisce esattamente la stessa cosa dell'input. In un'altra nota, cosa facciamo riguardo alla punteggiatura? Operiamo solo su parole costituite solo da lettere?
Thomas Eding,

1
@trinith non è sicuro di cosa tu stia parlando, ma idè la funzione identità. Vorrei ancora vedere la soluzione di Haskell a questo problema in meno di 100 caratteri.
Arlen,

3
Le specifiche dovrebbero essere aggiornate per richiedere una distribuzione uniforme dei risultati? Ciò non consentirebbe la soluzione Haskell a 4 caratteri. Non consentirebbe inoltre la tua soluzione Javascript di esempio (rimescolando facendo una sorta come quella non è uniforme).
Thomas Eding,

2
+1 per la prima frase: in realtà mi ci sono voluti alcuni secondi per capire che era stato scritto XP errato
Nate Koppenhaver il

Risposte:


21

Haskell, 4 personaggi

La funzione trinitis proposta corrisponde effettivamente alla specifica:

s=id

Restituisce la stringa invariata, mantenendo in posizione il primo e l'ultimo carattere e facendo una permutazione di tutti gli altri caratteri.

Se qualcuno non è soddisfatto della distribuzione di probabilità delle permutazioni, ecco una soluzione che produce una migliore distribuzione. È ovviamente molto più complesso:

Haskell, 110 120 107 caratteri

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

Un esempio di un programma che utilizza questa funzione:

main = getLine >>= s >>= putStrLn

18
"insoddisfatto della distribuzione di probabilità delle permutazioni" mi ha fatto ridere. :)
Tomalak il

@Rotsor come si chiama quella funzione?
Arlen,

Ho aggiunto un esempio al mio post.
Rotsor

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

3
La prima soluzione deve essere rimossa in quanto non si adatta ai criteri della sfida. La descrizione della sfida dice "randomizza". Secondo il meta, random non può sempre avere lo stesso output .
mbomb007,

19

J, 26 24 23 caratteri

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

Secondo le regole del golf del codice comune, non è necessario associare la frase a un nome.
FUZxxl,

#?#è un carattere più corto di?~@#
randomra

15

Rubino, 44 ​​caratteri

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

Funziona anche per parole brevi, vale a dire le parole con uno, due o tre caratteri vengono restituite inalterate.

Modifica: l' uso dell'idea array-splat di Ventero salva un altro carattere.


In realtà sono 44 caratteri. Alla fine ho trovato la stessa identica risposta perfezionando la mia, ora mi sento come un gatto poliziotto dopo aver letto la tua.
Aleksi Yrttiaho il

@ user2316 Naturalmente hai ragione. Grazie.
Howard,

11

Ruby 1.9, 46 caratteri

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

+1 Questo uso di array-splat mi ha salvato anche un carattere. Grande idea.
Howard,

Non conosco ruby ​​- fallisce sul mio ruby1.8, quindi credo di aver bisogno di una versione never? Funziona con input come 'I'?
utente sconosciuto

@utente: dice "Ruby 1.9" proprio lì. ;) - Ventero - Uno dei requisiti sensibili che ho dimenticato di menzionare è che non dovrebbe fallire per le parole di lunghezza 0 e 1. Ci dispiace.
Tomalak,

11

Golfscript

Come una "funzione" (denominata codeblock): 20 caratteri

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

Quando si opera sull'elemento più in alto nello stack: 16 caratteri

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

Non è un ottimo shuffle, ma probabilmente va bene per questo compito. (Cioè, "sembrerà abbastanza casuale".) Tuttavia, al costo di altri due caratteri, potresti ottenere un rimescolamento molto migliore sostituendolo 9con 9.?.
Ilmari Karonen,

Questo non ha esito positivo per le parole a lettera singola, e inoltre non credo che la funzione dovrebbe essere in grado di restituire stringa, matrice di stringhe, stringa (al contrario di una singola stringa).
Martin Ender,

11

C ++, 79 caratteri ( con controllo della portata )

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

C ++, 8165 caratteri ( senza controllo della portata )

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

L'uso del pass per riferimento invece di restituire il risultato fa radere altri 10 caratteri da entrambe le soluzioni.

Programma completo, leggere una stringa di parole e mescolarle convertendole:

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

Morale: non costruire ciò che è già lì. Oh, e i controlli di overflow sono per i wuss.


Bene, std::random_shufflequesto è nuovo per me. btw penso che hai dimenticato #include<string>nel tuo codice completo.
Scott Logan,

1
Qualcosa del genere è quello che avevo in mente in origine. Sfortunatamente non esiste un built-in per mescolare una stringa sul posto in JS.
Tomalak,

Non funziona per stringhe molto brevi.
utente sconosciuto

È vero, ti manca un controllo di lunghezza (anch'io). Vale la pena dare una risposta anche a BTW @ Arlen .
Tomalak,

1
@userunknown Questo è ciò che intendevo per "controlli di overflow per i wuss". Ma per essere onesti, così fanno quasi tutte le altre soluzioni.
Konrad Rudolph,

8

Python, 86 caratteri

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

Ed ecco un esempio di come usarlo:

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

Questo è il mio primo esercizio di golf in codice. Dopo aver risolto il problema, ho deciso di esaminare le risposte e non è una sorpresa che la mia risposta non sia unica. Questo è stato divertente: o)

Ho fatto una modifica dopo aver visto le altre risposte e stava cambiando la mia dichiarazione di importazione per usare un alias. Grande idea. ; O)


Eppure, la tua soluzione viene votata prima della mia! : p
stand dal

Errore nelle stringhe brevi; la mia risposta di Python sarebbe di 75 caratteri se fallisse su stringhe brevi ( 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 caratteri

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

Non c'è swap incorporato o funzione shuffle in C, quindi ho dovuto farlo manualmente :(

Programma di esempio con 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 : corretto il bug quando s consisteva in meno di 3 caratteri (grazie a user-unown per averlo notato!)


1
In glibc, esiste (era?) Una funzione di libreria non standard strfry.
Lumaca meccanica

esperienza divertente, se la nutro conchar s[] = "na"; // not anticipated
utente sconosciuto

@utente noto: ho appena modificato il codice e risolto il problema, grazie per aver notato il bug! (Ho appena aggiunto> 0 nella condizione del ciclo while, "costandomi" altri due, ma necessario, caratteri :))
Harry K.

1
@Mnailical snail: penso che strfy sia ancora in glibc.
Harry K.

7

python, 87 79 75 93 92 caratteri (gestione stringhe di lunghezza 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: Inizialmente pensava che avrebbe dovuto dividere le parole stringa (cosa che ha fatto a 128 caratteri; ora a 87 caratteri fa requisito). Argh, la mia cattiva comprensione della lettura.

EDIT 2: passa da def a lambda da def per salvare 6 caratteri. Supponendo che il campione sia già stato importato nello spazio dei nomi ( from random import sample), è possibile portarlo a ~ 60).

EDIT 3: "len (w [1: -1])" (12 caratteri) a "len (w) -2" (8 caratteri) per il bel suggerimento di gnibbler.

EDIT 4: JBernando ha salvato un carattere (aveva considerato from random import *e visto che era equivalente - non rendersi conto dello spazio in import *non è necessario) .; user unknown ha aggiunto 19 caratteri w if len(w)<4 elseper gestire correttamente le stringhe di caratteri 0 e 1.

EDIT 5: salvato un altro personaggio per il trucco di golf con codice boothby. if len(w)<4 elsea if 4>len(w)else.


Tuttavia, la domanda ha definito l'input solo come una parola, non una stringa di parole. :)
Ben Richards,

1
@ sidran32: Grazie, mio ​​cattivo. Avevo appena notato (riletto) e poi visto il tuo commento; cancellato - modificato - e non cancellato.
dr jimbob,

Idea: puoi tagliare 3 caratteri in questo modo .... def f (w): j = w [1: -1]; return w [0] + ''. join (r.sample (j, len (j))) + w [-1]
arrdem,

@rmckenzie: buona idea. Tuttavia, proprio prima di vedere il tuo commento subito dopo averlo ridotto alla funzione lambda (salvando 6 caratteri), quindi non posso più fare il tuo metodo per definire i parametri intermedi.
dr jimbob,

3
len(w)-2invece di len(w[1:-1])?
Gnibbler,

6

C ++, 111 97 caratteri

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

Ecco un programma completo per coloro che desiderano testarlo:

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

modificare

Realizzato non è necessario casualmente entrambi gli indici di scambio, salvato una variabile e qualche altro carattere.


Eccellente. La maggior parte delle soluzioni fallisce con input molto piccoli. Tuo no.
utente sconosciuto

6

php (68 caratteri)

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

più breve (60 caratteri)

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

+1 Molto bello. :) In realtà, potresti eliminare il trim () e nella regex puoi rimuovere le ancore e usarle al .posto di \w.
Tomalak,

@Tomalak Suggerito Provo a riscrivere questa soluzione in Perl. Tra cui i suoi suggerimenti, ho ottenuto questo: use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}Ecco 87 caratteri . Senza la linea di utilizzo, ha 62 caratteri .
Ben Richards,

Potete fornire una demo di questo funzionamento? Perché non posso ...
Steve Robbins,

6

Perl - 96 (o 71) caratteri 84 (o 59) caratteri

Questo è quello che mi è venuto in mente in Perl. Sono passati in diversi modi per farlo, ma questo sembrava il più breve rispetto a quello che riesco a pensare finora, con 97 personaggi.

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

Tuttavia, se tagli la linea "use" (che suppongo sia valida, dal momento che altri hanno escluso le righe #include nei loro programmi C) posso ridurla ulteriormente a 71 caratteri :

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

EDIT Mi è stato suggerito di provare a implementare il metodo di @tobius. In questo modo sono arrivato a 84 caratteri , o rimuovendo la riga d' uso , 59 caratteri :

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

2
abbreviato la tua versione fino a 87:use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
mbx

1
@ sidran32 Puoi implementare Perl una variante della risposta di @tobius , solo per confronto?
Tomalak,

@Tomalak Certo, lo proverò.
Ben Richards,

1
abbreviato la tua versione regex di 3 caratteri:use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
mbx

Bello. Sono troppo abituato a usare un aiuto colmo di parentesi per chiarezza. Cattiva abitudine durante il golf. : P
Ben Richards,

5

Rubino, 77 75 caratteri

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

La mia soluzione Scala in un linguaggio leggermente meno prolisso. Non sono affatto un esperto di Ruby, quindi probabilmente c'è spazio per miglioramenti.


Wow. Funziona con "I", come soluzione per la scala.
utente sconosciuto

5

Ruby 1.9, 77 48 46 44 caratteri

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

Disclaimer: l'ho sintonizzato sulla base della risposta con il punteggio più alto - più tardi ho notato la stessa risposta esatta. Puoi controllare la storia che ho mantenuto fedele alla mia idea originale, ma cambiata da ruby ​​1.8 a ruby ​​1.9 per lambda corte e shuffle.

Se sono consentite parole vuote, allora 56 54 caratteri

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

Nessuno si aspetta l'io spagnolo.
utente sconosciuto

Tentativo di gestire anche i casi con 0 o 1 lettere
Aleksi Yrttiaho

5

Python 3, 94 93 91 caratteri

Usando una tecnica diversa. Potrebbe funzionare anche in 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

Il ... if x[0:-1] else xxse la sua lunghezza è di 1 (altrimenti sarebbe essere duplicato). La funzione funziona quindi per stringhe di lunghezza 0 e 1.

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

Dato che è un'espressione, possiamo usare un lambda(eliminando return, defe una coppia di parentesi).

Modifica: from random import* per salvare 1 carattere, dopo l'altro invio di Python.


Io so Sono così così così tardi qui, ma posso x[0:-1]diventare x[:-1]?
Zacharý,

4

JavaScript - 118 122 caratteri

JavaScript più breve: 118 caratteri senza spazi bianchi. Utilizza approssimativamente lo stesso algoritmo dell'OP, ma con meno concatenamenti. Ho provato molta ricorsione e ho provato qualche iterazione, ma tutti tendono a impantanarsi in un modo o nell'altro.

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

Non supera il test I'.
utente sconosciuto

@Ryan L'utilizzo return z?a+...+z:w;come controllo di lunghezza implicito sarebbe in ordine. Il presupposto silenzioso era che la funzione avrebbe ricevuto solo parole "valide".
Tomalak,

Un buon punto, tranne per il fatto che w è stato modificato, quindi devo usarlo anel elseternario. Modificato e fino a 122 caratteri.
Ryan Kinal,

@Ryan: credo che asarebbe sbagliato per l'inserimento di due lettere. : - \ Accidenti la prossima volta definirò i requisiti più attentamente.
Tomalak,

Non penso che, in realtà. zsarà indefinito solo se la parola è una lettera (o meno).
Ryan Kinal,

4

D, 62 caratteri

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

va bene ho imbrogliato con un normale array di caratteri invece di una stringa reale (che è un carattere immutabile [], quindi nessun rimescolamento sul posto)

modifica con un controllo di lunghezza ne richiede altri 14

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

E restituisce cosa per un input come 'I'?
utente sconosciuto

Sarebbe più giusto (= meglio comparabile) restituire il risultato.
Konrad Rudolph,

@utente un errore di intervallo. @ konrad che richiederebbe return s;e char [] restituirà altri 11 caratteri
maniaco del cricchetto

@ratchet Potresti pubblicare l'intero programma, per favore? A proposito, non capisco perché stai contando import std.random;, e non solo la funzione.
Arlen,

Immagino che potresti risparmiare 1 byte usando omettendo lo spazio in char[] s(per renderlo char[]s), ma non uso D da anni.
Tim Čas,

4

php 5.3 (60 caratteri)

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

Migliorato a 56 caratteri e non richiede più la versione 5.3:

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

+1 bella alternativa all'altra risposta PHP. Non più breve, ma nessun regex è un vantaggio.
Tomalak,

Aggiornato con una soluzione più breve che non richiede la versione 5.3
migimaru

La vecchia versione non è corretta: restituisce truestringhe brevi.
Tito,

3

Perl - 111 caratteri (senza utilizzare alcuna funzione di libreria)

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}

Utilizzo :

$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

Pitone

Sono 90 89 112 caratteri di Python!

Modifica 1: come funzione questa volta!

(grazie gnibbler)

Modifica 2: ora gestisce parole brevi

(grazie utente sconosciuto)

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]

ancor meno se segui le specifiche e scrivi una funzione :)
gnibbler

ah, misericordia non funziona con le stringhe
gnibbler

1
Il modulo casuale è come me in un locale notturno ... entrambi abbiamo una sorta di shuffle sul posto! :)
Andbdrew,

Non funziona per input come 'I'; ritorna "II".
utente sconosciuto

Grazie! ora gestisce parole brevi, ma è leggermente più lungo :)
Andbdrew

3

Scala, 135 139 142 156 caratteri

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: rimosso ': String' (il tipo restituito può essere dedotto)
-7: rimosso 'ritorno' (l'ultima espressione è il valore restituito)
-3: fattorizzato s.size-2out
-4: toCharArray->toArray


Funziona con "I" e "Verwürfel" senza fantasiosi personaggi Python. :) Tuttavia, la mia soluzione usando 'shuffle' è un po 'più breve.
utente sconosciuto

@utente sconosciuto Grazie per le modifiche :-)
Gareth

3

Python, 86 caratteri

Slnicig è sicuro, quindi nessun bnouds ckhnceig è neeacrssy. Wkros su tutti i 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 caratteri

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

programma completo:

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

La codifica hardware nella stringa di input è legale?
Thomas Eding,

@trinithis Pensavo che fossimo interessati solo alla funzione stessa. Il programma mostra solo come utilizzare la funzione. Indipendentemente da ciò, la codifica non rigida dell'input non farebbe differenza in questo caso; aggiungistring s; cin >> s;
Arlen il

3

Ruby 1.9, 43 caratteri

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

Non funziona ancora per stringhe di 1 carattere (duplica quel carattere) e non funziona per String vuota.



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

Uso:

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"

la funzione seguente funziona con parole di lunghezza inferiore a 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"

Parte del compito non era spostare la prima e l'ultima lettera.
Tomalak,

@Tomalak fixed!
Paolo

Funziona con parole inferiori alla lunghezza di 3?
Tomalak,

@Tomalak Ora dovrebbe essere ok! Grazie per le correzioni!
Paolo

3

Python, 102 caratteri

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]

Nessuna importazione! Funziona con parole di 1 carattere e oltre. Questa è la mia prima entrata nel golf e sono stato ispirato dall'entrata di BlueEyedBeast dal codice più breve per produrre un output non deterministico per l'idea di usare id (Object) .


Spiegazione: Crea un elenco di lettere dall'input escludendo il primo e l'ultimo, e si apre ripetutamente da questo elenco e si aggiunge a uno nuovo fino a quando non è vuoto. L'indice da cui viene visualizzato è id (7)% len (elenco da cui stiamo saltando fuori). Poiché id (7) è l'indirizzo di memoria dell'oggetto 7, è essenzialmente casuale. Quindi ora abbiamo un elenco di lettere casualmente criptate dal centro dell'input originale. Tutto ciò che facciamo ora è aggiungere la prima e l'ultima lettera dell'output originale di conseguenza e abbiamo ottenuto l'output che vogliamo: (prima lettera) + (mezzo criptato) + (ultima lettera).


3

R, 95 92 91 caratteri

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

Utilizza la valutazione pigra di R per calcolare aeb come parametri di funzione, risparmiando spazio con il riutilizzo in seguito. Inoltre, diversamente dalle altre risposte R, questo funziona per tutte le parole> 1 carattere lungo. Esempio sotto:

> f("hippopotamus")
hpuoopaitmps

> f("dog")
dog

> f("az")
az

Modificare: Sostituito unlist()con[[]] Sostituito [[1]] con el ()


2

D: 55 caratteri

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

programma completo:

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

Penso che else smanchi la parte?
Tomalak,

1
@Tomalak No, non lo è, perché non ce n'è bisogno. Se la stringa è di lunghezza 2 o inferiore, la lasciamo sola. Inoltre, randomShuffle()è sul posto.
Arlen,

Wow, D essere competitivo. Penso che randomShuffle(s[1..$-1])possa essere s[1..$-1].randomShuffleIIRC (a meno che non sia in una versione D più vecchia di questo post)
Zacharý

2

Erlang, 188 172 132 caratteri

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

Sto ancora imparando Erlang, quindi sono apprezzati tutti i suggerimenti per rendere questo più corto.

codice completo (modulo 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).

modificare

Ha preso la parte shuffle come una funzione separata che non richiede più il passaggio della testa e della coda della lista.

Modifica 2

Ristrutturato per rimuovere uno dei fmodelli di funzione, modificato la funzione shuffle per accettare solo due parametri, modificato lists:deleteper --[], scambiato una lists:reversechiamata per unlists:last

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.