Mój pierwszy kod do golfa, przepraszam za błędy ...
Kontekst
W wspinaczce skalnej ( konkretnie bouldering ) oceny wspinaczki V / Vermin (USA) zaczynają się od „VB” (najłatwiejszy stopień), a następnie „V0”, „V0 +”, „V1”, „V2”, „V3” , „V4”, „V5” itp. Aż do „V17” (najtrudniejsza klasa).
Zadanie
Jako dane wejściowe weźmiesz listę / tablicę ocen wspinania i musisz zwrócić lub wydrukować listę / tablicę ocen posortowanych od najłatwiejszych do najtrudniejszych.
Jeśli dane wejściowe są puste, zwróć pustą strukturę danych; w przeciwnym razie dane wejściowe zawsze będą prawidłowe.
Przypadki testowe
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']
To wyzwanie dla golfa .
code-golf
array-manipulation
sorting
Chris_Rands
źródło
źródło
Odpowiedzi:
Python 2 ,
5854 bajtówWypróbuj online!
Jak to działa
źródło
a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))
ma 58 bajtów.a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))
jest o 2 bajty krótszy, ale to wciąż za długo.JavaScript (ES6) / Firefox, 53 bajty
Przypadki testowe
W przeglądarce Firefox:
Pokaż fragment kodu
W przypadku Chrome lub Edge (+4 bajty):
Pokaż fragment kodu
W jaki sposób?
Stosujemy 3 kolejne transformacje, które prowadzą do leksykograficznie porównywalnych ciągów.
źródło
a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))
na Chrome, to nie daje poprawnej odpowiedzi.f(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])
Nie jestem pewien, dlaczego; wersja kompatybilna z Edge działa dobrze na Chrome.Łuska , 5 bajtów
Wypróbuj online! Wyniki są drukowane po jednym w wierszu, ale wewnętrznie jest to funkcja, która pobiera i zwraca listę ciągów.
Wyjaśnienie
Jest to zaskakująco podobne do odpowiedzi Retina Martina . Najpierw to robimy
Öm±
, co oznacza „porządek przez odwzorowanie jest cyfrą”. Stawia toVB
,V0
iV0+
we właściwej kolejności, ponieważ są one porównywane jak[0,0]
,[0,1]
i[0,1,0]
. Następnie robimyÖi
, co oznacza „uporządkuj według wartości całkowitej”. Podany ciągi
zwraca pierwszą sekwencję występujących w nim cyfr jako liczbę całkowitą lub 0, jeśli nie zostanie znaleziona. Wszystkie trzy ciągi powyżej są odwzorowane na 0, a sortowanie jest stabilne, więc będą w prawidłowej kolejności na wyjściu.źródło
Siatkówka , 14 bajtów
Wypróbuj online!
Wyjaśnienie
Wymień
B
się!
więc, że kolejność ocen leksykograficzny putVB
(lub potemV!
) w obecności wszystkich klas numerycznych.Posortuj wszystkie wiersze wejściowe leksykograficznie. To nie daje właściwego wyniku, ale porządkuje
V! < V0 < V0+
poprawnie.Zamień się z
V!
powrotem wVB
.Sortuj linie numerycznie. Siatkówka po prostu szuka pierwszej liczby dziesiętnej w ciągu, aby określić jej klucz sortowania. Jeśli nie ma liczby (np. For
VB
), ustawia wartość na0
. Oznacza to, że wszyscyVB
,V0
iV0+
mieć ten sam klucz sortowania. Ale rodzaj Retiny jest stabilny i już umieściliśmy je we właściwej kolejności względnej.źródło
V , 3 bajty
Wypróbuj online!
Jak to działa?
To polecenie jest prawie prawidłowym rozwiązaniem, ponieważ każdy wiersz, którego nie można posortować według liczb (AKA,
VB
), zostanie umieszczony na początku, bez zmiany kolejności. Ponieważ jednak patrzy tylko na liczby, nie można rozróżnić międzyV0
iV0+
. Ponieważ Vim używa stabilnego sortowania, cokolwiek z tych, które pojawiły się pierwsze, pozostanie pierwsze po posortowaniu. Więc...źródło
C #,
121838283 bajtyZaoszczędź 39 bajtów dzięki TheLethalCoder i LiefdeWen
Wypróbuj online!
Liczba bajtów obejmuje
using System.Linq
.W jaki sposób?
VB
, ustaw wartość na -1, jeśli jest równaVB0+
, ustaw wartość na 0.V
.Może to być trochę hack, ale działa! :)
źródło
ToArray()
,IOrderedEnumerable
powinno być dobrze..Remove(0,1)
za dodatkowe -1 bajt :)Rubin ,
52 4241 bajtówWypróbuj online!
Jak to działa:
Odwróć problem, utwórz pełną posortowaną listę, a następnie uzyskaj skrzyżowanie z naszymi danymi wejściowymi.
Dzięki Lynn za uratowanie 1 bajtu.
źródło
->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}
zapisuje bajt.Pyth , 16 bajtów
Odpowiedź portu Python przez OP.
Zestaw testowy .
źródło
05AB1E ,
17138 bajtówWypróbuj online!
źródło
†
jest lepszy niżD"VB"åiÁ
strzelanie z dystansu.Galaretka , 9 bajtów
Monadyczny link prowadzący do listy list znaków i zwracający posortowaną listę.
Wypróbuj online! (stopka ładnie formatuje wynik)
W jaki sposób?
źródło
Haskell , 55 bajtów
Wypróbuj online!
źródło
Na początek jest moje rozwiązanie Python 3 ...Przepraszam, opublikowałem to zbyt wcześnie wbrew konwencji, teraz ponownie publikuję ...Python 3 ,
6967 bajtówWypróbuj online!
źródło
Swift 3 , 102 bajty
To jest funkcja. Możesz to tak nazwać:
Wypróbuj online!
Jak to działa?
Jest to w zasadzie część niesamowitej odpowiedzi JavaScript na @ Arnauld , ale zoptymalizowanej dla Swift.
Odwzorowuje każdą z wartości na uporządkowane leksykograficznie ciągi, jak pokazano w poniższej tabeli:
Objaśnienie kodu
String((Int($0,radix:32) ?? 992)%334)
- Konwertuje każdy ciąg z liczby podstawowej-32 na liczbę dziesiętną. W przypadku, gdy wartość wynosi „V0 +”, wywołanie doInt(_:radix:)
zwróci zero, i przyjmujemy wartość „V0”, 992. Dodatkowo bierzemy wynikmod 334
i ostatecznie przekształcamy go na String.+$0
- Dodaje bieżącą wartość do Ciągu utworzonego powyżej. Na przykład, jeśli String jestV9
, funkcja powyżej zwraca333
i dodajemyV9
, w wyniku czego333V9
.var r={...}
- Deklaruje zmiennąr
do anonimowego zamknięcia, ponieważ oszczędza wiele bajtów, ponieważ jest używana dwukrotnie.func f(l:[String])
- Definiuje funkcjęf
z parametreml
, listę ciągów.print(l.sorted(by:{r($0)<r($1)}))
- Drukuje wynik sortowania podanej listy, przy czym klucz jest zmiennąr
zdefiniowaną powyżej.źródło
PowerShell , 45 bajtów
Wypróbuj online!
Używa tego samego procesu co odpowiedź Ruby GB w celu utworzenia pełnej listy argumentów w posortowanej kolejności, a następnie wybierz te, które są
-in
listą wejściową.źródło
Arkusze Google, 142 bajty
Dane wejściowe to ciąg znaków
A1
z każdą pozycją oddzieloną przecinkiem.Dane wyjściowe to komórka formuły oraz
n-1
komórki pod nią, w którychn
znajduje się liczba wpisówA1
.To długa, niechlujna formuła, więc rozpakujmy ją.
If(A1="","",~)
naprawia wejście zerowe. Bez tego puste wejście zwraca#VALUE!
błąd, ponieważSplit
funkcja nie działa na pustych danych wejściowych.Transpose(Split(A1,","))
dzieliA1
przecinki i przenosi je do kolumny, ponieważSort
funkcja działa tylko na kolumnach.Transpose(IfError(Find(),Value()+9))
rozpada się na następujące części:Find(Split(A1,","),"VBV0V0+")
próbuje znaleźć każdy parametr w tym ciągu. Te trzy pierwsze są jedynymi, które muszą być sortowane jako ciągi, więc używamyFind
ich do sortowania.Value(Mid(Split(A1,","),2,3))+9
pobiera wartość liczbową oceny. Ma to znaczenie tylko dla wersji V1 i wyższych, więc sortowanie liczbowe jest w porządku. Na+9
końcu jest upewnienie się, że V1 występuje po V0 +, ponieważ jegoFind
wartość to5
. Technicznie więc tylko+5
wymagane jest, ale nie kosztuje mnie więcej bajtów, aby upewnić się podwójnie, że sortuje poprawnie.IfError(Find(~),Value(~))
zwracaFind
wartość, jeśli łańcuch został znaleziony (tj. ocena to VB, V0 lub V0 +). Jeśli nie można go znaleźć, zwraca wartość liczbową oceny plus dziewięć.Transpose(IfError(~))
ponownie zamienia go w kolumnę, abySort
móc go użyć.Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1)
podsumowuje wszystko, sortując podzielone dane wejściowe przy użyciu niestandardowej kolejności sortowania rosnąco.ArrayFormula(~)
opakowuje całość, więc zwraca wyniki jako tablicę zamiast tylko zwracać pierwszą wartość w tej tablicy. To powoduje, że formuła w jednej komórce wypełnia również komórki poniżej.źródło
Bash + coreutils, 21
GNU
sort
„s-V
ersion tryb sortowania prawie robi to, co chcemy. PrzełączB
na.
i gotowe.Wypróbuj online .
źródło
Haskell ,
90848361 bajtówWypróbuj online!
f
to funkcja konwertująca stopnie wspinaczkowe na struny, które można porównywać. Jeśli konwertujeVB
na pusty ciąg, aby uzyskać najwyższy priorytet, zastępujeV1
goX
ciągami o długości trzech, aby obniżyć priorytetV10
-V17
. Przez resztę nic nie robimy.Aby posortować listę używamy
Data.Lists
„ssortOn
funkcję (jako sugerowane przez Lynn), aby utworzyć funkcję point-free.źródło
g=sortOn f
jestData.List
.f(_:'1':a)='X':a
oszczędza 4 bajty![a]
inaczejV1
dopasowanego wzoru, który jest problemem, który próbuję obejść.R , 45 bajtów
Jak to działa?
źródło
Python2, 77 bajtów
źródło
Galaretka ,
1711 bajtówWypróbuj online!
źródło
TXR Lisp : 45 bajtów
Biegać:
źródło
Perl 5 , 56 + 1 (-a) = 57 bajtów
Wypróbuj online!
źródło