Мой первый пост по гольфу, извиняюсь за любые ошибки ...
контекст
В скалолазании (в частности , в боулдеринге ) классы скалолазания V / Vermin (США) начинаются с «VB» (самый легкий класс), а затем переходят в «V0», «V0 +», «V1», «V2», «V3». , «V4», «V5» и т. Д. До «V17» (самая высокая оценка).
задача
В качестве входных данных вы возьмете список / массив оценок за восхождение, и вам нужно будет вернуть или распечатать список / массив оценок, отсортированных от самых простых до самых сложных.
Если вход пуст, вернуть пустую структуру данных; в противном случае ввод всегда будет действительным.
Контрольные примеры
Input | Output
[] | []
['V1'] | ['V1']
['V7', 'V12', 'V1'] | ['V1', 'V7', 'V12']
['V13', 'V14', 'VB', 'V0'] | ['VB', 'V0', 'V13', 'V14']
['V0+', 'V0', 'V16', 'V2', 'VB', 'V6'] | ['VB', 'V0', 'V0+', 'V2', 'V6', 'V16']
Это вызов для игры в гольф .
code-golf
array-manipulation
sorting
Chris_Rands
источник
источник
Ответы:
Python 2 ,
5854 байтаПопробуйте онлайн!
Как это работает
источник
a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))
составляет 58 байт.a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))
на 2 байта короче, но это все еще слишком долго.JavaScript (ES6) / Firefox, 53 байта
Контрольные примеры
Для Firefox:
Показать фрагмент кода
Для Chrome или Edge (+4 байта):
Показать фрагмент кода
Как?
Мы применяем 3 последовательных преобразования, которые приводят к лексикографически сопоставимым строкам.
источник
a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))
Chrome, он не дает правильного ответа,f(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])
я не уверен, почему; совместимая с ребром версия отлично работает на Chrome.Шелуха , 5 байт
Попробуйте онлайн! Результаты печатаются по одному на строку, но внутри это функция, которая принимает и возвращает список строк.
объяснение
Это удивительно похоже на ответ Retina Мартина . Сначала мы делаем
Öm±
, что означает «порядок путем сопоставления цифр». Это ставитVB
,V0
иV0+
в правильном порядке, так как они сравниваются как[0,0]
,[0,1]
и[0,1,0]
. Далее мы делаемÖi
, что означает «порядок по целому числу». Дляi
данной строки возвращает первую последовательность цифр, встречающихся в ней, как целое число, или 0, если она не найдена. Все три строки выше сопоставлены с 0, и сортировка стабильна, поэтому они будут в правильном порядке в выводе.источник
Сетчатка , 14 байт
Попробуйте онлайн!
объяснение
Замените
B
на!
так, чтобы лексикографический порядок оценок ставилVB
(или затемV!
) перед всеми числовыми оценками.Сортировать все входные строки лексикографически. Это не дает правильного результата, но все
V! < V0 < V0+
правильно.Превратите
V!
обратно вVB
.Сортировка строк по численности. Retina просто ищет первое десятичное число в строке, чтобы определить ключ сортировки. Если число отсутствует (например, для
VB
), устанавливается значение0
. Это означает , что все изVB
,V0
иV0+
имеют один и тот же ключ сортировки. Но сортировка Retina стабильна, и мы уже расположили их в правильном относительном порядке.источник
V , 3 байта
Попробуйте онлайн!
Как это работает?
Эта команда является почти верным решением, поскольку каждая строка, которая не может быть отсортирована по номерам (AKA,
VB
), будет размещена в начале, без изменения порядка. Однако, поскольку он смотрит только на числа, он не может различитьV0
иV0+
. Поскольку Vim использует стабильную сортировку, то, какая из них будет первой, останется первой после сортировки. Так...источник
C #,
121838283 байтаСохранено 39 байт благодаря TheLethalCoder и LiefdeWen
Попробуйте онлайн!
Bytecount включает в себя
using System.Linq
.Как?
VB
, установите значение -1, если он равенVB0+
, установите значение 0.V
.Может быть немного взломать, но это работает! :)
источник
ToArray()
IOrderedEnumerable
.Remove(0,1)
для дополнительного -1 байта :)Рубин ,
52 4241 байтПопробуйте онлайн!
Как это работает:
Переверните проблему, создайте полный отсортированный список, затем получите пересечение с нашим вводом.
Спасибо Линн за сохранение 1 байта.
источник
->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}
сохраняет байт.Pyth , 16 байт
Порт Питона ответ от ОП.
Тестовый пакет .
источник
05AB1E ,
17138 байтПопробуйте онлайн!
источник
†
лучше, чемD"VB"åiÁ
безумный выстрел.Желе , 9 байт
Монадическая ссылка, содержащая список списков символов и возвращающая отсортированный список.
Попробуйте онлайн! (нижний колонтитул форматирует результат красиво)
Как?
источник
Haskell , 55 байтов
Попробуйте онлайн!
источник
Чтобы начать, вот мое решение Python 3 ...Извинения, опубликовал это слишком рано против соглашения, теперь переиздаю ...Python 3 ,
6967 байтПопробуйте онлайн!
источник
Swift 3 , 102 байта
Это функция. Вы можете назвать это так:
Попробуйте онлайн!
Как это работает?
Это в основном порт удивительного ответа Javascript от @Arnauld , но оптимизированный для Swift.
Он отображает каждое из значений в лексикографически упорядочиваемые строки, как показано в таблице ниже:
Код Объяснение
String((Int($0,radix:32) ?? 992)%334)
- Конвертирует каждую строку из числа 32 в десятичное. В случае, если значением является «V0 +», вызовInt(_:radix:)
возвратит nil, и мы берем значение «V0», 992. Мы дополнительно берем результатmod 334
и, наконец, преобразуем его в String.+$0
- Добавляет текущее значение в строку, созданную выше. Например, если String равенV9
, функция выше возвращает,333
и мы добавляемV9
, что приводит к333V9
.var r={...}
- Объявляет переменнуюr
анонимному закрытию, потому что она экономит много байтов, так как используется дважды.func f(l:[String])
- Определяет функциюf
с параметромl
, список строк.print(l.sorted(by:{r($0)<r($1)}))
- Печатает результат сортировки заданного списка, ключом которого является переменная,r
определенная выше.источник
PowerShell , 45 байт
Попробуйте онлайн!
Использует тот же процесс, что и Ruby-ответ GB, для построения полного списка аргументов в отсортированном порядке, а затем выбирает те, которые являются
-in
входным списком.источник
Google Sheets, 142 байта
Ввод - это строка
A1
с каждой записью, разделенной запятой.Выход - это ячейка формулы плюс
n-1
ячейки под ней, гдеn
находится количество записей вA1
.Это длинная, грязная формула, так что давайте распакуем ее.
If(A1="","",~)
исправляет нулевой ввод. Без этого пустой вход возвращает#VALUE!
ошибку, потому чтоSplit
функция не работает с пустыми входами.Transpose(Split(A1,","))
разделяетA1
запятые и переносит их в столбец, потому чтоSort
функция работает только со столбцами.Transpose(IfError(Find(),Value()+9))
Это разбивается на эти части:Find(Split(A1,","),"VBV0V0+")
пытается найти каждый параметр в этой строке. Эти первые три являются единственными, которые должны быть отсортированы как строки, поэтому мы используем,Find
чтобы получить их порядок сортировки.Value(Mid(Split(A1,","),2,3))+9
получает числовое значение оценки. Это имеет значение только для V1 и выше, поэтому они численно сортируются просто отлично. В+9
конце должен убедиться, что V1 идет после V0 +, так как егоFind
значение будет5
. Технически, тогда, только+5
требуется, но мне не нужно больше байтов, чтобы убедиться, что он дважды сортирует правильно.IfError(Find(~),Value(~))
возвращаетFind
значение, если строка была найдена (т. е. оценка равна VB, V0 или V0 +). Если это не может быть найдено, он возвращает числовое значение оценки плюс девять.Transpose(IfError(~))
снова превращает его в столбец, чтобыSort
можно было его использовать.Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1)
оборачивает все это, сортируя входные данные разделения, используя пользовательский порядок сортировки по возрастанию.ArrayFormula(~)
оборачивает всю вещь так, чтобы она возвращала результаты в виде массива, а не просто возвращала первое значение в этом массиве. Это то, что заставляет формулу в одной ячейке заполнять ячейки под ней.источник
Bash + coreutils, 21
GNU
sort
«s-V
режим сортировки ersion практически делает то , что мы хотим. ВключитеB
для,.
и мы сделали.Попробуйте онлайн .
источник
Haskell ,
90848361 байтПопробуйте онлайн!
f
это функция, которая преобразует уровни лазания в строки, которые можно сравнить. Если новообращенныеVB
быть пустая строка поэтому он получает наивысший приоритет, тогда заменяетV1
сX
в строках, которые три длинные , чтобы понизить приоритетV10
-V17
. В остальном мы ничего не делаем.Для сортировки списка мы используем
Data.Lists
«ssortOn
функции (как это было предложено Lynn) , чтобы создать функцию точечную бесплатно.источник
g=sortOn f
, что также вData.List
.f(_:'1':a)='X':a
экономит 4 байта![a]
иначеV1
будет сопоставление с шаблоном, и это проблема, которую я пытаюсь обойти.R , 45 байт
Как это работает?
источник
Python2, 77 байт
источник
Желе ,
1711 байтПопробуйте онлайн!
источник
TXR Lisp : 45 байт
Бег:
источник
Perl 5 , 56 + 1 (-a) = 57 байт
Попробуйте онлайн!
источник