Wie man Buchstaben in einem Wort zufällig sortiert


55

Einer umstrittenen Geschichte zufolge ist der Unterschied zwischen den Buchstaben in einem Schriftstück nicht viel für das Wort, ebenso wenig wie die ersten und letzten Buchstaben mit dem ursprünglichen Schriftstück.

Also, zum Spaß, was wäre die kürzeste Funktion, um die Buchstabenreihenfolge in einem Wort zufällig zu ordnen, während der erste und der letzte Buchstabe an Ort und Stelle bleiben?

Hier ist mein Versuch mit JavaScript. Alle Leerzeichen entfernt es ist bei 124 130 Zeichen.

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

Kürzere JavaScript immer willkommen.


  • Bearbeiten: Längenprüfung hinzugefügt. Die Funktion sollte für kurze Wörter nicht fehlschlagen.

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

2
Ja. Es gibt genau das Gleiche wie die Eingabe zurück. Was tun wir im Übrigen gegen die Zeichensetzung? Wirken wir nur mit Wörtern, die nur aus Buchstaben bestehen?
Thomas Eding

1
@trinithist nicht sicher, wovon du sprichst, aber es idist die Identitätsfunktion. Ich würde immer noch gerne sehen, dass Haskell dieses Problem in weniger als 100 Zeichen löst.
Arlen

3
Sollte die Spezifikation aktualisiert werden, um eine einheitliche Verteilung der Ergebnisse zu fordern? Dies würde die 4-stellige Haskell-Lösung nicht zulassen. Es würde auch Ihre Beispiel-Javascript-Lösung verbieten (Mischen durch Ausführen einer solchen Sortierung ist nicht einheitlich).
Thomas Eding

2
+1 für den ersten Satz: Ich habe tatsächlich ein paar Sekunden gebraucht, um zu erkennen, dass es sich um eine falsche XP handelt
Nate Koppenhaver

Antworten:


21

Haskell, 4 Zeichen

Der vorgeschlagene Funktions-Trinith stimmt tatsächlich mit der Spezifikation überein:

s=id

Es gibt die Zeichenfolge unverändert, so dass das erste und letztes Zeichen an Ort und Stelle zu halten und dabei eine Permutation aller anderen Zeichen.

Wenn jemand mit der Wahrscheinlichkeitsverteilung der Permutationen unzufrieden ist, ist hier eine Lösung, die eine bessere Verteilung ergibt. Es ist offensichtlich viel komplexer:

Haskell, 110 120 107 Zeichen

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

Ein Beispiel für ein Programm, das diese Funktion verwendet:

main = getLine >>= s >>= putStrLn

18
"Unzufrieden mit der Wahrscheinlichkeitsverteilung der Permutationen" brachte mich zum Lachen. :)
Tomalak

@Rotsor wie rufst du diese Funktion auf?
Arlen

Ich habe meinem Beitrag ein Beispiel hinzugefügt.
Rotsor

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

3
Die erste Lösung sollte entfernt werden, da sie nicht den Herausforderungskriterien entspricht. Die Herausforderungsbeschreibung lautet "Randomize". Zufall kann laut Meta nicht immer die gleiche Ausgabe haben .
mbomb007

19

J, 26 24 23 Zeichen

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

Gemäß den allgemeinen Golfregeln müssen Sie die Phrase nicht an einen Namen binden.
FUZxxl

#?#ist ein char kürzer als?~@#
randomra

15

Ruby, 44 Zeichen

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

Funktioniert auch für kurze Wörter, dh Wörter mit einem, zwei oder drei Zeichen werden unverändert zurückgegeben.

Bearbeiten: Mit der Array-Splat-Idee von Ventero wird ein weiteres Zeichen gespeichert.


Das sind eigentlich 44 Zeichen. Letztendlich habe ich genau die gleiche Antwort gefunden, indem ich meine eigene Feinabstimmung vorgenommen habe - jetzt fühle ich mich wie eine Nachahmerin, nachdem ich Ihre gelesen habe.
Aleksi Yrttiaho

