Policz moją zmianę

21

Twoim zadaniem jest sortowanie tablicy zawierającej ciągi „ćwiartka”, „dziesięciocentówka”, „nikiel” i „grosz” dowolną liczbę razy w określonej kolejności i sortowanie ich w takiej kolejności: quarter dime nickel penny(innymi słowy, od największej do najmniejszej wartości pieniężnej).


Zasady

  1. Twój program musi pobrać tablicę jako dane wejściowe zawierające nazwy monet amerykańskich i posortować je od największej do najmniejszej według wartości pieniężnej.
    • Dla tych, którzy nie pochodzą z USA lub nie używają zmian, wartości monet amerykańskich, od największej do najmniejszej, wynoszą:
      • Kwartał: 25 centów
      • Grosz: 10 centów
      • Nikiel: 5 centów
      • Grosz: 1 cent
  2. Możesz sortować tę tablicę w dowolny sposób, pod warunkiem, że dane wyjściowe są uporządkowane według wartości pieniężnych pokazanych powyżej.
  3. Dane wejściowe można przyjmować w dowolny sposób, czy to argumenty wiersza polecenia, czy STDIN.
  4. Tablica wejściowa składałaby się z małych ciągów znaków, mniej więcej tak:
    • quarter dime nickel nickel quarter dime penny penny
  5. Rzeczywisty format wejścia i wyjścia zależy od Ciebie.

Przypadki testowe

"penny nickel dime quarter" 
-> "quarter dime nickel penny"

"nickel penny penny quarter quarter quarter dime dime dime dime"
-> "quarter quarter quarter dime dime dime dime nickel penny penny"

"quarter dime nickel nickel quarter dime penny penny"
-> "quarter quarter dime dime nickel nickel penny penny"

To jest , więc obowiązują standardowe zasady i luki.

ckjbgames
źródło
1
Daj nam kontynuować tę dyskusję w czacie .
ckjbgames
1
Wszystkie przypadki testowe powinny zawierać dane wyjściowe. W telefonie komórkowym druga i trzecia obudowa są pokazane w dwóch liniach, więc wygląda na to, że druga linia to wynik
Luis Mendo
4
Jestem Kanadyjczykiem, czy mogę założyć, że wkład nie ma groszy? ;)
metro
1
@undergroundmonorail Niestety nie.
ckjbgames
1
Co się stało z wariatami i pół dolarów?
Adám

Odpowiedzi:

26

Japt , 5 3 bajty

ñg9

Przetestuj online!

Wyjaśnienie

Ja także dodałem funkcję sortującą do mojego języka w ciągu ostatnich kilku tygodni :-) ñprzejmuje tablicę i funkcję i sortuje tablicę tak, jakby każdy element został zmapowany przez tę funkcję.

gFunkcja na sznurku zajmuje w szeregu ni zwraca nth char w ciągu, jeśli opakowanie njest ujemna lub poza końcem łańcucha. Ciągi można zatem wyrównać w następujący sposób:

quarterquarter...
dimedimedimedi...
nickelnickelni...
pennypennypenn...

Dziewiąty znak (indeksowany 0) każdego łańcucha został pogrubiony. Są w prawidłowej kolejności, więc wszystko, co musimy zrobić, to ñg9. (Chociaż teraz, kiedy na to spojrzę, ñg5to też zadziała ...)

ETHprodukcje
źródło
Myślę, że powinien również działać z 5.
FlipTack,
@FlipTack Tak, właśnie to zauważyłem. To nie robi różnicy ;-)
ETHprodukcje
To. Nie może. Być. Pokonany.
ckjbgames
1
@ckjbgames Dennis nie opublikował żadnych odpowiedzi ;-)
ETHproductions
1
@ETHproductions Prawdopodobnie będzie. Po prostu pokaż mu to pytanie.
ckjbgames
8

V , 7 bajtów

ú/¨qu©¿

Wypróbuj online!

Używa to nowego, sortującego polecenia, które dodałem do V około tydzień temu (ú ). Słodki czas!

Sposób ten polega na domyślnym sortowaniu każdej linii (wartości ASCII), ale ignorowaniu pierwszego dopasowania określonego wyrażenia regularnego. W tym przypadku wyrażeniem regularnym jest(qu)? , chociaż ma pewne rażące elementy inne niż ASCII, aby uniknąć używania odwrotnych ukośników. Jeśli zignorujesz dwie pierwsze litery „ćwiartki”, zaczyna się od „a”, a następnie wszystkie monety są już w kolejności alfabetycznej.

Wersja niekonkurencyjna, 4 bajty

ú!/.

Ta funkcja została już zaimplementowana, ale jeszcze jej nie testowałem, więc miałem błąd, który zdałem sobie sprawę tylko z powodu tego wyzwania. Nie ma łącza do TIO, ponieważ TIO jest nieco opóźnione.

