서수 출력 (1, 2, 3)


43

숫자에 연결된 양의 정수 의 서수 접미사 ( 함수의 반환 결과 또는 단순히 프로그램 출력)를 생성하고 싶습니다 .

시료:

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

그리고 접미사가 10에서 100까지 초기 1-10 개의 서브 패턴을 반복 할 때마다 패턴이 다시 시작됩니다.

입력은 숫자이고 출력은 위에 표시된 서수 문자열입니다.

가장 작은 알고리즘은 무엇입니까?


안녕하십니까, codegolf.SE에 오신 것을 환영합니다! 명확히하기 위해 11입력 과 같은 숫자를 읽고 출력 해야한다는 것을 의미 11th합니까? 입력의 각 숫자가 별도의 행에 있고 출력 번호도 별도의 행에 있어야합니까? 그리고 둘 이상의 입력 라인을 처리해야합니까?
Ilmari Karonen

1
가장 작은 알고리즘이나 가장 작은 코드를 찾고 있습니까?
토토

@Ilmari 나는 11입력과 11th출력을 찾고 있습니다. 여러 줄을 처리하더라도 신경 쓰지 않지만 생각했던 것은 하나의 숫자 만 처리하는 것입니다.
Nicole

@ M42 알다시피, 확실하지 않습니다. 나는 엄격한 요구 사항이 없지만 아마도 가장 작은 알고리즘을 생각하고 있었을 것입니다.
Nicole

답변:


30

펄, 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'

이것은 stdin에서 입력을 읽고 처리 된 출력을 stdout에 기록하는 완전한 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일치하며 영숫자와 영숫자가 아닌 문자의 경계와 일치하는 너비가 0 인 어설 션입니다. 따라서 1?\d\b모든 숫자의 마지막 숫자와 이전 숫자가 일치하는 경우 일치합니다 1.

  • /e스위치 로 인해 Perl 코드로 평가되는 대체에서는 일치하는 문자열 세그먼트 ( $&)를 가져와 목록에 정수 인덱스로 .사용하여 얻은 접미사를 추가합니다 ( ) . 이 접미사가 0이거나 정의되지 않은 경우 (예 : 0이거나 3보다 큰 경우) 연산자는 이를 접미어로 바꿉니다 .$&(0,st,nd,rd)$&||th


편집 : 입력이 단일 정수로 제한되면이 35 자 솔루션으로 충분합니다.

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

1
g각 숫자가 고유 한 줄에 있어야한다고 지정하면 대체 를 제거 할 수 있어야합니다. 또한 단어 경계를로 변경할 수 있습니다 $. 그러나 전반적으로 +1, 영리한 솔루션.
Mr. Llama

@ GigaWatt : 실제로 NickC가 입력 형식에 대한 질문에 대답하기 전에 코드를 작성 했으므로 가능한 한 일반적인 형식으로 만들었습니다.
Ilmari Karonen

38

파이썬 2, 49 바이트

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

익명의 기능. 전체 프로그램은 55 바이트로 계산된다.

'tsnrhtdd'[i::4]0부터 3까지의 th st nd rd값에 대한 접미사 를 인코딩합니다. i이를 감안할 때 값을 n해당 접미어의 색인에 매핑하는 방법 만 있으면됩니다 i. 작동하는 간단한 표현은입니다 (n%10)*(n%10<4 and 10<n%100<14). 첫 번째 괄호 세트를 삭제 하고 특수 접미사 값과 n%5동일한 결과 를 제공하는 것을 관찰하면이를 쉽게 줄일 수 있습니다 . 시행 착오의 비트와 함께, 하나는이 단축 될 수 있습니다 에 더 많은 바이트를 저장하기 위해 다른 조건과 체인 될 수있다.n%10n10<n%100<14n%100^15>4


3
이것은 여기에 약간의 검은 마술이다 c :
고양이


나는 그것을 얻지 못한다. 아무도 여기서 무슨 일이 일어나고 있는지 설명 할 수 있습니까?
Pavel

@Pavel 설명을 통해 답변을 업데이트했습니다.
xsot

대박! 화려한 생각 ...
Benison Sam

10

파이썬, 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 바이트

참고 : 요청 티카의 최신 버전에서 nth의 일부 p, p정의되지 않는다, 오류 메시지를 생성하지만, 어쨌든 정답을 반환합니다. Quiet오류 메시지가 인쇄되지 않도록 추가 했습니다.

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

용법

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

31 일

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

{ "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th", " 13 일 ","14 일 ","15 일 ","16 일 ","17 일 ","18 일 ","19 일 ","20 일 ","21 일 "}