@ user2316 Natürlich hast du recht. Danke.
Howard

11

Ruby 1.9, 46 Zeichen

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

+1 Diese Verwendung von Array-Splat hat mir auch ein Zeichen erspart. Großartige Idee.
Howard

Ich kenne Ruby nicht - es schlägt bei meinem Ruby 1.8 fehl, also brauche ich wohl eine Never-Version? Funktioniert es mit Eingaben wie 'I'?
Benutzer unbekannt

@user: Hier steht "Ruby 1.9". ;) - Ventero - Eine der vernünftigen Anforderungen, die ich vergessen habe, ist, dass es für die Wortlängen 0 und 1 nicht scheitern sollte. Entschuldigung.
Tomalak

11

Golfscript

Als "Funktion" (benannter Codeblock): 20 Zeichen

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

Wenn Sie mit dem obersten Element auf dem Stapel arbeiten: 16 Zeichen

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

Das ist kein sehr gutes Shuffle, aber wahrscheinlich in Ordnung für diese Aufgabe. (Das heißt, es wird „aussehen zufällig genug“.) Noch auf Kosten von zwei weiteren Zeichen, könnten Sie eine bekommen viel besser Shuffle durch den Ersatz 9mit 9.?.
Ilmari Karonen

Dies schlägt bei Wörtern mit einem Buchstaben fehl, und ich glaube auch nicht, dass die Funktion Zeichenfolge, Array von Zeichenfolgen, Zeichenfolge (im Gegensatz zu einer einzelnen Zeichenfolge) zurückgeben darf.
Martin Ender

11

C ++, 79 Zeichen ( mit Bereichsprüfung )

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

C ++, 8165 Zeichen ( ohne Bereichsprüfung )

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

Durch die Verwendung der Referenzübergabe anstelle der Rückgabe des Ergebnisses werden weitere 10 Zeichen aus beiden Lösungen entfernt.

Volles Programm, eine Reihe von Wörtern lesen und diese mischen:

#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: Bauen Sie nicht, was schon da ist. Oh, und Überlaufprüfungen sind für Probleme.


Schön, std::random_shuffledas ist neu für mich. Übrigens, ich glaube, Sie haben #include<string>Ihren vollständigen Code vergessen .
Scott Logan

1
So etwas hatte ich ursprünglich im Sinn. Leider ist in JS keine Funktion zum Mischen eines Strings integriert.
Tomalak

Schlägt bei sehr kurzen Saiten fehl.
Benutzer unbekannt

Das stimmt, Ihnen fehlt eine Längenprüfung (das habe ich auch getan). Die Antwort von BTW @ Arlen ist auch einen Blick wert.
Tomalak

1
@userunknown Das ist, was ich mit "Überlaufprüfungen sind für Probleme" gemeint habe. Aber um fair zu sein, tun dies fast alle anderen Lösungen.
Konrad Rudolph

8

Python, 86 Zeichen

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

Und hier ist ein Beispiel für die Verwendung:

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

Dies ist meine erste Code-Golfübung. Nachdem ich das Problem gelöst hatte, beschloss ich, mir die Antworten anzuschauen, und es ist keine Überraschung, dass meine Antwort nicht eindeutig ist. Das hat Spaß gemacht: o)

Ich habe eine Änderung vorgenommen, nachdem ich mir die anderen Antworten angesehen hatte, und dabei wurde meine Importanweisung geändert, um einen Alias ​​zu verwenden. Großartige Idee. ;O)


Und doch wird Ihre Lösung vor meiner gewählt! : p
boothby

Scheitert an kurzen Saiten; Meine Python-Antwort wäre 75 Zeichen, wenn sie auf kurzen Strings ( from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]) fehlschlagen würde .
Dr. Jimbob

7

C (K & R) - 88 86 87 Zeichen

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