Działa to poprzez odwrotne sortowanie każdej linii, ale ignorowanie pierwszego znaku w każdej linii.

DJMcMayhem
źródło
8

Python, 36 bajtów

lambda a:a.sort(key=lambda x:x[-5:])

Nienazwana funkcja sortująca listę w miejscu według podanej funkcji kluczowej.

Plastry każdej nazwy monety są wtedy arter, dime, ickel, i penny- które są w alfabetycznym (lub co ważniejsze, porządkowa) kolejności.

Jonathan Allan
źródło
Ojej - jeśli nie zrozumiem elźle, tęsknię za c: p
Jonathan Allan
7

Bash + coreutils, 18

tr q b|sort|tr b q
  • Transliteruj od q do b
  • Sortować
  • Transliteruj b z powrotem do q

Wypróbuj online .

Cyfrowa trauma
źródło
6

Python 3 , 42 41 38 bajtów

Nienazwana funkcja lambda, która pobiera dane wejściowe jako listę ciągów znaków, jest sortowana na miejscu.

(Outgolfed Jonathan Allan)

lambda x:x.sort(key=lambda s:(s*2)[5])

Wypróbuj online!

Inne rozwiązania, które pomieszałem z:

lambda x:x.sort(key=lambda s:s*(s<'q'))
lambda x:x.sort(key=lambda s:(s+'pi')[5])
lambda x:x.sort(key=lambda s:ord(s[3])%16)
FlipTack
źródło
5

PowerShell , 21 bajtów

$args|sort{($_*3)[9]}

Wypróbuj online!

Wyjaśnienie

Bezwstydnie ukradł algorytm w odpowiedzi ETHproductions (w zasadzie). Mnożę każdy ciąg przez 3, a następnie sortuję na podstawie 9 znaku wynikowego ciągu.

briantist
źródło
Co zawiera $_PowerShell?
ckjbgames
@ckjbgames W potoku, w bloku skryptu, odnosi się do bieżącego elementu. Więc coś takiego 1,2,3,4 | ForEach-Object { $_*2 }wyświetli każdą liczbę razy 2; blok skryptu jest uruchamiany raz dla każdego elementu wejściowego.
briantist
To ma sens.
ckjbgames
5

Galaretka , 4 bajty

6ịµÞ

Wypróbuj online! (stopka,ÇYłączy wynikową listę ze znakami linii dla ładniejszego wydruku).

W jaki sposób?

6ịµÞ - Main link: list of strings
  µ  - monadic chain separation
   Þ - sort the list of strings by the monadic function:
6ị   - the sixth index - Jelly indexing is modular and 1-based

N-ty indeks listy w Galaretce to N-ty element zaczynający się od lewej strony, licząc od 1, i zapętlający się z powrotem do początku, gdy zajdzie taka potrzeba. (0 jest po prawej stronie, -1 po lewej i tak dalej).

Więc szósty znak ['d','i','m','e']jest, 'i'ponieważ szóstka jest zgodna z dwoma modulo czterema.

Szósty znak czterech monet w kolejności to kwartae r, d ime l, pnicke , enny. Są one w kolejności alfabetycznej (lub, co ważniejsze, porządkowej).


Innym sposobem, aby osiągnąć to samo byłoby, aby posortować według obróconego strun z ṙ5µÞ, gdzie obraca się w prawo, dzięki czemu struny erquart, imed,lnicke , i penny.

Jonathan Allan
źródło
5

Pyton , 32 bajty

lambda s:s.sort(key="npr".strip)

Wypróbuj online! Sortuje listę na miejscu.

Chodzi o to, aby użyć funkcji klawisza sortującego bez znaku lambda. Dobrym kandydatem był x.strip, który pobiera ciąg znaków xi usuwa jego lewą i prawą krawędź ze wszystkich znaków na wejściu. Na przykład "abcdef".strip("faces") == "bcd".

Metoda "npr".stripwymaga:

quarter ->  np
dime    ->  npr
nickel  ->  pr
penny   ->  r

które są posortowane leksykograficznie. Znalazłem strunę nprbrutalną siłą. npua npttakże praca, i nie ma nic krótszego.

xnor
źródło
5

Bash (+ coreutils) 11 bajtów

Grał w golfa

sort -rk1.2

Jak to działa

Sortowanie odwrotne za pomocą „klucza sortowania” od drugiego znaku pierwszego pola (słowa) do końca wiersza, tj .:

uarter
ime
ickel
enny

Test

>echo penny nickel dime quarter|tr ' ' '\n'|sort -rk1.2

quarter
dime
nickel
penny

Wypróbuj online!

zepelin
źródło
4

CJam , 8 bajtów

q~{5=}$p

