Посчитайте мои изменения

21

Ваша задача состоит в том, чтобы отсортировать массив, содержащий строки «четверть», «десять центов», «никель» и «пенни», любое количество раз в произвольном порядке и отсортировать их так, чтобы они были в следующем порядке: quarter dime nickel penny(другими словами, наибольшая или минимальная денежная стоимость).


правила

  1. Ваша программа должна принимать в качестве входных данных массив, содержащий названия монет США, и сортировать их по наибольшему или наименьшему по денежной стоимости.
    • Для тех, кто не из США или не использует изменения, значения монет США, от наибольшего к наименьшему, составляют:
      • Квартал: 25 центов
      • Дайм: 10 центов
      • Никель: 5 центов
      • Пенни: 1 цент
  2. Вы можете сортировать этот массив любым способом, если хотите, если выходные данные упорядочены по денежным значениям, показанным выше.
  3. Входные данные могут быть приняты любым способом, будь то аргументы командной строки или STDIN.
  4. Входной массив будет состоять из строчных букв, примерно так:
    • quarter dime nickel nickel quarter dime penny penny
  5. Фактический формат ввода и вывода зависит от вас.

Тестовые случаи

"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"

Это , поэтому применяются стандартные правила и лазейки.

ckjbgames
источник
1
Все тесты должны включать выходные данные. В мобильном телефоне второй и третий случаи отображаются в две строки, поэтому похоже, что вторая строка является выходной
Луис Мендо,
4
я канадец, могу ли я предположить, что на входе нет ни копейки? ;)
подземный
1
@undergroundmonorail К сожалению, нет.
ckjbgames
1
Что случилось с психами и полдолларами?
Адам

Ответы:

26

Japt , 5 3 байта

ñg9

Проверьте это онлайн!

объяснение

Я также добавил функцию сортировки к своему языку за последние несколько недель :-) ñпринимает массив и функцию и сортирует массив, как если бы каждый элемент был отображен через эту функцию.

gФункция на строку занимает в ряду nи возвращает nй символ в строке, обертывание , если nотрицательна или мимо конца строки. Таким образом, строки могут быть выровнены следующим образом:

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

9-й символ (0-индексированный) каждой строки выделен жирным шрифтом. Они в правильном порядке, поэтому все, что нам нужно сделать, это ñg9. (Хотя теперь, когда я оглядываюсь назад, ñg5это также сработало бы ...)

ETHproductions
источник
Это должно также работать с 5, я думаю.
FlipTack
@FlipTack Да, я только что заметил это сам. Не то чтобы это
имело
Это. Не могут. Быть. Потерпев поражение.
ckjbgames
1
@ckjbgames Деннис не опубликовал ни одного ответа ;-)
ETHproductions
1
@ETHproductions Он, вероятно, будет. Просто покажи ему этот вопрос.
ckjbgames
8

V , 7 байт

ú/¨qu©¿

Попробуйте онлайн!

При этом используется новая команда сортировки spiffy, которую я добавил в V около недели назад ( ú). Сладкий выбор времени!

Это работает путем сортировки каждой строки по умолчанию (значения ASCII), но игнорируя первое совпадение определенного регулярного выражения. В этом случае, регулярное выражение есть (qu)?, хотя оно имеет некоторые грубые вещи не ASCII, чтобы избежать использования обратной косой черты. Если вы игнорируете первые две буквы «четверти», он начинается с «а», а затем все монеты уже в алфавитном порядке.

Неконкурентная версия, 4 байта

ú!/.

Эта функция уже была реализована, но я еще не тестировал ее, поэтому в ней была ошибка, которую я осознал только из-за этой проблемы. Там нет ссылки TIO, потому что TIO немного отстает.

Это работает путем обратной сортировки каждой строки, но игнорирует первый символ в каждой строке.

DJMcMayhem
источник
8

Python, 36 байт

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

Безымянная функция, которая сортирует список по заданной ключевой функции.

Кусочки названия монеты затем, arter, dime, ickel, и penny- которые находятся в алфавитном (или , что более важно, порядковом) порядке.

Джонатан Аллан
источник
Ой ой - если я не elc
Джонатан Аллан
7

Баш + coreutils, 18

tr q b|sort|tr b q
  • Транслитерировать от q до b
  • Сортировать
  • Транслитерировать б обратно в д

Попробуйте онлайн .