작동 원리

SpokenString유효한 Mathematica 표현을 쓸 수 있습니다. 아래의 문서에서 두 가지 예 SpokenString는 ,

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

"수량 y 더하기 z에 대한 수량 x의 제곱근"*)

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

"0, 0, 0 및 1, 1, 1을 중심으로 한 단위 구로 구성된 3 차원 그래픽"


이제, 예를 들어서

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

"p의 31 번째 요소"

위의 문자열을 단어 목록으로 표현해 봅시다 :

StringSplit[%]

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

두 번째 요소는 ...

%[[2]]

31 일


혼란 스러워요. 어디에 p정의되어 있습니까? 편집 : 당신이 이것을 어떻게 사용하는지 보지 마십시오. 불행히도 그것은 내 시스템에서 작동하지 않습니다. :-/
Mr.Wizard

v.9.0.1에서 작동합니다. (7.0을 사용하고 있음을 기억합니다.) 예, p는 정의 할 필요가 없습니다.
DavidC

이해합니다. 그러나 v7 SpokenString @ p[[117]]에서는 출력 에서 얻습니다 " part 117 of p".
Mr.Wizard

따라서 SpokenString때때로 수정됩니다. 이 코드 ( codegolf.stackexchange.com/questions/8859/… )도 v. 7에서 작동하지 않는다는 사실에 놀라지 않을 것입니다. BTW, 그것은 지속적인 해결책이 아니 었습니다.
DavidC

Hah, 나는 그 대답을 전에 보지 못했습니다.
Mr.Wizard

7

루비, 60

펄 항목만큼 좋지는 않지만 루비 기술을 연구 할 것이라고 생각했습니다.

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

함수는 하나의 정수 인수를 취하여 n문자열을 서수 형식으로 반환합니다.

다음 논리에 따라 작동
합니다. 10 자리 숫자가 1이거나 1 자리 숫자가 3보다 큰 경우 접미사 'th'를 사용하십시오. 그렇지 않으면 마지막 숫자를 인덱스로 사용하여 배열 [ 'th', 'st', 'nd', 'rd']에서 접미사를 찾으십시오.


o(113)이다 "113rd"이어야한다 "113th". 10 자리 숫자 확인은 두 자리 이상의 숫자를 설명하지 않습니다.
hammar

좋아, %10보상하기 위해 다른 투구했다 . 3자를 추가했습니다. ( %10어쨌든 짧아 져야 할 정도로 충분 해 보이지만 해결책을 생각할 수는 없습니다)
Llama

당신은 : 가능한 한 짧게 끔찍한 이해할 수없는 코드 그의를 서면으로 펄을 이길 수 없다
jamylak

변수를 10?로 설정하십시오 .
wizzwizz4

변수를 설정하는 n%10것이 좋습니다.
CalculatorFeline

6

자바 스크립트 (ES6) 50 44 바이트 (비경쟁)

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

노트

  • 끈으로 대치하다
  • @ user81655 덕분에 6 바이트가 제거되었습니다.

1
a+-> a+=, 괄호 제거, \d-> ., remove [0]및 숫자를 문자열로 사용하는 경우 : a.match`1?.$`대신 /1?.$/.exec(a).
user81655

챌린지가 게시 될 때 ES6이 존재하지 않았으므로이 답변이 경쟁이 아님을 통지해야합니다.
user2428118

5

자바 스크립트, 68 71

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

ItsCosmo와의 공동 노력.

편집 : 100보다 큰 숫자로 제대로 작동하지 않았습니다.


다음 function o(n)n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')과 함께 62로 줄일 수 있습니다. 지방 화살표 표기법을 사용하는 것이 행복하면 54로 더 줄일 수 있습니다.o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
WallyWest

@WallyWest 어떤 이유로 든 내 솔루션이 최신 브라우저에서 작동하는 것이 정말 좋습니다. 자신의 답변을 자유롭게 게시하십시오. 나는 그것의 충분히 다른 생각합니다.
aebabis

아니, 괜찮아! 몇 가지 대안 만 제공하십시오!
WallyWest


3

하스켈, 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양수로 n끝나면 표현식 은 0으로 평가됩니다 . 따라서, 임의의에 대한 에 종료 , 또는 어레이 룩업 복귀 첨자 선도 .0815n mod 100111213undefinedth

모든 포지티브 n이외의 숫자로 끝나는 08- 15상기 식 n % 100 >> 3 ^ 1표현 호출은 양의 정수로 평가 n % 10어레이 조회를위한 반환 st, nd또는 rdn으로되는 단부 1, 2또는 3. 그렇지 않으면 th.


