Учитывая дорогу ascii-art и время, которое потребовалось мне, чтобы пересечь ее, скажите мне, ускоряюсь ли я.
Единицы
Расстояние в произвольной единице d
. Время в произвольной единице t
.
Дорога
Вот простая дорога:
10=====
Эти 10
средства 10 d
в t
. Это ограничение скорости на дороге. Дорога имеет 5 =
с, так что его d
5. Таким образом, если пересечь эту дорогу в 0,5 t
, я пошел 10 d
за t
, потому что 5 / 0,5 = 10. предел скорости этой дороги 10, так что я остался в пределах ограничения скорости.
Но если я пересечь эту дорогу в 0.25 t
, я пошел 20 d
за t
, потому что 5 / 0,25 = 20. Ограничение скорости этой дороги 10, так что я пошел 10 за ограничение скорости.
Примеры и расчеты
Обратите внимание, что ввод 1 - это время, которое я потратил на дорогу, а ввод 2 - сама дорога.
Вот сложная дорога:
Input 1: 1.5
Input 2: 5=====10=====
Самый быстрый я мог бы ( по закону) пошли на первой дороге (первые 5 =
сек) составляет 5 d
в t
. Поскольку 5 (расстояние), деленное на 5 (ограничение скорости), равно 1, самое быстрое, что я мог бы сделать на этой дороге, - 1 t
.
На следующей дороге ограничение скорости составляет 10, а расстояние также равно 5, самое быстрое, что я мог преодолеть, это 0,5 (5/10). Суммируя минимальное количество раз, мы получим 1,5, что означает, что я ехал именно с ограничением скорости.
Примечание: я знаю, что, возможно, я ехал очень быстро на одной дороге и очень медленно на другой, и все еще проезжал 1.5, но примите здесь лучшее.
Последний пример:
Input 1: 3.2
Input 2: 3.0==========20===
Длина первой дороги 10 и ограничение скорости 3, поэтому минимальное время составляет 3,33333 ... (10/3).
Длина второй дороги 3 и ограничение скорости 20, поэтому минимальное время составляет 0,15 (3/20).
Суммируя время, мы получаем результат в 3.483333333 ... Я пересек его в 3.2, поэтому мне пришлось куда-то ускоряться.
Заметки:
- Вы должны вывести одно отдельное значение, если я, несомненно, ускоряюсь, и другое, если это не так.
- Ваша программа или функция может требовать ввода или вывода для завершения новой строки, но, пожалуйста, укажите это в своем представлении.
- Ваш первый вход будет моей скоростью. Это будет положительное число с плавающей точкой или целое число или строка.
- Ваш второй вход будет дорога. Это всегда будет соответствовать регулярному выражению
^(([1-9]+[0-9]*|[0-9]+\.[0-9]+)=+)+\n?$
. Вы можете проверить потенциальные входы здесь, если вы заинтересованы. - Вы можете получить входные данные в 2 параметрах функции или программы, в 2 отдельных файлах, из STDIN дважды или из строки через пробел, переданной в STDIN, функцию, файл или параметр командной строки.
- Если вы хотите, вы можете изменить порядок ввода.
- Любые вопросы? Спросите ниже в комментариях и счастливого кода для игры в гольф !
^(([1-9]+[0-9]*|(?!0\.0+\b)[0-9]+\.[0-9]+)=+)+\n?$
. (Это было бы чище, если смотреть сзади, но тогда ему понадобился бы движок .Net)Ответы:
05AB1E ,
2422 байтаВозвращает 1, когда несомненно ускоряется и 0 в противном случае.
Сохранено 2 байта благодаря carusocomputing .
Попробуйте онлайн!
-§'-å
не должно быть больше, чем простое сравнение, но по какой-то причине ни кажется,›
ни‹
работает между вычисленным значением и вторым вводомобъяснение
Используя в
3.0==========20===, 3.2
качестве примераисточник
'=¡õK¹S'=QJ0¡õK€g/O-0.S
23 байт.S
работает, хорошо. Это не возвращает 2 уникальных значения, так как возвращает 0, когда вы точно установили ограничение скорости.a > b
оператор литья до целого числа перед сравнением между поплавком и междунар. Это очень странно , на самом деле ... я получить его до 22 байт , хотя:'=¡€Þ¹S'=Q.¡O0K/O-§'-å
.g>s/
} O-§'-å на 23 с двумя возвращаемыми значениями. Может быть, есть еще какое-то улучшение? Я не вижу, что, хотя Это последнее сравнение действительно портит нас.Python 2 , 71 байт
Попробуйте онлайн!
Динамическая система типов Python может потребовать некоторых злоупотреблений.
Разделение входной строки
s.split('=')
превращаетk
знаки равенства вk-1
элементы списка с пустой строкой (кроме конца, где он должен быть обрезан). Например,Код перебирает эти элементы, обновляя текущую скорость
s
каждый раз, когда видит число. Обновление выполняется следующим образомs=float(c or s)
: где ifc
- непустая строка, мы получаемfloat(c)
, а в противном случаеc or s
оцениваемs
, гдеfloat(s)
просто сохраняемs
. Обратите внимание, чтоc
это строка иs
число, но Python не требует, не требует согласованных типов ввода и такжеfloat
принимает.Также обратите внимание, что переменная,
s
хранящая скорость, такая же, как и входная строка. Строка оценивается, когда начинается цикл, и изменение ее внутри цикла не меняет то, что повторяется. Таким образом, одну и ту же переменную можно использовать повторно, чтобы сэкономить на инициализации. Первый цикл всегда имеетc
число, поэтомуs=float(c or s)
его не волнуетs
начальная роль строки.Каждая итерация вычитает текущую скорость из допустимого значения, которое начинается как ограничение скорости. В конце, ограничение скорости было нарушено, если оно падает ниже
0
.источник
Python 3 , 79 байт
Попробуйте онлайн!
Например, ввод
3.0==========20===
преобразуется в строкуи оценивается, и результат сравнивается с входной скоростью. Каждый
-~
увеличивается на1
. Я новичок в регулярных выражениях, так что, возможно, есть лучший способ, как сделать обе замены одновременно. Спасибо Джонатану Аллану за то, что он указал, как соответствовать на всех, кроме=
персонажа.источник
"0.5=20==="
, результат будетNone
независимо от времени ввода.([\d|.]+)
может исправить это.Javascript (ES6), 63 байта
использование
Присвойте эту функцию переменной и вызовите ее, используя синтаксис каррирования. Первый аргумент - время, второй - дорога.
объяснение
Совпадает со всеми последовательными сериями символов, которые не являются знаками равенства, после которых следует серия знаков равенства. Каждое совпадение заменяется результатом внутренней функции, которая использует два аргумента: набор знаков равенства (в переменной
d
) и число (переменнаяc
). Функция возвращает длину дороги, разделенную на число, с добавлением +.Затем полученная строка оценивается и сравнивается с первым вводом.
Фрагмент стека
источник
GNU C, 128 байт
Обрабатывает также нецелые ограничения скорости.
#import<stdlib.h>
необходимо, чтобы компилятор не предполагал, чтоatof()
возвращаетint
.t<s-.001
необходим для того, чтобы тестовый случай с точным ограничением скорости работал, иначе ошибки округления заставят его думать, что вы ускорялись. Конечно, теперь, если время1.4999
вместо1.5
, оно не учитывает это ускорение. Я надеюсь, что все в порядке.Попробуйте онлайн!
источник
Perl 5 , 43 байта
42 байта кода +
-p
флаг.Попробуйте онлайн!
Для каждой группы цифр, за которой следуют некоторые знаки равенства (
[^=]+(=+)
), мы рассчитываем, сколько времени требуется, чтобы пересечь ее (количество равных, деленное на скорость:)(length$1)/$&
и суммировать эти времена внутри$t
. В конце нам просто нужно проверить, что$t
это меньше времени, которое вы потратили на его пересечение ($_=$t < <>
). Результат будет1
(true) или ничего (false).источник
Mathematica, 98 байт
Чистая функция, принимающая два аргумента, число (которое может быть целым числом, дробью, десятичной дробью
π
или даже числом в научной нотации) и строка, оканчивающаяся новой строкой, и возвращающаяTrue
илиFalse
. Объяснение в качестве примера с использованием входных данных3.2
и"3==========20===\n"
:#2~StringSplit~"="
производит{"3","","","","","","","","","","20","","","\n"}
. Обратите внимание, что число последовательных""
s на единицу меньше количества последовательных=
s в каждом прогоне.//.{z___,a_,b:Longest@""..,c__}:>{z,(Length@{b}+1)/ToExpression@a,c}
является повторяющимся правилом замены. Сначала он устанавливаетz
пустую последовательностьa
to"3"
,b
to"","","","","","","","",""
(самая длинная последовательность""
s, которую он может найти) иc
to"20","","","\n"
; команда(Length@{b}+1)/ToExpression@a
оценивает(9+1)/3
, и поэтому результатом замены является список{10/3, "20","","","\n"}
.Далее правила замены устанавливаются
z
в10/3
,a
to"20"
,b
to"",""
иc
to"\n"
. Теперь(Length@{b}+1)/ToExpression@a
оценивает(2+1)/20
, и поэтому результат замены есть{10/3, 3/20, "\n"}
. Правило замены не может найти другое совпадение, поэтому оно останавливается.Наконец,
Tr[...]-"\n"
(он сохраняет байт для использования фактической новой строки между кавычками вместо"\n"
) добавляет элементы списка, получая10/3 + 3/20 + "\n"
, а затем вычитает из того"\n"
, что Mathematica совершенно рад сделать. Наконец,<=#
сравнивает результат с первым вводом (3.2
в данном случае), который даетFalse
.источник
"1+2====3.456====π=====\n"
четным.Желе , 27 байт
Попробуйте онлайн!
Примечание: предполагается , что регулярное выражение дано в вопросе должно быть таким , что ограничение скорости не может быть
0.0
,0.00
и т.д. - так же , как это может не быть0
( подтверждено в качестве непреднамеренной собственности).Как?
источник
0.0
поскольку отфильтровываю значения, которые оцениваются как0
в коде, чтобы вывести ограничения по скорости.Python 3, 90 байт
Выходы,
True
если вы превышаете скорость,False
если вы не можете быть. Не требует (но будет работать с) трейлингом новой строки.Несмотря на то, что он не выглядит так, как он есть, он корректно обрабатывает поплавки как по времени ввода, так и по ограничениям скорости, поскольку регулярное выражение используется только для разделения сегментов дороги.
источник
MATL ,
3130 байтВходные данные: строка (ограничения скорости и дороги), затем число (используемая скорость). Выход,
1
если несомненно ускоряется,0
если нет.Попробуйте онлайн!
Пояснение с примером
Рассмотрим входы
'3.0==========20==='
и3.2
.источник
APL, 41 байт
Это принимает дорогу в качестве строки в качестве правого аргумента, а время - в качестве левого аргумента и возвращает,
1
если вы превышали скорость, а0
если нет, вот так:Объяснение:
X←⍵='='
: сохранить вX
битовом векторе все позиции,⍵
которые являются частью дороги.X≠¯1⌽X
: отметьте каждую позицию,X
которая не равна его правому соседу (обтекание), давая позиции, где начинаются номера и дорогиY←⍵⊂⍨
: разделить⍵
на эти позиции (давая массив чередующихся номеров и дорожных строк) и сохранить его вY
.Y⊂⍨2|⍳⍴Y
: разделитьY
на последовательные пары.{(≢⍵)÷⍎⍺}/¨
: для каждой пары разделите длину части дороги (≢⍵
) на результат вычисления номера части (⍎⍺
). Это дает минимальное время для каждого сегмента.+/
: Суммируйте время для всех сегментов, чтобы получить общее минимальное время.⍺<
: Проверьте, меньше ли заданное время, чем минимум, или нет.источник
TI-Basic,
168165 байтовВход - это дорога как
Str0
и время какT
. Убедитесь, что перед дорогой стоит цитата, напримерStr0=?"14========3===
.Выход составляет 0, если ускоряется, 1, если возможно, не ускоряется.
источник
Баш, 151 байт
Запуск как (например)
$ bash golf.sh .5 10=====
:объяснение
Включите расширенные операторы сопоставления с образцом в bash и назначьте дорогу переменной
r
.Петля пока
r
не пуста. Установить ,f
чтобыr
со всеми равноправными признаками удалены с конца, используя%%
расширение параметра и+()
расширенный оператор подстановки.Присвойте
s
промежуточную сумму минимального времени для каждого сегмента дороги. Это может быть переписано (возможно, немного) более читабельно, как:В основном, здесь происходит то, что мы используем здесь-строку, чтобы заставить
dc
команду делать математику за нас, так как bash не может выполнять арифметику с плавающей точкой сама по себе.9k
устанавливает точность, поэтому наше деление с плавающей точкой, иp
выводит результат, когда мы закончим. Это калькулятор обратной польской обработки, поэтому то, что мы действительно вычисляем,${f##*=}
делится на$[${#r}-${#f}]
плюс нашу текущую сумму (или, когда мы впервые пробежались иs
еще не были установлены, ничего, что заставляет нас предупредить сообщение о stderr оdc
' стек пустой, но он все равно печатает правильное число, потому что мы все равно добавляем ноль).Что касается фактических значений, которые мы делим:
${f##*=}
этоf
с наибольшим сопоставлением*=
с шаблоном, удаленным спереди. Посколькуf
наша текущая дорога со всеми знаками равенства удалена с конца, это означает${f##*=}
ограничение скорости на данном участке дороги. Например, если бы наша дорогаr
была «10 ===== 5 ===», тоf
была бы «10 ===== 5», и поэтому${f##*=}
«5».$[${#r}-${#f}]
количество знаков равенства в конце нашего отрезка дороги.${#r}
длинаr
; такf
простоr
со всеми знаками равенства в конце удален, можно просто вычесть длину от такового ,r
чтобы получить длину этого участка дороги.Снимите ограничение скорости этого участка дороги с конца
f
, оставив все остальные участки дороги, и установитеr
его, продолжая цикл для обработки следующего участка дороги.Проверьте,
$1
не меньше ли времени, которое мы потратили на дорогу (при условии как ), меньше минимума, разрешенного ограничением скорости. Этот минимумs
может быть плавающим, поэтому мыdc
снова обращаемся к нему для сравнения.dc
действительно имеет оператор сравнения, но на самом деле его использование оказалось на 9 байтов больше, чем этот, поэтому вместо этого я вычитаю наше время в пути из минимума и проверяю, отрицательно ли оно, проверяя, начинается ли оно с тире. Возможно, не элегантный, но все по-честному в любви и кодегольфе.Поскольку эта проверка является последней командой в сценарии, ее возвращаемое значение будет также возвращено сценарием: 0, если возможно, ускорение, 1, если определенно ускорение:
источник
Python 3.6, 111 байт
Мой первый код гольф!
Попробуйте онлайн!
re.split('(=+)',b)[:-1]
Разбивает дорогу кусками=
.Затем он перебирает результат, используя
try:s=float(c)
для установки текущего ограничения скорости, если текущим элементом является число, илиexcept:t+=len(c)/s
для добавления времени для прохождения этого отрезка дороги к совокупному итогу.Наконец, он возвращает время, затраченное на максимально быстрое время.
источник
PHP5
207202 байтаСначала попытайтесь ответить на кодовый гольф, пожалуйста, будьте осторожны со мной. Я уверен, что один из вас, гениев, сможет значительно сократить это, любые советы по игре в гольф приветствуются.
Вызвать с
Возвращает истину, если вы были ниже ограничения скорости, ложь в противном случае
источник
Дьялог АПЛ, 27 байт
<∘(+/(⍎'='⎕r' ')÷⍨'=+'⎕s 1)
'=+'⎕s 1
является функцией, которая идентифицирует отрезки'='
с помощью регулярного выражения и возвращает вектор их длин (⎕s
правый операнд 0 будет означать смещения; 1 - длины; 2 - индексы совпадающих регулярных выражений)'='⎕r' '
заменяет'='
s пробелами⍎'='⎕r' '
выполняет его - возвращает вектор скоростей÷⍨
в середине делит два вектора (⍨
меняет местами аргументы, поэтому расстояние делится на скорость)+/
это суммавсе до сих пор - 4 поезда - функция без явного аргумента
<∘
сочиняет «меньше чем» перед этой функцией; поэтому функция будет действовать только для правого аргумента, а ее результат будет сравниваться с левым аргументомисточник
F # (165 байт)
Я все еще новичок в F #, поэтому, если я сделал что-то странное или глупое, дайте мне знать.
источник
Метод C # (
137122 байта)Требуется
using System.Linq
добавить 19 байтов, включенных в 122:Расширенная версия:
road
Строка разбивается на=
характер. В зависимости от того, является ли строка результирующим массивом пустым, агрегатная функция устанавливаетpace
переменную для сегмента (обозначая время, необходимое для прохождения одного=
) и вычитает ее из предоставленного времени. Это приведет к слишком большому количеству вычитаний (для конечного сегмента дороги), поэтому вместо сравнения0
мы сравниваем с-pace
источник
R , 100 байт
Попробуйте онлайн!
Возвращает
TRUE
для однозначно ускоряющихся значений,FALSE
для, возможно, не быстрых.источник
PowerShell, 71 bytes
Try it online!
Test script:
Output:
Explanation:
5=====10=====
, swaps elements, adds brackets and operators+(=====)/5+(=====)/10
=
with+1
:+(+1+1+1+1+1)/5+(+1+1+1+1+1)/10
источник