Я хотел бы сгенерировать (как возвращаемый результат функции или просто как вывод программы) порядковый суффикс положительного целого числа, соединенного с числом.
Образцы:
1st
2nd
3rd
4th
...
11th
12th
13th
...
20th
21st
22nd
23rd
24th
И так далее, с суффиксом, повторяющим исходный 1–10 подшаблон каждые 10–100, где шаблон в конечном итоге начинается заново.
На входе будет номер, а на выходе - порядковая строка, как показано выше.
Какой самый маленький алгоритм для этого?
11
качестве ввода и вывода, например11th
? Находится ли каждое число на входе в отдельной строке, и должны ли выходные числа быть на отдельных строках? И нужно ли обрабатывать более одной строки ввода?11
качестве ввода и11th
вывода. Я не против, если он обрабатывает несколько строк, но я имел в виду только одно число.Ответы:
Perl, 37 + 1 символов
Это подстановка регулярного выражения, которая добавляет соответствующий порядковый суффикс к любым числам, за
$_
которыми не следует буква. Чтобы применить его к вводу файла, используйтеp
переключатель командной строки, например:Это полная Perl-программа, которая читает входные данные из стандартного ввода и записывает обработанные выходные данные в стандартный вывод. Фактический код длиной 37 символов, но
p
переключатель считается одним дополнительным символом .Пример ввода:
Выход:
Числа, за которыми следуют буквы, будут игнорироваться, поэтому повторная подача вывода через фильтр не изменит его. Пробелы, запятые и точки между числами не обрабатываются специально, поэтому предполагается, что они разделяют числа, как и любые другие знаки препинания. Таким образом, например
3.14159
становится3rd.14159th
.Как это работает?
Во-первых, это глобальная замена регулярного выражения (
s///g
). Соответствующее регулярное выражение:1?\d\b
где\d
совпадает с любой цифрой и\b
является утверждением нулевой ширины, совпадающим с границей между буквенно-цифровым и не алфавитно-цифровым символом. Таким образом,1?\d\b
совпадает с последней цифрой любого числа плюс предыдущая цифра, если таковая есть1
.В подстановке, которая оценивается как код Perl из-за
/e
переключения, мы берем совпавшую строковый сегмент ($&
) и добавляем.
к нему суффикс, полученный, используя$&
себя в качестве целочисленного индекса для списка(0,st,nd,rd)
; если этот суффикс равен нулю или не определен (т. е. когда он$&
равен нулю или больше трех),||
оператор заменяет его наth
.Редактировать: если ввод ограничен одним целым числом, то этого 35-символьного решения будет достаточно:
источник
g
подстановку, если вы укажете, что каждое число должно быть в отдельной строке. Кроме того, это позволит вам изменить границу слова, чтобы быть$
. Но в целом +1 чертовски умное решение.Python 2, 49 байт
Анонимная функция. Полная программа будет учитываться в 55 байт.
'tsnrhtdd'[i::4]
кодирует суффиксыth st nd rd
для значенийi
от 0 до 3. Исходя из этого, все , что нам нужно , это способ отображения значенийn
индекса соответствующего суффиксаi
. Прямое выражение, которое работает(n%10)*(n%10<4 and 10<n%100<14)
. Мы можем легко сократить это, отбросив первый набор скобок и наблюдая, чтоn%5
дает те же результаты, что иn%10
для значенийn
со специальными суффиксами. Немного проб и ошибок можно сократить10<n%100<14
до одногоn%100^15>4
, который может быть связан с другим условием для сохранения еще большего количества байтов.источник
Python, 68 символов
источник
`i`+"tsnrhtdd"
. В противном случае, это точное решение, которое я только что получил.Mathematica
3945 байтПримечание. В последних версиях Mathematica запрос
nth
частиp
, гдеp
не определено, генерирует сообщение об ошибке, но в любом случае возвращает правильный ответ. Я добавил,Quiet
чтобы предотвратить печать сообщения об ошибке.использование
Как это работает
SpokenString
записывает любое допустимое выражение Mathematica, как оно может быть произнесено. Ниже приведены два примера из документации для SpokenString ,Теперь, для примера,
Давайте представим вышеупомянутую строку как список слов:
и взять второй элемент ...
источник
p
определяется? РЕДАКТИРОВАТЬ: неважно, я вижу, как вы используете это; к сожалению, это не работает в моей системе. : - /SpokenString @ p[[117]]
выхода" part 117 of p"
.SpokenString
пересматривается время от времени. Я не удивлюсь, если этот код ( codegolf.stackexchange.com/questions/8859/… ) также не работает с версией 7. Кстати, он не должен был быть устойчивым решением.Руби, 60
Это не так хорошо, как в Perl, но я решил, что буду работать над своими навыками Ruby.
Функция принимает один целочисленный аргумент
n
и возвращает строку в виде порядковой формы.Работает в соответствии со следующей логикой:
если цифра десятков равна 1 или цифра единиц больше 3, используйте суффикс «th»; в противном случае найдите суффикс из массива ['th', 'st', 'nd', 'rd'], используя последнюю цифру в качестве индекса.
источник
o(113)
есть"113rd"
, должно быть"113th"
. Проверка десятков не учитывает числа с более чем двумя цифрами.%10
чтобы компенсировать. Добавлено 3 персонажа. (Я чувствую, что%10
кажется достаточно, где это должно быть как-то сокращено, но я не могу придумать решение)10
?n%10
лучше.Javascript (ES6)
5044 байт (не конкурирует)Заметки
источник
a+
->a+=
, удалите скобки,\d
->.
, удалите[0]
, и если вы берете число в виде строки:a.match`1?.$`
вместо/1?.$/.exec(a)
.Javascript,
6871Совместные усилия с ItsCosmo.
РЕДАКТИРОВАТЬ: не работает должным образом с номерами> 100
источник
function o(n)n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
и вы можете понизить его до 54, если вы счастливы использовать жирную стрелку:o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
Golfscript, 34 символа
источник
Haskell, 95 символов
Тестирование:
Должен быть загружен с -XNoMonomorphismRestriction.
источник
JavaScript, 64 символа (ES3) или 47 символов (ES6)
ES3 (64 символа):
function(n){return n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'}
ES6 (47 символов):
n=>n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
объяснение
Выражение
n % 100 >> 3 ^ 1
оценивается в 0 для любого положительногоn
конца цифрами08
-15
. Таким образом, для любого ,n mod 100
оканчивающихся на11
,12
или13
, массив Lookup возвращаетundefined
, что приводит к суффиксуth
.Для любого положительного
n
окончания в других цифрах , чем08
-15
, то выражениеn % 100 >> 3 ^ 1
принимает значение положительного целого числа, ссылаясь на выражениеn % 10
для поиска массива, возвращаяst
,nd
илиrd
дляn
которого заканчивается1
,2
или3
. В противном случаеth
.источник
n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
.n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th"
, адаптированный из этого поста .APL (Dyalog Unicode) ,
3836 байтСпасибо ngn за исправление ошибки при сохранении количества байтов.
Функция анонимного молчаливого префикса. Требуется
⎕IO
( I ndex O rigin) значение, установленное по0
умолчанию во многих системах. Даже работает на 0!Попробуйте онлайн!
{
...}
анонимная лямбда;⍵
это аргумент:⍳4
Первые четыре ɩ ndices;[0,1,2,3]
10↑
возьмите первые десять элементов, заполнив их нулями:[0,1,2,3,0,0,0,0,0,0]
⊂
заключить, чтобы рассматривать как единый элемент;[[0,1,2,3,0,0,0,0,0,0]]
1 0 8\
развернуть до одной копии, прототипной копии (все ноль), восемь копий;[[0,1,2,3,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,1,2,3,0,0,0,0,0,0],
[0,1,2,3,0,0,0,0,0,0],
⋮ (еще 5)
[0,1,2,3,0,0,0,0,0,0]]
∊
ε NLIST (Flatten);[0,1,2,3,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,1,2,3,0,0,0,0,0,0,
0,1,2,3,0,0,0,0,0,0,
⋮ (еще 50)
0,1,2,3,0,0,0,0,0,0]
⍵⌽
циклически вращайте влево столько шагов, сколько указано аргументом⊃
выбрать первое число (то есть аргумент-мод-100-й номер)2×
умножить два на что (дает0
,2
,4
, или6
)'thstndrd'↓⍨
отбросьте столько символов из этой строки2↑
возьмите первые два из оставшихся персонажей⍕,
объединить строковый аргумент с этимисточник
⍕,{2↑'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}
⎕io←0
. Я вижу, вы догадались, но есть несколько 1,2,3,4,0,0 ... которые должны быть 0,1,2,3,0,0 ...PowerShell, 92
Работает с одним номером на строку ввода. Ввод осуществляется через конвейер. Заставить его работать только для одного числа не уменьшает размер.
источник
J - 44 символа
Ничего в J? Это безобразие!
Объяснено (обратите внимание, что
1
в J логическое значение true, а0
в false):10 10(...)/@#:]
- Сначала мы берем аргумент (]
) и находим цифру десятков и единиц (10 10 #:
). Затем мы вставим(...)
между ними.(]*[(~:*])4>])
- В этом подвыражении, но не в самом внутреннем,]
будут указаны цифры и[
цифры десятков.[(~:*])4>]
-~:
это J для "не равно", поэтому он берет результат4>]
(т.е., меньше ли одна цифра меньше 4) и умножает его на результатtens ~: (4>])
. Зачем кому-то это делать? Учтите следующее:tens
есть1
(мы в подростковом возрасте) иones
меньше 4, поэтомуtens ~: (4>])
ложно, и результат0*1
=0
.tens ~: (4>])
что верно, и мы выберем1*1
=1
.ones
больше четырех, то4>]
было0
и не имеет значения, что будет с тестом, мы все равно0
выберемся.[(~:*])4>]
является1
ли мы в {X0, X1, X2, X3} , но не в подростковом возрасте, и в0
противном случае.]*
- Наконец, мы умножаем этот результат на одну цифру. Так что этот продукт будет,0
если число заслуживает'th'
суффикса, иначе его значение.th`st`nd`rd{::~
- Мы используем модифицированные однозначные числа сверху, чтобы индексировать список суффиксов.0
получает'th'
,1
получает'st'
и так далее.":,
- Наконец, возьмите исходное число, преобразуйте его в строку (":
), а затем добавьте его к суффиксу.Использование очевидно, хотя глагол «как есть» может принимать только один порядковый номер, а не список.
источник
C #, 62 байта
Полная программа и проверка:
источник
||
к|
.Mathematica 29 + 5 = 34 байта
+5 байт, потому что
Speak
функция должна быть вызвана перед использованием этого встроенного.использование
источник
PHP, 151
Я знаю, что эта программа не сравнима с другими. Просто хотелось дать решение.
источник
foreach($s as $n){echo$n;
Скала 86
Scala 102:
102 также:
ungolfed:
источник
OCaml
Я довольно новичок в OCaml, но это самое короткое, что я мог получить.
Я создал функцию n, которая принимает число в качестве параметра и выполняет всю работу. Это долго, но я подумал, что было бы здорово иметь функциональный пример.
источник
if v>10 && v<14
? Я не знаком с ocaml, но нужно ли, чтобыstring_v
переменная была такой длинной?К - 44 символа
Так получилось, что это ровно столько же, сколько у J, и работает почти так же.
Разъяснение:
x$:
- Сначала мы конвертируем операндx
в строку, а затем присваиваем его обратноx
. Нам понадобится его строковое повторение позже, поэтому теперь это сохраняет символы..:'
- Преобразуйте (.:
) каждую ('
) цифру обратно в число.-2#0,
- Добавить 0 в начале списка цифр (в случае однозначных чисел), а затем взять последние две.{y*(y<4)*~1=x}.
- Используйте две цифры в качестве аргументовx
иy
для этой внутренней функции, которая возвращает,y
еслиy
меньше 4 иx
не равно 1, иначе 0.`th`st`nd`rd@
- Индексировать список суффиксов по этому результату.x,$
- Преобразуйте суффикс из символа в строку и добавьте его к исходному номеру.Использование:
источник
C -
9583 знакаDegolfed:
Мы могли бы сделать
k=(n-1)%10
вместо добавления 9, но для n = 0 мы получили бы неправильное поведение, потому что в C(-1)%10
оценивается -1, а не 9.источник
Javascript, 75
источник
PHP, 98 байт
11-13 бит убивает меня здесь. Работает на любое целое число
$n >= 0
.Для любого целого числа
$n
:PHP, 103 байта
источник
Python,
8884 байтаUngolfed:
lambda x
определяет анонимную функцию с параметромx
.((('th','st','nd','rd')+('th',)*6)[int(x[-1])]
определяет кортеж окончаний для чисел меньше 10,0-th
элемент для0
и так далее. тоif ('0'+x)[-2] != '1'
проверяет, есть ли11
,12
или13
для исправления, и добавляет затемelse 'th'
добавляетth
вместоst
,rd
илиnd
.источник
JavaScript (Node.js) , 51 байт
кредит @KevinCruijssen за улучшение ответа
Попробуйте онлайн!
Пояснение:
источник
R ,
7976 байтТак как пока нет решения R ... здесь нет хитростей, базовая векторная индексация, игра в гольф на 3 знака благодаря Джузеппе. Ранее опробованный индекс:
[1+(x%%10)-(x%%100==11)]
а[1+(x%%10)*(x%%100!=11)]
.Попробуйте онлайн!
С
substr
, 79 байтов:Попробуйте онлайн!
источник
1+x%%10*!x%%100==11
для индекса?!
перед выражением вместо!=
.^
очень высока, то%%
-типа операторы, то*/
и+-
я думаю , что==
и&|
будет дальше.!
имеет довольно низкий приоритет, поэтому вы можете использовать его как разделитель между операциями.Python 2,7, 137 символов
n
должна быть строкаЯ знаю, что я уже побежден конкурентами, но я все равно решил представить свою идею
это просто в основном генерирует список ключей, пар значений с числом (в виде строки), заканчивающимся
e
и порядковым номеромo
. Сначала он пытается найти «th» (следовательно, я не использовал словарь), чтобы он случайно не возвратил «st», например, когда он должен быть «th». Это будет работать для любого натурального числаисточник
n[-1]==e
на 5 символов корочеn.endswith(e)
C: 95 символов
Смешное долгое решение:
Это нужно изуродовать больше.
источник
Javascript, 75
источник
Oracle SQL 11.2, 101 байт
источник
Javascript ES6, 52 символа
источник