SE 게시물에 상위 5 개의 댓글 점수 표시


30

스택 교환 스크립트는 질문 또는 답변에 대한 5 가지 의견이 사이트의 메인 페이지에서 처음에 의견 수를 통해 표시되는 것을 결정합니다. 가장 많은 표를 얻은 5 개의 의견이 표시됩니다. 당신의 임무는이 동작을 재현하는 것입니다.

STDIN, 명령 줄 인수 또는 함수 인수를 통해 입력을받는 전체 프로그램 또는 함수를 작성하고 상위 5 개의 주석 점수를 인쇄하거나 반환합니다. 입력은 일부 게시물의 의견에 대한 공감 수를 나타내는 정수 배열입니다. 예를 들어,

0, 2, 5, 4, 0, 1, 0

즉, 첫 번째 의견에는 투표가없고, 두 번째 의견에는 두 개의 투표가 있고, 세 번째에는 5 개의 투표가 있고, 네 번째에는 4 명이있었습니다. 등이 있습니다.

입력에 5 개 이하의 주석 점수가 포함 된 경우 출력에는 주어진 점수 만 포함되어야합니다. 둘 이상의 댓글 점수가 동일한 경우 첫 번째 점수가 표시되어야합니다. 입력 배열에 하나 이상의 주석 점수가 포함되어 있다고 가정 할 수 있습니다.

출력의 숫자는 쉽게 구별되어야합니다 (따라서 1의 경우 02541은 유효하지 않습니다). 그렇지 않으면 출력 형식에 대한 제한이 없습니다. 숫자는 공백이나 줄 바꿈으로 구분되거나 목록 형식 등일 수 있습니다.

테스트 사례 :

[0, 2, 5, 4, 0, 1, 0] -> [0, 2, 5, 4, 1]
[2, 1, 1, 5, 3, 6] -> [2, 1, 5, 3, 6]
[0, 4, 5] -> [0, 4, 5]
[1, 1, 5, 1, 1, 5] -> [1, 1, 5, 1, 5]
[0, 2, 0, 0, 0, 0, 0, 0] -> [0, 2, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0] -> [0, 0, 0, 0, 1]
[5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7] -> [5, 8, 7, 6, 7]
[6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2] -> [6, 69, 22, 37, 5]

마지막 예제는 이 스택 오버플로 질문 에서 가져 왔습니다 .

가능하면 게시물에 온라인으로 제출할 수있는 링크를 제공하십시오.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 행운을 빕니다!


우리는 질서를 유지해야합니까?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 예. 정수가 나타나는 순서는 바뀌지 않아야합니다.
TNT

답변:


10

젤리 , 6 바이트

NỤḣ5Ṣị

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 한 번에 확인하십시오 .

작동 원리

NỤḣ5Ṣị    Main link. Input: A (list)

N         Negate (multiply by -1) all elements of A.
 Ụ        Grade the result up.
          This consists in sorting the indices of A by their negated values.
          The first n indices will correspond to the n highest vote counts,
          tie-broken by order of appearance.
  ḣ5      Discard all but the first five items.
    Ṣ     Sort those indices.
          This is to preserve the comments' natural order.
     ị    Retrieve the elements of A at those indices.

10

파이썬 2, 58 바이트

x=input()[::-1]
while x[5:]:x.remove(min(x))
print x[::-1]

Ideone에서 테스트하십시오 .

작동 원리

list.remove인수가 지정된 목록에서 첫 번째 발생을 제거합니다. 리스트 x 를 반대로함으로써 , 우리는 본질적으로 마지막 발생을 제거한다는 것을 달성합니다 .

따라서 5 개 이하의 주석 목록에 도달 할 때까지 최소한의 투표로 주석을 계속 제거하면됩니다. 그런 다음 목록을 한 번 더 되돌려 원래 순서로 복원합니다.


9

Pyth, 11 바이트

_.-_Q<SQ_5

Q5 개의 가장 큰 요소 Q가있는 순서대로 입력 ( ) 의 다중 집합 교집합을 계산 한 다음 순서대로 Q5 개를 취합니다.

