Задание
Это простой вызов. Ваш ввод представляет собой одну непустую строку, содержащую только цифры 0123456789
и хэши #
. Он будет содержать ровно одну последовательность цифр, которая кодирует неотрицательное целое число и может обернуть конец строки, и хотя бы одну #
. Целое число может иметь начальные нули. Так , например, ##44##
, 013####
и 23###1
являются действительными входы, в то время как ###
, 0099
и #4#4
нет.
Ваша задача - извлечь целое число n
из строки и вывести строку с повернутыми n
шагами вправо.
Примеры
- Вход
#1##
должен быть повернут на 1 шаг вправо, поэтому правильный вывод##1#
. - Вход
#026###
должен быть повернут на 26 шагов вправо, так как начальный 0 игнорируется. Правильный вывод есть26####0
. - Вход
1####2
содержит целое число 21, завернутое в конец, поэтому его следует повернуть на 21 шаг вправо. Правильный вывод есть##21##
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Вы можете предположить, что число n
соответствует стандартному int
типу вашего языка. И наоборот, если этот стандартный int
тип реализует целые числа произвольной точности, вы должны поддерживать (теоретически) сколь угодно большойn
.
Контрольные примеры
#1## -> ##1#
##4## -> #4###
1####1 -> ####11
1####2 -> ##21##
#026### -> 26####0
#000### -> #000###
###82399 -> ##82399#
51379#97 -> #9751379
#98##### -> ###98###
#######4## -> #4########
60752#1183 -> 8360752#11
####99366800## -> 366800######99
########9##### -> ###9##########
91#####515694837 -> 1#####5156948379
###6114558###### -> #6114558########
######219088736090042#### -> 9088736090042##########21
#46055080150577874656291186550000138168########### -> 0138168############4605508015057787465629118655000
568375993099127531613012513406622393034741346840434468680494753262730615610086255892915828812820699971764142551702608639695081452206500085233149468399533981039485419872101852######################3680 -> 99533981039485419872101852######################36805683759930991275316130125134066223930347413468404344686804947532627306156100862558929158288128206999717641425517026086396950814522065000852331494683
n
соответствуютint
типу вашего языка (который может иметь произвольную точность). Я обновлю текст запроса позже.1234
?Ответы:
CJam, 11 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Обратите внимание, что это не сработает для двух последних тестовых случаев, так как задействованные числа не вписываются в 64 бит.
Как это работает
источник
Юлия,
7165 байтЭто анонимная функция, которая принимает строку и возвращает строку. Чтобы вызвать его, назначьте его переменной.
Мы добавляем входные данные к себе, разделяем их на массив с
#
разделителем, анализируем каждое целое число и берем максимум. Это определяет количество раз, когда мы сдвигаем строку вправо. Мы разбиваем строку наChar
массив, сдвигаем иjoin
возвращаем вместе.источник
Python, 66 байт
источник
Сетчатка,
655749Сохранено 8 байтов благодаря Мартину!
Попробуйте онлайн!
Обратите внимание, что это приведет к истечению времени ожидания / нехватке памяти для очень больших тестовых примеров в Интернете и на большинстве нормальных компьютеров для некоторых из более крупных.
Это берет последний номер в строке и первый или нулевой номер в строке и помещает их перед строкой. Затем он преобразует это объединенное число в одинарное и многократно вращается, выпуская одинарную цифру.
источник
Желе,
1210 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Задний план
Скажите, что вход
51379#97
.Повторяя строку дважды (
51379#9751379#97
), мы можем убедиться, что она будет содержать непрерывное представление числа.Далее мы применяем побитовое НЕ ко всем символам. Это попытается привести к int, поэтому '1' оценивается как 1 , а затем отображается на ~ 1 = -2 . При сбое (
#
) возвращается 0 .Для нашего примера это дает
Затем мы разделяем нули, чтобы отделить часть, которая кодирует число от остальных.
Побитовое НЕ отображает n в -n - 1 , поэтому мы увеличиваем каждый для получения -n .
Далее мы конвертируем каждый список из базы 10 в целое число.
Наименьшее число является отрицательным значением того, которое мы ищем. Поскольку атом вращения списка желе
ṙ
вращается влево , это позволяет избежать умножения на -1 для поворота вправо.Как это работает
источник
MATL ,
28251716 байтНа 8 байт меньше, заимствуя идею Денниса о разбиении массива и изменении порядка частей
Два последних теста не работают, потому что число слишком велико.
РЕДАКТИРОВАТЬ (20 мая 2016 г.) Код в ссылке используется
Xz
вместоXv
, в связи с недавними изменениями в языке.Попробуйте онлайн!
источник
PowerShell, 153 байта
(Но см. Раздел «Дополнительные кредиты» ниже)
В PowerShell нет концепции «сдвига» массива, поэтому мне пришлось развернуть собственное решение. Для больших чисел потребуется много времени, но в конечном итоге он должен завершить все, что уместится в 32-битном int.
Принимает ввод
$a
и устанавливает новую переменную$d
как [System.Collections.ArrayList] . Это сделано потому, что с технической точки зрения массивы в PowerShell являются неизменяемыми (более подробное объяснение приведено ниже в разделе «Дополнительные кредиты») и, следовательно, не поддерживают произвольные вставки или удаления, которые необходимы для сдвига. Затем мы входим вfor
цикл.Начальное условие - хитрость, которую я нашел - если мы объединяем входные данные, разделяем их
#
и игнорируем пустые значения, второй элемент полученного массива будет равен нашему числу независимо от переноса. Мы устанавливаем это значение$b
и уменьшаем$b
каждый раз, пока оно не станет равным нулю.На каждой итерации мы устанавливаем хелпер
$r
в качестве последнего элемента в массиве, удаляем этот последний элемент, а затем вставляем элемент вперед ... эффективно "сдвигая" массив вправо на один элемент.Наконец, мы просто выводим с
-join$d
таким образом, что он объединяется в одну строку.Дополнительный кредит
Если проблема заключалась в смещении массива влево, а не вправо , мы можем сделать это значительно короче, используя множественное присваивание . По сути, «если значение присваивания содержит больше элементов, чем переменных, все остальные значения присваиваются последней переменной».
По сути, это означает что-то вроде
$c=@(1,2,3)
и$a,$b=$c
будет иметь
$a=1
int и$b=@(2,3)
массив.PowerShell, 90 байт, выполняет сдвиг влево вместо сдвига вправо
Здесь мы снова принимаем данные и устанавливаем,
$b
как указано выше. Мы повторно приводим$a
как массив символов, а затем вводим тот жеfor
цикл, что и выше. Однако в этот раз нам не нужно было поддерживать произвольное удаление / вставку, поэтому нам не нужно использовать дорогостоящий[System.Collections.ArrayList]
объект или дорогостоящие вызовы методов. Вместо этого мы просто устанавливаем$r
быть первым элементом$a
, а остальные элементы повторно сохраняются в$a
. Тогда мы+=
вернемся к концу.(Как я уже сказал, массивы PowerShell являются технически неизменными, но
+=
оператор здесь перегружен - он принимает массив и другой объект, объединяет их (технический термин) в новый массив, возвращает его, сохраняет его как имя переменной и уничтожает исходный массив. Функционально мы только что добавили элемент в конец массива, но технически (и с точки зрения очистки памяти / мусора и т. д.) это совершенно новый массив. Это, очевидно, может стать дорогостоящей операцией если массив большой или сложный. Обратная сторона в том, что, поскольку массивы неизменны, индексирование в них или итерации по ним очень дешевы.)Выход остается тем же действием, с
-join
оператором, чтобы превратить его в одну строку.источник
Серьезно, 21 байт
Попробуйте онлайн!
Предупреждение: это решение очень неэффективно, поэтому для больших тестовых случаев тайм-аут на TIO истекает. Используйте местного переводчика.
Объяснение:
источник
Mathematica, 69 байт
Найти последовательности чисел в, если есть 2, то их порядок должен быть обратным. Объединить строки (если он только один, он просто возвращает строку чисел). Преобразуйте строку в числовое и поверните строку столько раз.
источник
FromDigits
работает вместоToExpression
.Pyth,
2214 байтовПопробуй это здесь!
объяснение
Это работает для всех тестовых случаев, а также почти всегда заканчивается для очень больших чисел.
источник
-...\#
вместоh:..."\d+"1
. Кроме того, нет необходимости преобразовыватьz
в список символов,.>
работает также на строку.JavaScript (ES6) 66
На этот раз
%
полезен тупой минус javascript для отрицательных чиселисточник
b+a
представляет собой конкатенацию строк.a='32',b='1', (b?b+a:a)=='132', (b|0+a)==33
Pyth, 10 байт
Попробуйте онлайн. Тестирование.
Это перевод ответа Дениса CJam . Я делаю это вики сообщества, так как я не придумал это.
объяснение
источник
JavaScript (ES6),
6764 байтаЕще один порт CJam ответа Денниса.
Редактировать: Сохранение 3 байтов путем присвоения части ответа edc65, на которую он не обратил внимания.
источник
s+s
трюк вместо этого. (Я действительно думал об этом прошлой ночью, но я был слишком устал, чтобы попробовать это в то время.)Perl 5, 41 байт
39 байтов плюс два для
-lF
флагов (-M5.01
бесплатно):perl -lF -M5.01 script.pl
Объяснение:
-lF
читает входные данные, удаляет завершающий символ новой строки, помещает остаток в строку$_
символ , разбивает его на символы и помещает этот раздел в массив@F
./#+/
находит первую строку#
s в$_
и устанавливает$`
равным материалу перед ним и$'
равным материалу после него. Если$`
пусто, то$'
может содержать больше#
s. Тем не менее,$'.$`
это строка, чья начальная подстрока является числом поворотов массива.1..$'.$`
, который обрабатывается$'.$`
как целое число и, таким образом, нумерует его, что удаляет любой окончательный#
s, поэтому список составляет от1
количества массива.pop
последний элемент иunshift
его начало).say
все элементы повернуты массивом.источник
Рубин -
687270 байтsplit
преобразует строку в массив(s+s).scan(/\d+/)
объединить строку с собой и получить массив чисел (в виде строк)map(&:to_i)
конвертировать строки в целыеmax
выбрать самый большой introtate
max
раз*""
преобразовать массив обратно в строку (сокращение отjoin
)Использование :
ruby scriptname.rb "[string]"
источник
05AB1E ,
1413 байтЧто ж, код вряд ли закончится для чисел больше 100000, но если вы достаточно терпеливы, будет вывод :). Код:
Объяснение:
Попробуйте онлайн!
Использует кодировку CP-1252
источник
VBSCRIPT,
8299 БАЙТОВпредыдущий код не обрабатывал случаи с числом, завернутым в конец
UNGOLFED
это отстой ... возможно, есть лучший способ сделать это, даже в VBscript
источник
a
находится функция ввода и она возвращает результат? Таким образом, вам не нужно быinputbox
иmsgbox
звонки.b
?Mathematica,
7358 байтМного байт. 15 байт сохранено благодаря в IPoiler
источник
StringRotateRight
сохраняет несколько байтов здесь.Matlab (73)
источник
Matlab
(86)72Функция выполняет суммирование строки два раза, один раз для целочисленного извлечения, второй для желаемой задачи, это не занимает слишком много времени, потому что Matlab продолжает вращаться на
(Dim)modulus(Length)
за исключением того, что он падает из-за ошибки сегментации для больших диапазонов.Будут бороться, как в гольф это больше ....
(86)
источник