Wkład:
- Tablica zawierająca trzy liczby całkowite:
0
,1
i2
w dowolnej kolejności (tj[2, 0, 1]
) - I ciąg długości> = 2 zawierający tylko litery alfabetu (zarówno małe, jak i wielkie litery) oraz cyfry (tj.
a1B2c3
)
Wydajność:
W oparciu o tablicę sortujemy i wyprowadzamy ciąg.
Jak to działa?
- Tablica wskazuje pierwszeństwo kolejności
a-z
,A-Z
a0-9
pierwsza istota0
; druga istota1
; i trzecia istota2
. - Na tej podstawie można uporządkować poszczególne znaki ciągu.
Przykład:
- Szyk:
[2, 0, 1]
- Strunowy:
a1B2c3
W oparciu o tablicę wiemy, że naszym priorytetem jest kolejność 0-9a-zA-Z
.
Na tej podstawie możemy konwertować i wyjście ciąg: 123acB
.
Zasady konkursu:
- W przypadku tablicy można użyć danych wejściowych o indeksie 0 lub 1, więc
[3, 1, 2]
jest to również prawidłowe dane wejściowe, jeśli wolisz używać tablic o indeksie 1. - Ciąg (zarówno wejście i wyjście) zawiera tylko prawidłowe znaki:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
. - Jeśli język nie obsługuje macierze (lub jeśli zdecydujesz się), jesteś wolny, aby korzystać z ciągów zamiast tablic dla pierwszego parametru (czyli
012
,[0,1,2]
etc.).
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
[2, 0, 1] & a1B2c3 -> 123acB
[2, 1, 0] & aAaA909UuHWw9gh2 -> 02999AAHUWaaghuw
[2, 1, 0] & 6Bx43 -> 346Bx
[1, 0, 2] & jfjf33g -> ffgjj33
[0, 2, 1] & AbC13 -> b13AC
[1, 2, 0] & Qfl0l -> Q0fll
[0, 1, 2] & 9870abcABC -> abcABC0789
[0, 2, 1] & test123 -> estt123
[2, 0, 1] & WHAT -> AHTW
[2, 0, 1] & WhAt -> htAW
[1, 0, 2] & 102BACbac -> ABCabc012
code-golf
string
array-manipulation
sorting
Kevin Cruijssen
źródło
źródło
"123"
byłby prawidłowy format pierwszego parametru?123
,012
,[0,1,2]
,[0, 1, 2]
,0;1;2
lub jak wolisz.Odpowiedzi:
05AB1E ,
151412 bajtówKod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
²
i użycie₂
zamiast26
.Python 2,
6766 bajtówPrzetestuj na Ideone .
źródło
JavaScript (ES6), 87 bajtów
Jeśli tablica wejściowa podała kolejność, a nie pierwszeństwo, trzech zakresów (robi to różnicę
[1, 2, 0]
i[2, 1, 0]
których efekty są zamieniane), działałoby to dla 80 bajtów:Źle odczytałem pytanie i nadal otrzymałem 7 pozytywnych opinii. Usuń swoje opinie i daj je @CharlieWynn, który zaproponował najlepszą korektę mojego podejścia.
źródło
Array.sort
opcjonalnego parametru funkcji, ale to działa znacznie lepiej.Galaretka , 13 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Pyth,
171615 bajtówZestaw testowy.
Dzięki @FryAmTheEggman za bajt i @Jakube za kolejny!
źródło
'UT
zamiasts'MT
.'UT
jest błędem i`UT
nie skutkuje tym samym ciągiem.JavaScript es6 77 bajtów
źródło
?
s do każdego wyrażenia regularnego, zapewnia to, że dopasowanie zwraca wyniki (głównie puste ciągi, ale i tak znikają), unikając w(||[])
ten sposób, oszczędzając w ten sposób 3 bajty ogółem.TSQL,
199191 bajtówGra w golfa:
Nie golfowany:
Skrzypce
źródło
APLX , 19 bajtów
⎕a⎕A⎕D
dolne górne cyfry(
…)[a]
Zmienić kolejność zgodnie z tablicą a∊
spłaszczyć(
…)⍋s
Zgodnie z tym „alfabetem” podaj wskaźniki, które posortowałyby ciąg ss[
…]
Użyj tego, aby zmienić kolejność sźródło
⎕a
, ponieważ jest to rozróżniana wielkość liter nazwa quada. Znacznie lepiej (do gry w golfa i ogólnie) do czego lobbuję; aby uzyskać⌈
i⌊
spasować wielkość liter na danych postaci, tak jak w K. Wtedy będziemy mieli⌊⎕A
zamiast⎕a
.Python 2, 121 bajtów
źródło
Clojure, 74 bajty
Dla każdej wartości z pierwszej listy pobiera odpowiednie wyrażenie regularne i stosuje ją do ciągu wejściowego. Wynikiem jest lista list symboli pasujących do wyrażenia regularnego. Następnie posortuj każdy z nich i połączy wynik w jedną listę i przekształć go w ciąg znaków.
Możesz to zobaczyć online tutaj: https://ideone.com/dqAkxg
źródło
Retina ,
4339 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1. Końcowe podawanie linii jest znaczące.
Oczekuje się, że dane wejściowe będą porządkiem sortowania jako lista liczona od zera bez ograniczników w pierwszym wierszu, a ciąg znaków do sortowania w drugim wierszu, np.
Wypróbuj online!
Wyjaśnienie
Użyję powyższego przykładu wprowadzania, aby przeprowadzić cię przez kod:
Etap 1: Zmiana
Sam regex jest po prostu
.
(pasuje do dowolnego znaku nieciągłego), który jest otoczony!..."
. Jednak2=
jest granica mówiąc Retina, aby zastosować zmiany tylko w drugim meczu regex. Otrzymujemy to:Etap 2: Transliteracja
Etap transliteracji po prostu zastępuje znak po znaku.
¶
Reprezentuje wysuw id
rozszerza się do0123456789
(chociaż możemy ignorować wszystkie cyfry po2
). Oznacza to, że transliteracja odpowiada następującemu mapowaniu:Z
04
przodu są dwie granice, które razem wskazują, że tylko pierwsze cztery znaki z tego zestawu powinny być transliterowane. Tak się składa, że są to cyfry w pierwszym wierszu, a także linia oddzielająca dwie linie, więc otrzymujemy:Z przodu sznurka mamy teraz trzy pary tych postaci:
Zauważ, że drugie znaki par są po prostu w normalnej kolejności ASCII (i zawsze będą takie same). Użyjemy ich później, aby posortować grupy znaków na głównym wejściu w wymaganej kolejności.
Pierwsze znaki są nieco bardziej interesujące: ich znaczenie jest takie, że
%
występuje przed cyframi w tabeli ASCII, przed dużymi@
literami (ale po cyfrach) i^
przed małymi literami (ale po wielkich literach). Pomoże nam to zgrupować znaczniki pozycji (tj. Drugi znak w każdej parze) z odpowiednim zestawem znaków.Etap 3: Sortuj
To prosty etap sortowania. Dopasowuje dwa znaki, jeśli pierwszy nie jest znakiem słownym (dopasowując w ten sposób wszystkie trzy pary, o których właśnie mówiłem) lub pojedynczy znak w przeciwnym razie (dopasowuje każdy znak z głównego wejścia indywidualnie) i sortuje te ciągi. Ma to dwa cele: wprowadza znaki w każdej grupie we właściwej kolejności (a ponieważ sortowanie jest stabilne, kolejność ta nie zostanie zmieniona w następnym etapie), a ze względu na
%@^
znaczniki wstawia pary w odpowiednie pozycje:Etap 4: Sortuj
Ten etap sortuje wszystkie dopasowania
.\w+
wyrażenia regularnego, które z powodu chciwości dopasowują jeden znacznik pozycji (tj. Jeden!"#
) wraz ze wszystkimi znakami po nim. Oznacza to, że sortuje te trzy ciągi, których kolejność zależy wyłącznie od znaku znacznika:„24! BOR #afo
Chociaż tasuje to wokół tych znaczników (pozostawiając pozostałe trzy znaczniki na miejscu), co najważniejsze, wprowadza cyfry i litery we właściwej kolejności:
Etap 5: Zmiana
Pozostało tylko trochę oczyszczenia, w którym usuwamy wszystkie markery, dopasowując je i zastępując niczym.
źródło
JavaScript (ES6), 65
Uwaga: „naturalna” kolejność ASCII to 0–9, AZ, az, co jest dokładnie odwrotnością OP 0,1,2. Więc
źródło
Haskell,
6263 bajtyPrzykład użycia:
"cD12ab" # [2,0,1]
->"12abcD"
.Jak to działa:
Edycja: @Christian Sievers znalazł błąd. Dzięki! Naprawiono dla 1 dodatkowego bajtu.
źródło
Stax , 15 bajtów
Uruchom i debuguj online
To 15-bajtowe przesyłanie jest pakowane w wariant zestawu znaków CP437. Odpowiednia reprezentacja ascii zajmuje 18 bajtów:
Jestem pewien, że można go jeszcze bardziej przyciąć.
VlVd+
może również byćVLA|(
, który w lewo obraca0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
o dziesięć elementów. Może być również cały kodVlVd+26/,e@:f,{[Io
, który odczytuje stos wejściowy dwa razy zamiast odczytywać je wszystkie na początku do głównego stosu i używa innego (bardziej tradycyjnego) formatu wejściowego, jak pokazano w tym .źródło
Dyalog APL , 22 bajty
(819⌶⎕A)
złóż wielkie litery na małe(
…)⎕A⎕D[a]
Dolne górne cyfry uporządkowane zgodnie z tablicą a∊
spłaszczyćs⍋⍨
na łańcuch s , uzyskać indeksy że porządek y Zgodnie z tym „alfabet”s[
…]
Użyj tego, aby zmienić kolejność sźródło
PowerShell v2 +, 107 bajtów
Badam algorytmy za pomocą wyrażenia regularnego, ale jak dotąd wszystkie wydają się dłuższe.
Pobiera dane wejściowe jako jawną tablicę
$n
(patrz przykłady poniżej) i ciąg znaków,$s
który jest natychmiast przesyłany do tablicy znaków . Następnie konstruujemy trzy elementy nowej dynamicznej tablicy, z których każdy jest zamknięty w-join
:-
(($s=$s|sort)|?{$_-ge97})
-
($s|?{$_-in65..96})
-
($s|?{$_-lt58})
Najpierw bierzemy to
$s
i przeprowadzamySort-Object
. Na szczęście, ponieważ już umieściliśmy go jako tablicę znaków, sortowanie jest rozróżniane z uwzględnieniem wielkości liter. To jest ponownie zapisywane,$s
a następnie przesyłane strumieniowo doWhere-Object
klauzuli większej niż97
(tj. Małe litery ASCIIa-z
). Drugi jest za,A-Z
a trzeci za0-9
.Tak więc mamy teraz tablicę ciągów, gdzie każdy ciąg składa się z jednego z trzech typów znaków i jest sortowany. Kroimy to razem,
[$n]
a następnie-join
wynik razem, aby utworzyć nasz końcowy ciąg wyjściowy. Pozostaje to w przygotowaniu, a drukowanie jest niejawne.Przypadki testowe
źródło
Rubinowy, 56 bajtów
Przeniesione z odpowiedzi @Dennis.
Alternatywne 58 bajtowe rozwiązanie, które bardziej mi się podoba, zainspirowane przez @Neil i nieznacznie zmodyfikowane od jego odpowiedzi.
Wypróbuj dowolną wersję online! (wersja skomentowana to alternatywne rozwiązanie)
źródło
32-bitowy kod maszynowy x86, 70 bajtów
W hex:
Ta procedura oczekuje, że kolejność sortowania klas znaków będzie łańcuchem zakończonym znakiem NULL o długości 3 znaków (0..2)
ESI
i łańcuchem do sortowaniaEDI
. Sortowanie odbywa się na miejscu przy użyciu wyjątkowo nieoptymalnej (pod względem wydajności) wersji sortowania bąbelkowego.źródło
Emacs Lisp, 183 bajtów
Nieco krótszy niż Java ...
źródło
Clojure, 77 bajtów
Nie tak krótki jak
re-seq
bazowy i nie mogłem wymyślić, jak wyrazić to „(apply str(mapcat sort(map(...))))
” na mniejszej przestrzeni.group-by
tworzy mapę skrótów, która może być używana jako funkcja, po zapytaniu o liczbę całkowitą od 0 do 2 zwraca odpowiednią grupę, porządkuje trzy różne klasy znaków.Byłoby to bardziej zwarte niż
re-seq
rozwiązanie, gdyby było więcej klas znaków do obsługi, ponieważ zajmuje to tylko 5 dodatkowych znaków / grup57 1,
zamiast 8 zamiast wyrażeń podobnych#"[a-z]"
.źródło
Python 2,
14011710110099 bajtówWszyscy mówią „Ewww!”. Przynajmniej jest to czytelne ... kaszel, a nie kaszel
Wypróbuj online
źródło
R , 101 bajtów
Tworzy wektor z az, AZ i 0-9 w podanej kolejności i zmienia kolejność znaków ciągu wejściowego, aby dopasować to uporządkowanie.
Wypróbuj online!
źródło
J, 40 bajtów
źródło
Java 8,
221212193156 bajtówOczywiście powinienem również spróbować odpowiedzieć na moje własne wyzwanie. :) (I jak zwykle w Javie.)
-28 bajtów zapisanych dzięki @cliffroot .
Wyjaśnienie:
Wypróbuj tutaj.
źródło
[^a-z]
[^A-Z]
[^0-9]
getBytes()
toCharArray()
^
replaceAll
połączeniaString c(int[]a,String z){String r[]={"[^a-z]","[^A-Z]","[^0-9]"},o="";for(byte c[],i=0;i<3;){c=z.replaceAll(r[a[i++]],"").getBytes();java.util.Arrays.sort(c);o+=new String(c);}return o;}