Es gibt keine eingebaute Swap- oder Shuffle-Funktion in C, daher musste ich es manuell machen :(

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

BEARBEITEN : Behebung des Fehlers, wenn s aus weniger als 3 Zeichen besteht (dank des Unbekannten, der es bemerkt hat!)


1
In glibc gibt es (was?) Eine nicht standardmäßige Bibliotheksfunktion strfry.
Mechanische Schnecke

lustiges erlebnis, wenn ich es mit char s[] = "na"; // not anticipated
user unbekannt

@user uknown: Ich habe den Code gerade bearbeitet und korrigiert, danke, dass Sie den Fehler bemerkt haben! (Ich habe gerade> 0 im Zustand der while-Schleife hinzugefügt, "kostet mich" zwei weitere, aber benötigte Zeichen :))
Harry K.

1
@Mechanical Schnecke: Ich denke, strfy ist immer noch in glibc.
Harry K.

7

Python, 87 79 75 93 92 Zeichen (für Saiten mit einer Länge von 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: Ursprünglich dachte, es sollte Zeichenfolgenwörter aufteilen (was es bei 128 Zeichen tat; jetzt bei 87 Zeichen ist erforderlich). Argh, mein schlechtes Leseverständnis.

EDIT 2: Wechseln Sie von def zur Lambda-Funktion von def, um 6 Zeichen zu sparen. Angenommen, das Sample ist bereits in den Namespace importiert ( from random import sample), könnte dies auf ~ 60 reduzieren).

EDIT 3: "len (w [1: -1])" (12 Zeichen) bis "len (w) -2" (8 Zeichen) pro netter Vorschlag des Knabbers.

EDIT 4: JBernando speicherte ein Zeichen (hatte from random import *es als äquivalent angesehen - es ist nicht import *notwendig , den Platz in zu realisieren ); Unbekannter Benutzer hat 19 Zeichen hinzugefügt w if len(w)<4 else, um die Zeichenfolgen 0 und 1 korrekt zu behandeln.

EDIT 5: Ein weiterer Char per Boothby-Code-Golf-Trick wurde gespeichert. if len(w)<4 elsezu if 4>len(w)else.


Die Frage definierte die Eingabe jedoch nur als Wort, nicht als Wortfolge. :)
Ben Richards

1
@ sidran32: Danke, meine schlechte. Ich hatte es gerade bemerkt (beim erneuten Lesen) und dann Ihren Kommentar gesehen. gelöscht - bearbeitet - und nicht gelöscht.
Dr. Jimbob

Idee - Sie können 3 Zeichen zuschneiden, indem Sie dies tun ... def f (w): j = w [1: -1]; return w [0] + ''. join (r.Beispiel (j, len (j))) + w [-1]
arrdem

@ rmckenzie: Gute Idee. Kurz bevor ich Ihren Kommentar gesehen habe, nachdem ich ihn auf die Lambda-Funktion getrimmt habe (um 6 Zeichen zu sparen), kann ich Ihre Methode zur Definition von Zwischenvariablen nicht mehr ausführen.
Dr. Jimbob

3
len(w)-2statt len(w[1:-1])?
Gnibbler

6

C ++, 111 97 Zeichen

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

Hier ist ein vollständiges Programm für diejenigen, die es testen möchten:

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

Bearbeiten

Es wurde erkannt, dass es nicht notwendig ist, beide Auslagerungsindizes nach dem Zufallsprinzip zu vertauschen, eine Variable und einige weitere Zeichen zu speichern.


Ausgezeichnet. Die meisten Lösungen scheitern bei sehr kleinen Eingaben. Dein nicht.
Benutzer unbekannt

6

PHP (68 Zeichen)

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

kürzer (60 Zeichen)

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

+1 Sehr schön. :) Sie könnten die trim () tatsächlich fallen lassen, und in der Regex können Sie die Anker entfernen und .anstelle von verwenden \w.
Tomalak

@Tomalak Empfohlen Ich versuche, diese Lösung in Perl umzuschreiben. Mit seinen Vorschlägen habe ich folgendes verstanden: use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}Das sind 87 Zeichen . Ohne die Use Line sind es 62 Zeichen .
Ben Richards

