정수 목록 순위


21

빈 정수가 아닌 양의 정수 목록이 제공됩니다. 예 :

[6 2 9 7 2 6 5 3 3 4]

이 숫자의 값을 기준으로 순위를 정해야하지만 순위표에서 평소와 같이 순위가있는 경우 묶인 숫자는 모두 같은 순위를 가지며 적절한 수의 순위를 건너 뜁니다. 따라서 위 목록에 대한 예상 출력은 다음과 같습니다.

[3 9 1 2 9 3 5 7 7 6]

예를 들어 입력에서 가장 높은 값은 9이므로 1(1 위)가됩니다. 세 번째로 높은 값은 6이므로 두 값이 모두 6되고 3순위 4는 완전히 건너 뜁니다.

규칙

편리하고 명확한 플랫리스트 형식을 입력 및 출력에 사용할 수 있습니다. 출력에서 첫 번째 / 최소 순위는 항상 1 이어야합니다 .

당신은 쓸 수 있습니다 프로그램이나 기능을 하고, 우리의 사용 표준 방법 입력을 수신하고 출력을 제공합니다.

모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

테스트 사례

[8] -> [1]
[1 15] -> [2 1]
[18 14 11] -> [1 2 3]
[11 16 14 8] -> [3 1 2 4]
[15 15 15 15 15] -> [1 1 1 1 1]
[10 2 5 4 15 5] -> [2 6 3 5 1 3]
[5 5 10 10 5 11 18] -> [5 5 3 3 5 2 1]
[2 4 9 4 17 9 17 16] -> [8 6 4 6 1 4 1 3]
[11 17 19 17 10 10 15 3 18] -> [6 3 1 3 7 7 5 9 2]
[2 11 4 8 3 3 12 20 4 18] -> [10 4 6 5 8 8 3 1 6 2]
[12 6 10 2 19 19 6 19 8 6 18] -> [5 8 6 11 1 1 8 1 7 8 4]
[5 6 14 19 13 5 19 9 19 9 9 19] -> [11 10 5 1 6 11 1 7 1 7 7 1]
[9 2 12 3 7 11 15 11 6 8 11 17 11] -> [8 13 3 12 10 4 2 4 11 9 4 1 4]
[3 5 15 7 18 5 3 9 11 2 18 1 10 19] -> [11 9 4 8 2 9 11 7 5 13 2 14 6 1]
[6 11 4 19 14 7 13 16 10 12 7 9 7 10 10] -> [14 6 15 1 3 11 4 2 7 5 11 10 11 7 7]
[11 20 11 1 20 16 11 11 4 8 9 7 11 14 10 14] -> [6 1 6 16 1 3 6 6 15 13 12 14 6 4 11 4]
[4 7 15 2 3 2 3 1 14 2 10 4 7 6 11 2 18] -> [9 6 2 13 11 13 11 17 3 13 5 9 6 8 4 13 1]
[5 1 17 7 1 9 3 6 9 7 6 3 2 18 14 4 18 16] -> [12 17 3 8 17 6 14 10 6 8 10 14 16 1 5 13 1 4]
[5 6 8 10 18 13 20 10 7 1 8 19 20 10 10 18 7 2 1] -> [16 15 11 7 4 6 1 7 13 18 11 3 1 7 7 4 13 17 18]
[12 17 8 2 9 7 15 6 19 5 13 16 14 20 10 11 18 4 3 1] -> [9 4 13 19 12 14 6 15 2 16 8 5 7 1 11 10 3 17 18 20]

1
밀접하게 관련. 차이점은 도전은 입력이 정렬되도록 보장한다는 것입니다. 이는 대부분의 답변이 indexOf함수 형식에 의존한다는 것을 의미 합니다. 나는 분류되지 않은 입력을 위해 많은 언어에서 더 짧은 대안이 있다고 생각합니다.
— Martin Ender


미안하지만 나는 이것이 Lynn의 링크와 너무 가깝다고 생각합니다. 차이점은 최소화됩니다. 값이 잘리고 이미 정렬 된 입력을 가정 할 수 없으며 출력의 절반이 순서가 바뀐 것으로 가정 할 수 없습니다. 연결된 질문에 대한 대답은 거의 효과가 있습니다. 최소한의 노력으로 누군가가 일할 수 있습니다. 따라서 나는 이것이 복제 된 것입니다.
— Ismael Miguel

동의하지 않습니다. 이것은 분명히 복제본이 아닙니다.
— Timtech

팀 테크에 동의합니다.이 과제는 더 간단하지만 중복은 아닙니다.
— tuskiomi

답변:


13