로 바이트를 저장하십시오 n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'.
얽히고 설킨

@Shaggy, 감사합니다. 제안대로 업데이트되었습니다.
Tomas Langkaas


@ guest271314,이 코드가 사용되는 것을 보는 것이 재미 있습니다. 이 게시물n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th" 에서 수정 된 또 다른 대안은 양수에만 적용됩니다 .
Tomas Langkaas

3

APL (Dyalog Unicode) , 38 36 바이트

바이트 수를 유지하면서 버그를 수정 한 ngn에게 감사합니다.

익명의 암묵적 접두사 기능. 필요 ⎕IO( I ndex O 에 rigin) 세트 0많은 시스템에 기본입니다. 0에도 작동합니다!

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

온라인으로 사용해보십시오!

{} 익명의 람다; 논쟁이다 :

⍳4 처음 네 개의 오지 ( dicy);[0,1,2,3]

10↑ 그중 처음 10 개 요소를 0으로 채우십시오. [0,1,2,3,0,0,0,0,0,0]

 단일 요소로 취급하기 위해 동봉; [[0,1,2,3,0,0,0,0,0,0]]

1 0 8\ 하나의 사본, 프로토 타입 사본 (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 (패턴 화 된);
  [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]

⍵⌽ 인수가 나타내는 수만큼 단계적으로 왼쪽으로 회전

 첫 번째 숫자를 선택하십시오 (즉, 인수-mod-100 번째 숫자)

 그 곱셈하여 두 (범 0, 2, 4, 또는 6)

'thstndrd'↓⍨이 문자열에서 많은 문자를 삭제

2↑ 나머지 캐릭터 중 처음 두 개를 가져옵니다

⍕, 문자열 화 된 인수를


"31 일"?
ngn

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

죄송합니다 ⎕io←0. 언급하는 것을 잊었습니다 . 나는 당신이 추측 한 것을 볼 수 있지만, 1,2,3,4,0,0 ... 0,1,2,3,0,0 ...이 있어야합니다.
ngn

@ngn 수정되었습니다. 그리고 0도 작동합니다!
Adám

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>])/@#:])

설명 ( 1J에서 부울 true 0이고 false입니다.)

  • 10 10(...)/@#:]-먼저 인수 ( ])를 사용하여 십 자리와 한 자리 숫자 ( 10 10 #:)를 찾습니다 . 그런 다음 (...)둘 사이에 삽입 합니다.
  • (]*[(~:*])4>])-이 하위 표현식에서 가장 안쪽이 아닌 ]숫자는 1 자리와 [10 자리를 가리 킵니다 .
  • [(~:*])4>]- ~:는 "같지 않음"에 대해 J이므로, 결과 4>](즉, 한 자릿수가 4보다 작은 지 여부) 의 결과를 가져 와서 결과에 곱합니다 tens ~: (4>]). 왜 이런 짓을했을까요? 다음을 고려하세요:
    • 우리가 10, 11, 12, 13을 확인하면 tensis 1(우리는 십대에 있습니다)이고 ones4보다 작으므로 tens ~: (4>])false 이므로 결과는 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{::~-위의 수정 된 한 자리 숫자를 사용하여 접미사 목록을 색인화합니다. 0gets 'th', 1gets '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));
        }
    }
}

을 변경하여 두 바이트로 당신이 할 수있는 골프를 |||.
Kevin Cruijssen

2

Mathematica 29 + 5 = 34 바이트

