Игроки традиционной настольной игры Go измеряют свое мастерство в системе рангов :
- Игроки новые к игре ранжируются 30 кю (письменный
30k
) , и прогресс отсчет до 1 - го кю (письменного1k
). Они считаются студентами . - Игрок может повышаться с 1-го кю до 1 - го ранга (написано
1d
), а затем прогрессировать до 7 -го ранга (написано7d
). Это главные звания. - Исключительно опытные игроки прошлого
7d
могут повысить свой ранг до 1-го профессионального дана1p
, а прогресс - до 9 -го ранга профессионального дана (написано9p
). Это высший ранг.
Вкратце: ранги упорядочены 30k < 29k < ··· < 1k < 1d < 2d < ··· < 7d < 1p < 2p < ··· < 9p
.
задача
Учитывая две строки среди { 30k
, ..., 1k
, 1d
..., 7d
, 1p
..., 9p
} в качестве входных данных, выведите выше ранг два. (Если они равны, просто выведите любой из них.)
(Как обычно, ввод / вывод является гибким - ваш ответ может быть функцией или полной программой, читающей ввод любым разумным способом и производящей вывод любым разумным способом.)
Это код-гольф : цель состоит в том, чтобы минимизировать количество байтов вашего кода.
Контрольные примеры
(Формат:. input1 input2 output
)
29k 9k 9k
21k 27k 21k
6d 1p 1p
5d 17k 5d
1k 1d 1d
1d 1d 1d
1d 2d 2d
9p 1d 9p
2d 30k 2d
1p 1k 1p
1d 1p 1p
1p 2d 1p
7p 8p 8p
30k 30k 30k
4 k
или4K
или так, либо.)30k
,29k
,1k
,1d
и так далее, так что я не допущу никаких изменений там.Ответы:
JavaScript (ES7), 58 байт
Принимает две строки в синтаксисе карри
(a)(b)
.Попробуйте онлайн!
Как?
Вспомогательная функция g () переводит входную строку s в счет.
1) Мы ищем s [1] в строке "_dp" . Это дает:
2) Мы кубизируем этот результат, который оставляет 1 и -1 неизменными, но дает 8 для профессионального ранга дана .
3) Умножаем на десятичную часть ранга.
источник
a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
Желе , 14 байт
Монадическая ссылка, принимающая список строк * (как описано), который дает самый высокий найденный ранг.
* Также работает с номерами, отличными от двух.
Попробуйте онлайн! Или посмотрите тестовый набор .
Как?
Сортировка по ключевой функции и возвращает крайнюю правую (то есть максимум).
Буквы , d и p имеют порядковые номера 107 , 100 и 112 соответственно. В двоичном коде 107 установлено восемь битов, в то время как остальные нет, следовательно, побитовое ИЛИ с 8 мы получаем 107, 108 и 120 соответственно - теперь они находятся в порядке, необходимом для сортировки классов, которые они идентифицируют.К d п 107 100 112 107
Любительские ранги расположены в порядке убывания, поэтому для завершения нашей ключевой функции мы могли бы объединить наш идентификатор класса с номером, указанным в строке, с отрицанием, если строка заканчивается на (например, -> while -> ). В коде это требует хранения идентификатора класса и возведения в степень минус один для умножения - что составляет 16 байтов.К 16
'7k'
[107,-7]
7p
[120,7]
OṪ|©8-*×ṖV$®,µÞṪ
Чтобы улучшить это, мы можем использовать минус два и умножить элементы вместе, что может быть достигнуто с помощью одного умножения.
Таблица действия ключевой функции ...
источник
2^8=256
, который является ASCII, afaik. Разве вам не нужно больше одного байта для хранения символов Юникода?Желе ,
1110 байтВдохновленный вернуться к чертежной доске Арно!
Монадическая ссылка, принимающая список строк * (как описано), который дает самый высокий найденный ранг.
Попробуйте онлайн! Или посмотрите тестовый набор .
Как?
Сортировка по ключевой функции и возвращает крайнюю правую (то есть максимум).
Функция ключа сначала меняет любое k, чтобы стать N, используя диадический атом
y
, переводит с двухсимвольным списком⁾kN
(код Jelly для['k','N']
), а затем оценивает строку как монаду с аргументом девять (используя кодv9
).В желе:
N
является монадическим атомом, который отрицает свой вклад9 30N
самом деле не использует девять и приводит к целому числу-30
d
является диадическим атомом, который выдает результат делимода Python из двух значений - пары результатов целочисленного деления и по модулю9 7d
приводит к паре с7[0,7]
p
является диадическим атомом, который выполняет декартово произведение, которое включает в себя неявное 1-индексированное указание диапазона его входных данных9 p3
дает декартово произведение[1,2,3]
и[1,2,3,4,5,6,7,8,9]
который[[1,1],[1,2],...,[1,9],[2,1],[2,2],...,[2,9],[3,1],[3,2],...,[3,9]]
После того, как такие оценки были выполнены с использованием сравниваемых строк, мы должны иметь возможность сравнить результаты; поскольку целые числа не сравнимы со списками, нам нужно обернуть отрицательные значения в списке, но поскольку упорядочение все равно будет работать после
p
сглаживания списков (например,[[1,1],[1,2],...]
->[1,1,1,2]
), мы можем использовать однобайтовый монадический атом,F
примененный ко всем вычислениям.Таблица входов для их значения ключа выглядит следующим образом:
Комментарий к коду:
источник
MATL ,
30282523 байтаПопробуйте онлайн!
(-2 байта благодаря Луису Мендо)
(еще -3 байта заменены
v&X>
на>
, на этот раз на основе ответа Луиса Мендо)(-2 байта с использованием
&)
синтаксиса)Объяснение:
Вычтите «k» из последнего символа (дает n = -7, 0, 5 для «d», «k», «p» соответственно).
Вычислить v = n ^ 2 + 6n-1 (дает 7, -1, 54 соответственно).
Умножьте это значение v на фактическое ранговое число (чтобы k уровней получали отрицательные произведения, d уровней переходили от 7 до 49, p уровней от 54 и выше).
Сделайте это для обеих входных строк, сравните продукты
Получить строку ввода, соответствующую большему произведению
Альтернативный, более простой метод:
23 байта
Попробуйте онлайн!
источник
Haskell ,
7371 байтПопробуйте онлайн!
Как обычно для меня, просто прямая реализация, а не что-нибудь особенно гольф-у. Функция "(#)" принимает два ранга как строки и возвращает больший. Работает только с тем форматом, который указан в вопросе.
(Я также попробовал версию с помощью
comparing
и ,maximumBy
но это закончилось тем , что было 3 байта больше - ты проклятbase
! И ваши считываемые имена функций иногда человека)(Прикладные предложения Амфиболога и Линн)
источник
True
на1<2
.(-x)
может быть0-x
.r(x,_)=x+7
!0-x
может быть `-x`)Python 2 , 54 байта
Попробуйте онлайн!
Используя метод Арно . Отображение
int(x,27)%9-3
зависит только от последней буквыx
, поскольку все цифры, кроме последней, содержат кратные числа9
. Занимает:Этого едва хватает для того, чтобы множитель
1p
побил7d
самый высокий ранг дана при интерпретации в базе 26.Я нашел это с помощью грубых выражений этой формы и нескольких других.
Python 2 , 64 байта
Попробуйте онлайн!
источник
R , 73 байта
Попробуйте онлайн!
as.double
вместо,strtoi
так как последний не обрабатывает пробелы / точки, и я не мог придумать другой действительный символ для заменыd
rank
вместоorder
, так как они равны, когда есть только два элементаисточник
L
вместо,.
но он тоже не работает ... даст вам знать, если я могу найти что-то еще.Желе , 13 байт
Это сильно отличается от моего другого ответа Jelly , поэтому я публикую это отдельно.
Принимает ввод как список из двух (или более) строк.
Попробуйте онлайн!
комментарии
источник
Юлия 0,7
10093 байтаЭто не самый эффективный способ (контраст @ sundar's Julia 0.6 ), но он хорош, потому что он чисто числовой. Также использует диспетчеризацию (хотя, к сожалению, только один раз)
Очень похожий код работает в 0.6 Попробуйте онлайн
Как:
Уловка - все в
!(z)
функции.Он отображает значение UTF-8:
k
отрицательного числа, поэтому он сортирует в обратном направленииd
положительного числаp
большего положительного числаКак показано:
Результаты теста
источник
.~[a,b]
это возможно! Кстати, я думаю, вы можете заменить collect (r) на[r...]
и сохранить несколько байтов.Int[r...]
больше, чемInt([r...])
сэкономить. Спасибоargmax
наindmax
) на Julia 0.6. Вы можете включить Попробовать онлайн! ссылку, если вы хотите.Haskell , 64 байта
Попробуйте онлайн!
Выражение
gcd(fromEnum c)28-3
отображает символ в множительИдея состояла в том, чтобы взять их характерные ценности
[107,100,112]
и решить28
иметь все более и более общие с ними факторы, что было легко, но первый из них был основным. Этот метод экономит 2 байта по сравнению с явной записью отображения .Встроенный
reads
используется для разделения числа и ранга.(На самом деле, прямое разбиение от Sara J на один байт короче, что дает 63 байта .)
Шаг «сделай больше» занимает в моем решении раздражающее количество байтов. Я пробовал другие подходы, такие как перебор рангов в порядке убывания и выбор первого из элементов
[a,b]
, но они оказались дольше.источник
MATL ,
2827 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Желе , 16 байт
Принимает ввод как список из двух строк.
Попробуйте онлайн! (все тесты)
Как?
Который дает:
комментарии
Альтернативная формула
Также для 16 байтов мы можем использовать:
Попробуйте онлайн!
источник
JavaScript (ES6),
5554 байта-1 байт благодаря @Shaggy
Попробуйте онлайн!
объяснение
источник
f("2d")("1d")
, но заменить егоd:1
наd:2
исправленное.Рубин ,
5246 байтПрямой порт ответа Xnor.
Попробуйте онлайн!
РЕДАКТИРОВАТЬ: -6 байт, понимая, что я мог бы использовать Proc
источник
C # (компилятор Visual C #) ,
136135 байтПопробуйте онлайн!
-1 байт благодаря TheLethalCoder
Expanation:
источник
a=>b=>
.PadLeft
требуетchar
и использование107
вместо'k'
не имеет значения.Perl,
4638 байтЗапустить как
perl -pae '...'
. Принимает ввод из стандартного ввода, разделенных пробелами в одной строке.Выполняет пару замен, чтобы сделать сравнение «проще». Подстановки регулярных выражений по существу равносильны замене
p
на конечный ноль иk
ведущий отрицательный знак. Так10k
становится-10
(так что порядок меняется) и3p
становится30
(так, чтоp
выше всего остального). Тогда это просто численное сравнение.Спасибо DomHastings за предложение
$`
/$'
, которое сбрило 8 байт.источник
/ /
и используя `` $ `` `и$'
: Попробуйте онлайн!R ,
6562 байтаПопробуйте онлайн!
Это немного короче, чем предыдущие ответы R, и хорошо использует функциональность статистики R :-)
-3 байта благодаря предложению Робина Райдера использовать
ordered
вместоfactor
Принимает входные данные от стандартного ввода (хотя ссылка TIO немного реструктурируется для простоты тестирования). Преобразует входные ранги в упорядоченные
factor
из всех рангов, затем принимает максимум.Вывод выглядит так:
источник
factor
и полностью пропустилordered
.Java 8,
128122121 байт-6 байт благодаря @SaraJ .
Попробуйте онлайн. (См. Нижнюю часть вывода в TIO-ссылках, чтобы увидеть сопоставленные значения.)
Объяснение:
источник
Haskell ,
757068 байтовПопробуйте онлайн!
-5 bytes
благодаря @Laikoni-2 bytes
благодаря @ ASCII-толькоисточник
(read$init k)
может бытьread(init k)
. Вспомогательная функция короче, чем использованиеcase of
: попробуйте онлайн!Python 2 , 61 байт
Использует алгоритм Арно.
Попробуйте онлайн!
Предыдущий ответ, 73 байта
Попробуйте онлайн!
источник
Юлия 0,6 ,
757165 байтПопробуйте онлайн!
(-4 байта, анализ 0,6 автоматически определяет его как Int)
(-6 байт, использовать
(search("_dp",s[2])-1)^3)
вместо ответа Арнаулда JS((c=cmp(s[end],'k'))^2*6+4c-1)
)источник
Сетчатка 0.8.2 , 29 байт
Попробуйте онлайн! Принимает любое количество рангов и выводит самые высокие. Объяснение:
Сортировка строк ...
... используя указанный ключ ...
... в обратном порядке.
Ключ создается из строки ввода следующим образом: а) (профессиональная) буква ранга дана б) ранг в унарной букве в) буква кю (где применимо). Поскольку это обратная сортировка, профессиональный дан ранг
p
сортирует перед рангом данd
и рангом кю, который начинается с1
того, что буква кю остается в конце. В пределах рангов (профессиональный) дан ранжируется в порядке убывания из-за длины одинарной строки, однакоk
след за рангами кю заставляет их сортировать в порядке возрастания.Выберите первую строку, которая в настоящее время является наибольшим званием.
источник
J, 39 байт
Попробуйте онлайн!
объяснение
источник
Python , 59 байт
Неименованная функция, принимающая итерируемую строку, которая возвращает максимальную по рангу Go. Работает так же, как мой ответ Jelly (просто использует целую строку, вычисленную как целое число в базе 26 для сохранения байтов).
Попробуйте онлайн!
источник
C (gcc) , 95 байт
Попробуйте онлайн!
источник
Perl 6 , 35 байт
Попробуйте онлайн!
Совсем другой подход ко всему этому поисковому запросу. По существу строка замены:
...k -> -...
,p -> 0
,d
удаляются. Таким образом, новички получают минус, даны получают ранг, а профессионалы получают ранг * 10. Использование WhwhatStar дает нам замыкание иmax
принимает функцию компаратора.источник
05AB1E , 12 байтов
.V
(оценивается как код 05AB1E) вдохновлен похожим подходом @Arnauld в своем ответе Jelly .Ввод в виде списка из двух (или более) допустимых строк.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
k
"30k"
"1k"
-1
d
>= 0
"1d"
"7d"
1
p
°
"2k"
"2d"
"2k"
"2d"
°
"2"
p
°
100
"1p"
"9p"
Посмотреть все сопоставленные значения здесь.
источник
Scala ,
3076154 байтаОгромное спасибо Кевину Круйссену и ASCII-only за их работу над этим ответом, который получил ~ 250b.
Некоторые алгоритмы оптимизации для функции упорядочения ответа 61b.
Тестовые случаи здесь: Попробуйте онлайн!
Старый 61 байт ответ
Хитрость заключается в том, чтобы вычислить расстояние между
rank letter
иi
(код символа105
). Затем мы используем это расстояние как оценку ( dan = 5, kyu = 2, pro = 7), которую мы умножаем на число ранга. Затем мы берем максимум на входном массиве, используя функцию оценки.Попробуйте тоже онлайн!
источник
var f: Function1[String, Function1[String, String]]=
. 247 байт .PHP ,
10098 байт(-2 байта путем изменения объявления функции)
Чтобы запустить это:
Пример:
Или попробуйте онлайн!
PHP (7.4), 74 байта
Попробуйте онлайн!
Как?
Аналогично подходу Арно , но в PHP. Я использую функцию для преобразования каждого ранга в числовое значение, сравнения и вывода с более высоким значением.
Значение ранга берется из позиции второго символа входной строки
!!dp
, уменьшается на единицу, затем получает значение 3 и умножается на целую часть входной строки.Так, например, позиция второго символа ,
1p
который находитсяp
в!!dp
3, уменьшается на один и питание до 3 будет 8. Таким образом , целая часть всех*p
рангов будет умножен на 8. Это означает1p = 8
,2p = 16
...,9p = 72
.Для всех
*d
рангов целочисленная часть будет умножена на 1 (или просто без умножения). Это означает1d = 1
, ...,7d = 7
.А для всех
*k
и**k
рангов позиция второго символа в!!dp
будет равнаfalse
0, равному 0 (без явного), уменьшенному на единицу и усиленному на 3, что означает, что целая часть будет умножена на -1. Это означает30k = -30
, ...,1k = -1
.Это моя первая попытка игры в гольф, не знаю, насколько она плоха!
источник
Excel VBA, 129 байт
Анонимная VBE Immediate оконная функция, которая принимает входной сигнал в диапазоне
A1:A2
и выводит на консоль.Explaination
источник