Согласно некоторой противоречивой истории , запах слов в мире не так уж и велик для Рэднига, так же, как и у первого, и другого, с оригинальным языком.
Итак, для интереса, что было бы самой короткой функцией для рандомизации буквенного порядка в слове при сохранении первой и последней буквы на месте?
Вот мой удар с помощью JavaScript. Все пробелы удалены - это 124 130 символов.
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 всегда приветствуется.
- Изменить: добавлена проверка длины. Функция не должна выходить из строя для коротких слов.
r=id
.id
это функция идентичности. Я все еще хотел бы, чтобы Haskell решил эту проблему менее чем за 100 символов.Ответы:
Хаскель, 4 персонажа
Предложенная функция trinithis фактически соответствует спецификации:
Он возвращает строку без изменений, сохраняя, таким образом, первый и последний символы и делая перестановку всех остальных символов.
Если кто-то недоволен распределением вероятностей перестановок, вот решение, дающее лучшее распределение. Это, очевидно, намного сложнее:
Haskell,
110120107 символовПример программы, использующей эту функцию:
источник
fmap((a:t!!i:).tail)
J,
262423 символаисточник
#?#
на один символ короче?~@#
Рубин, 44 символа
Работает также для коротких слов, т.е. слова с одним, двумя или тремя символами возвращаются без изменений.
Изменить: Использование идеи массива-сплат Ventero сохраняет еще один символ.
источник
Ruby 1.9, 46 символов
источник
Golfscript
В качестве «функции» (названной кодовым блоком): 20 символов
При работе с самым верхним элементом в стеке: 16 символов
источник
9
на9.?
.C ++, 79 символов ( с проверкой диапазона )
C ++,
8165 символов ( без проверки диапазона )Использование передачи по ссылке вместо возврата результата сбрасывает еще 10 символов из любого решения.
Полная программа, читающая цепочку слов и перетасовывающая их
Мораль: не строить то, что уже есть.
Да, и проверки переполнения для wusses.источник
std::random_shuffle
, это новый для меня. Кстати, я думаю, что вы забыли#include<string>
в своем полном коде.Python, 86 символов
И вот пример использования этого:
Это мой первый опыт игры в гольф. После решения проблемы я решил посмотреть на ответы, и неудивительно, что мой ответ не уникален. Это было весело, хотя: о)
Я сделал одно изменение после просмотра других ответов, и это изменило мою инструкцию импорта, чтобы использовать псевдоним. Отличная идея. ; О)
источник
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
).C (K & R) - 88
8687символовВ C нет встроенной функции swap или shuffle, поэтому мне пришлось делать это вручную :(
Пример программы с Ungolfed r ():
РЕДАКТИРОВАТЬ : исправлена ошибка, когда s состоит из менее чем 3 символов (спасибо, пользователь-неизвестно, что заметил это!)
источник
strfry
.char s[] = "na"; // not anticipated
python,
8779759392 символа (обработка строк длиной 0,1)РЕДАКТИРОВАТЬ: Первоначально думал, что он должен был разделить строковые слова (что он сделал в 128 символов; теперь в 87 символов делает требование). Ох, мой плохой в понимании чтения.
РЕДАКТИРОВАТЬ 2: изменить с def на лямбда-функцию с def, чтобы сохранить 6 символов. Если предположить, что sample уже импортирован в пространство имен (
from random import sample
), это может привести к снижению до ~ 60).РЕДАКТИРОВАТЬ 3: от «len (w [1: -1])» (12 символов) до «len (w) -2» (8 символов) в соответствии с хорошим предложением гнибблера.
РЕДАКТИРОВАТЬ 4: JBernando сохранил один символ (считал
from random import *
и видел, что это было эквивалентно - не понимая пространство вimport *
ненужном) .; неизвестный пользователь добавил 19 символовw if len(w)<4 else
для правильной обработки строк 0 и 1.РЕДАКТИРОВАТЬ 5: Сохранено еще один символ в коде игры в гольф Бобби.
if len(w)<4 else
кif 4>len(w)else
.источник
len(w)-2
вместоlen(w[1:-1])
?C ++,
11197 символовВот полная программа для тех, кто хочет ее протестировать:
редактировать
Понял, что нет необходимости случайным образом менять индексы подкачки, сохранить переменную и еще несколько символов.
источник
php (68 символов)
короче (60 символов)
источник
.
вместо\w
.use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}
это 87 символов . Без использования строки, это 62 символа .Perl -
96 (или 71) символов84 (или 59) символовЭто то, что я придумал в Perl. Прошло несколько разных способов сделать это, но это казалось самым коротким из того, что я могу себе представить, до 97 символов.
Хотя, если вы вырежете строку «use» (которую я считаю верной, поскольку другие исключают строки #include в своих программах на C), я могу сократить ее до 71 символа :
РЕДАКТИРОВАТЬ Было предложено, чтобы я попытался сделать это, реализуя метод @tobius '. Таким образом, я получил его до 84 символов или, удалив строку использования , 59 символов :
источник
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}
Рубин,
7775 знаковМое решение Scala на чуть менее многословном языке. Я ни в коем случае не эксперт по Ruby, так что, вероятно, есть возможности для улучшения.
источник
Ruby 1,9,
77484644 символовОтказ от ответственности: я настроил это на основе ответа с наивысшим рейтингом - позже заметил тот же самый ответ. Вы можете проверить историю, в которой я придерживался своей первоначальной идеи, но изменил с ruby 1.8 на ruby 1.9 для коротких лямбд и
shuffle
.Если пустые слова разрешены, тогда
5654 символовисточник
Python 3,
949391 символовИспользуя другую технику. Может также работать в Python 2.
... if x[0:-1] else x
Дает ,x
если его длина равна 1 ( в противном случае он будет дублироваться). Таким образом, функция работает для строк длиной 0 и 1.Это
sample()
с https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .Так как это одно выражение, мы можем использовать
lambda
(исключаяreturn
,def
и пару скобок).Редактировать:
from random import*
чтобы сохранить 1 символ, после другой подачи Python.источник
x[0:-1]
статьx[:-1]
?JavaScript -
118122 символовКороче JavaScript - 118 символов без пробелов. Использует примерно тот же алгоритм, что и OP, но с меньшей цепочкой. Я пробовал много рекурсии, и я пробовал некоторую итерацию, но все они имеют тенденцию увязать в той или иной мере.
источник
return z?a+...+z:w;
в качестве неявной проверки длины будет в порядке. Предполагалось, что функция получит только «правильные» слова.a
вelse
троичной. Отредактировано и до 122 символов.a
что было бы неправильно для двухбуквенного ввода. Черт возьми, в следующий раз я выложу требования более тщательно.z
будет только неопределенным, если слово будет одной буквой (или меньше).D, 62 символа
ладно, я обманул с помощью обычного массива char вместо реальной строки (которая является неизменяемой char [], поэтому не нужно тасовать на месте)
редактировать с проверкой длины требуется еще 14
источник
return s;
и char [] вернет тип 11 больше символовimport std.random;
, а не только функция.char[] s
(чтобы сделать этоchar[]s
), но я годами не использовал D.php 5.3 (60 символов)
Улучшено до 56 символов и больше не требует версии 5.3:
источник
true
для коротких строк.Perl - 111 символов (без использования библиотечной функции)
Использование :
источник
питон
Это
9089112 символов Python!Редактировать 1: как функция на этот раз!
(спасибо, Гнибблер)Редактировать 2: теперь обрабатывает короткие слова
(спасибо, пользователь неизвестен)источник
Scala, 135
139142156символов-7: удалено «: строка» (тип возвращаемого значения может быть выведен)
-7: удалено «возвращение» (последнее выражение является возвращаемым значением)
-3:
s.size-2
вычеркнуто из-4:
toCharArray
->toArray
источник
Питон, 86 символов
Slnicig безопасен, так что нет ничего страшного. Wkros на всех длинах.
источник
C ++ 11: -
6866 символовполная программа:
источник
string s; cin >> s;
Ruby 1.9, 43 символа
г = ш [0] + [* ш [1 ..- 2] .chars] .shuffle.join + W [-1]
Пока не работает для строк длиной 1 символ (дублирует этот символ) и завершается ошибкой для пустой строки.
источник
Python - 76 символов
источник
R 104 (126)
Использование:
нижеследующая функция работает со словами длиной менее 3:
источник
Python, 102 символа
Нет импорта! Работает для слов 1 символа и выше. Это моя первая запись о гольфе, и я был вдохновлен записью BlueEyedBeast из кратчайшего кода, чтобы создать недетерминированный вывод для идеи использования id (Object) .
Объяснение: Он создает список букв из входных данных, исключая первое и последнее, и многократно появляется из этого списка и добавляет новый, пока он не будет пустым. Индекс, из которого он появляется, - это id (7)% len (список, из которого мы выскакиваем). Поскольку id (7) является адресом памяти объекта 7, он является по существу случайным. Итак, теперь у нас есть список случайно зашифрованных букв из центра исходного ввода. Все, что мы делаем сейчас, это добавляем первые и последние буквы исходного вывода соответственно, и мы получаем желаемый результат: (первая буква) + (скремблированная середина) + (последняя буква).
источник
Р,
959291 персонажИспользует ленивую оценку R для вычисления a и b как параметров функции, экономя место с последующим повторным использованием. Также в отличие от другого ответа R это работает для всех слов> 1 символ длиной. Пример ниже:
Редактировать:
ЗамененоЗаменено [[1]] на el ()unlist()
на[[]]
источник
D: 55 символов
полная программа:
источник
else s
часть отсутствует?randomShuffle()
на месте.randomShuffle(s[1..$-1])
может бытьs[1..$-1].randomShuffle
IIRC (если это не в версии D старше, чем этот пост)Эрланг,
188172132 символаЯ все еще изучаю Erlang, поэтому любые советы по сокращению это приветствуются.
полный код (модуль string_shuffle):
редактировать
Вытащил перемешанную часть как отдельную функцию, которая больше не требует, чтобы заголовок и хвост списка передавались.
Редактировать 2
Реструктурирован, чтобы удалить один из
f
шаблонов функций, изменил функцию shuffle, чтобы принимать только два параметра, изменилlists:delete
для--[]
, обменялlists:reverse
вызов наlists:last
источник