Буквені літери


19

Буквені літери

Для заданого набору чисел поставте їх в алфавітному порядку, коли вони прописані (тобто 1: один, 2: два, 90: дев'яносто, 19: дев'ятнадцять). Ваш код повинен працювати для діапазону [-999999, 999999]. Вихід повинен мати роздільник між числами. Пробіл буде працювати, як пробіл і кома, як показано в прикладах нижче. Введенням може бути масив цілих чисел, рядок з обмеженими числами або як би ви вважаєте за потрібне. Усі цілі числа вважаються унікальними.

Для цілей цього виклику цифри не переносяться дефісами, а пробіли розміщуються перед іншими символами. Негативні числа прийнято виражати за допомогою слова minus. Наприклад, fourбуде передувати, four thousandа число -40буде відсортовано за допомогою рядка minus forty. Припустимо, що всі числа будуть складатися виключно з числових слів і без сполучників (наприклад, використання two thousand forty twoзамість two thousand and forty two).


Випробування

Одноцифрові цілі числа:

Вхід:

1, 2, 3, 4, 5

Вихід:

5, 4, 1, 3, 2

Багатоцифрові цілі числа:

Вхід:

-1002, 5, 435012, 4, 23, 81, 82

Вихід:

81, 82, 5, 4, 435012, -1002, 23

Пробіли між словами, без дефісів, коми або "і":

Вхід:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

Вихід:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

Пам'ятайте, що це , тому виграє код з найменшими байтами. Не допускаються лазівки!


Ось посилання на відповідну пісочну публікацію.
сучки

Чи буде вхід колись містити більше ніж одне ціле число?
ETHproductions

@ETHproductions Ні, не буде. Я уточню це у питанні.
вилазки

8
Ласкаво просимо до PPCG. Гарний аватар. : D Гарне перше питання.
AdmBorkBork

@TimmyD Дякую! Я з нетерпінням чекаю PowerShell-ing всього, що тут можу.
шматки

Відповіді:


5

JavaScript (ES6), 189 179 186 байт

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

Основна ідея полягає в перетворенні кожного вхідного номера в короткий рядок, який знаходиться у правильному лексографічному положенні порівняно з усіма іншими парами числових рядків. Ось використаний словник: (Не запускайте фрагмент; він просто використовується для приховування довгого списку.)

Це створює дуже стислий спосіб відображення кожного числа у його лексографічно правильному положенні. Ось що qробить рекурсивна функція:

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

