Вывод порядковых номеров (1, 2, 3)


43

Я хотел бы сгенерировать (как возвращаемый результат функции или просто как вывод программы) порядковый суффикс положительного целого числа, соединенного с числом.

Образцы:

1st  
2nd  
3rd  
4th  
...  
11th  
12th  
13th  
...  
20th  
21st
22nd
23rd
24th

И так далее, с суффиксом, повторяющим исходный 1–10 подшаблон каждые 10–100, где шаблон в конечном итоге начинается заново.

На входе будет номер, а на выходе - порядковая строка, как показано выше.

Какой самый маленький алгоритм для этого?


Привет, NickC, и добро пожаловать в codegolf.SE! Просто чтобы уточнить, вы имеете в виду, что мы должны читать число, например, в 11качестве ввода и вывода, например 11th? Находится ли каждое число на входе в отдельной строке, и должны ли выходные числа быть на отдельных строках? И нужно ли обрабатывать более одной строки ввода?
Ильмари Каронен

1
Вы ищете наименьший алгоритм или наименьший код?
Toto

@Ilmari Я ищу в 11качестве ввода и 11thвывода. Я не против, если он обрабатывает несколько строк, но я имел в виду только одно число.
Николь

@ M42 Знаешь, я не совсем уверен. У меня нет строгих требований - но я, наверное, думал, что самый маленький алгоритм.
Николь

Ответы:


30

Perl, 37 + 1 символов

s/1?\d\b/$&.((0,st,nd,rd)[$&]||th)/eg

Это подстановка регулярного выражения, которая добавляет соответствующий порядковый суффикс к любым числам, за $_которыми не следует буква. Чтобы применить его к вводу файла, используйте pпереключатель командной строки, например:

perl -pe 's/1?\d\b/$&.((0,st,nd,rd)[$&]||th)/eg'

Это полная Perl-программа, которая читает входные данные из стандартного ввода и записывает обработанные выходные данные в стандартный вывод. Фактический код длиной 37 символов, но pпереключатель считается одним дополнительным символом .

Пример ввода:

This is the 1 line of the sample input...
...and this is the 2.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
101 102 103 104 105 106 107 108 109 110

Выход:

This is the 1st line of the sample input...
...and this is the 2nd.
1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th
11th 12th 13th 14th 15th 16th 17th 18th 19th 20th
21st 22nd 23rd 24th 25th 26th 27th 28th 29th 30th
101st 102nd 103rd 104th 105th 106th 107th 108th 109th 110th

