Сортуйте класи для сходження


33

Мій перший пост з кодом для гольфу, вибачте за будь-які помилки ...

Контекст

У скелелазінні ( конкретно валуні валуні) класи сходження з 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']

Це проблема з .


Наступного разу опублікуйте це на пісочниці, щоб отримати зворотній зв'язок перед публікацією. По-друге, чи слід реально відповідати на власний виклик?
Ян Х.

Чи з’являться дублюючі оцінки у вхідних даних?
Містер Xcoder

@ Mr.Xcoder Немає дублікатів
Chris_Rands

7
Ласкаво просимо до PPCG! Досить чітко і приємно для першого питання. (У)
officialaimm

3
Дуже приємне перше запитання! Відповіді, які вона призвела, настільки різноманітні та креативні. :)
Лінн

Відповіді:


23

Python 2 , 58 54 байти

lambda x:sorted(x,key=lambda y,B10=0:eval(y[1:]+'10'))

Спробуйте в Інтернеті!

Як це працює

y         y[1:]+'10'   eval(y[1:]+'10')
=======================================
VB        B10          0  (a variable we defined)
V0        010          8  (an octal literal)
V0+       0+10         10
V1        110          110
V2        210          210
...       ...          ...
V17       1710         1710

Схоже, перенесення цього на ES6 не перевершує підхід Арнаульда: a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))становить 58 байт.
Лінн

1
a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))на 2 байти коротше, але це все ще занадто довго.
Арнольд

@GB Я думаю, що це було дійсно, але зараз він точно є дійсним.
Лінн

Навіщо використовувати "10", а не щось коротше? Наприклад, "2" зберігає 2 байти.
ГБ

1
@GB Хитрість полягає в запуску перекладу з восьмеричного позначення "010" на 8 у вигляді десяткового для "V0". З 2 ви отримаєте "02" = 2, що таке саме, як "0 + 2".
Арнольд

15

JavaScript (ES6) / Firefox, 53 байти

a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))

Тестові справи

Для Firefox:

Для Chrome або Edge (+4 байти):

Як?

Ми застосовуємо 3 послідовних перетворення, що призводять до лексикографічно порівняних рядків.

s     | Base32 -> dec. | MOD 334 | +s
------+----------------+---------+---------
"VB"  |           1003 |       1 | "1VB"
"V0"  |            992 |     324 | "324V0"
"V0+" |            992 |     324 | "324V0+"
"V1"  |            993 |     325 | "325V1"
"V2"  |            994 |     326 | "326V2"
"V3"  |            995 |     327 | "327V3"
"V4"  |            996 |     328 | "328V4"
"V5"  |            997 |     329 | "329V5"
"V6"  |            998 |     330 | "330V6"
"V7"  |            999 |     331 | "331V7"
"V8"  |           1000 |     332 | "332V8"
"V9"  |           1001 |     333 | "333V9"
"V10" |          31776 |      46 | "46V10"
"V11" |          31777 |      47 | "47V11"
"V12" |          31778 |      48 | "48V12"
"V13" |          31779 |      49 | "49V13"
"V14" |          31780 |      50 | "50V14"
"V15" |          31781 |      51 | "51V15"
"V16" |          31782 |      52 | "52V16"
"V17" |          31783 |      53 | "53V17"

Ви придумали ідею базового перетворення / модуля? Блискуче!
kamoroso94

1
@ kamoroso94 FWIW, ось код, який я написав, щоб знайти базу та модуль. Це дає деякі інші можливі відповіді (з m <1000).
Арнольд

Я спробував 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"])я не знаю чому; сумісна з краєм версія чудово працює на хромі.
Ra8

1
@ Ra8 Ага, так. Він також нестабільний для Chrome. Повернення булевого типу із зворотного виклику sort () - це просто хак, який, як буває, працює у Firefox, але ми справді повинні повернути підписане значення. Дякуємо за ваш відгук!
Арнольд

12

Лушпиння , 5 байт

ÖiÖm±

Спробуйте в Інтернеті! Результати друкуються по одному на рядок, але внутрішньо це функція, яка приймає та повертає список рядків.

Пояснення

Це напрочуд схоже на відповідь Мартіна Ретіна . Спочатку робимо це Öm±, маючи на увазі "порядок за допомогою відображення - це цифра". Це ставить VB, V0і V0+в правильному порядку, так як вони порівнюються як [0,0], [0,1]і [0,1,0]. Далі робимо Öi, що означає "порядок за цілим значенням". Задавши рядок, iповертає першу послідовність цифр, що виникають у ньому, як ціле число, або 0, якщо його не знайдено. Три вищезазначені рядки відображаються на 0 і сортування стабільне, тому вони будуть у правильному порядку на виході.


11

Сітківка , 14 байт

B
!
O`
!
B
O#`

Спробуйте в Інтернеті!

Пояснення

B
!