Können Sie eine Demo dieser Funktion bereitstellen? Weil ich nicht ...
Steve Robbins

6

Perl - 96 (oder 71) Zeichen 84 (oder 59) Zeichen

Das habe ich mir in Perl ausgedacht. Ich habe ein paar verschiedene Methoden durchlaufen, aber dies schien mir mit 97 Zeichen die kürzeste zu sein, von der ich bisher denken konnte.

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

Wenn Sie jedoch die 'use'-Zeile ausschneiden (was meiner Meinung nach gültig ist, da andere #include-Zeilen in ihren C-Programmen ausschließen), kann ich sie weiter auf 71 Zeichen reduzieren :

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

BEARBEITEN Es wurde vorgeschlagen, diese Methode von @tobius zu implementieren. Auf diese Weise habe ich es auf 84 Zeichen reduziert oder durch Entfernen der Verwendungszeile auf 59 Zeichen :

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

2
verkürzte deine Version auf 87:use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
mbx

1
@ sidran32 Kannst du Perl eine Variante von @tobius 'Antwort implementieren , nur zum Vergleich?
Tomalak

@ Tomalak Sicher, ich werde es ausprobieren.
Ben Richards

1
verkürzt deine Regex-Version um 3 Zeichen:use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
mbx

Nett. Ich bin es auch gewohnt, aus Gründen der Klarheit eine gehäufte Portion Klammern zu verwenden. Schlechte Angewohnheit beim Golfen. : P
Ben Richards

5

Ruby, 77 75 Zeichen

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

Meine Scala-Lösung in einer etwas weniger ausführlichen Sprache. Ich bin in keiner Weise ein Ruby-Experte, daher gibt es wahrscheinlich Raum für Verbesserungen.


Beeindruckend. Funktioniert mit "Ich" als Ihre Scala-Lösung.
Benutzer unbekannt

5

Ruby 1,9, 77 48 46 44 Zeichen

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

Haftungsausschluss: Ich habe dies basierend auf der bestplatzierten Antwort abgestimmt - habe später genau dieselbe Antwort bemerkt. Sie können die Geschichte überprüfen, die ich meiner ursprünglichen Idee treu gehalten habe, aber für kurze Lambdas und von Ruby 1.8 auf Ruby 1.9 geändert habe shuffle.

Wenn leere Wörter erlaubt sind, dann 56 54 Zeichen

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

Niemand erwartet das spanische Ich.
Benutzer unbekannt

Es wurde versucht, auch Fälle mit 0 oder 1 Buchstaben zu bearbeiten
Aleksi Yrttiaho

5

Python 3, 94 93 91 Zeichen

Mit einer anderen Technik. Funktioniert möglicherweise auch 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

Das ... if x[0:-1] else xergibt, xwenn seine Länge 1 ist (sonst würde es dupliziert werden). Die Funktion funktioniert dabei für Strings der Länge 0 und 1.

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

Da es ein Ausdruck ist, können wir eine verwenden lambda(Beseitigung return, defund ein Paar von Klammern).

Bearbeiten: from random import* um 1 Zeichen nach der anderen Python-Übermittlung zu speichern.


Ich weiß, ich bin so spät hier, aber kann es x[0:-1]werden x[:-1]?
Zacharý

4

JavaScript - 118 122 Zeichen

Kürzere JavaScript - 118 Zeichen ohne Leerzeichen. Verwendet ungefähr den gleichen Algorithmus wie das OP, jedoch mit weniger Verkettung. Ich habe eine Menge Rekursionen versucht, und ich habe einige Iterationen versucht, aber alle neigen dazu, auf die eine oder andere Weise festzusacken.

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

Besteht den 'I'-Test nicht.
Benutzer unbekannt

@ Ryan return z?a+...+z:w;Als implizite Längenprüfung wäre in Ordnung. Die stille Annahme war, dass die Funktion nur "gültige" Wörter erhalten würde.
Tomalak

Guter Punkt, mit der Ausnahme , dass w geändert wurde, so habe ich verwenden , ain der elseder ternären. Bearbeitet und bis zu 122 Zeichen.
Ryan Kinal

@ Ryan: Ich glaube a, für die Eingabe von zwei Buchstaben wäre das falsch. : - \ Verdammt, beim nächsten Mal werde ich die Anforderungen genauer auslegen.
Tomalak

Das glaube ich eigentlich nicht. zwird nur undefiniert sein, wenn das Wort ein Buchstabe (oder weniger) ist.
Ryan Kinal

4

D 62 Zeichen

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

okay, ich habe mit einem normalen char-Array betrogen, anstatt mit einem echten String (der unveränderlich char [] ist, also kein direktes Mischen)

Mit einem Längencheck bearbeiten , es werden 14 weitere benötigt

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

Und es gibt was für eine Eingabe wie 'I' zurück?
Benutzer unbekannt

Es wäre fairer (= besser vergleichbar), das Ergebnis zurückzugeben.
Konrad Rudolph

@user einen Bereichsfehler. @ Konrad, die erfordern würde return s;und char [] Typ 11 mehr Zeichen zurückgeben
Ratschenfreak

@ratchet Könnten Sie bitte das gesamte Programm posten? Übrigens verstehe ich nicht, warum Sie zählen import std.random;und nicht nur die Funktion.
Arlen

Ich vermute, Sie könnten 1 Byte sparen, indem Sie den Platz weglassen char[] s(um es zu machen char[]s), aber ich habe D seit Jahren nicht mehr verwendet.
Tim Čas

4

PHP 5.3 (60 Zeichen)

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

Verbessert auf 56 Zeichen und benötigt keine Version 5.3 mehr:

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

+1 nette Alternative zur anderen PHP-Antwort. Nicht kürzer, aber kein Regex ist ein Plus.
Tomalak

Aktualisiert mit einer kürzeren Lösung, die keine Version 5.3 erfordert
Migimaru

Die alte Version ist nicht korrekt: Gibt truefür kurze Zeichenfolgen zurück.
Titus

3

Perl - 111 Zeichen (ohne Bibliotheksfunktion)

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}