_ .-           Reverse of multiset difference
     _ Q       of reversed Q
     <         with all but last 5 elements of sorted Q
       S Q                   
       _ 5

여기에서 시도 하십시오 .


<5SQ<SQ_51 바이트를 절약하는와 같습니다 .
PurkkaKoodari


흥미 롭군 왜 그것이 구현되지 않았는지 궁금합니다 b[:-a]... 어쩌면 언젠가는 그런 것 같습니다.
PurkkaKoodari

5

MATL , 16 바이트

tn4>?t_FT#S5:)S)

이 문제보다 빠른 현재 릴리스 (10.2.1)를 사용합니다 .

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

설명

          % implicitly get input
t         % duplicate
n         % number of elements
4>?       % if greater than 4...
  t       % duplicate
  _       % unary minus (so that sorting will correspond to descending order)
  FT#S    % sort. Produce the indices of the sorting, not the sorted values
  5:)     % get first 5 indices
  S       % sort those indices, so that they correspond to original order in the input
  )       % index the input with those 5 indices
          % implicitly end if
          % implicitly display

5

자바 스크립트, 74 65 62 61 바이트

@ user81655 덕분에 3 바이트가 떨어져 있습니다. @apsillers 덕분에 1 바이트 할인.

f=a=>5 in a?f(a.splice(a.lastIndexOf(Math.min(...a)),1)&&a):a


5

파이썬 3, 76

목록 작성에서 if 문을 남용 할 수 있음을 상기시켜주는 Kevin 덕분에 9 바이트를 절약했습니다.

DSM 덕분에 5 바이트를 절약했습니다.

지금은 매우 간단한 해결책입니다. 상위 5 개의 점수를 얻은 다음 목록을 통해 구문 분석하여 찾은 결과에 추가합니다.

def f(x):y=sorted(x)[-5:];return[z for z in x if z in y and not y.remove(z)]

누군가가 원하는 경우 내 테스트 사례는 다음과 같습니다.

assert f([0, 2, 5, 4, 0, 1, 0]) == [0, 2, 5, 4, 1]
assert f([2, 1, 1, 5, 3, 6]) == [2, 1, 5, 3, 6]
assert f([0, 4, 5]) == [0, 4, 5]
assert f([0, 2, 0, 0, 0, 0, 0, 0]) == [0, 2, 0, 0, 0]
assert f([0, 0, 0, 0, 1, 0, 0, 0, 0]) == [0, 0, 0, 0, 1]
assert f([5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]) == [5, 8, 7, 6, 7]
assert f([6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2]) == [6, 69, 22, 37, 5]

4

05AB1E , 12 11 바이트

암호:

E[Dg6‹#Rß\R

설명:

E           # Evaluate input
 [          # Infinite loop
  D         # Duplicate top of the stack
   g        # Get the length
    6‹#     # If smaller than 6, break
       R    # Reverse top of the stack
        ß\  # Extract the smallest item and remove it
          R # Reverse top of the stack
            # Implicit, print the processed array

CP-1252 인코딩을 사용합니다.


4

CJam, 16 바이트

{ee{1=~}$5<$1f=}

배열을 받아서 배열을 반환하는 명명되지 않은 블록 (함수).

테스트 스위트.

설명

ee   e# Enumerate the array, pairing each number with its index.
{    e# Sort by...
 1=  e#   The original value of each element.
 ~   e#   Bitwise NOT to sort from largest to smallest.
}$   e# This sort is stable, so the order tied elements is maintained.
5<   e# Discard all but the first five.
$    e# Sort again, this time by indices to recover original order.
1f=  e# Select the values, discarding the indices.


3

파이썬, 68 바이트

lambda l,S=sorted:zip(*S(S(enumerate(l),key=lambda(i,x):-x)[:5]))[1]

실행 예.

내장 된 덩어리. 설명하는 가장 좋은 방법은 예제를 실행하는 것입니다.

>> l
[5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]
>> enumerate(l)
[(0, 5), (1, 4), (2, 2), (3, 1), (4, 0), (5, 8), (6, 7), (7, 4), (8, 6), (9, 1), (10, 0), (11, 7)]

enumerate목록을 인덱스 / 값 쌍 (기술적으로 enumerate객체) 으로 바꿉니다 .

>> sorted(enumerate(l),key=lambda(i,x):-x)
[(5, 8), (6, 7), (11, 7), (8, 6), (0, 5), (1, 4), (7, 4), (2, 2), (3, 1), (9, 1), (4, 0), (10, 0)]
>> sorted(enumerate(l),key=lambda(i,x):-x)[:5]
[(5, 8), (6, 7), (11, 7), (8, 6), (0, 5)]

쌍은 가장 큰 값으로 먼저 정렬되어 관계의 현재 색인 순서를 유지합니다. 이것은 가장 높은 점수를 매긴 의견을 앞선 게시물로 묶었습니다. 그런 다음 5 가지 최고의 의견이 취해집니다.

>> sorted(_)
   [(0, 5), (5, 8), (6, 7), (8, 6), (11, 7)]
>> zip(*sorted(_))[1]
   (5, 8, 7, 6, 7)

상위 5 개의 메모를 게시 순서대로 다시 넣은 다음 점수 만 유지하면서 인덱스를 제거하십시오.


3

PowerShell v4, 120 97 바이트

param($a)$b=@{};$a|%{$b.Add(++$d,$_)};($b.GetEnumerator()|sort Value|select -l 5|sort Name).Value

주위를 실험하면서 추가 바이트를 사용하는 다른 방법을 찾았습니다. 그러나 PowerShell v4에만 적용되는 것으로 보이며 해당 버전에서 해시 테이블 정렬을 처리하는 방법이 있습니다. 기본적으로 v4에서는 여러 값이 동일한 값을 갖는 경우 "더 낮은"키가있는 것으로 간주하지만 v3에서 ordered 키워드를 사용하는 경우에도 v3 이전 버전에서는 보장되지 않습니다 . 이 동작이 계속되는지 PowerShell v5에 대해 완전히 조사하지 않았습니다.

이 v4 전용 버전은로 입력 $a한 다음 비어있는 새 해시 테이블을 만듭니다 $b. 입력의 모든 요소를 $a|%{...}반복하고 각 반복마다 키 / 값 쌍을 추가합니다 (각 반복의 키로 $b도우미 변수 $d를 사전 증가시켜 수행). 그럼 우리가 sort $b기반으로 Value다음, AST 다음 으로 (즉, 키), 그리고 마지막으로 만 출력 결과 해시의의.select-l5sortName.Value

5 개보다 적은 요소를 입력하면 값을 기준으로 정렬하고 마지막 5 개 (즉, 모두)를 선택하고 키를 다시 정렬하여 출력합니다.


이전 버전에서 작동하는 120 바이트 이상

param($a)if($a.Count-le5){$a;exit}[System.Collections.ArrayList]$b=($a|sort)[-5..-1];$a|%{if($_-in$b){$_;$b.Remove($_)}}

Morgan Thrapp와 동일한 알고리즘 답변 , 훌륭한 마음이 같은 생각을하는 것 같습니다. :)

입력을 받고 항목 수가 5보다 작거나 같은지 확인하고 입력이 있으면 입력을 출력하고 종료합니다. 그렇지 않으면 의 상위 5 개 요소로 구성된 ArrayList $b(매우 긴 [System.Collections.ArrayList]캐스트가있는)를 $a만듭니다. 그런 다음 $a요소가있는 경우 각 요소에 대해 반복 합니다.$b 를 출력 한 다음 제거합니다 $b(기술적으로 고정되어 있기 때문에 배열에서 요소를 제거하는 것이 지원되는 기능이 아니기 때문에 ArrayList를 사용해야하는 이유는 다음 과 같습니다) 크기).

-in연산자에 v3 이상이 필요합니다 . 이전 버전에서 작동하는 답변 $_-in$b$b-contains$_대해서는 총 126 바이트로 교체하십시오 .


2

하스켈, 62 바이트

import Data.List
map snd.sort.take 5.sortOn((0-).snd).zip[0..] 

사용 예 : map snd.sort.take 5.sortOn((0-).snd).zip[0..] $ [5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]->[5,8,7,6,7] .