코드 골프 스택 교환에서 마우스 입력에 관한 바보 같은 규칙에 대한 Excel의 해결 방법 : (WESRRMICGSE) 28 바이트

rank(RC[1],r1c1:r1024:c1024)

10,23,34,2,소스를 입력 한 후 목록을 csv ( )로 컴파일러에 입력하십시오. 따옴표, 괄호, 쉼표가 없습니다.

WESRRMICGSE는 바이트를 저장하기 위해 초기 '='부호를 생략 할 수 있다는 점을 제외하고는 Excel에서 프로그래밍하는 것과 정확히 같습니다. 기능상의 차이점은 WESRRMICGSE가 공식을 아래로 끌어서 코드를 자동으로 복사하고 단일 정수 입력으로 제공된 다른 출력을 제공한다는 사실에서 비롯됩니다. 목록을 입력으로 제공 한 경우 해당 목록은 B 열 (입력 열)로 이동하고 입력 수에 맞게 수식이 자동으로 줄어 듭니다. (예 : 입력 34,21,45는 수식을 사용하여 총 3 개의 셀에 대해 수식을 2 개의 셀 아래로 '끌어 놓습니다').

편집 : 나는이 대답이 대중적이라고 기대하지 않았습니다. 와우!


21
언어 이름은 조금 독특합니다.
— Conor O'Brien

어떤 규칙을 참조하고 얼마나 정확하게 어리석은가?
— Luis Mendo

3
@LuisMendo 여기에 선언 된 규칙 : meta.codegolf.stackexchange.com/questions/10199/… 나는 그들이 말하는 것에 대해 정확하게 우회하는 '통역사'를 작성하는 데 5 분이 걸렸기 때문에 규칙이 바보라고 생각합니다. 이 언어를 도전에 사용할 수있을수록 규칙이 더 어려워집니다. 나는 이것을 링크에 포함시킬 것입니다.
— tuskiomi


9

파이썬 2, 41 바이트

lambda l:map(sorted(l+[l])[::-1].index,l)

각 값에 대해 목록에서 색인을 내림차순으로 정렬하십시오. 파이썬 2는리스트를 숫자보다 큰 것으로 취급하기 때문에 가장 큰 값을 0 대신 1로 지정하기 위해리스트 자체의 추가 "무한대"요소를 사용합니다.

더 직접적인 솔루션은 42 바이트이며 Python 3에서도 작동합니다.

lambda l:[1+sum(y<x for x in l)for y in l]

각 요소에 대해 더 작은 요소의 수를 세고 1을 더하여 1 인덱싱으로 바꿉니다.



7

R, 24 25 20 바이트

음수 벡터에 대해 "min"타이 방법과 함께 표준 순위 함수를 사용합니다. catSTDOUT에 출력하기 위해 추가되었습니다. @Guiseppe 덕분에 하나를 저장했습니다.

cat(rank(-scan(),,"mi"))

예

> cat(rank(-scan(),,"mi"))
1: 9 2 12 3 7 11 15 11 6 8 11 17 11
14: 
Read 13 items
8 13 3 12 10 4 2 4 11 9 4 1 4
> 

나는 그것이 cat완전한 프로그램이 되려면 그것을 감싸 야한다고 생각합니다 .
— Alex A.

@AlexA. 나는 그것에 대해 궁금했다. 이것이 그 자체의 함수라고 말하는 것이 공정하고 그 경우 rank(-a,,'min')a가 벡터 형식의 목록 입력이면 괜찮을까요?
— MickyT

이 경우 네임 스페이스에 변수가 이미 있다고 가정하므로 스 니펫으로 간주합니다. 적절한 기능 제출을 위해서는 당신이 필요합니다 function(a)rank(-a,,'min').
— Alex A.

"mi"오히려 단축 될 수 있습니다 "min".
— Giuseppe

@AlexA. 왜 싸야 cat합니까? 제출이 function(a)rank(-a,,'mi')충분한 것으로 간주되고 프로그램 출력이 동일하면rank(-scan(),,'mi')
— Mark

4

PowerShell v2 +, 43 41 바이트

($a=$args)|%{@($a|sort -d).indexof($_)+1}

독립적으로 개발되었지만 이것이 @xnor의 Python 솔루션 과 동일한 알고리즘 이므로 / shrug 입니다.

입력을 개별 명령 행 인수 (공백으로 구분 된 목록)로 사용합니다. 출력 (기본 형식)은 요소 사이의 줄 바꿈입니다.