Verwendung :

$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

Python

Es ist 90 89 112 Zeichen von Python!

Edit 1: diesmal als Funktion!

(danke gnibbler)

Edit 2: Behandelt jetzt kurze Wörter

(danke Benutzer unbekannt)

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]

Noch weniger, wenn Sie der Spezifikation folgen und eine Funktion schreiben :)
Gnibbler

ah, schade, shuffle funktioniert nicht auf Saiten
Gnibbler

1
Das Zufallsmodul ist wie ich in einem Nachtclub ... wir mischen beide einfach irgendwie an Ort und Stelle! :)
Andbdrew

Funktioniert nicht für Eingaben wie 'I'; return 'II'.
Benutzer unbekannt

Vielen Dank! Es behandelt jetzt kurze Wörter, ist aber etwas länger :)
Andbdrew

3

Scala, 135 139 142 156 Zeichen

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: 'entfernt: String' (Rückgabetyp abgeleitet werden kann)
-7: entfernt 'Rückkehr' (letzter Ausdruck ist der Rückgabewert)
-3: einkalkuliert s.size-2out
-4: toCharArray->toArray


Funktioniert mit 'I' und 'Verwürfel' ohne ausgefallene Python-Charaktere. :) Meine Lösung mit 'shuffle' ist jedoch etwas kürzer.
Benutzer unbekannt

@user unbekannt Vielen Dank für die Änderungen :-)
Gareth

3

Python, 86 Zeichen

Slnicig ist sicher, also ist kein bnouds ckhnceig neeacrssy. Wkros auf allen Beinen.

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 Zeichen

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

Volles Programm:

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

Ist eine feste Kodierung in der Eingabezeichenfolge zulässig?
Thomas Eding

