Według niektórych kontrowersyjnych historii , odrer z wrod deos nie wiele za raednig, tak samo jak frist i lsat lteter macth z oryginalnym wrod.
Więc, dla zabawy, jaka byłaby najkrótsza funkcja do losowego uporządkowania liter w słowie, przy jednoczesnym zachowaniu pierwszej i ostatniej litery?
Oto mój cios w JavaScript. Cała spacja usunięta ma 124 130 znaków.
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];
}
Krótszy JavaScript zawsze mile widziany.
- Edycja: dodano kontrolę długości. Funkcja nie powinna zawieść w przypadku krótkich słów.
r=id
.id
jest funkcją tożsamości. Nadal chciałbym zobaczyć rozwiązanie tego problemu przez Haskell w mniej niż 100 znakach.Odpowiedzi:
Haskell, 4 znaki
Zaproponowana funkcja trinithis faktycznie odpowiada specyfikacji:
Zwraca ciąg znaków bez zmian, utrzymując w ten sposób pierwszy i ostatni znak na miejscu i dokonując permutacji wszystkich pozostałych znaków.
Jeśli ktoś jest niezadowolony z rozkładu prawdopodobieństwa permutacji, oto rozwiązanie zapewniające lepszy rozkład. Jest to oczywiście o wiele bardziej złożone:
Haskell,
110120107 znakówPrzykład programu używającego tej funkcji:
źródło
fmap((a:t!!i:).tail)
J,
262423 znakówźródło
#?#
jest o jeden char krótszy niż?~@#
Ruby, 44 znaki
Działa również w przypadku krótkich słów, tzn. Słowa zawierające jeden, dwa lub trzy znaki są zwracane w niezmienionej formie.
Edycja: Użycie pomysłu tablicowego Ventero oszczędza kolejny znak.
źródło
Ruby 1.9, 46 znaków
źródło
Golfscript
Jako „funkcja” (o nazwie blok kodu): 20 znaków
Podczas działania na najwyższym elemencie stosu: 16 znaków
źródło
9
go9.?
.C ++, 79 znaków ( z kontrolą zakresu )
C ++,
8165 znaków ( bez sprawdzania zasięgu )Użycie pass by referencji zamiast zwracania wyniku usuwa kolejne 10 znaków z obu rozwiązań.
Pełny program, odczytując ciąg słów i przetasowując je:
Morale: nie buduj tego, co już tam jest.
Och, a kontrole przelewu dotyczą wusów.źródło
std::random_shuffle
to dla mnie nowe. btw Myślę, że zapomniałeś#include<string>
w swoim pełnym kodzie.Python, 86 znaków
A oto przykład użycia:
To jest mój pierwszy trening golfowy. Po rozwiązaniu problemu postanowiłem spojrzeć na odpowiedzi i nic dziwnego, że moja odpowiedź nie jest wyjątkowa. To było zabawne: o)
Dokonałem jednej zmiany po spojrzeniu na inne odpowiedzi i zmieniłem moją instrukcję importu na użycie aliasu. Świetny pomysł. ; o)
źródło
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
).C (K&R) - 88
8687znakówW C nie ma wbudowanej funkcji zamiany ani odtwarzania losowego, więc musiałem to zrobić ręcznie :(
Przykładowy program z Ungolfed r ():
EDYCJA : naprawiono błąd, gdy s składa się z mniej niż 3 znaków (dzięki nieznanemu użytkownikowi za zauważenie go!)
źródło
strfry
.char s[] = "na"; // not anticipated
python,
8779759392 znaki (obsługa ciągów o długości 0,1)EDYCJA: Początkowo myślał, że powinien dzielić słowa łańcuchowe (co robił przy 128 znakach; teraz przy 87 znakach wymaga). Argh, mój kiepski z czytania ze zrozumieniem.
EDYCJA 2: Zmień z funkcji def na lambda z def, aby zapisać 6 znaków. Zakładając, że próbka jest już zaimportowana do przestrzeni nazw (
from random import sample
), może to obniżyć do ~ 60).EDYCJA 3: „len (w [1: -1])” (12 znaków) do „len (w) -2” (8 znaków) za miłą sugestię gnibblera.
EDYCJA 4: JBernando uratował jeden znak (rozważył
from random import *
i zobaczył, że jest równoważny - nie uświadomienie sobie, że miejsceimport *
jest niepotrzebne) .; użytkownik nieznany dodał 19 znaków,w if len(w)<4 else
aby poprawnie obsługiwać ciągi znaków 0 i 1.EDYCJA 5: Zapisałem kolejny kod na sztuczkę golfową dla boothby'ego.
if len(w)<4 else
doif 4>len(w)else
.źródło
len(w)-2
zamiastlen(w[1:-1])
?C ++,
11197 znakówOto pełny program dla tych, którzy chcą go przetestować:
Edytować
Uświadomiono sobie, że nie ma potrzeby losowania obu indeksów wymiany, zapisania zmiennej i kilku innych znaków.
źródło
php (68 znaków)
krótszy (60 znaków)
źródło
.
zamiast\w
.use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}
To 87 znaków . Bez wiersza użycia ma 62 znaki .Perl -
96 (lub 71) znaków84 (lub 59) znakówTo właśnie wymyśliłem w Perlu. Przeszedłem kilka różnych sposobów, aby to zrobić, ale wydawało się to najkrótsze z tego, co do tej pory myślę, przy 97 znakach.
Chociaż, jeśli wytniesz linię „use” (co, jak sądzę, jest poprawna, ponieważ inni wykluczyli #include linii w swoich programach C), mogę ją zmniejszyć do 71 znaków :
EDYCJA Sugerowano, żebym spróbował wykonać tę metodę implementacji @tobiusa. W ten sposób zredukowałem go do 84 znaków , lub usuwając wiersz użycia , 59 znaków :
źródło
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 znakówMoje rozwiązanie Scala w nieco mniej szczegółowym języku. W żadnym wypadku nie jestem ekspertem od Ruby, więc prawdopodobnie jest miejsce na ulepszenia.
źródło
Ruby 1.9,
77484644 znakówOświadczenie: Dostosowałem to na podstawie odpowiedzi najwyżej ocenionej - później zauważyłem dokładnie taką samą odpowiedź. Możesz sprawdzić historię, którą zachowałem zgodnie z moim oryginalnym pomysłem, ale zmieniłem z ruby 1.8 na ruby 1.9 w przypadku krótkich lambd i
shuffle
.Jeśli dozwolone są puste słowa, to
5654 znakówźródło
Python 3,
949391 znakówUżywanie innej techniki. Może także działać w Pythonie 2.
... if x[0:-1] else x
Dajex
jeżeli jego długość wynosi 1 (inaczej byłoby powielany). Funkcja działa w ten sposób dla ciągów o długości 0 i 1.To
sample()
pochodzi z https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .Ponieważ jest to jeden wyraz, możemy użyć
lambda
(eliminujereturn
,def
oraz parę nawiasów).Edycja:
from random import*
aby zapisać 1 znak po drugim przesłaniu Pythona.źródło
x[0:-1]
staćx[:-1]
?JavaScript -
118122 znakówKrótszy JavaScript - 118 znaków bez spacji. Używa w przybliżeniu tego samego algorytmu co OP, ale z mniejszym łańcuchem. Próbowałem wiele rekurencji i próbowałem wykonać iterację, ale wszystkie one mają tendencję do zapadania się w taki czy inny sposób.
źródło
return z?a+...+z:w;
jako domyślnej kontroli długości byłoby w porządku. Ciche założenie było takie, że funkcja otrzyma tylko „poprawne” słowa.a
welse
trójce. Edytowane i do 122 znaków.a
że wprowadzanie dwuliterowe byłoby błędne. : - Cholera, następnym razem ostrożniej wyłożę wymagania.z
będzie niezdefiniowany tylko wtedy, gdy słowo ma jedną literę (lub mniej).D, 62 znaki
ok, oszukiwałem normalną tablicą znaków zamiast prawdziwego ciągu znaków (który jest niezmiennym char [], więc nie tasuje się w miejscu)
edycja z kontrolą długości wymaga 14 więcej
źródło
return s;
i char [] zwrócił typ 11 dodatkowych znakówimport std.random;
, a nie tylko funkcja.char[] s
(żeby to zrobićchar[]s
), ale nie używałem D od lat.php 5.3 (60 znaków)
Ulepszony do 56 znaków i nie wymaga już wersji 5.3:
źródło
true
krótkie ciągi znaków.Perl - 111 znaków (bez użycia funkcji biblioteki)
Zastosowanie :
źródło
Pyton
To
9089112 znaków python!Edycja 1: tym razem jako funkcja!
(dzięki gnibbler)Edycja 2: obsługuje teraz krótkie słowa
(dzięki użytkownik nieznany)źródło
Scala, 135
139142156znaków-7: usunięto „ciąg” (typ zwrotny można wywnioskować)
-7: usunięte „powrotu” (ostatnie wyrażenie jest wartość powrotna)
-3: uwzględnione
s.size-2
na-4:
toCharArray
->toArray
źródło
Python, 86 znaków
Slnicig jest bezpieczny, więc żadne bnouds ckhnceig nie jest neeacrssy. Wkros we wszystkich leghtns.
źródło
C ++ 11: -
6866 znakówpełny program:
źródło
string s; cin >> s;
Ruby 1.9, 43 znaki
r = w [0] + [* w [1 ..- 2] .chars]. shuffle.join + w [-1]
Nie działa jeszcze dla Ciągów o długości 1 znaku (duplikuje ten znak), a dla pustych Ciągów kończy się niepowodzeniem.
źródło
Python - 76 znaków
źródło
R, 104 (126)
Stosowanie:
poniższa funkcja działa ze słowami o długości mniejszej niż 3:
źródło
Python, 102 znaki
Bez importu! Działa dla słów 1 i wyżej. To jest mój pierwszy wpis w golfa i zainspirował mnie wpis BlueEyedBeast z Shortest code w celu uzyskania niedeterministycznych danych wyjściowych dla pomysłu użycia id (Object) .
Objaśnienie: Tworzy listę liter na podstawie danych wejściowych z wyłączeniem pierwszej i ostatniej i wielokrotnie wyskakuje z tej listy i dołącza się do nowej, aż będzie pusta. Indeks, z którego wyskakuje, to id (7)% len (lista, z której wyskakujemy). Ponieważ id (7) jest adresem pamięci obiektu 7, jest on zasadniczo losowy. Mamy teraz listę losowo zaszyfrowanych liter ze środka oryginalnego tekstu. Wszystko, co teraz robimy, to odpowiednio dołączyć pierwszą i ostatnią literę oryginalnego wyjścia i otrzymaliśmy pożądany wynik: (pierwsza litera) + (zakodowany środek) + (ostatnia litera).
źródło
R,
959291 znakówWykorzystuje leniwą ocenę R do obliczenia a i b jako parametrów funkcji, oszczędzając miejsce z ponownym użyciem później. Również w przeciwieństwie do innych odpowiedzi R działa to dla wszystkich słów o długości> 1 znak. Przykład poniżej:
Edytować:
zastąpioneZamieniono [[1]] na el ()unlist()
z[[]]
źródło
D: 55 znaków
pełny program:
źródło
else s
części brakuje?randomShuffle()
jest na miejscu.randomShuffle(s[1..$-1])
może byćs[1..$-1].randomShuffle
IIRC (chyba że jest to wersja D starsza niż ten post)Erlang,
188172132 znakówWciąż uczę się Erlanga, więc wszelkie wskazówki dotyczące skrócenia tej wersji są mile widziane.
pełny kod (moduł string_shuffle):
Edytować
Wyodrębniono część losową jako osobną funkcję, która nie wymaga już omijania głowy i ogona listy.
Edytuj 2
Zrestrukturyzowano, aby usunąć jeden z
f
wzorców funkcji, zmieniono funkcję odtwarzania losowego, aby zaakceptować tylko dwa parametry, zmienionolists:delete
na--[]
, zamienionolists:reverse
wywołanie nalists:last
źródło