정수 목록 순위


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.