입력 목록의 각 요소에 대해 입력 목록 sort을 -d내림차순으로 정렬 .indexOf()하고 현재 요소를 가져와 추가합니다 1. @(...)단일 숫자 입력을 설명하기 위해 명시 적 배열 캐스트 에 유의하십시오 . 결과 숫자는 파이프 라인에 남아 있고 출력은 암시 적입니다.

@Matt 덕분에 2 바이트가 절약되었습니다!

예

PS C:\Tools\Scripts\golfing> .\rank-the-integers.ps1 6 2 9 7 2 6 5 3 3 4
3
9
1
2
9
3
5
7
7
6

sort -d당신에게 효과가없는 이유 가 있습니까? 그것은 분명하다.
— Matt

@ 매트 홀수. 내 Win8.1 ISE에, 그것은한다고 -Descending하고 -Debug모호하다. 그러나 Win8.1의 직선 쉘과 Win10의 쉘 및 ISE에서는 정상적으로 작동합니다. 내 특정 Win8.1 설치가 바보 같은 것은 이번 이 처음이 아닙니다 ... :-/ 골프에 감사드립니다!
— AdmBorkBork

또한 이것은 모든 테스트 사례에서 작동하지 않았습니까? $args|%{@($args|sort -d).indexof($_)+1}짧지 만 작동하는지 잘 알지 못했습니다
— Matt

두 번째 때문에 작동하지 않습니다 @ 매트 $args루프의 스크립트 블록에 대한 입력으로 기능 {...}당신이 사용하는 것처럼 같은, filter또는 function.
— AdmBorkBork


3

자바 스크립트 (ES6), 38 36 바이트

a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)

편집 : @ETHproductions 덕분에 2 바이트가 절약되었습니다.


.mapFTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
— ETHproductions

3
@ETHproductions 왜 항상 재미를 망치어야합니까?
— Neil

2

젤리 , 5 바이트

<S‘ð€

TryItOnline!

방법?

<S‘ð€ - Main link: listOfValues
   ð  - dyadic chain separation
    € - for each
<     - less than (vectorises) - yields a list of 1s and 0s
 S    - sum - yields number of values the current value is less than (those that beat it)
  ‘   - increment - the place of a value is the number that beat it plus 1.

제출하려는 J 코드와 얼마나 비슷한가요? 1+(+/@:<)"0 1~
— Dane

비슷해 보이지만 (축소를 사용합니까?) 코드 게시를 중단해서는 안됩니다!
— Jonathan Allan

나는 "이차원 체인 분리"와 "각각"이 J에서 영감을 얻은 언어로 무엇을하는지 궁금해하고 있다고 생각한다.
— Dane

아, 당신의 설명에서 나는 당신의 코드가 더 같 >€µS‘거나 정말로 같다고 생각합니다 <@€µS‘( 연산자 @를 반대하는 주장을 뒤집습니다 <). J ~는 왼쪽에있는 체인에 암시 적이며 µ, 이것은 분리형이 아닌 monadic 분리이며 <인수가 목록 인 경우 벡터화됩니다.
— Jonathan Allan

2

펄 6 ,  42  26 바이트

:k역순 [R,]으로 정렬 된 목록 에서 첫 번째 색인 찾기

{map {[R,](.sort).first(*==$^a,:k)+1},@$_}

더 큰 값을 세고 하나 더하십시오

{map {1+.grep(*>$^a)},@$_}

2

자바 스크립트, 87 49 바이트

f=a=>a.slice().map(function(v){return a.sort(function(a,b){return b-a}).indexOf(v)+1 })

a=>[...a].map(v=>a.sort((a,b)=>b-a).indexOf(v)+1)

Conor O'Brien과 ETHproductions에게 감사드립니다!


1
지도에서 익명 함수를 사용할 수 있습니다 (예 :) v=>a.sort((a,b)=>b-a).indexOf(v)+1.
— Conor O'Brien

어레이의 사본에서 작동 .slice()하므로 전혀 필요하지 않습니다 .map.
— ETHproductions

또한 사이트 정책에 따라 함수의 이름을 지정할 필요가 없으므로 Leading f=도 제거 할 수 있습니다.
— Conor O'Brien

@ETHproductions 슬라이스를 제거하면 대신 에 [18,13,18]return을 전달[1,1,2][1, 3, 1]
— Oliver

오, 이상 a.sort()하다 a. 정렬 된 배열을에 저장 하기 때문 이다 . 하지만 당신은 변경할 수 있습니다 a.slice()에 [...a]몇 바이트를 저장합니다.
— ETHproductions

2

수학, 44 바이트 42 바이트 40 바이트