Wypróbuj online!

Wyjaśnienie

q~        Get and eval all input (array of coin names)
  {5=}$   Sort the array by the 5th index of each element (array indices loop in CJam)
       p  Print the result
Business Cat
źródło
3

Siatkówka, 10

  • 6 10 bajtów zapisanych dzięki @ETHproductions
q
b
O`
b
q
  • Zastąpić q dob
  • Sortować
  • Zastąp z bpowrotem doq

Wypróbuj online .

Cyfrowa trauma
źródło
@ETHproductions Świetnie - dzięki!
Cyfrowa trauma
3

V , 8 7 bajtów

1 bajt zapisany dzięki @DJMcMayhem

Úçq/:m0

[Wypróbuj online!]

Zobacz @ DJMcMayhem za odpowiedź w V ( 1 0 bajtów krócej niż kopalnia)

Wypróbuj online!

Ú                    " sort all lines "
 ç                   " globally "
  q/                 "  where there a q is matched, "
    :m0              "  move it to the top of the buffer "

Oto starsze rozwiązanie o 1 bajt większe, ale bardzo mi się podoba.

V , 8 bajtów

Ú/q
dGHP

[Wypróbuj online!]

Wypróbuj online!

Wyjaśnienie

Ú        " sorts the lines

Teraz bufor będzie w tym formacie:

dimes
nickels
pennies
quarters

Jedyne, co pozostało do zrobienia, to przenieść kwaterę na szczyt.

/q      " search for a q "
dG      " delete everything from the first quarter to the end of buffer "
HP      " and paste it at the top of the buffer
Kritixi Lithos
źródło
Możesz zrobić :m0na swoim alternatywnym rozwiązaniu, aby zaoszczędzić bajt (i powiązać mnie)Úçq/:m0
DJMcMayhem
@DJMcMayhem Dzięki, TIL o:move
Kritixi Lithos
1

T-SQL, 41 36 34 bajtów

select*from @ order by right(a,5)

Wyjaśnienie

Załóżmy, że dane wejściowe są wstępnie załadowane do zmiennej tabeli o nazwie @, o nazwie pojedynczej kolumnya , gdzie każda wartość to jedna moneta do posortowania.

select * from @Częścią kotła jest płyta „uzyskać wszystkie wartości do powrotu”. Prawdziwa magia dzieje się w order byklauzuli.

Stosując tę samą strategię jako Johnathan Allan , I sortować według ostatnich pięciu znaków (SQL zwróci cały ciąg jeśli jest zbyt krótki): arter, dime, ickel, penny.

Brian J.
źródło
qjest następną literą po p, więc aby zwykły mod, którego wynikiem jest qmniej niż pwartość, musiał być czynnikiem q, który jest liczbą pierwszą. Możesz najpierw odjąć 1, a potem zadziała moduł 7, ale prawdopodobnie zajmie to co najmniej tyle bajtów, co 113.
Neil
@ Nee Tak, zdałem sobie sprawę, że 113 bycie głównym jest rujnujące moje próby zmniejszenia liczby. Wykonanie -1, a następnie mod 7 to więcej bajtów (w tym wymagane nawiasy)
Brian J
1

JavaScript (ES6), 35 33 bajtów

a=>a.sort(([,...a],[,...b])=>b>a)

Przypadki testowe

Arnauld
źródło
1

Befunge, 158 bajtów

~:0`v0v4<~_
9:%8_^>8*`^1p9\+1g
$:!#@_1-0" ynnep">:#,_>
1-0" lekcin">:#,_>$:!#^_
" emid">:#,_>$:!#^_1-0
>:#,_$1>-:!#^_0" retrauq"
*84g9< ^*84g91-*84g94-*84g96-

Wypróbuj online!

Przetwarzanie i sortowanie ciągów nie jest typem rzeczy, które zwykle chcesz spróbować w Befunge, ale to rozwiązanie wykorzystuje Johna Kasunicha że tak naprawdę nie musimy niczego sortować. Po prostu policzymy liczbę wystąpień każdej monety (którą można łatwo określić na podstawie pierwszego znaku), a następnie wyprowadzamy tyle nazw każdej monety w odpowiedniej kolejności.

Wciąż nie jest wcale konkurencyjny pod względem wielkości, ale takie podejście jest przynajmniej lepsze niż byłoby, gdybyśmy próbowali poradzić sobie z wyzwaniem jako ćwiczenie sortowania strun.

James Holderness
źródło
1

Pyth, 3 bajty

@D5

Demonstracja

Na podstawie produkcji ETH odpowiedź „sw Japt.

Wyjaśnienie:

@D5
@D5Q    Variable introduction
 D Q    Sort the input by
@ 5     Its fifth character
isaacg
źródło
1

APL (Dyalog APL) , 11 bajtów

Pobiera i zwraca listę ciągów.

{⍵[⍋↑5⌽¨⍵]}

Wypróbuj online!

{ funkcja anonimowa:

⍵[] Argument indeksowany przez

 indeksy rosnące

 matryca, której rzędy są wypełnione

5⌽ pięć kroków obróconych

¨⍵ elementy argumentu

}

Adám
źródło
1

Brachylog , 3 bajty

↺₉ᵒ

Wypróbuj online!

Podejście skradzione z Japt odpowiedzi ETHproductions.

       The input
  ᵒ    sorted by
↺      its elements rotated left
 ₉     by 9
       is the output.
Niepowiązany ciąg
źródło
1

Łuska , 3 bajty

Öṙ9

Wypróbuj online!

Przeniesiony z mojej odpowiedzi Brachylog, która zgrywa Japt odpowiedź ETHproductions, ale nie jest dokładnym tłumaczeniem, ponieważ używa rotacji zamiast prostego dostępu do n-tego elementu. Zrobiłem to, ponieważ nie pozwala na indeksowanie poza końcem danych wejściowych (co jest prawdopodobnie całkiem pomocne w wielu okolicznościach ze względu na deklaratywny charakter języka). W łuskę, ! nie pozwalają indeks poza koniec wejściu, z tego samego modularnego owijania wokół tego Japt ñg9zastosowań, ale to od 1 więc ten program w szczególności by skończyć jako jeden bajt już: Ö!10.

Ö      Sort by
 ṙ     rotation by
  9    9.
Niepowiązany ciąg
źródło
0

Partia, 82 bajty

@for %%c in (quarter dime nickel penny)do @for %%a in (%*)do @if %%a==%%c echo %%c

Pobiera dane wejściowe jako argumenty wiersza polecenia i dane wyjściowe do STDOUT. Działa poprzez łączenie list wynikających z filtrowania oryginalnej listy na każdej monecie.

Neil
źródło
0

Rubinowy, 34 bajty

->m{m.sort_by{|c|c[1..2]}.reverse}

dane wejściowe i wyjściowe jako tablica ciągów

Alexis Andersen
źródło
0

Ruby, 31 bajtów

->s{s.sort_by{|i|i[1]}.reverse}
dkudriavtsev
źródło
Nie zawsze będzie to poprawnie sortowało „nikiel” i „grosz”.
daniero
0

Rubinowy, 30 bajtów

->m{m.sort_by{|s|s[3].ord^16}}

Liczby magiczne znalezione metodą prób i błędów. Trochę niezdarny, ale krótszy niż używanie .reverse.

daniero
źródło
0

Perl 6 ,  40 36  34 bajtów

*.sort: {(<q d n p>Zxx 1..*).Bag{~m/./}}

Spróbuj

*.sort: {%(<q d n p>Z=>1..*){~m/./}}

Spróbuj

*.sort: {%(<q d n p>Z=>^4){~m/./}}

Spróbuj

Rozszerzony:

*\            # WhateverCode lambda ( this is the parameter )

.sort:        # sort using the following code block

{             # bare block lambda with implicit parameter 「$_」

  %(          # treat this list as a hash

    <q d n p> # list of first characters
    Z[=>]     # zipped using pair constructor
    ^4        # Range from 0 up-to 4 ( excludes 4 )

  ){          # get the value associated with this key

    ~m/./     # regex which gets the first character ( implicitly from 「$_」 )

  }

}
Brad Gilbert b2gills
źródło
0

Mathematica, 50 bajtów

Flatten@{Last@#,Most@#}&@Split@Sort@StringSplit@#&
jaskółka oknówka
źródło
0

RProgN , 18 bajtów

~{3mtt¢\3mtt¢>}$

Wyjaśnił

~               # Zero Space Segment
 {            } # Anonymous Function
  3m            # Repeat the inputted string 3 times
    tt¢         # And take the tenth character of that
       \3mtt¢   # Do the same for the entry underneith
             >  # Compare the ascii value of the two
               $# Sort the input by the anonymous function.

Wypróbuj online!

ATaco
źródło
0

java 8, 128 112 bajtów

To jest wyrażenie lambda dla java.util.function.Function<String[],String[]>

s->{String r="";for(String k:"q d c p".split(" "))for(String t:s)if(t.contains(k))r+=" "+t;return r.split(" ");}

Objaśnienie: Dla każdej z 4 monet w kolejności przejrzyj dane wejściowe i dołączaj nazwę monety do wyniku za każdym razem, gdy występuje dopasowanie do unikalnego charakteru tej monety. Podziel wynik na tablicę i zwróć go.

Jack Ammo
źródło
0

Rubinowy, 27 bajtów

->s{s.sort_by{|x|(x*2)[5]}}
GB
źródło