Цифровая травма
источник
6

Python 3 , 42 41 38 байт

Безымянная лямбда-функция, которая принимает входные данные в виде списка строк, сортирует по месту.

(Outgolfed Джонатаном Алланом)

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

Попробуйте онлайн!

Другие решения, с которыми я столкнулся:

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
источник
5

PowerShell , 21 байт

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

Попробуйте онлайн!

объяснение

Бесстыдно украл алгоритм в ответе ETHproductions (в основном). Я умножаю каждую строку на 3, а затем сортирую на основе 9-го символа полученной строки.

briantist
источник
Что находится $_в PowerShell?
ckjbgames
@ckjbgames В конвейере, внутри скриптового блока, он ссылается на текущий элемент. Так что что-то вроде 1,2,3,4 | ForEach-Object { $_*2 }будет выводить каждое число раз 2; блок скрипта запускается один раз для каждого элемента ввода.
Бриантист
В этом есть смысл.
ckjbgames
5

Желе , 4 байта

6ịµÞ

Попробуйте онлайн! (нижний колонтитул,ÇYобъединяет результирующий список с переводами строки для более красивой распечатки.)

Как?

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-й индекс списка в Jelly - это N-й элемент, начинающийся слева, считающий от 1 и возвращающийся к началу, когда это необходимо. (0-й справа, -1-й слева от этого и так далее).

Таким образом, шестой символ ['d','i','m','e']является 'i'с шестью конгруэнтно два по модулю четыре.

Шестой символ из четырех монет по порядку: кварт e, г i, ник l, энни p. Они расположены в алфавитном (или, что более важно, порядковом) порядке.


Другим способом достижения того же результата будет сортировка по повернутым струнам ṙ5µÞ, где вращение направо, создание струн.erquart , imed, lnicke, и penny.

Джонатан Аллан
источник
5

питон , 32 байта

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

Попробуйте онлайн! Сортирует список по месту.

Идея состоит в том, чтобы использовать функцию сортировки клавиш без lambda. Хороший кандидат был x.strip, который принимает строкуx и удаляет ее левый и правый края всех символов на входе. Например, "abcdef".strip("faces") == "bcd".

Метод "npr".stripпринимает:

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

которые лексикографически отсортированы. Я нашел строку nprгрубой силой. npuа nptтакже работают, и нет никого короче.

XNOR
источник
5

Bash (+ coreutils) 11 байт

Golfed

sort -rk1.2

Как это работает

Обратная сортировка с использованием «ключа сортировки» от второго символа первого поля (слова) до конца строки, то есть:

uarter
ime
ickel
enny

Тестовое задание

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

quarter
dime
nickel
penny

Попробуйте онлайн!

дирижабль
источник
4

CJam , 8 байт

q~{5=}$p

Попробуйте онлайн!

объяснение

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
Бизнес Кот
источник
3

Сетчатка, 10

  • 6 10 байт сэкономлено благодаря @ETHproductions