Замінити Bз !тим щоб лексикографічний порядок сорти пут VB(або тоді V!) в присутності всіх числових класів.

O`

Сортувати всі вхідні рядки лексикографічно. Це не дає правильного результату, але воно впорядковується V! < V0 < V0+правильно.

!
B

Поверніться V!назад VB.

O#`

Сортуйте рядки чисельно. Retina просто шукає перше десяткове число в рядку, щоб визначити його ключ сортування. Якщо немає числа (наприклад, для VB), воно встановлює значення 0. Це означає , що всі з VB, V0і V0+мають один і той же ключ сортування. Але сорт Ретіни стабільний, і ми їх вже встановили у правильному відносному порядку.


6

V , 3 байти

Úún

Спробуйте в Інтернеті!

Як це працює?

ú   # Sort on...
 n  #   the first decimal number on the line

Ця команда є майже прийнятним рішенням, оскільки кожен рядок, який не можна сортувати за номерами (AKA, VB), буде розміщений на початку, без зміни порядку. Однак, оскільки він дивиться лише на числа, він не може розрізняти V0і V0+. Оскільки Vim використовує стабільний сорт, той, хто з них з’явився першим, залишатиметься першим після сортування. Так...

Ú   # Sort lexicographically (will place 'V0' before 'V0+')
 ú  # Sort by...
  n #   The first number on the line

2
Наскільки доречно, що V справляється з цим завданням: P
Business Cat

5

C #, 121 83 82 83 байт

Збережено 39 байт завдяки TheLethalCoder та LiefdeWen

a=>a.OrderBy(x=>x[1]>65?-1:x=="V0+"?0.5:int.Parse(x.Remove(0,1)))

Спробуйте в Інтернеті!

Рахунок включає using System.Linq .


Як?

  • Отримує масив рядків як вхідний.
  • Якщо вхід дорівнює VB, встановіть значення -1, якщо воно дорівнюєVB0+ , встановіть значення 0.
  • Замовте вхід на основі значення числа, що надходить після V.

Може бути трохи хак, але це працює! :)



@LiefdeWen Вам не потрібно, ToArray()це IOrderedEnumerableмає бути добре.
TheLethalCoder

На жаль, випадково видалено посилання System.Linq, виправлено це
LiefdeWen

@TheLethalCoder Ти маєш рацію, як завжди, 84 байти
LiefdeWen

@LiefdeWen .Remove(0,1)для додаткових -1 байт :)
Ian H.

4

Рубі , 52 42 41 байт

->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}

Спробуйте в Інтернеті!

Як це працює:

Вирішіть проблему, складіть повний відсортований список, а потім отримайте перехрестя з нашими введеннями.

Дякую Лінн, що зберегла 1 байт.


Розумний! ->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}зберігає байт.
Лінн



2

Желе , 9 байт

Ḋv-.F+LµÞ

Монадічне посилання, що містить список списків символів та повертає відсортований список.

Спробуйте в Інтернеті! (колонтитул добре форматує результат)

Як?

Ḋv-.F+LµÞ - Link: list of lists of characters
       µÞ - sort by key:
Ḋ         -   dequeue (remove the 'V' from the item)
  -.      -   literal -0.5
 v        -   evaluate as Jelly code with argument -0.5
          -   ...this means `VB` and `V0+` become -0.5
          -      (to binary and addition respectively)
          -      while others become their literal numbers
    F     -   flatten
     +L   -   add the length of the item
          -   ...'VB', 'V0', 'V0+', 'V1', 'V2'... -> 1.5, 2, 2.5, 3, 4, ...


2

Щоб почати все, це моє рішення Python 3 ... Вибачення, занадто рано викладено проти з'їзду, а тепер повторно розміщую ...

Пітон 3 , 69 67 байт

lambda l:sorted(l,key=lambda x:'B00+'.find(x[1:])+1or int(x[1:])+3)

Спробуйте в Інтернеті!


5
Не рекомендується негайно відповідати на власний виклик. Дайте трохи часу для відповіді інших людей, принаймні, 48 годин, можливо, довше.
TheLethalCoder

@TheLethalCoder О так, на Stack Overflow така поведінка рекомендується! Чи слід видалити свою відповідь?
Chris_Rands

@Chris_Rands Так, я пропоную вам видалити його.
Містер Xcoder

9
@Downvoter: Відхилення нового члена за те, що він робив те, чого вони не знали, нахмурився не круто; набагато краще просто зазначити, що вони не повинні робити так, як це робив Летальний.
Shaggy

Зауважте, якщо хтось не опублікував ваше рішення, ви можете це зробити. Після очікування курсу
TheLethalCoder

1

Швидкий 3 , 102 байти

var r={String((Int($0,radix:32) ?? 992)%334)+$0};func f(l:[String]){print(l.sorted(by:{r($0)<r($1)}))}

Це функція. Ви можете назвати його таким:

f(l:["V0","VB","V13","V0+"])

Спробуйте в Інтернеті!


Як це працює?

Це в основному порт чудової відповіді на Javascript від @Arnauld , але оптимізований для Swift.

Він відображає кожне зі значень для лексикографічно впорядкованих рядків, як показано в таблиці нижче:

Початковий рядок -> Результат

V1 -> 325V1
V10 -> 46V10
V11 -> 47V11
V12 -> 48V12
V13 -> 49V13
V14 -> 50V14
V15 -> 51V15
V16 -> 52V16
V17 -> 53V17
V2 -> 326V2
V3 -> 327V3
V4 -> 328V4
V5 -> 329V5
V6 -> 330V6
V7 -> 331V7
V8 -> 332V8
V9 -> 333V9
V0 + -> 324V0 +
V0 -> 324V0
VB -> 1VB

Пояснення коду

  • String((Int($0,radix:32) ?? 992)%334)- Перетворює кожну рядок з базового числа 32 в десятковий. Якщо значення "V0 +", виклик до Int(_:radix:)повернеться нульовим, і ми беремо значення "V0", 992. Ми додатково беремо результат mod 334і, нарешті, перетворимо його в String.

  • +$0- додає поточне значення до String, створеному вище. Наприклад, якщо String є V9, функція повертається вище, 333і ми додаємо V9, в результаті чого 333V9.

  • var r={...}- оголошує змінну rна анонімне закриття, оскільки це економить багато байтів, оскільки вона використовується двічі.

  • func f(l:[String])- Визначає функцію fз параметром l, списком рядків.

  • print(l.sorted(by:{r($0)<r($1)}))- Друкує результат сортування даного списку, при цьому ключ є змінною, rвизначеною вище.



1

Google Таблиці, 142 байти

=ArrayFormula(If(A1="","",Sort(Transpose(Split(A1,",")),Transpose(IfError(Find(Split(A1,","),"VBV0V0+"),Value(Mid(Split(A1,","),2,3))+9)),1)))

Введення - це рядок у A1кожному записі, розділеному комою.
Вихід - це клітинка формули плюс n-1комірки під нею, де nкількість записів A1.

Result

Це довга безладна формула, тому давайте розпакуємо її.

  • 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(~)загортає всю річ, щоб вона повертала результати як масив, а не просто повертає перше значення в цьому масиві. Саме це змушує формулу в одній клітині заповнювати і комірки під нею.

Я думаю, що це вперше я бачив використовуваних Таблиць Google. Кудо вам і +1!
Хізер


1

Haskell , 90 84 83 61 байт

import Data.List
f"VB"=[]
f(_:'1':[a])='X':[a]
f x=x
sortOn f

Спробуйте в Інтернеті!

f- це функція, яка перетворює класи сходження в рядки, які можна порівняти. Якщо новонавернені VBбути порожній рядок тому він отримує найвищий пріоритет, тоді замінює V1з Xв рядках, які три довгі , щоб знизити пріоритет V10-V17 . На решту ми нічого не робимо.

Для сортування списку ми використовуємо Data.Lists«s sortOnфункції (як це було запропоновано Lynn) , щоб створити функцію точкову безкоштовно.


Ось тільки g=sortOn fщо є і в Data.List.
Лінн

1
Також f(_:'1':a)='X':aекономить 4 байти!
Лінн

1
@Lynn Перша пропозиція працює, однак друга не робить, мені потрібно, [a]інакше V1буде узгоджена модель, яка є проблемою, яку я намагаюся обійти.
Пшеничний майстер

1

R , 45 байт

l=paste0('V',c('B','0','0+',1:17));l[l%in%x]

Як це працює?

  • Призначте правильно упорядкований вектор класів до 'l';
    • Використовуйте 'paste0' замість 'paste', щоб уникнути створення аргументу 'sep = ""';
  • Індекс 'l' заснований на збігах 'l' у вашому вхідному векторі змішаних, несортісних оцінок.

0

Python2, 77 байт

sorted(input(),key=lambda s:float(s[1:].replace("B","-1").replace("+",".5")))

Я думаю, це вважається фрагментом! Тому що ви ні друкуєте результат, ні це визначення функції. Ви можете перетворити його на лямбда або друкувати результат.
officialaimm

1
@officialaimm приємно спробувати, але не працює, якщо V0 + s перед V0.
Сетоп


0

TXR Lisp : 45 байт

(op sort @1 :(ret`@(mod(toint @1 32)334)@1`))

Виконати:

1> (op sort @1 :(ret`@(mod(toint @1 32)334)@1`))
#<interpreted fun: lambda (#:arg-01-0168 . #:rest-0167)>
2> [*1 ()]
nil
3> [*1 (list "V0+" "V0" "V16" "V2" "VB" "V6")]
("VB" "V0" "V0+" "V2" "V6" "V16")

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.