De acordo com uma história controversa , o odioso dos últimos em um artigo não é muito importante para o futuro, tanto quanto o primeiro e o último, com o texto original.
Então, por diversão, qual seria a função mais curta para randomizar a ordem das letras em uma palavra, mantendo a primeira e a última letra no lugar?
Aqui está minha facada com JavaScript. Todo o espaço em branco removido está em 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];
}
JavaScript mais curto sempre bem-vindo.
- Editar: verificação de comprimento adicionada. A função não deve falhar em palavras curtas.
r=id
.id
é a função de identidade. Eu ainda gostaria de ver a solução Haskell para esse problema em menos de 100 caracteres.Respostas:
Haskell, 4 caracteres
A função trinithis proposta realmente corresponde à especificação:
Ele retorna a string inalterada, mantendo assim o primeiro e o último caracteres no lugar e fazendo uma permutação de todos os outros caracteres.
Se alguém está insatisfeito com a distribuição de probabilidade das permutações, aqui está uma solução que produz uma melhor distribuição. É obviamente muito mais complexo:
Haskell,
110120107 caracteresUm exemplo de um programa usando esta função:
fonte
fmap((a:t!!i:).tail)
J,
262423 caracteresfonte
#?#
é um caractere menor que?~@#
Ruby, 44 caracteres
Funciona também para palavras curtas, ou seja, palavras com um, dois ou três caracteres são retornadas inalteradas.
Edit: Usar a idéia de array-splat do Ventero salva outro caracter.
fonte
Ruby 1.9, 46 caracteres
fonte
Golfscript
Como uma "função" (chamada codeblock): 20 caracteres
Ao operar no elemento superior da pilha: 16 caracteres
fonte
9
por9.?
.C ++, 79 caracteres ( com verificação de intervalo )
C ++,
8165 caracteres ( sem verificação de alcance )O uso de passagem por referência em vez de retornar o resultado reduz outros 10 caracteres de qualquer solução.
Programa completo, lendo uma sequência de palavras e convertendo-as aleatoriamente:
Moral: não construa o que já está lá.
Ah, e as verificações de transbordamento são para covardes.fonte
std::random_shuffle
isso é novo para mim. btw eu acho que você esqueceu#include<string>
no seu código completo.Python, 86 caracteres
E aqui está um exemplo de como usá-lo:
Este é o meu primeiro exercício de golfe com código. Depois de resolver o problema, decidi procurar as respostas e não é surpresa que a minha resposta não seja única. Isso foi divertido: o)
Fiz uma alteração depois de examinar as outras respostas e estava alterando minha declaração de importação para usar um alias. Boa ideia. ; o)
fonte
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
).C (K&R) - 88
8687caracteresNão há nenhuma função de troca ou reprodução aleatória incorporada em C, então eu tive que fazer isso manualmente :(
Programa de exemplo com Ungolfed r ():
EDIT : corrigido o bug quando s consiste em menos de 3 caracteres (obrigado ao usuário-conhecido por notá-lo!)
fonte
strfry
.char s[] = "na"; // not anticipated
python,
8779759392 caracteres (manipulação de cadeias de comprimento 0,1)Edição: Originalmente pensado que era para dividir palavras de seqüência de caracteres (o que fez em 128 caracteres; agora em 87 caracteres requer). Argh, meu mau entendimento de leitura.
EDIT 2: Altere da função def para lambda de def para salvar 6 caracteres. Supondo que a amostra já esteja importada para o espaço para nome (
from random import sample
) pode reduzir para ~ 60).EDIT 3: "len (w [1: -1])" (12 caracteres) a "len (w) -2" (8 caracteres) por sugestão agradável do gnibbler.
EDIT 4: JBernando salvou um caractere (considerou
from random import *
e viu que era equivalente - não perceber que o espaçoimport *
é desnecessário) .; usuário desconhecido adicionou 19 caracteresw if len(w)<4 else
para manipular as seqüências de caracteres 0 e 1 corretamente.EDIÇÃO 5: Salva outro caractere por truque de golfe do código do boothby.
if len(w)<4 else
paraif 4>len(w)else
.fonte
len(w)-2
em vez delen(w[1:-1])
?C ++,
11197 caracteresAqui está um programa completo para quem deseja testá-lo:
Editar
Percebeu que não há necessidade de selecionar aleatoriamente os dois índices de swap, salvou uma variável e mais alguns caracteres.
fonte
php (68 caracteres)
mais curto (60 caracteres)
fonte
.
vez de\w
.use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}
são 87 caracteres . Sem a linha de uso, são 62 caracteres .Perl -
96 (ou 71) caracteres84 (ou 59) caracteresFoi isso que eu criei no Perl. Passamos por algumas maneiras diferentes de fazer isso, mas isso parecia mais curto do que eu posso pensar até agora, com 97 caracteres.
No entanto, se você cortar a linha 'use' (que eu acho que é válida, já que outras pessoas excluíram #incluir linhas em seus programas em C), eu posso reduzi-la para 71 caracteres :
EDIT Foi sugerido que eu tentasse fazer isso implementando o método @tobius '. Dessa maneira, reduzi para 84 caracteres ou, removendo a linha de uso , 59 caracteres :
fonte
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 caracteresMinha solução Scala em uma linguagem um pouco menos detalhada. Eu não sou especialista em Ruby, por isso, provavelmente há espaço para melhorias.
fonte
Ruby 1.9,
77484644 caracteresDisclaimer: Eu ajustei isso com base na resposta mais alta classificada - notei a mesma resposta mais tarde. Você pode verificar a história que eu mantive fiel à minha idéia original, mas mudei de ruby 1.8 para ruby 1.9 para lambdas curtas e
shuffle
.Se palavras vazias forem permitidas,
5654 caracteresfonte
Python 3,
949391 caracteresUsando uma técnica diferente. Também pode funcionar em Python 2.
O
... if x[0:-1] else x
dáx
se seu comprimento é 1 (caso contrário, seria duplicado). A função funciona assim para cadeias de comprimento 0 e 1.O
sample()
é de https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .Desde que é uma expressão, podemos usar uma
lambda
(eliminandoreturn
,def
e um par de parênteses).Editar:
from random import*
para salvar um caractere, após o outro envio do Python.fonte
x[0:-1]
se tornarx[:-1]
?JavaScript -
118122 caracteresJavaScript mais curto - 118 caracteres sem espaço em branco. Usa aproximadamente o mesmo algoritmo que o OP, mas com menos encadeamento. Tentei muita recursão e tentei algumas iterações, mas todas elas tendem a ficar atoladas de uma maneira ou de outra.
fonte
return z?a+...+z:w;
como uma verificação implícita de comprimento estaria em ordem. A suposição silenciosa era de que a função receberia apenas palavras "válidas".a
noelse
ternário. Editado e até 122 caracteres.a
que seria errado para a entrada de duas letras. : - \ Droga da próxima vez vou alinhar os requisitos com mais cuidado.z
será indefinido apenas se a palavra for uma letra (ou menos).D, 62 caracteres
ok, eu trapacei com uma matriz de caracteres normal em vez de uma string real (que é um caracter imutável [], portanto, não é necessário arrastar no local)
editar com uma verificação de comprimento, requer mais 14
fonte
return s;
e char [] tipo de retorno mais 11 caracteresimport std.random;
, e não apenas a função.char[] s
(para torná-lochar[]s
), mas eu não uso D há anos.php 5.3 (60 caracteres)
Aprimorado para 56 caracteres e não requer mais a versão 5.3:
fonte
true
para cadeias curtas.Perl - 111 caracteres (sem usar nenhuma função da biblioteca)
Uso :
fonte
Pitão
São
9089112 caracteres de python!Edit 1: desta vez em função!
(obrigado gnibbler)Edição 2: agora lida com palavras curtas
(obrigado usuário desconhecido)fonte
Scala, 135
139142156caracteres-7: removido ': String' (tipo de retorno pode ser inferida)
-7: removido 'retorno' (última expressão é o valor de retorno)
-3: consignado
s.size-2
fora-4:
toCharArray
->toArray
fonte
Python, 86 caracteres
Slnicig é seguro, portanto, nenhum bnouds ckhnceig é neeacrssy. Wkros em todas as leghtns.
fonte
C ++ 11: -
6866 caracteresprograma completo:
fonte
string s; cin >> s;
Ruby 1.9, 43 caracteres
r = w [0] + [* w [1 ..- 2] .chars] .shuffle.join + w [-1]
Ainda não funciona para Strings de 1 caractere (duplica esse caractere) e falha para String vazia.
fonte
Python - 76 caracteres
fonte
R, 104 (126)
Uso:
a função abaixo funciona com palavras com comprimento menor que 3:
fonte
Python, 102 caracteres
Sem importações! Funciona para palavras com 1 caractere e acima. Esta é minha primeira entrada no golfe e fui inspirado pela entrada da BlueEyedBeast no código Shortest para produzir uma saída não determinística para a idéia de usar o id (Object) .
Explicação: Faz uma lista de letras da entrada, excluindo a primeira e a última, e aparece repetidamente nesta lista e anexa a uma nova até ficar vazia. O índice do qual ele aparece é id (7)% len (lista da qual estamos saindo). Como id (7) é o endereço de memória do objeto 7, é essencialmente aleatório. Portanto, agora temos uma lista de letras embaralhadas aleatoriamente no centro da entrada original. Tudo o que fazemos agora é anexar a primeira e a última letra da saída original de acordo e obtemos a saída que queremos: (primeira letra) + (meio embaralhado) + (última letra).
fonte
R,
959291 caracteresUtiliza a avaliação lenta de R para calcular aeb como parâmetros de função, economizando espaço com reutilização posteriormente. Diferentemente de outras respostas R, isso funciona para todas as palavras com> 1 caractere. Exemplo abaixo:
Editar:
SubstituídoSubstituído [[1]] por el ()unlist()
por[[]]
fonte
D: 55 caracteres
programa completo:
fonte
else s
parte está faltando?randomShuffle()
está no local.randomShuffle(s[1..$-1])
pode sers[1..$-1].randomShuffle
IIRC (a menos que esteja em uma versão D mais velho do que este post)Erlang,
188172132 caracteresEu ainda estou aprendendo Erlang, então todas as dicas para torná-lo mais curto são apreciadas.
código completo (módulo string_shuffle):
Editar
Retirou a parte aleatória como uma função separada, que não exige mais que o cabeçalho e o final da lista sejam passados.
Editar 2
Reestruturado para remover um dos
f
padrões de função, alterou a função aleatória para aceitar apenas dois parâmetros, alteradoslists:delete
por--[]
, trocou umalists:reverse
chamada por umlists:last
fonte