De acuerdo con alguna historia controvertida , el que odia a los personajes en un mundo no se enamora mucho de la educación, como el hombre y el hombre que se relacionan con el mundo original.
Entonces, por diversión, ¿cuál sería la función más corta para aleatorizar el orden de las letras en una palabra mientras se mantiene la primera y la última letra en su lugar?
Aquí está mi puñalada con JavaScript. Todo el espacio en blanco eliminado está en 124 130 caracteres.
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];
}
Un JavaScript más corto siempre es bienvenido.
- Editar: verificación de longitud añadida. La función no debe fallar para palabras cortas.
r=id
.id
es la función de identidad. Todavía me gustaría ver la solución de Haskell a este problema en menos de 100 caracteres.Respuestas:
Haskell, 4 personajes
La función trinithis propuesta en realidad coincide con la especificación:
Devuelve la cadena sin cambios, manteniendo así el primer y último carácter en su lugar y haciendo una permutación de todos los demás caracteres.
Si alguien no está satisfecho con la distribución de probabilidad de las permutaciones, aquí hay una solución que produce una mejor distribución. Obviamente es mucho más complejo:
Haskell
110120107 caracteresUn ejemplo de un programa que usa esta función:
fuente
fmap((a:t!!i:).tail)
J,
262423 caracteresfuente
#?#
es un char más corto que?~@#
Ruby, 44 caracteres.
Funciona también para palabras cortas, es decir, las palabras con uno, dos o tres caracteres se devuelven sin modificaciones.
Editar: Usar la idea de matriz-splat de Ventero ahorra otro personaje.
fuente
Ruby 1.9, 46 caracteres
fuente
Golfscript
Como una "función" (llamada codeblock): 20 caracteres
Cuando se opera en el elemento superior de la pila: 16 caracteres
fuente
9
con9.?
.C ++, 79 caracteres ( con verificación de rango )
C ++,
8165 caracteres ( sin verificación de rango )El uso de pasar por referencia en lugar de devolver el resultado elimina otros 10 caracteres de cualquiera de las soluciones.
Programa completo, leyendo una cadena de palabras y barajando convirtiéndolas:
Moral: no construyas lo que ya está allí.
Ah, y los controles de desbordamiento son para wusses.fuente
std::random_shuffle
eso es nuevo para mí. por cierto creo que te olvidaste#include<string>
en tu código completo.Python, 86 caracteres
Y aquí hay un ejemplo de uso:
Este es mi primer código de ejercicio de golf. Después de resolver el problema, decidí mirar las respuestas y no sorprende que la respuesta mía no sea única. Sin embargo, esto fue divertido: o)
Realicé un cambio después de mirar las otras respuestas y estaba cambiando mi declaración de importación para usar un alias. Gran idea. ; o)
fuente
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
).C (K&R) - 88
8687caracteresNo hay una función integrada de intercambio o aleatorio en C, así que tuve que hacerlo manualmente :(
Programa de muestra con Ungolfed r ():
EDITAR : se corrigió el error cuando s consta de menos de 3 caracteres (¡gracias a un usuario desconocido por notarlo!)
fuente
strfry
.char s[] = "na"; // not anticipated
pitón,
8779759392 caracteres (manejo de cadenas de longitud 0,1)EDITAR: Originalmente pensé que se suponía que debía dividir las palabras de cadena (lo que hizo en 128 caracteres; ahora en 87 caracteres sí se requiere). Argh, mi mala comprensión de lectura.
EDIT 2: Cambiar de def a la función lambda de def para guardar 6 caracteres. Suponiendo que la muestra ya se haya importado al espacio de nombres (
from random import sample
) podría reducir esto a ~ 60).EDITAR 3: "len (w [1: -1])" (12 caracteres) a "len (w) -2" (8 caracteres) según la sugerencia de gnibbler.
EDITAR 4: JBernando guardó un personaje (lo consideró
from random import *
y vio que era equivalente, sin darse cuenta de que el espacioimport *
es innecesario) .; El usuario desconocido agregó 19 caracteresw if len(w)<4 else
para manejar las cadenas de caracteres 0 y 1 correctamente.EDITAR 5: Guardado otro char por truco de golf de código de cabina.
if len(w)<4 else
aif 4>len(w)else
.fuente
len(w)-2
en lugar delen(w[1:-1])
?C ++,
11197 caracteresAquí hay un programa completo para aquellos que deseen probarlo:
Editar
Se dio cuenta de que no es necesario aleatorizar ambos índices de intercambio, guardó una variable y algunos caracteres más.
fuente
php (68 caracteres)
más corto (60 caracteres)
fuente
.
lugar de\w
.use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}
son 87 caracteres . Sin la línea de uso, son 62 caracteres .Perl -
96 (o 71) caracteres84 (o 59) caracteresEsto es lo que se me ocurrió en Perl. Pasé por varias formas diferentes de hacerlo, pero esto parecía más corto de lo que puedo pensar hasta ahora, con 97 caracteres.
Sin embargo, si corta la línea de 'uso' (que supongo que es válida, ya que otros excluyeron #incluir líneas en sus programas en C), puedo reducirla a 71 caracteres :
EDITAR Se sugirió que intente hacer esto implementando el método @tobius. De esta forma lo reduje a 84 caracteres , o quitando la línea de uso , 59 caracteres :
fuente
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 caracteresMi solución Scala en un lenguaje un poco menos detallado. No soy un experto en Ruby de ninguna manera, por lo que probablemente haya margen de mejora.
fuente
Ruby 1.9,
77484644 caracteresDescargo de responsabilidad: Ajusté esto en función de la respuesta mejor clasificada, noté la misma respuesta más adelante. Puede consultar el historial que he mantenido fiel a mi idea original pero que cambié de ruby 1.8 a ruby 1.9 para lambdas cortas y
shuffle
.Si se permiten palabras vacías,
5654 caracteresfuente
Pitón 3,
949391 caracteresUsando una técnica diferente. También podría funcionar en Python 2.
El
... if x[0:-1] else x
dax
si su longitud es 1 (de lo contrario se duplicaría). La función funciona para cadenas de longitud 0 y 1.El
sample()
es de https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .Ya que es una expresión, se puede utilizar una
lambda
(eliminandoreturn
,def
y un par de paréntesis).Editar:
from random import*
para guardar 1 carácter, después del otro envío de Python.fuente
x[0:-1]
llegar a serx[:-1]
?JavaScript -
118caracteresJavaScript más corto: 118 caracteres sin espacios en blanco. Utiliza aproximadamente el mismo algoritmo que el OP, pero con menos encadenamiento. Intenté muchas recursiones e intenté algunas iteraciones, pero todas tienden a atascarse de una forma u otra.
fuente
return z?a+...+z:w;
como una verificación de longitud implícita estaría en orden. La suposición silenciosa era que la función recibiría solo palabras "válidas".a
en elelse
del ternario. Editado, y hasta 122 caracteres.a
que sería incorrecto para la entrada de dos letras. : - \ Maldita sea la próxima vez voy a delinear los requisitos con más cuidado.z
solo estará indefinido si la palabra es una letra (o menos).D, 62 caracteres
Está bien, hice trampa con una matriz de caracteres normal en lugar de una cadena real (que es un carácter inmutable char [], por lo que no hay barajado in situ)
editar con una verificación de longitud requiere 14 más
fuente
return s;
y char [] Tipo de retorno 11 caracteres másimport std.random;
, y no solo la función.char[] s
(para hacerlochar[]s
), pero no he usado D en años.php 5.3 (60 caracteres)
Mejorado a 56 caracteres y ya no requiere la versión 5.3:
fuente
true
cadenas cortas.Perl - 111 caracteres (sin usar ninguna función de biblioteca)
Uso :
fuente
Pitón
¡Son
9089112 caracteres de python!Edición 1: ¡como una función esta vez!
(gracias gnibbler)Edición 2: ahora maneja palabras cortas
(gracias usuario desconocido)fuente
Scala, 135
139142156caracteres-7: eliminado ': String' (tipo de retorno puede inferir)
-7: eliminado 'retorno' (última expresión es el valor de retorno)
-3: factorizado
s.size-2
cabo-4:
toCharArray
->toArray
fuente
Python, 86 caracteres
Slnicig es seguro, por lo que no hay ningún ckhnceig cercano. Wkros en todas las longitudes.
fuente
C ++ 11: -
6866 caracteresprograma completo:
fuente
string s; cin >> s;
Ruby 1.9, 43 caracteres
r = w [0] + [* w [1 ..- 2] .chars] .shuffle.join + w [-1]
Todavía no funciona para cadenas de 1 carácter (duplica ese carácter) y falla para una cadena vacía.
fuente
Python - 76 caracteres
fuente
R, 104 (126)
Uso:
La siguiente función funciona con palabras con una longitud inferior a 3:
fuente
Python, 102 caracteres
¡Sin importaciones! Funciona para palabras de 1 carácter y superiores. Esta es mi primera entrada de golf y me inspiró la entrada de BlueEyedBeast del código más corto para producir una salida no determinista para la idea de usar id (Object) .
Explicación: hace una lista de letras de la entrada, excluyendo la primera y la última, y aparece repetidamente en esta lista y se agrega a una nueva hasta que esté vacía. El índice del que aparece es id (7)% len (lista de la que estamos emergiendo). Como id (7) es la dirección de memoria del objeto 7, es esencialmente aleatorio. Así que ahora tenemos una lista de letras aleatorizadas desde el centro de la entrada original. Todo lo que hacemos ahora es agregar la primera y la última letra del resultado original en consecuencia y obtenemos el resultado que queremos: (primera letra) + (codificado en el medio) + (última letra).
fuente
R
959291 caracteresUtiliza la evaluación perezosa de R para calcular ayb como parámetros de función, ahorrando espacio con la reutilización posterior. También, a diferencia de otras respuestas R, esto funciona para todas las palabras> 1 carácter largo. Ejemplo a continuación:
Editar:
ReemplazadoReemplazado [[1]] con el ()unlist()
con[[]]
fuente
D: 55 caracteres
programa completo:
fuente
else s
falta la parte?randomShuffle()
está en su lugar.randomShuffle(s[1..$-1])
puede sers[1..$-1].randomShuffle
IIRC (a menos que esté en una versión D anterior a esta publicación)Erlang,
188172132 caracteresTodavía estoy aprendiendo Erlang, por lo que agradezco cualquier consejo para hacer esto más corto.
código completo (string_shuffle module):
Editar
Tomó la parte aleatoria como una función separada que ya no requiere que se pasen el encabezado y la cola de la lista.
Editar 2
Reestructurado para eliminar uno de los
f
patrones de función, cambió la función aleatoria para aceptar solo dos parámetros, cambiólists:delete
por--[]
, cambió unalists:reverse
llamada por unlists:last
fuente