На 0початку рядка потрібно переконатися, що наприклад 100 ( one hundredперетворений у PK0) сортується до 101( one hundred oneперетворюється в PKP). Це створює дивний сценарій, коли 0 ( zero) сортується на передню частину масиву, тому, щоб обійти це, у функції сортування ми спочатку сортуємо будь-які нулі праворуч !x-!y||(....


Схоже, це не працює [1100, 1000]. Я б очікував, що результат буде 1000 (one thousand), 1100 (one thousand one hundred), але вихід у тому ж порядку, що і вхідний.
молоко

@milk Хм ... Я не впевнений, чому це відбувається, але я розберуся в цьому.
ETHproductions

@milk Ах, 1000розбирається як one thousand zero; Я це миттєво виправлю. Чи повинні ми підтримувати 0самостійно? Це унікальний випадок, який додасть до мого коду 15 байт.
ETHproductions

11

Інформуйте 7, 214 201 118 байт

Інформ 7 - це абсолютно жахлива мова для гольфу, тому я хотів дати тут шанс.

Для відступу слід використовувати \tсимволи табуляції ( ), але HTML не подобається. І навпаки, Inform не любить пробілів для відступів, тому вам доведеться замінити пробіли на вкладки, якщо ви скопіюєте і вставте код звідси, щоб перевірити його. Або просто скопіюйте вставити замість цього джерела Markdown.

Гольф:

До X:
    повторити таблицю 1:
        тепер запис Q - це "[R запис словами]";
    сортувати таблицю 1 у порядку Q;
    скажіть "[R у таблиці 1]".

Введення має бути таблицею Inform, як-от так (з \tстовпцями):

Таблиця 1
R (число) Q (текст)
-1002
5
435012
4
23
81
82

Вихід:

81, 82, 5, 4, 435012, -1002, 23

Ця функція проходить через таблицю один раз, додаючи текстове подання кожного номера в новий стовпчик. Потім вона сортує рядки таблиці відповідно до текстового стовпця; у Inform рядки сортуються лексикографічно. Нарешті, він виводить оригінальний стовпець у новому порядку. Зручно, що "сирий, але іноді корисний" формат Inform 7 для друку стовпців таблиць виявляється розділеним комами, точно так, як вимагається.

Без заготівлі, на котельній панелі показано, як викликати функцію:

Щоб надрукувати цифри в алфавітному порядку:
    повторіть таблицю сортувальних чисел:
        тепер запис імені - "[запис індексу словами]";
    сортувати Таблицю сортувальних чисел за порядком імен;
    скажіть "[стовпець індексу в таблиці зіставних чисел]".

Таблиця сортованих чисел
індекс (число) ім'я (текст)
-1002
5
435012
4
23
81
82

Є кімната.
Коли гра починається: друкуйте числа в алфавітному порядку.

1
Я трохи збентежений цим. Чи wordsє посилання на прописані версії чисел, вбудовані в Inform 7?
Павло

1
@Pavel Дійсно! "(число) словами" повертає рядок з текстовим поданням числа. Він зручно використовує "мінус" для від'ємних чисел, і, хоча він ставить дефіси між словами, він робить це послідовно і буквене позначення дефісів перед усіма літерами (тому кінцевий результат однаковий).
Драконіс

2
+1 для вибору мови. Я повинен був би перевірити, але я підозрюю, що в ньому залишилися деякі можливості для гольфу; наприклад, чи справді парсер вимагає всіх тих "" "статей? І вам доведеться запитати ОП, але я не бачу жодної очевидної причини, чому "і" не було б дійсним роздільником. Навіть якщо ні, то однозначний пробіл явно дозволений, тому просто say "[R entry] "має бути достатньо.
Ільмарі Каронен

Я б сказав, що "і" наприкінці добре. Я не сказав, що роздільники повинні бути однаковими, тому це цілком прийнятна відповідь. Якби я міг дати бали за найцікавішу відповідь, я б сказав це вам. Мені дуже подобається читати цю мову, навіть гольф. Хороша робота!
сучки

Нарешті я отримав шанс трохи пограти з Inform7, і мені вдалося перезавантажити свій запис до всього 118 байт. Оскільки розміщення коду Inform у коментарях працює не дуже добре, я продовжував редагувати його у своїй відповіді безпосередньо. Сподіваюсь, ви не заперечуєте, не соромтесь повернути та / або змінити мої зміни будь-яким способом, як вам подобається.
Ільмарі Каронен

4

Математика, 67 байт

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

Безіменна функція, приймаючи список цілих чисел як аргумент і повертаючи список цілих чисел як своє значення. #~IntegerName~"Words"це вбудований модуль, який змінює ціле число на своє ім'я англійською мовою. IntegerNameіноді є коми і дефіси у виході, тому StringReplaceдзвінок позбавляється від них. (На жаль, дефіс насправді є 3-байтовим символом, 8208, в UTF-8.) Потім SortByсортує оригінальний список в алфавітному порядку відповідно до значення модифікованого цілого імені.

Гарний збіг обставин: IntegerNameвикористовує negativeзамість minusсвого виводу, але жодне слово, яке відображається в назвах будь-якого із дозволених чисел, не знаходиться в алфавітному порядку між цими двома словами, тому заміна не потрібна!

(Наконечник капелюха до ngenisis, щоб нагадати мені Sortby.)


Кудо! Я підійшов дуже близько до прийняття цього рішення, але цей тире доставляв мені головний біль!
ngenisis

Чи справді у вашій відповіді використовується правильний дефіс? Якщо я скопіюю те, що ви маєте тут, у Mathematica, це не замінить дефіси з IntegerName. Документація Wolfram говорить, що це символ Unicode 2010 року .
ngenisis

Мабуть, ні, тоді - я намагався отримати правильну дефіс у цій відповіді, але схоже, що мені це не вдалося.
Грег Мартін

Я розрізав вашу відповідь навпіл;)
Дж. Антоніо Перес