Числа, за которыми следуют буквы, будут игнорироваться, поэтому повторная подача вывода через фильтр не изменит его. Пробелы, запятые и точки между числами не обрабатываются специально, поэтому предполагается, что они разделяют числа, как и любые другие знаки препинания. Таким образом, например 3.14159становится 3rd.14159th.

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

  • Во-первых, это глобальная замена регулярного выражения ( s///g). Соответствующее регулярное выражение: 1?\d\bгде \dсовпадает с любой цифрой и \bявляется утверждением нулевой ширины, совпадающим с границей между буквенно-цифровым и не алфавитно-цифровым символом. Таким образом, 1?\d\bсовпадает с последней цифрой любого числа плюс предыдущая цифра, если таковая есть 1.

  • В подстановке, которая оценивается как код Perl из-за /eпереключения, мы берем совпавшую строковый сегмент ( $&) и добавляем .к нему суффикс, полученный, используя $&себя в качестве целочисленного индекса для списка (0,st,nd,rd); если этот суффикс равен нулю или не определен (т. е. когда он $&равен нулю или больше трех), ||оператор заменяет его на th.


Редактировать: если ввод ограничен одним целым числом, то этого 35-символьного решения будет достаточно:

s/1?\d$/$&.((0,st,nd,rd)[$&]||th)/e

1
Должна быть возможность отбросить gподстановку, если вы укажете, что каждое число должно быть в отдельной строке. Кроме того, это позволит вам изменить границу слова, чтобы быть $. Но в целом +1 чертовски умное решение.
Мистер Лама

@GigaWatt: Действительно, я написал код до того, как NickC ответил на мой вопрос о формате ввода, поэтому я сделал его как можно более универсальным.
Ильмари Каронен

38

Python 2, 49 байт

lambda n:`n`+'tsnrhtdd'[n%5*(n%100^15>4>n%10)::4]

Анонимная функция. Полная программа будет учитываться в 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, который может быть связан с другим условием для сохранения еще большего количества байтов.


3
это какая-то черная магия прямо здесь c:
кошка


Я не понимаю Кто-нибудь может объяснить, что здесь происходит?
Павел

@Pavel Я обновил свой ответ объяснением.
xsot

Потрясающе! Блестящий способ думать ...
Бенисон Сэм

10

Python, 68 символов

i=input()
k=i%10
print"%d%s"%(i,"tsnrhtdd"[(i/10%10!=1)*(k<4)*k::4])

4
Это действительно поздно, но вы можете удалить 7 байт, выполнив `i`+"tsnrhtdd". В противном случае, это точное решение, которое я только что получил.
DLosc

10

Mathematica 39 45 байт

Примечание. В последних версиях Mathematica запрос nthчасти p, где pне определено, генерирует сообщение об ошибке, но в любом случае возвращает правильный ответ. Я добавил, Quietчтобы предотвратить печать сообщения об ошибке.

Quiet@StringSplit[SpokenString[p[[#]]]][[2]]&

использование

Quiet@StringSplit[SpokenString[p[[#]]]][[2]] &[31]

тридцать первый

Quiet@StringSplit[SpokenString[p[[#]]]][[2]] &/@Range[21]

{"1-й", "2-й", "3-й", "4-й", "5-й", "6-й", "7-й", "8-й", "9-й", "10-й", "11-й", "12-й", " 13-й, 14-й, 15-й, 16-й, 17-й, 18-й, 19-й, 20-й, 21-й


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

SpokenStringзаписывает любое допустимое выражение Mathematica, как оно может быть произнесено. Ниже приведены два примера из документации для SpokenString ,

SpokenString[Sqrt[x/(y + z)]]

"квадратный корень из числа x над количеством y плюс z" *)

SpokenString[Graphics3D[Sphere[{{0, 0, 0}, {1, 1, 1}}]], "DetailedGraphics" -> True]

«трехмерная графика, состоящая из единичных сфер с центром в 0, 0, 0 и 1, 1, 1»


Теперь, для примера,

Quiet@SpokenString[p[[#]]] &[31]

«31-й элемент р»

Давайте представим вышеупомянутую строку как список слов:

StringSplit[%]

{"the", "31st", "element", "of", "p"}

и взять второй элемент ...

%[[2]]

тридцать первый


Я запутался; где pопределяется? РЕДАКТИРОВАТЬ: неважно, я вижу, как вы используете это; к сожалению, это не работает в моей системе. : - /
Mr.Wizard

Работает на v.9.0.1. (Кажется, я помню, что вы используете 7.0.) Да, р не нужно определять.
DavidC

Теперь я это понимаю. Однако в v7 я получаю с SpokenString @ p[[117]]выхода " part 117 of p".
Мистер Волшебник,

Так SpokenStringпересматривается время от времени. Я не удивлюсь, если этот код ( codegolf.stackexchange.com/questions/8859/… ) также не работает с версией 7. Кстати, он не должен был быть устойчивым решением.
DavidC

Ха, я не видел этот ответ раньше.
Мистер Волшебник,

7

Руби, 60

Это не так хорошо, как в Perl, но я решил, что буду работать над своими навыками Ruby.

def o(n)n.to_s+%w{th st nd rd}[n/10%10==1||n%10>3?0:n%10]end

Функция принимает один целочисленный аргумент nи возвращает строку в виде порядковой формы.

Работает в соответствии со следующей логикой:
если цифра десятков равна 1 или цифра единиц больше 3, используйте суффикс «th»; в противном случае найдите суффикс из массива ['th', 'st', 'nd', 'rd'], используя последнюю цифру в качестве индекса.


o(113)есть "113rd", должно быть "113th". Проверка десятков не учитывает числа с более чем двумя цифрами.
Хаммар

Хорошо, разбил в другой, %10чтобы компенсировать. Добавлено 3 персонажа. (Я чувствую, что %10кажется достаточно, где это должно быть как-то сокращено, но я не могу придумать решение)
г-н Лама

Вы никогда не сможете победить Perl в написании ужасного непонятного кода, который будет настолько коротким, насколько это возможно :)
jamylak

Установить переменную 10?
wizzwizz4

Я думаю, что установка переменной n%10лучше.
CalculatorFeline

6

Javascript (ES6) 50 44 байт (не конкурирует)

a=>a+=[,"st","nd","rd"][a.match`1?.$`]||"th"

Заметки

  • принимает в качестве строки
  • Удалено 6 байт, спасибо @ user81655

1
a+-> a+=, удалите скобки, \d-> ., удалите [0], и если вы берете число в виде строки: a.match`1?.$`вместо /1?.$/.exec(a).
user81655

Вы, вероятно, должны добавить уведомление, что этот ответ не является конкурирующим, так как ES6 не существовал, когда было опубликовано задание.
user2428118 28.09.16

5

Javascript, 68 71

function o(n){return n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')}

Совместные усилия с ItsCosmo.

РЕДАКТИРОВАТЬ: не работает должным образом с номерами> 100


Вы можете понизить его до 62 с помощью: 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')
WallyWest

@WallyWest Почему-то мне очень нравится, что мое решение работает в современных браузерах. Не стесняйтесь размещать свой собственный ответ; Я думаю, что это достаточно отличается.
aebabis

Нет, все в порядке! Просто предоставив несколько альтернатив!
WallyWest


3

Haskell, 95 символов

h=foldr g"th".show
g '1'"th"="1st"
g '2'"th"="2nd"
g '3'"th"="3rd"
g '1'[x,_,_]='1':x:"th"
g a s=a:s

Тестирование:

*Main> map h [1..40]
["1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th","11th","12th","13t
h","14th","15th","16th","17th","18th","19th","20th","21st","22nd","23rd","24th",
"25th","26th","27th","28th","29th","30th","31st","32nd","33rd","34th","35th","36
th","37th","38th","39th","40th"]

Должен быть загружен с -XNoMonomorphismRestriction.


3

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'.
Лохматый

@ Shaggy, спасибо, обновлено как предложено.
Томас Лангкаас


@ guest271314, интересно видеть, как этот код используется. Обратите внимание, что это работает только для положительных чисел, другой вариант n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th", адаптированный из этого поста .
Томас Лангкаас

3

APL (Dyalog Unicode) , 38 36 байт

Спасибо ngn за исправление ошибки при сохранении количества байтов.

Функция анонимного молчаливого префикса. Требуется ⎕IO( I ndex O rigin) значение, установленное по 0умолчанию во многих системах. Даже работает на 0!

⍕,{2'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}

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

{... } анонимная лямбда; это аргумент:

⍳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-й номер)

 умножить два на что (дает 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 ...
ngn

@ngn Исправлено. И бывает работать на 0 тоже!
Адам

2

PowerShell, 92

process{"$_$(switch -r($_){"(?<!1)1$"{'st'}"(?<!1)2$"{'nd'}"(?<!1)3$"{'rd'}default{'th'}})"}

Работает с одним номером на строку ввода. Ввод осуществляется через конвейер. Заставить его работать только для одного числа не уменьшает размер.


2

J - 44 символа

Ничего в J? Это безобразие!

(":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:])

Объяснено (обратите внимание, что 1в J логическое значение true, а 0в false):

  • 10 10(...)/@#:]- Сначала мы берем аргумент ( ]) и находим цифру десятков и единиц ( 10 10 #:). Затем мы вставим (...)между ними.
  • (]*[(~:*])4>])- В этом подвыражении, но не в самом внутреннем, ]будут указаны цифры и [цифры десятков.
  • [(~:*])4>]- ~:это J для "не равно", поэтому он берет результат 4>](т.е., меньше ли одна цифра меньше 4) и умножает его на результат tens ~: (4>]). Зачем кому-то это делать? Учтите следующее:
    • Если мы проверяем 10, 11, 12, 13, то tensесть 1(мы в подростковом возрасте) и onesменьше 4, поэтому tens ~: (4>])ложно, и результат 0*1= 0.
    • Если мы любой другой из {X0, X1, X2, X3}, то ясно, 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'и так далее.
  • ":,- Наконец, возьмите исходное число, преобразуйте его в строку ( ":), а затем добавьте его к суффиксу.

Использование очевидно, хотя глагол «как есть» может принимать только один порядковый номер, а не список.

   (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:]) 112         NB. single use
112th
   (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:]) 1 2 3 4 5   NB. doing it wrong
|length error
|       (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:])1 2 3 4 5
   NB. i.5 10   makes a 5x10 grid of increasing integers
   NB. &.>      to operate on each integer separately, and box the result after
   (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:])&.> i.5 10   NB. all better
+----+----+----+----+----+----+----+----+----+----+
|0th |1st |2nd |3rd |4th |5th |6th |7th |8th |9th |
+----+----+----+----+----+----+----+----+----+----+
|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|
+----+----+----+----+----+----+----+----+----+----+
|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|
+----+----+----+----+----+----+----+----+----+----+
|30th|31st|32nd|33rd|34th|35th|36th|37th|38th|39th|
+----+----+----+----+----+----+----+----+----+----+
|40th|41st|42nd|43rd|44th|45th|46th|47th|48th|49th|
+----+----+----+----+----+----+----+----+----+----+

2

C #, 62 байта

n=>n+(n/10%10==1||(n%=10)<1||n>3?"th":n<2?"st":n<3?"nd":"rd");

Полная программа и проверка:

using System;

namespace OutputOrdinalNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,string>f= n=>n+(n/10%10==1||(n%=10)<1||n>3?"th":n<2?"st":n<3?"nd":"rd");

            for (int i=1; i<=124; i++)
                Console.WriteLine(f(i));
        }
    }
}

Вы можете играть в гольф это два байта, изменяя ||к |.
Кевин Круйссен

2

Mathematica 29 + 5 = 34 байта

SpokenStringDump`SpeakOrdinal

+5 байт, потому что Speakфункция должна быть вызвана перед использованием этого встроенного.

использование

SpokenStringDump`SpeakOrdinal[1]

"1st "

SpokenStringDump`SpeakOrdinal[4707]

"4,707th "


1

PHP, 151

Я знаю, что эта программа не сравнима с другими. Просто хотелось дать решение.

<?$s=explode(' ',trim(fgets(STDIN)));foreach($s as$n){echo$n;echo(int)(($n%100)/10)==1?'th':($n%10==1?'st':($n%10==2?'nd':($n%10==3?'rd':'th')))."\n";}

Вы можете сохранить несколько символов с помощьюforeach($s as $n){echo$n;
karthik

1

Скала 86

def x(n:Int)=n+{if(n%100/10==1)"th"else(("thstndrd"+"th"*6).sliding(2,2).toSeq(n%10))}

Scala 102:

def x(n:Int)=if((n%100)/10==1)n+"th"else if(n%10<4)n+("thstndrd".take(n+1)%5*2.drop(n%5*2))else n+"th"

102 также:

def x(n:Int)=if((n%100)/10==1)n+"th"else if(n%10<4)n+("thstndrd".sliding(2,2).toSeq(n%10))else n+"th"

ungolfed:

def x (n: Int) =
  n + { if (((n % 100) / 10) == 1) "th" 
        else (("thstndrd"  + ("th"  * 6)).sliding (2, 2).toSeq (n % 10))
      }

1

OCaml

Я довольно новичок в OCaml, но это самое короткое, что я мог получить.

let n x =
   let v = x mod 100 and string_v = string_of_int x in
   let z = v mod 10 in
   if v=11 || v=12 || v=13 then string_v^"th" 
   else if v = 1 || z = 1 then string_v^"st" else if v = 2 || z = 2 then string_v^"nd" else if v = 3 || z = 3 then string_v^"rd" else string_v^"th";;

Я создал функцию n, которая принимает число в качестве параметра и выполняет всю работу. Это долго, но я подумал, что было бы здорово иметь функциональный пример.


вход: 11 даст выход: 11-й

да, вы правы .. я сделал исправление. Спасибо
Джозеф Элсид

Я только что исправил форматирование в вашем коде. Каждой строке должны предшествовать четыре пробела, чтобы их можно было распознать как кодовый блок.
Гарет

Не будет ли ваш первый, если проверка будет короче, как if v>10 && v<14? Я не знаком с ocaml, но нужно ли, чтобы string_vпеременная была такой длинной?
Гаффи

Нет, это не обязательно, я мог бы выбрать ш или х. Просто хотел что-то значимое. Но вы правы, это сделало бы код немного короче.
Джозеф Элсид

1

К - 44 символа

Так получилось, что это ровно столько же, сколько у J, и работает почти так же.

{x,$`th`st`nd`rd@{y*(y<4)*~1=x}.-2#0,.:'x$:}

Разъяснение:

  • x$:- Сначала мы конвертируем операнд xв строку, а затем присваиваем его обратно x. Нам понадобится его строковое повторение позже, поэтому теперь это сохраняет символы.
  • .:'- Преобразуйте ( .:) каждую ( ') цифру обратно в число.
  • -2#0, - Добавить 0 в начале списка цифр (в случае однозначных чисел), а затем взять последние две.
  • {y*(y<4)*~1=x}.- Используйте две цифры в качестве аргументов xи yдля этой внутренней функции, которая возвращает, yесли yменьше 4 и xне равно 1, иначе 0.
  • `th`st`nd`rd@ - Индексировать список суффиксов по этому результату.
  • x,$ - Преобразуйте суффикс из символа в строку и добавьте его к исходному номеру.

Использование:

  {x,$`th`st`nd`rd@{y*(y<4)*~1=x}.-2#0,.:'x$:} 3021
"3021st"
  {x,$`th`st`nd`rd@{y*(y<4)*~1=x}.-2#0,.:'x$:}' 1 2 3 4 11 12 13 14  /for each in list
("1st"
 "2nd"
 "3rd"
 "4th"
 "11th"
 "12th"
 "13th"
 "14th")

1

C - 95 83 знака

main(n,k){scanf("%d",&n);k=(n+9)%10;printf("%d%s\n",n,k<3?"st\0nd\0rd"+3*k:"th");}

Degolfed:

main(n,k)
{
    scanf("%d",&n);
    k=(n+9)%10; // xx1->0, xx2->1, xx3->2
    printf("%d%s\n",n,k<3?"st\0nd\0rd"+3*k:"th");
}

Мы могли бы сделать k=(n-1)%10вместо добавления 9, но для n = 0 мы получили бы неправильное поведение, потому что в C (-1)%10оценивается -1, а не 9.



1

PHP, 98 байт

function c($n){$c=$n%100;$s=['','st','nd','rd'];echo$c>9&&$c<14||!$s[$c%10]?$n.'th':$n.$s[$c%10];}

11-13 бит убивает меня здесь. Работает на любое целое число $n >= 0.

Для любого целого числа $n:

PHP, 103 байта

function c($n){$c=abs($n%100);$s=['','st','nd','rd'];echo$c>9&&$c<14||!$s[$c%10]?$n.'th':$n.$s[$c%10];}

1

Python, 88 84 байта

lambda x:x+((('th','st','nd','rd')+('th',)*6)[int(x[-1])]if('0'+x)[-2]!='1'else'th')

Ungolfed:

def y(x):
    return x + (('th', 'st', 'nd', 'rd') + ('th', ) * 6)[int(x[-1])] if ('0' + x)[-2] != '1' else 'th')

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.


Это отличный ответ, но мне потребовалось некоторое время, чтобы пройти и понять его. Если бы вы могли добавить объяснение и разбивку кода ниже гольфовой версии вашего кода, это помогло бы людям извлечь уроки из вашего кода и улучшить качество вашего ответа.
wizzwizz4

Хорошо, я буду. Должен ли я также добавить ответ без гольфа?
NoOneIsHere

Это не должен быть другой ответ ... То, что вы сделали, хорошо, хорошо сделано. Если вы хотите еще какие-то проблемы, я мог бы дать некоторые рекомендации.
wizzwizz4

Хорошо. Вы могли бы попробовать ... Приспособьте свой стул , или Где будут сидеть ваши приятели . Или вы можете попробовать некоторые из моих испытаний , например , следующий тур The Knight . Если это не те проблемы, которые вам нравятся, просто скажите.
wizzwizz4

1

JavaScript (Node.js) , 51 байт

кредит @KevinCruijssen за улучшение ответа

n=>n+=[,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th'

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


Пояснение:

n =>                      // input
    n+=[,'st','nd','rd']     // the array of suffices add everything to n
        [~~(n/10%10)-1?n%10:0] // the full magic 
    || 'th'               // works for everything except 1 , 2 , 3 just like what you want


1

R , 79 76 байт

Так как пока нет решения R ... здесь нет хитростей, базовая векторная индексация, игра в гольф на 3 знака благодаря Джузеппе. Ранее опробованный индекс: [1+(x%%10)-(x%%100==11)]а [1+(x%%10)*(x%%100!=11)].

function(x)paste0(x,c("th","st","nd","rd",rep("th",6))[1+x%%10*!x%%100==11])

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

С substr, 79 байтов:

function(x,y=1+2*min(x%%10-(x%%100==11),4))paste0(x,substr("thstndrdth",y,y+1))

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


1
1+x%%10*!x%%100==11для индекса?
Джузеппе

@ Giuseppe Мне нужно успокоиться в скобках :). Умное использование !перед выражением вместо !=.
JayCe

1
Да, операторы имеют странный приоритет; ^очень высока, то %%-типа операторы, то */и +-я думаю , что ==и &|будет дальше. !имеет довольно низкий приоритет, поэтому вы можете использовать его как разделитель между операциями.
Джузеппе

0

Python 2,7, 137 символов

def b(n):
 for e,o in[[i,'th']for i in['11','12','13']+list('4567890')]+[['2','nd'],['1','st'],['3','rd']]:
  if n.endswith(e):return n+o

n должна быть строка

Я знаю, что я уже побежден конкурентами, но я все равно решил представить свою идею

это просто в основном генерирует список ключей, пар значений с числом (в виде строки), заканчивающимся eи порядковым номером o. Сначала он пытается найти «th» (следовательно, я не использовал словарь), чтобы он случайно не возвратил «st», например, когда он должен быть «th». Это будет работать для любого натурального числа


n[-1]==eна 5 символов корочеn.endswith(e)
'11

0

C: 95 символов

Смешное долгое решение:

n;main(){scanf("%d",&n);printf("%d%s",n,n/10%10-1&&(n=n%10)<4&&n?n>2?"rd":n<2?"st":"nd":"th");}

Это нужно изуродовать больше.


Пользователь отметил это высказывание «неверно: вообще не выполняет цикл, то есть он работает только для заданного числа, а не для _все_ чисел под ним. См. Ideone.com/pO6UwV». Это не повод для пометки, поскольку модераторы не оценивают правильность, но это может быть проблемой.
dmckee

Исходя из этого комментария от создателя вопроса: «@Ilmari Я ищу 11 в качестве входных данных и 11-й в качестве выходных данных. Я не против, если он обрабатывает несколько строк, но то, что я имел в виду, обрабатывал только одно число. - NickC Jan 20 '12 в 21:00 "он делает то, что должен. Т.е. он должен обрабатывать только одно число.
Форс

извините за этот флаг; Я неправильно прочитал требование, и у меня не было достаточно представителей, чтобы прокомментировать напрямую. Прости еще раз. :)
Уилл Несс

0

Javascript, 75

function o(s){return s+((0|s/10%10)==1?"th":[,"st","nd","rd"][s%10]||"th")}


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.