작동 방식 : 각 요소를 색인으로 확장, 내림차순 정렬, 처음 5 개 요소 가져 오기, 색인별로 정렬 및 색인 제거


2

PHP 5, 107 102

@WashingtonGuedes 덕분에 5 바이트 절약

function p($s){uasort($s,function($a,$b){return$a<=$b;});$t=array_slice($s,0,5,1);ksort($t);return$t;}

언 골프

function p($scores) {
    // sort the array from high to low,
    // keeping lower array keys on top of higher
    // array keys
    uasort($scores,function($a, $b){return $a <= $b;});
    // take the top 5
    $top_five = array_slice($scores,0,5,1);
    // sort by the keys
    ksort($top_five);
    return $top_five;
}

시도 해봐.


의 경우 1 1 5 1 1 5제출 한 내용 1 5 1 1 5이 올바른 결과 대신 출력 됩니다 1 1 5 1 5.
TNT

PHP 7.X에서는 다르게 동작하는 것 같습니다. PHP 버전을 5.6 이하로 전환하십시오.
Samsquanch

알았어요, 버전 번호를 몰랐어요. :)
TNT

나는 처음에는 아니었다. 왜 그것이 사용 된 버전과 코드를 저장하지 않는지 잘 모르겠습니다. 또한 왜 7.X에서 제대로 작동하지 않는지 잘 모르겠습니다.
Samsquanch

@WashingtonGuedes 공백을 제거하면 5 바이트가 절약되었지만 오류가 발생하지 않는 불필요한 세미콜론이 표시되지 않습니까?
Samsquanch

0

루비, 82 87 89 바이트

$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)

전화 : ruby test.rb [1,2,2,3,4,5]

원래 제출-56 바이트이지만 특정 테스트 사례에서 실패하고 $ stdin 및 $ stdout을 지원하지 않았습니다.

_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}

설명

$><<               # print to stdout
eval($*[0])        # evals the passed in array in stdin ex: [1,2,3,4]
.map.with_index    # returns an enumerator with indices
{|x,i|[i,x]}       # maps [index,value]
.sort_by{|x|-x[1]} # reverse sorts by the value
[0,5]              # selects the first 5 values
.sort              # sorts item by index (to find the place)
.map{|x|x[1]}      # returns just the values

좋은 프로그램입니다. 그래도 OP에 문의해야 할 수도 있습니다. 입력 형식이 올바른지 잘 모르겠습니다.
Rɪᴋᴇʀ

@RikerW 마지막 indice에 중복 된 최상위 #가 있으면 실제로 실패합니다. 지금 수정하고 있습니다.
John

@RikerW는 이제 고정되어 있으며 stdin을 지원하고 stdout에 씁니다.
John

괜찮아. 나는 입력 방법을 좋아한다. 나는 단지 @TNT에게 그것에 대해 물었다.
Rɪᴋᴇʀ

0

자바 7, 155 바이트

import java.util.*;List c(int[]f){LinkedList c=new LinkedList();for(int i:f)c.add(i);while(c.size()>5)c.removeLastOccurrence(Collections.min(c));return c;}

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

class Main{
    static List c(int[] f){
        LinkedList c = new LinkedList();
        for (int i : f){
            c.add(i);
        }
        while(c.size() > 5){
            c.removeLastOccurrence(Collections.min(c));
        }
        return c;
    }

    public static void main(String[] a){
        System.out.println(Arrays.toString(c(new int[]{ 0, 2, 5, 4, 0, 1, 0 }).toArray()));
        System.out.println(Arrays.toString(c(new int[]{ 2, 1, 1, 5, 3, 6 }).toArray()));
        System.out.println(Arrays.toString(c(new int[]{ 0, 4, 5 }).toArray()));
        System.out.println(Arrays.toString(c(new int[]{ 1, 1, 5, 1, 1, 5 }).toArray()));
        System.out.println(Arrays.toString(c(new int[]{ 0, 2, 0, 0, 0, 0, 0, 0 }).toArray()));
        System.out.println(Arrays.toString(c(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0, 0 }).toArray()));
        System.out.println(Arrays.toString(c(new int[]{ 6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2 }).toArray()));
    }
}

