Selon une histoire controversée , le titre de rapporteur dans une lettre ne serait pas très utile au raid, comme le premier et le dernier journaliste avec le mot original.
Donc, pour le plaisir, quelle serait la fonction la plus courte pour randomiser l’ordre des lettres dans un mot tout en maintenant la première et la dernière lettre en place?
Voici mon coup de couteau avec JavaScript. Tous les espaces sont supprimés: 124 130 caractères.
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 plus court toujours la bienvenue.
- Edit: vérification de la longueur ajoutée. La fonction ne devrait pas échouer pour les mots courts.
r=id
.id
c'est la fonction identité. J'aimerais toujours voir la solution Haskell à ce problème en moins de 100 caractères.Réponses:
Haskell, 4 personnages
La fonction trinithis proposée correspond effectivement à la spécification:
Il retourne la chaîne inchangée, gardant ainsi les premier et dernier caractères en place et permettant une permutation de tous les autres caractères.
Si quelqu'un n'est pas satisfait de la distribution de probabilité des permutations, voici une solution permettant d'obtenir une meilleure distribution. C'est évidemment beaucoup plus complexe:
Haskell,
110120107 caractèresUn exemple de programme utilisant cette fonction:
la source
fmap((a:t!!i:).tail)
J,
262423 caractèresla source
#?#
est un caractère plus court que?~@#
Ruby, 44 personnages
Fonctionne également pour les mots courts, c’est-à-dire que les mots contenant un, deux ou trois caractères sont renvoyés sans modification.
Edit: Utiliser l’idée de array-splat de Ventero enregistre un autre caractère.
la source
Ruby 1.9, 46 caractères
la source
Golfscript
En tant que "fonction" (nommé codeblock): 20 caractères
En opérant sur le premier élément de la pile: 16 caractères
la source
9
avec9.?
.C ++, 79 caractères ( avec contrôle de plage )
C ++,
8165 caractères ( sans vérification de la plage )Utiliser passe par référence au lieu de renvoyer le résultat supprime 10 autres caractères de l'une ou l'autre solution.
Programme complet, lisant une chaîne de mots et les mélangeant en les convertissant:
Moral: ne construisez pas ce qui existe déjà.
Oh, et les contrôles de débordement sont pour des wusses.la source
std::random_shuffle
c'est un nouveau pour moi. BTW je pense que vous avez oublié#include<string>
dans votre code complet.Python, 86 caractères
Et voici un exemple d'utilisation:
Ceci est mon premier exercice de golf de code. Après avoir résolu le problème, j'ai décidé d'examiner les réponses et il n'est pas surprenant que ma réponse ne soit pas unique. C'était amusant cependant: o)
J'ai fait un changement après avoir examiné les autres réponses et cela modifiait mon instruction d'importation pour utiliser un alias. Bonne idée. ; o)
la source
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
).C (K & R) - 88
8687caractèresIl n'y a pas de fonction swap ou shuffle intégrée en C, je devais donc le faire manuellement :(
Exemple de programme avec ungolfed r ():
EDIT : correction du bug quand s est composé de moins de 3 caractères (merci à l'utilisateur de l'avoir remarqué!)
la source
strfry
.char s[] = "na"; // not anticipated
python,
8779759392 caractères (manipulation de chaînes de longueur 0,1)EDIT: À l’origine, on pensait qu’il était supposé diviser les mots de chaîne (ce qui était le cas pour 128 caractères; maintenant, l’exigence de 87 caractères). Argh, ma mauvaise compréhension en lecture.
EDIT 2: Change de def en fonction lambda de def pour sauvegarder 6 caractères. En supposant qu'un échantillon est déjà importé dans l'espace de noms (
from random import sample
), cela pourrait ramener le nombre à ~ 60).EDIT 3: "len (w [1: -1])" (12 caractères) à "len (w) -2" (8 caractères) par suggestion agréable du gnibbler.
EDIT 4: JBernando a sauvegardé un caractère (il avait considéré
from random import *
et vu que c’était équivalent - ne pas se rendre compte que la place enimport *
était inutile) .; utilisateur inconnu a ajouté 19 caractèresw if len(w)<4 else
pour gérer correctement les chaînes de caractères 0 et 1.EDIT 5: enregistré un autre personnage par tour de golf code astuce.
if len(w)<4 else
àif 4>len(w)else
.la source
len(w)-2
au lieu delen(w[1:-1])
?C ++,
11197 caractèresVoici un programme complet pour ceux qui souhaitent le tester:
Modifier
Réalisé, il n’est pas nécessaire d’aléatoire des deux index de swap, d’une variable enregistrée et de quelques caractères supplémentaires.
la source
php (68 caractères)
plus court (60 caractères)
la source
.
place de\w
.use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}
Voilà 87 caractères . Sans la ligne d'utilisation, c'est 62 caractères .Perl -
96 (ou 71 caractères)84 (ou 59 caractères)C’est ce que j’ai trouvé en Perl. Je suis passé par différentes manières de le faire, mais cela semblait le plus court de ce que je peux penser à ce jour, à 97 personnages.
Cependant, si vous supprimez la ligne 'use' (ce qui, je suppose, est valide, car d'autres personnes ont exclu les lignes #include dans leurs programmes C), je peux la réduire davantage à 71 caractères :
EDIT Il a été suggéré que j'essaie de faire ceci en implémentant la méthode de @tobius. De cette façon, je l'ai réduit à 84 caractères , ou en supprimant la ligne d' utilisation , 59 caractères :
la source
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 caractèresMa solution Scala dans une langue légèrement moins commentée. Je ne suis absolument pas un expert de Ruby, alors il y a probablement place à amélioration.
la source
Ruby 1.9,
77484644 caractèresAvertissement: J'ai réglé ceci en fonction de la réponse la mieux classée - j'ai remarqué la même réponse plus tard. Vous pouvez vérifier l’historique que j’ai gardé fidèle à mon idée d’origine, mais qui est passé de ruby 1.8 à ruby 1.9 pour les lambdas courts et
shuffle
.Si les mots vides sont autorisés, alors
5654 caractèresla source
Python 3,
949391 caractèresUtiliser une technique différente. Peut aussi fonctionner en Python 2.
Le
... if x[0:-1] else x
donnex
si sa longueur est 1 (sinon, il serait dupliqué). La fonction fonctionne donc pour les chaînes de longueur 0 et 1.La
sample()
provient de https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .Comme il est une expression, on peut utiliser un
lambda
(éliminantreturn
,def
et une paire de parenthèses).Éditer:
from random import*
pour sauvegarder un caractère après l'autre soumission Python.la source
x[0:-1]
devenirx[:-1]
?JavaScript -
118122 caractèresJavaScript plus court - 118 caractères sans espace. Utilise approximativement le même algorithme que l'OP, mais avec moins de chaînage. J'ai essayé beaucoup de récursion, et j'ai essayé quelques itérations, mais ils ont tous tendance à s'enliser d'une manière ou d'une autre.
la source
return z?a+...+z:w;
Une vérification de longueur implicite serait utile. L'hypothèse silencieuse était que la fonction ne recevrait que des mots "valides".a
danselse
le ternaire. Édité et jusqu'à 122 caractères.a
serait faux pour une saisie de deux lettres. : - \ Zut la prochaine fois que je vais préciser les exigences.z
ne sera indéfini que si le mot est une lettre (ou moins).D, 62 caractères
d'accord j'ai triché avec un tableau de caractères normal au lieu d'une chaîne réelle (qui est un caractère immuable [], donc pas de brassage sur place)
éditer avec une vérification de longueur, il en faut 14 de plus
la source
return s;
et char [] renvoyer le type 11 plus de caractèresimport std.random;
, et pas seulement la fonction.char[] s
(pour le fairechar[]s
), mais je n'ai pas utilisé D depuis des années.php 5.3 (60 caractères)
Amélioré à 56 caractères et ne nécessite plus la version 5.3:
la source
true
pour les chaînes courtes.Perl - 111 caractères (sans utiliser aucune fonction de bibliothèque)
Utilisation :
la source
Python
C'est
9089112 caractères de python!Edit 1: comme une fonction cette fois!
(merci gnibbler)Edit 2: gère maintenant les mots courts
(merci utilisateur inconnu)la source
Scala, 135
139142156caractères-7: enlevé ': String' (le type de retour peut être inféré)
-7: enlevé 'retour' (la dernière expression est la valeur de retour)
-3: factored
s.size-2
out-4:
toCharArray
->toArray
la source
Python, 86 caractères
Slnicig est sûr, donc pas de problème, ckhnceig n’est nécessaire. Wkros à tous points de vue.
la source
C ++ 11: -
6866 caractèresprogramme complet:
la source
string s; cin >> s;
Ruby 1.9, 43 caractères
r = w [0] + [* w [1 ..- 2] .chars] .shuffle.join + w [-1]
Ne fonctionne pas encore pour les chaînes de 1 caractère (duplique ce caractère) et échoue pour les chaînes vides.
la source
Python - 76 caractères
la source
R, 104 (126)
Usage:
la fonction ci-dessous fonctionne avec des mots de longueur inférieure à 3:
la source
Python, 102 caractères
Aucune importation! Fonctionne pour les mots 1 caractère et plus. C’est ma première participation au golf et j’ai été inspiré par l’entrée de Blueesty Code dans Shortest pour produire une sortie non déterministe sur l’idée d’utiliser id (Object) .
Explanation: Il crée une liste de lettres à partir de l'entrée, en excluant les première et dernière, puis disparaît de manière répétée dans cette liste et en ajoute une nouvelle jusqu'à ce qu'elle soit vide. L'index dont il provient est id (7)% len (la liste d'où nous venons). Puisque id (7) est l'adresse mémoire de l'objet 7, il est essentiellement aléatoire. Nous avons maintenant une liste de lettres brouillées de manière aléatoire à partir du centre de l’entrée initiale. Tout ce que nous faisons maintenant est d’ajouter les première et dernière lettres de la sortie originale en conséquence et nous obtenons la sortie souhaitée: (première lettre) + (brouillé au milieu) + (dernière lettre).
la source
R,
959291 caractèresUtilise l’évaluation paresseuse de R pour calculer a et b en tant que paramètres de fonction, économisant ainsi de la place lors de la réutilisation ultérieure. De plus, contrairement aux autres réponses R, cela fonctionne pour tous les mots> 1 caractère. Exemple ci-dessous:
Modifier:
RemplacéRemplacé [[1]] par el ()unlist()
par[[]]
la source
D: 55 caractères
programme complet:
la source
else s
partie est manquante?randomShuffle()
est en place.randomShuffle(s[1..$-1])
peut êtres[1..$-1].randomShuffle
IIRC (à moins que ce soit dans une version D plus ancienne que ce post)Erlang,
188172132 caractèresJ'apprends toujours Erlang, donc tous les conseils pour raccourcir cette étape sont appréciés.
code complet (module string_shuffle):
Modifier
La partie aléatoire a été retirée en tant que fonction distincte qui n'exige plus que la tête et la queue de la liste soient diffusées.
Modifier 2
Restructuré pour supprimer l'un des
f
modèles de fonction, modification de la fonction de lecture aléatoire afin qu'elle n'accepte que deux paramètres, modificationlists:delete
de--[]
, échange d'unlists:reverse
appel contre unlists:last
la source