q
b
O`
b
q
  • Заменить qнаb
  • Сортировать
  • Заменить bобратно наq

Попробуйте онлайн .

Цифровая травма
источник
@ETHproductions Отлично - спасибо!
Цифровая травма
3

V , 8 7 байт

1 байт сохранен благодаря @DJMcMayhem

Úçq/:m0

[Попробуйте онлайн!]

Смотрите ответ @ DJMcMayhem в V (на 1 0 байт меньше моего)

Попробуйте онлайн!

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

Вот более старое решение на 1 байт больше, но оно мне действительно нравится.

V , 8 байт

Ú/q
dGHP

[Попробуйте онлайн!]

Попробуйте онлайн!

объяснение

Ú        " sorts the lines

Теперь буфер будет в следующем формате:

dimes
nickels
pennies
quarters

Единственное, что осталось сделать сейчас, это переместить кварталы на вершину.

/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
источник
Вы можете использовать :m0альтернативное решение, чтобы сохранить байт (и связать меня)Úçq/:m0
DJMcMayhem
@DJMcMayhem Спасибо, TIL о:move
Kritixi Lithos
1

T-SQL, 41 36 34 байта

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

объяснение

Предположим, что входные данные предварительно загружены в табличную переменную с именем @, именуемым одним столбцом a, где каждое значение представляет собой одну монету для сортировки.

select * from @Часть шаблонные "получить все значения для возврата. Настоящая магия происходит в order byпункте.

Используя ту же стратегию , как Johnathan Аллан , я сортирую по последним пяти символов (SQL возвращает всю строку , если она слишком коротка) arter, dime, ickel, penny.

Брайан Дж
источник
qэто следующая буква после p, так что для простого мода, чтобы получить qменьше, чем pзначение, должен быть фактор q, который является простым. Сначала вы могли бы вычесть 1, а затем модуль 7 сработал бы, но, вероятно, это заняло бы как минимум столько же байтов, сколько 113.
Нейл
@Neil Да, я понял, что 113, будучи главным, разрушали мои попытки уменьшить количество. Выполнение -1, а затем мод 7 - это больше байтов (включая необходимые скобки.
Brian J
1

JavaScript (ES6), 35 33 байта

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

Контрольные примеры

Arnauld
источник
1

Befunge, 158 байт

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

Попробуйте онлайн!

Обработка и сортировка строк - это не те вещи, которые вы обычно хотите попробовать в Befunge, но это решение использует преимущества Джона Касунича. наблюдения том, что нам на самом деле ничего не нужно сортировать. Мы просто подсчитываем количество вхождений каждой монеты (которое легко определить по первому символу), а затем выводим столько имен каждой монеты в соответствующем порядке.

С точки зрения размера он все еще не вполне конкурентоспособен с другими языками, но этот подход, по крайней мере, лучше, чем он был бы, если бы мы попытались справиться с проблемой как с сортировкой строк.

Джеймс Холдернесс
источник
1

APL (Dyalog APL) , 11 байтов

Принимает и возвращает список строк.

{⍵[⍋↑5⌽¨⍵]}

Попробуйте онлайн!

{ анонимная функция:

⍵[... ] аргумент, проиндексированный

 восходящие показатели

 матрица, строки которой дополнены

5⌽ пяти шагов, повернутые

¨⍵ предметы аргумента

}

Адам
источник
1

Шелуха , 3 байта

Öṙ9

Попробуйте онлайн!

Портировано из моего ответа на брахилоге, который отрывает ответ Japt от ETHproductions, но не является точным переводом, поскольку он использует вращение вместо простого элемента доступа к n-му элементу. Там я сделал это, потому что не позволяет индексировать после конца ввода (что, вероятно, весьма полезно во многих обстоятельствах из-за декларативного характера языка). В шелухи, ! делает пусть индексировать мимо конца ввода, с той же модульной оборачивания вокруг этого Japt ñg9использования, но это от 1 , поэтому эта программа , в частности , будет в конечном итоге один байт больше: Ö!10.

Ö      Sort by
 ṙ     rotation by
  9    9.
Несвязанная строка
источник
0

Пакет, 82 байта

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

Принимает ввод в качестве аргументов командной строки и выводит в STDOUT. Работает путем объединения списков, полученных в результате фильтрации исходного списка на каждой монете.

Нил
источник
0

Рубин, 34 байта

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

ввод и вывод в виде массива строк

Алексис Андерсен
источник
0

Рубин, 31 байт

->s{s.sort_by{|i|i[1]}.reverse}
dkudriavtsev
источник
Это не всегда правильно сортирует «никель» и «десять центов».
Даниеро
0

Рубин, 30 байтов

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

Магические числа найдены методом проб и ошибок. Немного неуклюже, но короче, чем используя .reverse.

daniero
источник
0

Perl 6 ,  40 36  34 байта

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

Попытайся

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

Попытайся

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

Попытайся

Expanded:

*\            # 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 「$_」 )

  }

}
Брэд Гилберт b2gills
источник
0

Mathematica, 50 байтов

Flatten@{Last@#,Most@#}&@Split@Sort@StringSplit@#&
Мартин
источник
0

RProgN , 18 байт

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

Разъяснения

~               # 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.

Попробуйте онлайн!

Ataco
источник
0

Ява 8, 128 112 байт

Это лямбда-выражение для 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(" ");}

Объяснение: Для каждой из 4 монет по порядку пройдите ввод и добавляйте название монеты к результату каждый раз, когда есть совпадение с уникальным персонажем этой монеты. Разделите результат на массив и верните его.

Джек Боеприпасы
источник
0

Рубин, 27 байт

->s{s.sort_by{|x|(x*2)[5]}}
гигабайт
источник