В абсурдной пьесе Розенкранц и Гильденстерн мертвы , два главных героя Розенкранц и Гильденстерн (или они?) Всегда путают, кто из них есть кто, а иногда и какой из их собственных частей тела из-за ощущаемого отсутствия индивидуальная идентичность. Разве не было бы абсурдом, если бы они даже перемешали свои имена?
Ваша задача состоит в том, чтобы написать функцию, которая принимает строку четной длины (и, по замыслу, кратную 4), которая превышает 7 символов, разделяет ее и перемешивает ее.
Разделение должно быть следующим : строка будет иметь формат "abscd"
, где s будет символом-разделителем . Первый раздел и разделитель abs
будут первой половиной строки, тогда как вторая половина будетcd
Длина a
будет(string length / 4) - 1
Длина b
будет(string length / 4)
Длина s
будет1
Длина c
будет(string length / 4) + 1
Длина d
будет(string length / 4) - 1
Это может быть очень запутанным, поэтому позвольте мне показать вам несколько примеров
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
В заключение:
Затем вы перемешаете части вокруг, выводя adscb
ех. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Rulez:
- Стандартные лазейки запрещены
- Приемлемые ответы: функция, которая принимает входные данные через одну входную строку и возвращает одну выходную строку
- Если входная строка не соответствует требованиям, указанным выше, ваш код ДОЛЖЕН выдавать ошибку (не имеет значения, какого типа
Exception
илиError
) - Так
code-golf
что самый короткий (действительный) ответ (на каждом языке) выигрывает! - Бонусные баллы за однострочник :-) (Не совсем так, просто классные баллы)
Ответы:
K (ок) ,
353433 байтаПопробуйте онлайн!
Без проверки ввода (для вознаграждения ngn),
252423 байтаПопробуйте онлайн!
Быстро изучив немного K, и, глядя на список глаголов, я подумал, что здесь может работать альтернативный подход ( без использования cut). И это сработало отлично.
Как это работает
источник
Perl 6 ,
6058 байт-2 байта благодаря Джо Кингу
Попробуйте онлайн!
Выдает «Rotorizing длина подсписка вне диапазона» в случае ошибки.
объяснение
источник
J ,
3635 байтПопробуйте онлайн!
-1 байт
{.
+ отрицательные длины и;.2
вместо них используются маркеры «окончания».Оригинальный ответ, 36 байт
Попробуйте онлайн!
ngn упомянул «вырезать» в комментарии к более раннему ответу K , и это заставило меня попробовать J, который имеет такой же «вырез» (я понятия не имею, как работает K).
Как это работает
Обратите внимание, что эта функция автоматически обрабатывает неверные данные:
{.
throws,domain error
поскольку его аргумент length должен быть целым числом.5 A.
выбрасываетindex error
.length error
выбрасывается.источник
Python 3 ,
10310210197888684 байтаПопробуйте онлайн!
На самом деле не одна
;
строка , но на один байт на строку меньше, чем разрыв строки и отступ.Выдает,
ZeroDivisionError
если длина входной строки меньше 8 или не кратна 4.Также работает в Python 2.
-4 байта благодаря Джо Кингу
-9 байт благодаря овсу
-2 байта благодаря Джонатану Фреху
-2 байта благодаря Bubbler
источник
//=
самой внешней пары стало излишним. Огромное спасибо!-l+1
<->1-l
?Perl 6 , 78 байт
Попробуйте онлайн!
Блок анонимного кода, который принимает строку и возвращает измененную строку, если она действительна, иначе возвращает ошибку деления на ноль. Я знаю, что могу изменить массив напрямую, чтобы я мог поменять местами два раздела строки, но я не могу понять это.
источник
K (нгн / к) ,
1201131039995 байтБудем надеяться, что их можно увеличить, добавив дополнительную функцию для проверки, если длина строки делится на четыре, выводит ошибку со ссылкой на необъявленную переменную, если ввод неверен
РЕДАКТИРОВАТЬ: Пропущенное условие на длине больше 7, включая
РЕДАКТИРОВАТЬ: объединены в одну функцию, удалены избыточные объявления переменных
Попробуйте онлайн!
источник
indices_string
)? пинг меня в саду, если я должен объяснить этоСетчатка 0.8.2 , 58 или 73 или 83 или 93 байта
Попробуйте онлайн! Объяснение:
Захват
a
в$1
, и сделать его как можно более коротким*?
.$#2
,$#3
И в$#4
конечном итоге , как длинаa
.Захват
b
в$4
. В(?<-2>.)+
захватывает до длиныa
, в то время как другой.
добавляет 1 к его длине по мере необходимости.Захват
s
иc
в$6
. Их общая длина на три больше, чем длинаa
.Захват
d
в$7
. Его длина не больше, чем длинаa
.Мы сделали
a
как можно короче, но мы все еще хотим достичь конца ввода.Обмен
b
иd
.Вышеуказанный этап не проверяет его ввод. Поскольку Retina не имеет ошибок во время выполнения, существует несколько вариантов проверки ввода:
Ничего не выводится, если длина меньше 8 или не кратна 4. (+15 байт)
Выводится,
Error
если длина меньше 8 или не кратна 4. (+25 байт)Зависает, если длина меньше 8 или не кратна 4. (+35 байт)
источник
C (gcc) с
-Dx=memcpy
а-DL=(l-1)
,154158160 байтВозвращает NULL, если длина входной строки не делится на 4 или короче 8 символов.
Спасибо Rogem и Jonathan Frech за предложения.
РЕДАКТИРОВАТЬ: Перемещенный препроцессор определяет в командной строке и делает строку динамически распределенной, чтобы строго соответствовать загадке.
Попробуйте онлайн!
источник
t[80]
? Кажется, нет верхней границы относительно длины ввода.malloc()
вместо этого.NULL
для неверного вывода, использует возвращаемые значения изmemcpy()
, подобного функции макроса для пропуска типов и массивов переменной длины C99 для пропускаmalloc()
.//
или-w
?-w
- просто удобство для подавления предупреждений (поэтому ошибки легче найти). Я обычно добавляю аргументы командной строки после a,//
чтобы TIO подсчитывал мне их байты, а затем вычитал 1 из общего количества, чтобы учесть один дополнительный символ, необходимый для этого.Желе , 28 байт
(Если разрешена полная программа, мы можем удалить завершающий символ
F
).Если длина меньше 8 или не делится на четыре, a
ValueError
увеличивается во время целочисленного деленияinf
(float) на4
- деление даетNaN
(также float), которое затем не может быть брошенным наint
.Попробуйте онлайн!
Как?
источник
Желе , 25 байт
Попробуйте онлайн!
Ẏ
Могут быть удалены , чтобы сделать это в полной программе.источник
Рубин , 64 байта
Попробуйте онлайн!
источник
JavaScript (ES6),
9789 байтСохранено 8 байт благодаря @ l4m2
Попробуйте онлайн!
источник
JavaScript (Node.js) , 80 байт
Попробуйте онлайн!
JavaScript (Node.js) , 84 байта
Попробуйте онлайн!
JavaScript (Node.js) , 87 байт
Попробуйте онлайн!
Короче чем RegExp
источник
Java 8, 135 байт
Выдает
ArithmeticException
(делит на ноль), если входная строка не соответствует требованиям. Попробуйте это онлайн здесь .Ungolfed:
источник
l/=l>7&l%4<1?4:0;
вместоl=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 байт
Возвращает по модификации. Компилировать с:
Исходный файл:
Попробуйте онлайн!
Degolf
источник