@ Trinithis Ich dachte, wir waren nur mit der Funktion selbst beschäftigt. Das Programm zeigt nur die Verwendung der Funktion. Unabhängig davon würde eine nicht harte Codierung der Eingabe in diesem Fall keinen Unterschied machen. einfach hinzufügenstring s; cin >> s;
Arlen

3

Ruby 1.9, 43 Zeichen

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

Funktioniert noch nicht für Zeichenfolgen mit einer Zeichenlänge (dupliziert dieses Zeichen) und schlägt für leere Zeichenfolgen fehl.



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

Verwendungszweck:

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"

Die folgende Funktion funktioniert mit Wörtern mit einer Länge von weniger als 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"

Ein Teil der Aufgabe bestand darin, den ersten und den letzten Buchstaben nicht zu verschieben.
Tomalak

@ Tomalak behoben!
Paolo

Funktioniert es mit Wörtern unter der Länge von 3?
Tomalak

@Tomalak Nun sollte es ok sein! Danke für die Korrekturen!
Paolo

3

Python, 102 Zeichen

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]

Keine Importe! Funktioniert für Wörter ab 1 Zeichen. Dies ist mein erster Golfeintrag und ich wurde von BlueEyedBeasts Eintrag aus Shortest Code inspiriert , um eine nicht deterministische Ausgabe für die Idee der Verwendung von id (Object) zu erzeugen .


Erläuterung: Es wird eine Liste von Buchstaben aus der Eingabe erstellt, wobei der erste und der letzte Buchstabe ausgenommen sind. Diese Liste wird wiederholt aufgerufen und an einen neuen angehängt, bis sie leer ist. Der Index, aus dem es herausspringt, ist id (7)% len (Liste, aus der wir herausspringen). Da id (7) die Speicheradresse des Objekts 7 ist, ist es im Wesentlichen zufällig. Jetzt haben wir eine Liste von zufällig verschlüsselten Buchstaben aus der Mitte der ursprünglichen Eingabe. Jetzt müssen wir nur noch den ersten und den letzten Buchstaben der Originalausgabe anhängen und haben die gewünschte Ausgabe: (erster Buchstabe) + (durcheinandergemischte Mitte) + (letzter Buchstabe).


3

R, 95 92 91 Zeichen

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

Nutzt die verzögerte Auswertung von R, um a und b als Funktionsparameter zu berechnen, und spart Platz bei der späteren Wiederverwendung. Auch im Gegensatz zu anderen R-Antworten funktioniert dies für alle Wörter> 1 Zeichen lang. Beispiel unten:

> f("hippopotamus")
hpuoopaitmps

> f("dog")
dog

> f("az")
az

Bearbeiten: Ersetzt unlist()durch[[]] Ersetzt [[1]] durch el ()


2

D: 55 Zeichen

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

Volles Programm:

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

Ich denke, das else sTeil fehlt?
Tomalak

1
@Tomalak Nein, ist es nicht, weil es keine Notwendigkeit dafür gibt. Wenn der String eine Länge von 2 oder weniger hat, lassen wir ihn in Ruhe. Ist auch vorhanden randomShuffle().
Arlen

Wow, D ist wettbewerbsfähig. Ich denke, randomShuffle(s[1..$-1])kann s[1..$-1].randomShuffleIIRC sein (es sei denn, das ist in einer D-Version älter als dieser Beitrag)
Zacharý

2

Erlang, 188 172 132 Zeichen

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

Ich lerne immer noch Erlang, daher sind alle Tipps zur Verkürzung willkommen.

vollständiger Code (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).

Bearbeiten

Nahm den Shuffle-Teil als separate Funktion heraus, die nicht länger erfordert, dass der Kopf und der Schwanz der Liste herumgereicht werden.

Bearbeiten 2

Umstrukturiert einen der entfernen fFunktion Muster änderten die Shuffle - Funktion nur zwei Parameter zu akzeptieren, geändert lists:deletefür --[]einen tauschte lists:reverseAnruf für einlists:last

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.