산출:

[0, 2, 5, 4, 1]
[2, 1, 5, 3, 6]
[0, 4, 5]
[1, 1, 5, 1, 5]
[0, 2, 0, 0, 0]
[0, 0, 0, 0, 1]
[6, 69, 22, 37, 5]

0

줄리아, 48 바이트

!x=x[find(sum(x.<x',2)+diag(cumsum(x.==x')).<6)]

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

작동 원리

주석 c 1 이 주석 c 2 보다 우선 순위가 높습니다.다음 중 하나에 해당하는 경우 .

  • c 1c 2 보다 더 많은 투표를 가지고 있습니다 .
  • c 1c 2 는 같은 양의 공감 율을 갖지만 c 1 이 이전에 게시되었습니다.

이것은 주석의 전체 순서를 정의하며 당면 과제는 우선 순위가 가장 높은 5 개의 주석을 찾는 것입니다.

우선 순위별로 주석을 정렬하는 대신 (각 주석 c 에 대해 순서가 변경 될 수 있음) 우선 순위가 더 높거나 같은 주석을 계산합니다. 이 개수가 5 인 경우에만 c를 이하인 합니다.

의견 수를 기준으로 의견을 부분적으로 정렬하려면 다음을 수행하십시오. 하자 x는 투표 수를 포함하는 열 벡터합니다. 그런 다음 x를x' 전치 하여 행 벡터를 만들고 x의 각 요소와 각 요소 를 비교하는 부울 행렬을 만듭니다.x.<x' x T의 .

들면 X = [0, 2, 5, 4, 0, 1, 0] 이주는

<     0      2      5      4      0      1      0
0 false   true   true   true  false   true  false
2 false  false   true   true  false  false  false
5 false  false  false  false  false  false  false
4 false  false   true  false  false  false  false
0 false   true   true   true  false   true  false
1 false   true   true   true  false  false  false
0 false   true   true   true  false   true  false

행을 합산하여 sum(...,2) 엄격하게 더 많은 주석 수를 계산합니다. 합하면 해당 인덱스의 주석 엄청나게 .

예제 벡터의 경우

4
2
0
1
4
3
4

다음으로, 우리는 같은 의견 수보다 많은 의견이 게시 된 의견 수를 그 의견 수보다 먼저 계산했습니다. 우리는 이것을 다음과 같이 달성합니다.

먼저 x.==x', x 의 요소와 x T 의 요소 를 비교 하는 등가 테이블 을 만듭니다. . 예제 벡터의 경우 다음을 제공합니다.

=     0      2      5      4      0      1      0
0  true  false  false  false   true  false   true
2 false   true  false  false  false  false  false
5 false  false   true  false  false  false  false
4 false  false  false   true  false  false  false
0  true  false  false  false   true  false   true
1 false  false  false  false  false   true  false
0  true  false  false  false   true  false   true

다음으로 cumsum행렬의 각 열에 대한 누적 합계를 계산합니다.

1  0  0  0  1  0  1
1  1  0  0  1  0  1
1  1  1  0  1  0  1
1  1  1  1  1  0  1
2  1  1  1  2  0  2
2  1  1  1  2  1  2
3  1  1  1  3  1  3

대각선 ( diag)은 같은 양의 공감대를 가지며 해당 주석보다 늦게 나타나는 주석 수를 보유합니다.

1
1
1
1
2
1
3

생성 한 두 개의 행 벡터를 추가 하여 주석 의 우선 순위 ( 1 이 가장 높음)를 얻습니다 .

5
3
1
2
6
4
7

우선 순위가 1 에서 5 사이 인 주석 이 표시되어야하므로로 색인을 결정하고로 find(....<6)해당 주석을 검색합니다 x[...].


0

파이썬 3.5, 68 바이트

f=lambda x,*h:x and x[:sum(t>x[0]for t in x+h)<5]+f(x[1:],*h,x[0]+1)

내 Python 2 답변 과 일치하지 않습니다 않지만 Python 3에 대한 포트보다 3 바이트 만 길며 재미있을 정도로 다르다고 생각합니다.

I / O는 튜플 형태입니다. repl.it에서 테스트하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.