Интерпретировать свободные диапазоны
ListSharp - это интерпретируемый язык программирования, который имеет много функций, одна из которых - это создатель диапазона на основе 1 индекса, который работает следующим образом:
Вы определяете диапазон как (INT) TO (INT)
или только (INT)
где оба или одно целое может перейти от минимального до максимального значения int32
Затем вы можете использовать эти диапазоны для извлечения элементов массива, не боясь перешагнуть его границы.
следовательно:
1 TO 5
генерирует: {1,2,3,4,5}
3
генерирует: {3}
Диапазоны можно сложить с помощью AND
оператора
1 TO 5 AND 3 TO 6
генерирует: {1,2,3,4,5,3,4,5,6}
помните, что это работает и с отрицательными числами
3 TO -3
генерирует: {3,2,1,0,-1,-2,-3}
Проблема заключается в следующем:
вход
Массив символов и ранее определенное предложение диапазона в виде строки
Выход
Элементы в позициях диапазона на основе индекса 1 (несуществующие / отрицательные индексы переводятся в пустой символ)
Как победить
В качестве задачи по коду для игры в гольф вы должны создать программу с самым коротким числом байтов, чтобы выиграть
Было отмечено, что пустых символов не существует, поэтому вы должны их игнорировать (я только показал их здесь, чтобы было легче понять, но это запутало людей)
Тестовые случаи:
input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}
range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
источник
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
когда-нибудь вход, и каков ожидаемый результат?AND
кратных диапазонов. Кроме того, Вы не ответили, можем ли мы использовать индексацию с нуля, которая является стандартной в большинстве языков.Ответы:
Python 2 -
239211210 байтСпасибо @ mbomb007 и @Cyoce за дальнейшую игру в гольф!
Прямой подход. Пробовал генераторы и рекурсивную версию, но они не могли побить простое для каждого цикла. Я играю в гольф, так что, скорее всего, это можно немного улучшить. Кроме того, основным недостатком этого фрагмента является то, что диапазон как объект списка вычисляется снова каждый раз, когда элемент извлекается из массива символов (см. Последнюю строку, понимание списка). Это означает,
r(s)
что выполняетсяlen(r(s)) + 1
раз.Код Ungolfed:
Тестовые случаи:
Выход:
источник
if
той же строкой, и разделить их точкой с запятой. И удалить пробел в[x] for
. Также1if b else-1
может быть заменен либо на,b and 1or-1
либо2*bool(b)-1
для сохранения байта.lambda
, так как это не рекурсивно.t+=[int(x)]
canbecomet+=int(x),
Groovy (
9997 байт)Попробуйте это здесь: https://groovyconsole.appspot.com/edit/5155820207603712
Объяснение:
.replaceAll(" TO ","..")
- Заменить на с традиционным диапазоном..replaceAll(" AND ", ",")
- Заменить все ии с запятой."[${...}]"
- Окружите его обозначением «список» в Groovy.Eval.me(...)
- Оценить строку как код Groovy..flatten()
- Свести смесь двумерного массива и одномерного массива в одномерный массив..collect{v[it]}
- Соберите индексы из массива в единую структуру.Вот решение
115113 байтов, удаляющее нули из вывода: https://groovyconsole.appspot.com/edit/5185924841340928Вот 117-байтовое решение, если вы говорите, что оно ДОЛЖНО быть проиндексировано как 1 вместо 0: https://groovyconsole.appspot.com/edit/5205468955803648
Если вы хотите, чтобы я поменял оригинал на байт 113/117, дайте мне знать.
источник
Eval.me(...)
до сих пор; использование его на практике было бы смехотворно небезопасным, но все же это было бы здорово знать.C #, 342 байта
Безгольфовый метод:
Полная программа с тестовыми примерами:
Наивное решение, использующее список символов, который использует
' '
пустой символ и выполняет свою работу. Надеемся на улучшение в ближайшее время.источник
Скала, 165 байт
Объяснение:
источник
Python 2,
156155 байтМой ответ имеет некоторые подобные идеи, 1Darco1 в ответ , но, используя другой подход с самого начала (строка нарезки , а не списков), то в конечном итоге совсем немного короче. Это было бы на четыре байта короче, если бы 0-индексация была разрешена.
Попробуйте онлайн
К счастью, я могу разобрать строки, содержащие пробелы, в целые числа. Отрицательное индексирование в индексах Python с конца строки, поэтому я использую
i[-1]
либо то же самое,i[0]
либо второе значение, если оно есть. Затем я должен настроить любые отрицательные значения диапазона на более отрицательные, чтобы они не мешали нарезке. Умножение отрицательных значений на11**9
(2357947691
) учитывает диапазоны, используя целочисленное минимальное значение. Затем просто нарежьте строку, используя обратный срез, если диапазон перевернут.С нулевой индексацией (151 байт):
источник
range
подход - это просто супер многословная форма именно этого. И ты даже избавился от всейif"T"in x: else:
роли. +1R, 142 байта
Предполагая, что я правильно понял задачу, здесь я предполагаю, что
r
это предопределенное предложение диапазона в строковом формате и что входной массив («Hello world», в примерах) читается из stdin.Некоторые тестовые случаи:
Ungolfed / объяснил
Строка 1
R имеет хороший инфиксный оператор,
:
который генерирует последовательности.1:5
дает[1, 2, 3, 4, 5]
, и0:-2
дает[0, -1, -2]
. Итак, мы заменим предложениеTO
в свободном диапазоне на:
.Интерпретация
AND
- это просто объединение. Для этого мы можем использовать функциюc
, которая легко может принимать произвольное количество аргументов, разделенных запятыми. Таким образом, мы заменимAND
на,
а затем обернуть все это в
c(
,)
.Это дает строку символов, которая может выглядеть следующим образом
c( 1 : 5 , 7 )
. Мы призываемparse
преобразовать в тип «выражение», а затемeval
оценить выражение. Получившаяся последовательность чисел затем переназначается переменнойr
.Линия 2
Теперь для уродливой части - работа со строками в R, которая быстро запутывается. Сначала мы определяем
e
пустую строку (она понадобится нам позже).Мы читаем из stdin и преобразуем строку символов в массив отдельных символов, разбивая пустую строку. (Например, мы переходим от «Hi» к [«H», «i»].) Это возвращает список длины 1, поэтому мы должны запросить первый элемент,
[[1]]
чтобы получить массив, с которым мы можем работать. Тьфу, я предупреждал тебя, это было грязно.Индексы R начинаются с 1 и имеют приятную особенность с отрицательными числами. Предположим,
x
есть['a', 'b', 'c']
. Звонокx[1]
неудивительно возвращается'a'
. Вызовx[-1]
возвращает все ,x
кроме индекса1
, то есть['b', 'c']
. Это классная функция, но это означает, что мы должны быть осторожны с нашими отрицательными показателями для этой проблемы. Итак, сейчас мы просто возвращаем элементы входного массива с индексом>0
и присваиваем результатo
.Линия 3
Однако есть проблема! Для индексов, которые больше, чем длина массива, R просто возвращает
NA
значения. Нам нужно это вернуть пустые строки. Таким образом , мы переопределять элементы ,o
для которыхis.na(o)
этоTRUE
будет пустая строка.Строка 4
Наконец, как мы можем справиться с отрицательными (и нулевыми) индексами? Им всем нужно вернуть пустую строку, поэтому мы повторяем пустую строку N раз, где N - это количество индексов
<1
.Наконец, мы объединяем ранее определенный
o
в этот (потенциально пустой) список.источник
JavaScript (ES6), 141
Безымянная функция с 2 параметрами, первый из которых представляет собой массив символов (также может быть строкой), а второй - строку, содержащую определение диапазона.
Возвращаемым значением является массив, в котором каждый элемент может быть либо одним символом, либо значением js
undefined
. При строковом преобразовании это приводит к последовательности символов, разделенных запятыми, с неопределенным значением, показанным как «пустой» символ - как тестовые примеры в первой версии вопроса.Используя
.join
вы можете получить строковый результат, похожий на результат теста в текущей версии вопроса.Меньше гольфа
Тестовое задание
источник
Perl - 110 байт
Вызов сценария в командной строке со строкой в качестве первого аргумента и диапазоном в качестве второго.
Де-запутанный:
источник
Python 2, 146 байт
Все тесты в идеоне
Разбивает предложение
s
на «И», разбивает каждое из результирующих подпунктов на «ТО», преобразует результирующие строки вint
использованиеmap
. Каждый из результатов будет иметь 1 или 2 элемента (1, если в подпункте «TO» не было).Создает диапазоны на основе 0 для каждого из них, используя параметр шага диапазона как 1 или -1, проверяя значения в индексах 0 и -1 (список с одной записью имеет эту запись в обоих индексах).
Выполняет эти диапазоны и создает список выходных данных, если предоставленные индексы находятся в диапазоне (
if 0<=i<len(a)
).источник
Желе ,
28 2725 байтTryItOnline (также будет работать со строкой вместо массива char)
Как?
источник
Clojure
232230229 байтО, какой монстр я создал ... Но на самом деле это было 260, когда я собирался представить его.
Изменить: убрал пробел из
#(get r %_"")
,(if_(< f t)
и(take-nth 2_%)
(обозначен как_
).Меньше гольфа:
Используется
clojure.string/split
для разделения на "И" и "",take-nth
отбрасывает «TO» между целыми числами, сопоставление аргументов функции обрабатывает случай с 1 или 2 аргументами, и это все.Соглашение о вызовах:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
источник
#
символами.#
? Я пробовал безуспешно, он "сливается" с предыдущим токеном. О, еще одно место, чтобы удалить, прежде чем%
там.