xPosition[SortBy[x,-#&],#][[1,1]]&/@x

3 바이트 개인용 문자 U+F4A1( Wolfram Docs 페이지 )

편집 : 바이트 절약을위한 JHM 덕분 입니다.


1
테스트 케이스가 실패합니다 {10,2,5,4,15,5}(출력은 {2,6,3,5,1,3}안됩니다 {2,5,3,4,1,3}. 입력에 42가 있으므로 건너 뛰어야 5합니다).
— JungHwan Min

정식으로 수정되었습니다.
— ngenisis

1
전환 x하고 #(괄호를 효과적으로 제거) -2 바이트 : xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
— JungHwan Min


2

J , 14 8 바이트

1+1#.</~

방법?

1+1#.</~ - Consumes and returns a list of integers
       ~ - Use the same list for both inputs
     </  - Create a table of less-than comparisons
  1#.    - Treat each row like digits of a base-one number, returning a list of integers
1+       - Increment the results

이전 솔루션

1+(+/@:<)"0 1~

안녕하세요, 8 bytes보다 짧은 버전을 찾았습니다 1+1#.</~. 행 단위 합계는 기본 1 변환을 사용하여 수행됩니다. 또 다른 대안은 1+\:~i.]8 바이트입니다.
— 마일

좋은! 당신은 당신의 자신의 답변을 게시 하시겠습니까? 그렇지 않으면 기본 1 개선을 포함하겠습니다.
— Dane

2
아냐, 나는 바이트 절약을 제안하는 것이 좋다. 그것들을 자유롭게 사용하십시오
— 마일


1

Wonder , 28 바이트

@(->@+1:0iO#0rev sort#I#1)#0

용법:

(@(->@+1:0iO#0rev sort#I#1)#0)[6 2 9 7 2 6 5 3 3 4]

내림차순 정렬 된 입력 버전에서 항목의 첫 번째 색인에 1을 추가하는 함수를 사용하여 입력 배열에 맵핑하십시오.



1

수학, 37 바이트

Min@Position[-Sort@-#,i]~Table~{i,#}&

문제의 규칙에 따라 입력의 순위를 매기는 순수한 함수입니다. 전의:

Min@Position[-Sort@-#, i]~Table~{i, #} &[{6, 2, 9, 7, 2, 6, 5, 3, 3, 4}]
(*{3, 9, 1, 2, 9, 3, 5, 7, 7, 6}*)

1

해파리 , 15 바이트

p`&& ~i
  >/+`<

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

설명

Jellyfish의 목록에서 값의 색인을 찾는 좋은 방법은 아직없는 것 같습니다. 따라서 현재 값보다 큰 값을 계산하고 결과를 증가시키는 방법을 사용합니다. 이것은 주로 주어진 요소에 대해이 값을 계산하는 단항 함수를 구성하여 수행됩니다.

     `<

그러면 스레드 버전의 비교 연산자가 만들어 지므로 정수와 목록을 제공하면 해당 정수와 목록의 각 요소 사이에 비교 결과 목록이 반환됩니다.

     ~i
     `<

이전 함수의 오른쪽 인수를 입력 목록과 함께 처리합니다. 따라서 결과는 정수를 사용하고 프로그램의 입력과 비교 결과 목록을 제공하는 단항 함수입니다.

   & ~i
   /+`<

여기 /+에 더하기를 통한 축소가 있습니다. 이는 단순히 "이 목록 합계"기능 일뿐입니다. &이 함수를 이전 함수에 구성하므로 이제 입력에서 해당 정수보다 큰 값의 수 를 계산 하는 단항 함수가 있습니다.

  && ~i
  >/+`<

또한 증가 함수를 구성합니다.

 `&& ~i
  >/+`<

마지막으로이 함수도 스레딩하여 전달 된 목록의 각 정수에 자동으로 적용됩니다. 코드의 레이아웃으로 인해이 i함수의 입력으로도 사용되어 원하는 출력을 계산합니다.

p`&& ~i
  >/+`<

마지막으로 결과가 인쇄됩니다.


1

brainfuck, 124 바이트

->,[>>>+>,]<[-<+]+[-->[<[<<<<]>>>+>[>[>>]<[[<<+<<]>+>[->>>>]]<+>>>]+[-<<+]->]<[<
<<<]>+.,>>[>[>->+>>]<<[-<<<<]>-]+[->+]+>>>>]

형식화 :

->
,[>>>+>,]
<[-<+]
+
[
  -->
  [
    <[<<<<]
    >>>+>
    [
      >[>>]
      <
      [
        [<<+<<]
        >+>[->>>>]
      ]
      <+> >>
    ]
    +[-<<+]
    ->
  ]
  <[<<<<]
  >+.,>>
  [
    >[>->+>>]
    <<[-<<<<]
    >-
  ]
  +[->+]
  +>>>>
]

이것은 8 비트 brainfuck 구현을 위해 설계되었습니다. 입력 및 출력은 바이트 값을 통해 이루어 집니다.

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

각 요소에 대해 이보다 큰 요소 수를 계산 한 다음 결과에 1을 더한 값을 인쇄합니다. 이는 현재 요소가 0이 될 때까지 모든 요소를 ​​증분하여 다른 요소가 현재 요소 이전에 0이 될 때마다 결과를 업데이트하여 수행됩니다.

테이프는 4 셀 노드로 나뉩니다.

b c 0 0

여기서 c요소 b는 현재 요소에 대해 음수 인 탐색 플래그이며, 그렇지 않으면 하나입니다.

현재 요소의 결과와 사본은 배열의 왼쪽에 유지됩니다.


1

자바, 215 바이트

public class G{public static void L(int[]A){int[]r=new int[A.length];for(int i=0;i<A.length;i++){int c=1;for(int j=0;j<A.length;j++){if(A[j]>A[i])c++;}r[i]=c;}for(int i=0;i<r.length;i++)System.out.print(r[i]+",");}}

설명:

매우 설명이 필요합니다.

기본적으로 배열의 각 정수에 대해 얼마나 큰지 확인한 다음 순위가있는 새 배열을 인쇄합니다.

죄송하지만 이것이 간결하지는 않지만 이것들 중 하나를 시도한 첫 번째 시도이며 Java에 대한 항목을 보지 못했습니다. 더 골프를 칠 수 있다고 확신합니다.

정적 메소드를 참조하고 배열을 전달하여 실행할 수 있습니다. 주요 기능을 작성해야한다고 생각하지는 않았지만 앞으로는 그렇게 할 것입니다.


이 공백을 제거 할 수 있습니까? 그것이 실제로 골프되지 않습니다. (즉,에 공백 r = new)
— Rɪᴋᴇʀ

@EasterlyIrk 예, 죄송합니다.이 작업에 익숙하지 않습니다. 필연적으로 불필요한 공백을 모두 제거했다고 생각합니다.
— Henry

"rankNumbersGolf"의 이름을 "G"와 같은 짧은 이름이나 다른 이름으로 지정할 수 있습니까?
— Rɪᴋᴇʀ

@EasterlyIrk 예, 감사합니다.
— Henry

나는 잘하지 못하지만 세 개의 공백을 제거 할 수 for (있습니까?
— Rɪᴋᴇʀ

0

PHP, 101 바이트

더 짧은 방법이 있어야합니다.

function f(&$a){for($r=1;$v++<max($a);$r+=$n,$n=0)foreach($a as$k=>$w)if($w===$v){$a[$k]="$r";$n++;}}

함수는 입력을 정수 배열로 취하고 순위를 숫자 문자열로 사용하여 입력 변수를 덮어 씁니다.

용법: $a=[1,2,4,2,2,3];f($a);print_r($a);


0

루비, 45 40 바이트

->a{a.map{|x|a.sort.reverse.index(x)+1}}

이것을 어떻게 부릅니까? 테스트 사례와 일치하도록 할 수 없으며 순위가 같은 버그가있는 것 같습니다. 예를 들어 [10, 2, 5, 4, 15, 5]출력 [2, 5, 3, 4, 1, 3]해야 할 때 출력을 제공 합니다. 5 바이트를 절약 [2, 6, 3, 5, 1, 3]하면 .uniq됩니다.
— Neil Slater

질문을 잘못 읽은 것 같습니다. 그것을 발견해 주셔서 감사합니다!
— Lee W

0

클로저, 48 44 바이트

업데이트 : for대신 사용map

#(for[i %](+(count(filter(partial < i)%))1))

단순히 현재 값보다 작은 각 값을 필터링하고 목록의 길이를 세고 1 씩 증가시킵니다.





0

K (oK) , 11 바이트

해결책:

1+(x@>x)?x:

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

예 :

1+(x@>x)?x:6 2 9 7 2 6 5 3 3 4
3 9 1 2 9 3 5 7 7 6
1+(x@>x)?x:5 6 14 19 13 5 19 9 19 9 9 19
11 10 5 1 6 11 1 7 1 7 7 1

설명:

정렬 된 목록에서 원본 목록의 조회 위치를 찾은 다음 추가하십시오.

1+(x@>x)?x: / the solution
         x: / save input as x
  (  >x)    / return indices of x sorted in descending order
   x@       / apply these indices to x (thus sort x)
        ?   / lookup right in left
1+          / add one
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.