А потім деякі ... ви вносите непотрібні зміни в рядок.
Дж. Антоніо Перес

4

Утиліти Bash + GNU + bsdgames, 52

  • 4 байти збережено завдяки @izabera.
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

Введення / виведення - це лінії з обмеженою лінією.

  • Перший вираз sed замінює кожне числове число командою оболонки, яка виводить слово форму числа (як задано bsdgamesnumber утилітою ), а :потім числовою формою числа.
  • Це тоді sort редакція.
  • Потім друга sedсмужка провідних символів до і включаючи :, залишаючи числову форму відсортованою, як потрібно.

number правильно обробляє "мінус", і його вихід досить близький до визначеного формату, що sort працює як потрібно. Він виводить "чотиридцять чотири" замість "чотиридесят чотири", але це не має значення з точки зору сортування.

У пакеті bsdgames може знадобитися установка:

sudo apt-get install bsdgames

sedІ sortутиліти майже напевно вже в вашому дистрибутиві.


-t:марно, і ви можете використовуватиnumber<<<&
izabera

@izabera Так - спасибі - я видалив -t:. Однак eфункція val val запускає команди з використанням sh, тому функції bash, як-от <<<не працюватимуть.
Цифрова травма

це добре працює, поки твій
штурхне

@izabera Nope - якщо bash як розпочатий, shвін намагається максимально імітувати Posix sh, це означає, що башизми, такі як <<<вимкнено. GNU sed«s eВел функція запускає команди з /bin/sh -c ...і /bin/bash -c .... Ви пробували це?
Цифрова травма

bash ніколи не вимикається <<<, навіть не в режимі
posix

1

Python + inflect, 97 91 89 байт

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

Використовується inflectбібліотека для перетворення wordsмасиву цілих чисел у їх фонетичне / рядкове подання. Зберігається у словнику пар k / v, де ключі були числовим представленням, а значеннями були рядкове подання. Повертає список клавіш, відсортованих за значеннями.

EDIT: Збережено 5 та 3 байти, завдяки ETHproductions та Alex.S!


Ласкаво просимо до PPCG! Ви можете грати в гольф, видаляючи місця ; наприклад, другий рядок може бути a={x:inflect.engine().number_to_words(x)for x in words}.
ETHproductions

Ви можете зберегти два байти за допомогою from inflect import*та викидання inflect.у другому рядку.
Alex.S

На жаль, схоже, що це також не вдається правильно сортувати список 40, 44, 40000, 40804, 40004, 40204 (який повинен залишатися в такому порядку).
Ільмарі Каронен

0

Математика, 30 байт

Відповідь нижче видає чисту функцію, яка візьме список цілих чисел як вхідний і сортує їх за алфавітним іменем. Якраз те, що призначив лікар;)

SortBy[#~IntegerName~"Words"&]

Ось незворушена версія:

SortBy[IntegerName[#, "Words"]&]

Ось приклад використання:

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

Що також можна записати як

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

Вони дають однакові результати - в математиці f[x]це рівнозначно f@x.

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

Є набагато довша відповідь, що інший користувач розмістив у Mathematica. Ця відповідь намагається виправити деякі невеликі відмінності між тим, як математика переносить числа, щоб вони краще відповідали тому, як заявлені в ОП числа повинні бути альфабізовані, однак те, для чого вони виправлені, не впливає на порядок сортування, і моя відповідь виводиться однаково їх.

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

Чудове розслідування! - на жаль, вони насправді не дають однакового наказу. TheirFправильно сортує 888 до 880 000, тоді як MyFні. Можливо, проблема полягає в скопіюванні дивного дефісу: ваша версія TheirF, можливо, замінює звичайні дефіси (яких немає), а фактична версія замінює дивний 3-байтовий дефіс Unicode. (Ще цікаво було б побачити, чи потрібно видаляти коми.)
Грег Мартін

Я тестував його на Range [999999]. Схоже, усунення коми не є зайвим, але замінити "[Дефіс]" на "", безумовно, потрібно.
ngenisis

0

Лист звичайний, 113 байт

Не потрібні зовнішні бібліотеки.

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

Вихід, якщо xє '(1 2 3 4 5):

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