SpokenStringDump`SpeakOrdinal

Speak이 내장 기능을 사용하기 전에 함수를 호출해야 하므로 +5 바이트

용법

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))}

스칼라 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"

언 골프 :

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

1

오캄

나는 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 출력을 얻을 것이다 : 11st

그래, 네 말이 맞아. 내가 정정 했어 감사합니다
Joseph Elcid

방금 코드의 서식을 정리했습니다. 코드 블록으로 인식 되려면 각 줄 앞에 4 개의 공백이 있어야합니다.
Gareth

검사가 짧아지면 첫 번째가 if v>10 && v<14아닙니까? 나는 ocaml에 익숙하지 않지만 string_v변수가 너무 길어야합니까?
Gaffi

필요하지 않은 w 또는 x를 선택할 수있었습니다. 의미있는 것을 원했습니다. 그러나 당신이 옳습니다. 코드를 조금 짧게 만들었을 것입니다.
Joseph Elcid

1

K-44 자

이것이 J만큼 정확하고 거의 같은 방식으로 작동합니다.

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

설명 :

  • x$:-먼저 피연산자 x를 문자열로 변환 한 다음 다시 피연산자 를 할당합니다 x. 나중에 문자열 rep가 다시 필요하므로 이제 문자를 저장합니다.
  • .:'- .:'숫자 ( )를 숫자로 다시 변환합니다.
  • -2#0, -숫자 목록 앞에 0을 추가하고 (한 자리 숫자의 경우) 마지막 두 개를 가져옵니다.
  • {y*(y<4)*~1=x}.- 사용 인수로 두 자릿수 xy반품이 내부 기능, y경우 y4 미만이고 x되지 않고, 0, 그렇지 않으면 1과 동일.
  • `th`st`nd`rd@ -이 결과로 접미사 목록을 색인화하십시오.
  • x,$ -접미사를 symbol에서 string으로 변환하여 원래 번호에 추가하십시오.

용법:

  {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");}

디고 프드 :

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)%109를 추가 하는 대신 할 수 있지만 n = 0의 경우 C에서 (-1)%109가 아닌 -1로 평가 되므로 잘못된 동작을 얻습니다 .


1

자바 스크립트, 75

function s(i){return i+'thstndrd'.substr(~~(i/10%10)-1&&i%10<4?i%10*2:0,2)}

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

파이썬, 88 84 바이트

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

언 골프 드 :

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

알았어 골퍼가없는 답변도 추가해야합니까?
NoOneIsHere2

다른 대답이되어서는 안됩니다 ... 당신이 한 일은 훌륭하고 잘되었습니다. 더 이상의 도전을 원한다면 몇 가지 권장 사항을 제시 할 수 있습니다.
wizzwizz4

승인. 당신은 시도 할 수 있습니다 ... 의자를 조정 하거나 친구가 어디에 앉아있을 것 입니다. 아니면 The Knight 's Next Tour 같은 내 도전을 시도해 볼 수도 있습니다. 이것들이 당신이 좋아하는 종류의 도전이 아닌 경우, 그냥 말하십시오.
wizzwizz4

1

자바 스크립트 (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 문자로 줄었습니다. 이전에 시도한 index : [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])

온라인으로 사용해보십시오!

substr79 바이트 :

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색인을 위해?
주세페

@ 주세페 나는 괄호를 진정시켜야합니다 :). !대신 표현 앞에서 영리한 사용 !=.
JayCe

1
예, 연산자는 이상한 우선 순위를 가지고 있습니다. ^이다는 정말 높은, 다음 %%타입 운영자는 다음 */+-내가 생각 ==하고 &|다음에 온다. !우선 순위가 매우 낮아서 작업 간 구분 기호로 사용할 수 있습니다.
주세페

0

파이썬 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'를 일치 시키려고 시도하므로 (사전을 사용하지 않은 이유) 예를 들어 'th'여야 할 때 실수로 'st'를 반환하지 않습니다. 이것은 양의 정수에 대해 작동합니다


n[-1]==e5 개 문자 짧은n.endswith(e)
찾았

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");}

더 엉망이되어야합니다.


사용자 가 "정확하지 않습니다 : 루프하지 않습니다. 즉, 아래의 _all_ 숫자가 아닌 주어진 숫자에 대해서만 작동합니다. ideone.com/pO6UwV를 참조하십시오." 그렇기 때문에 중재자가 정확성을 판단하지는 않지만 문제가 될 수 있습니다.
dmckee

질문 작성자의이 의견을 바탕으로 : "@Ilmari 11을 입력으로, 11을 출력으로 찾고 있습니다. 여러 줄을 처리하더라도 마음에 들지 않지만 한 개의 숫자 만 처리하는 것이 마음에 듭니다. – NickC Jan 20 '12 at 21:00 "그것은해야 할 일을하고 있습니다. 즉, 하나의 숫자 만 처리해야합니다.
하기 Fors

그 깃발에 대해 죄송합니다; 요구 사항을 잘못 읽었으며 당시에 담당자가 충분하지 않아 직접 의견을 말할 수 없었습니다. 다시 죄송합니다. :)
Will Ness

0

자바 스크립트, 75

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

0

Oracle SQL 11.2, 101 바이트

SELECT:1||DECODE(ROUND(MOD(:1,100),-1),10,'th',DECODE(MOD(:1,10),1,'st',2,'nd',3,'rd','th'))FROM DUAL

0

자바 스크립트 ES6, 52 자

n=>n+(!/1.$/.test(--n)&&'snr'[n%=10]+'tdd'[n]||'th')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.