Порахуй мою зміну


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"

Це , тому застосовуються стандартні правила та лазівки.



1
Усі тестові випадки повинні включати висновок. У мобільному телефоні другий і третій регістри показані двома рядками, тож виглядає так, ніби другий рядок є результатом
Луїс Мендо

4
Я канадський, чи можу я припустити, що вхід не має ні копійки? ;)
підземниймонорельс

1
@undergroundmonorail На жаль, ні.
ckjbgames

1
Що трапилося з луні та півдоларів?
Адам

Відповіді:


26

Japt , 5 3 байти

ñg9

Перевірте це в Інтернеті

Пояснення

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

gФункція на рядок займає в рядуn і повертає nй символ в рядку, обгортання , якщо nнегативна або повз кінця рядка. Таким чином, рядки можна вирівняти так:

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

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


Я також повинен працювати з 5, я думаю.
FlipTack

@FlipTack Так, я щойно це помітив. Не те, що це має значення ;-)
ETHproductions

Це. Не можу. Бути. Переможений.
ckjbgames

1
@ckjbgames Денніс не опублікував жодної відповіді ;-)
ETHproductions

1
@ETHproductions Він, мабуть, буде. Просто покажіть йому це питання.
ckjbgames

8

V , 7 байт

ú/¨qu©¿

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

Для цього використовується нове сортування команда я додав у V близько тижня тому ( ú). Солодкі терміни!

Це працює за допомогою сортування кожного рядка за сортуванням за замовчуванням (значення ASCII), але ігнорування першої відповідності певного регулярного виразу. У цьому випадку регулярний вираз є (qu)?, хоча він містить деякі грубі елементи , що не належать до ASCII, щоб уникнути використання косої риски. Якщо ви проігноруєте перші дві літери "чверті", вона починається з "а", і тоді всі монети вже в алфавітному порядку.

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

ú!/.

Ця функція вже була впроваджена, але я її ще не перевіряв, тому вона мала помилку, яку я зрозумів лише через цю проблему. Немає зв'язку TIO, оскільки TIO трохи відстає.

Це працює шляхом зворотного сортування кожного рядка, але ігнорування першого символу в кожному рядку.


8

Пітон, 36 байт

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

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

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


Ой, ой, якщо я не зрозумію elнеправильний шлях, я сумую за c: p
Джонатан Аллан


6

Пітон 3 , 42 41 38 байт

Неназвана лямбда-функція, яка приймає введення як список рядків, впорядкованих на місці.

(Перевершив Джонатан Аллан)

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)

5

PowerShell , 21 байт

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

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

Пояснення

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


Що $_в 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' з шістьма конгруентно два по модулю чотири.

Шостий символ чотирьох монет у порядку - квадратик er, d ime, nicke l, penny. Вони в алфавітному (або, що ще важливіше, порядковому) порядку.


Ще одним способом досягти того ж, було б сортування за обертовими рядками з ṙ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також працюють, і немає коротших.


5

Bash (+ coreutils) 11 байт

Гольф

sort -rk1.2

Як це працює

Зворотне сортування, за допомогою клавіші "сортування" від другого символу першого поля (слова) до кінця рядка, тобто:

uarter
ime
ickel
enny

Тест

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

quarter
dime
nickel
penny

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





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

Ви можете зробити :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 і потім mod 7 - це більше байт (включаючи необхідні дужки.
Brian J

1

JavaScript (ES6), 35 33 байт

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

Тестові кейси


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

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

Поданий з моєї відповіді Brachylog, яка вириває відповідь 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

Рубін, 30 байт

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

Магічні числа, знайдені методом проб і помилок. Трохи незграбний, але коротший, ніж використання .reverse.


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/./}}

Спробуй це

Розширено:

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

  }

}


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.

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


0

java 8, 128 112 байт

Це лямбда-вираз для a 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-х монет пройдіть по вводу та додайте ім'я монети до результату щоразу, коли буде відповідати унікальному символу цієї монети. Розбийте результат на масив і поверніть його.


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