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.
r=id
.id
ist die Identitätsfunktion. Ich würde immer noch gerne sehen, dass Haskell dieses Problem in weniger als 100 Zeichen löst.Antworten:
Haskell, 4 Zeichen
Der vorgeschlagene Funktions-Trinith stimmt tatsächlich mit der Spezifikation überein:
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,
110120107 ZeichenEin Beispiel für ein Programm, das diese Funktion verwendet:
quelle
fmap((a:t!!i:).tail)
J,
262423 Zeichenquelle
#?#
ist ein char kürzer als?~@#
Ruby, 44 Zeichen
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.
quelle
Ruby 1.9, 46 Zeichen
quelle
Golfscript
Als "Funktion" (benannter Codeblock): 20 Zeichen
Wenn Sie mit dem obersten Element auf dem Stapel arbeiten: 16 Zeichen
quelle
9
mit9.?
.C ++, 79 Zeichen ( mit Bereichsprüfung )
C ++,
8165 Zeichen ( ohne Bereichsprüfung )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:
Moral: Bauen Sie nicht, was schon da ist.
Oh, und Überlaufprüfungen sind für Probleme.quelle
std::random_shuffle
das ist neu für mich. Übrigens, ich glaube, Sie haben#include<string>
Ihren vollständigen Code vergessen .Python, 86 Zeichen
Und hier ist ein Beispiel für die Verwendung:
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)
quelle
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
) fehlschlagen würde .C (K & R) - 88
8687ZeichenEs gibt keine eingebaute Swap- oder Shuffle-Funktion in C, daher musste ich es manuell machen :(
Beispielprogramm mit Ungolfed r ():
BEARBEITEN : Behebung des Fehlers, wenn s aus weniger als 3 Zeichen besteht (dank des Unbekannten, der es bemerkt hat!)
quelle
strfry
.char s[] = "na"; // not anticipated
Python,
8779759392 Zeichen (für Saiten mit einer Länge von 0,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 nichtimport *
notwendig , den Platz in zu realisieren ); Unbekannter Benutzer hat 19 Zeichen hinzugefügtw 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 else
zuif 4>len(w)else
.quelle
len(w)-2
stattlen(w[1:-1])
?C ++,
11197 ZeichenHier ist ein vollständiges Programm für diejenigen, die es testen möchten:
Bearbeiten
Es wurde erkannt, dass es nicht notwendig ist, beide Auslagerungsindizes nach dem Zufallsprinzip zu vertauschen, eine Variable und einige weitere Zeichen zu speichern.
quelle
PHP (68 Zeichen)
kürzer (60 Zeichen)
quelle
.
anstelle von verwenden\w
.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 .Perl -
96 (oder 71) Zeichen84 (oder 59) ZeichenDas 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.
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 :
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 :
quelle
use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
Ruby,
7775 ZeichenMeine 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.
quelle
Ruby 1,9,
77484644 ZeichenHaftungsausschluss: 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
5654 Zeichenquelle
Python 3,
949391 ZeichenMit einer anderen Technik. Funktioniert möglicherweise auch in Python 2.
Das
... if x[0:-1] else x
ergibt,x
wenn 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
(Beseitigungreturn
,def
und ein Paar von Klammern).Bearbeiten:
from random import*
um 1 Zeichen nach der anderen Python-Übermittlung zu speichern.quelle
x[0:-1]
werdenx[:-1]
?JavaScript -
118122 ZeichenKü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.
quelle
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.a
in derelse
der ternären. Bearbeitet und bis zu 122 Zeichen.a
, für die Eingabe von zwei Buchstaben wäre das falsch. : - \ Verdammt, beim nächsten Mal werde ich die Anforderungen genauer auslegen.z
wird nur undefiniert sein, wenn das Wort ein Buchstabe (oder weniger) ist.D 62 Zeichen
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
quelle
return s;
und char [] Typ 11 mehr Zeichen zurückgebenimport std.random;
und nicht nur die Funktion.char[] s
(um es zu machenchar[]s
), aber ich habe D seit Jahren nicht mehr verwendet.PHP 5.3 (60 Zeichen)
Verbessert auf 56 Zeichen und benötigt keine Version 5.3 mehr:
quelle
true
für kurze Zeichenfolgen zurück.Perl - 111 Zeichen (ohne Bibliotheksfunktion)
Verwendung :
quelle
Python
Es ist
9089112 Zeichen von Python!Edit 1: diesmal als Funktion!
(danke gnibbler)Edit 2: Behandelt jetzt kurze Wörter
(danke Benutzer unbekannt)quelle
Scala, 135
139142156Zeichen-7: 'entfernt: String' (Rückgabetyp abgeleitet werden kann)
-7: entfernt 'Rückkehr' (letzter Ausdruck ist der Rückgabewert)
-3: einkalkuliert
s.size-2
out-4:
toCharArray
->toArray
quelle
Python, 86 Zeichen
Slnicig ist sicher, also ist kein bnouds ckhnceig neeacrssy. Wkros auf allen Beinen.
quelle
C ++ 11: -
6866 ZeichenVolles Programm:
quelle
string s; cin >> s;
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.
quelle
Python - 76 Zeichen
quelle
R 104 (126)
Verwendungszweck:
Die folgende Funktion funktioniert mit Wörtern mit einer Länge von weniger als 3:
quelle
Python, 102 Zeichen
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).
quelle
R,
959291 ZeichenNutzt 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:
Bearbeiten:
ErsetztErsetzt [[1]] durch el ()unlist()
durch[[]]
quelle
D: 55 Zeichen
Volles Programm:
quelle
else s
Teil fehlt?randomShuffle()
.randomShuffle(s[1..$-1])
kanns[1..$-1].randomShuffle
IIRC sein (es sei denn, das ist in einer D-Version älter als dieser Beitrag)Erlang,
188172132 ZeichenIch lerne immer noch Erlang, daher sind alle Tipps zur Verkürzung willkommen.
vollständiger Code (Modul string_shuffle):
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
f
Funktion Muster änderten die Shuffle - Funktion nur zwei Parameter zu akzeptieren, geändertlists:delete
für--[]
einen tauschtelists:reverse
Anruf für einlists:last
quelle