정렬되지 않은 배열에 반 정렬 된 삽입


14

PPCG Inc.의 첫 날에 오신 것을 환영합니다. 최신 주니어 보조 문서 분류기로서, 귀하가 보내 드린 모든 문서를 알파벳 순서로 보관해야합니다. 원숭이가 그렇게 쉽게 할 수 있습니다. 우리가 원숭이를 고용 한 것처럼 은유 적으로 말하면 뭔지 맞춰봐? 원숭이는 우리 알파벳에 대한 이해가 부족하다는 것이 밝혀졌습니다. 어쨌든, 지금 당장 엉망을 고칠 시간이 없으므로 상황을 더 악화시키지 마십시오. 그런 다음 그것을 얻으십시오! 배가 고프면 워터 쿨러 옆에 바나나가 있습니다. 행운을 빕니다!

업무 설명서

입력

  • 문자열 목록 (아카이브)과 해당 목록에 추가해야하는 문자열 (문서)을 받게됩니다.
  • 모든 문자열은 대문자, 소문자 및 공백 만 포함합니다
  • 문자열은 항상 문자로 시작하고 끝납니다

직무

문서의 대상 위치를 결정하십시오. 문서가 아카이브에서 수신 할 위치입니다. 목표 위치는 다음과 같이 결정될 수 있습니다.

  • 각 위치에 대해 :
    • 해당 위치 이전의 아카이브에서 문서 앞의 사전 순으로 문자열의 수를 계산합니다.
    • 문서 뒤의 알파벳순으로 해당 위치 이후의 아카이브에서 문자열의 수를 계산합니다.
    • 위의 두 카운트의 합으로 위치 점수를 정의하십시오.
  • 문서의 목표 위치는 점수가 가장 높은 위치입니다
  • 동점 인 경우, 가장 높은 점수를받은 모든 직책이 목표 직책과 동일하게 유효합니다. 하나만 선택하면됩니다.

정렬 할 때 :

  • 대문자와 소문자는 동일합니다
  • 문자 앞에 공백이옵니다

산출

  • 어떤 형태로든 문서가 추가 된 아카이브

또는

  • 0 기반 또는 1 기반 인덱스에서 문서의 대상 위치

업무 평가

가장 적은 바이트가 이깁니다!

예제 I / O

Archive:
    Applebuck Season
    Friendship is Magic
    The Ticket Master
    Griffon the BrushOff
    Boast Busters
    Bridle Gossip

Document: Dragonshy

Position scores (0-based index):
0: 0 + 3 = 3
1: 1 + 3 = 4
2: 1 + 2 = 3
3: 1 + 1 = 2
4: 1 + 0 = 1
5: 2 + 0 = 2
6: 3 + 0 = 3

Target position: 1

5
PPCG에 오신 것을 환영합니다. 이것은 멋진 첫 게시물처럼 보입니다! :) "작업"섹션의 지침은 읽기 어렵습니다. 가로 스크롤이 번거 롭습니다. 대신 글 머리 기호 목록을 사용하는 것이 좋습니다. 원하는 경우 커뮤니티에서 검토 할 수있는 문제를 게시 할 수 있는 편리한 샌드 박스 가 있습니다.
FryAmTheEggman

Dragonshy 방금 받았습니다! 아주 좋은 :-D
Luis Mendo

@Lex 하나 또는 두 개의 테스트 케이스를 추가하는 것이 좋을 것입니다.
Luis Mendo

답변:


4

자바 스크립트 (ES6), 81 바이트

(a,d)=>a.map((e,i)=>d[l="toLowerCase"]()<e[l]()?s--:++s>m&&(++m,p=++i),m=s=p=0)|p

언 골프 드 :

function position(archive, document) {
    var score = 0;
    var max = 0;
    var pos = 0;
    var i = 0;
    while (i < archive.length) {
        if (archive[i++].toLowerCase() > document.toLowerCase()) {
            score--;
        } else {
            score++;
            if (score > max) {
                max++;
                pos = i;
            }
        }
    }
    return pos;
}

편집 : @ user81655 덕분에 많은 바이트를 절약했습니다.


또한 indexOf맵 중에 설정된 결과 변수로를 대체하는 것도 더 짧습니다.
user81655

동의하지만 더 이상 내 솔루션처럼 보이지 않습니다 ...
Neil

3

Pyth, 40 38 바이트

크레딧 @Katenkyo 이 나를 가르치는 A xnor B기본적으로 A==B. ( A xor B또한 A!=B)

AQJ+],k0.e,rb0hkGteh.Msmq<hdrH0<edeZJJ

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

작동 방식 :

항목이 문서보다 작은 지 여부와 항목의 색인이 문서의 색인보다 작은 지 여부의 XNOR을 합산합니다.

이 합계가 최대 인 위치를 찾아 출력합니다.


2

파이썬 3 135 167 바이트

def a(b,c):a=[sum(map(lambda x:x.lower()>c.lower(),b[i:]))+sum(map(lambda x:x.lower()<c.lower(),b[:i]))for i in range(0,len(b)+1)];b.insert(a.index(max(a)),c);print(b)

1

루비, 97 바이트

익명 함수, 대상 위치를 반환합니다.

->a,d{d.upcase!;(0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}}}

실제로 아카이브에 삽입 할 때 110 바이트 :

->a,d{t=d.upcase;a.insert (0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}},d}

1

Pyth, 54 52 47 45 바이트

AQVhlG=Ys+m>rH0rd0:G0Nm<rH0rd0gGNI>YZ=ZY=kN;k

예상 입력은 목록이고 첫 번째 요소는 문자열 (아카이브) 목록이고 두 번째 요소는 문자열 (문서)입니다.

AQ                                            # initialize G and H with the archive and the document
  VhlG                                        # iterate over the indexes on archive
      =Ys+                                    # concatenate and sum the following scores
          m>rH0rd0:G0N                        # map a string comparison between the document and the archives up to the index, returning true(1) for lower, and false(0) for higher
                      m<rH0rd0gGN             # same as above, but starts at the index and goes up to the end of the archive, returning false(0) for lower, and true(1) for higher
                                 I>YZ         # Check if score is higher than highest
                                     =ZY      # update highest score
                                        =kN;  # update index
                                            k # print index

여기서 테스트

  • 입력 초기화시 5 바이트 절약 (@Kenny Lau 덕분에)

Z는 자동 초기화되어 0코드를 올바르게 읽으면 공간을 절약 할 수 있습니다.
Maltysen

사용하여 ["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"입력으로하고 사용하는 E대신에 @Q0하고 @Q1당신에게 4 바이트를 저장할 수 있습니다.
Leaky Nun

AQ대신에 사용할 수 있습니다 J@Q0K@Q1.
Leaky Nun

1

MATL , 32 바이트

hk4#S4#S%2#0)>t0whYsw~0hPYsP+K#X>

입력은 아카이브 용 문자열 (공백으로 구분되고 중괄호로 묶인 여러 문자열) 및 문서 용 문자열로 구성된 셀형 배열입니다. 출력은 1 기반입니다. 동점 인 경우 첫 번째 위치가 반환됩니다.

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

설명

h      % Concatenate archive and document as a cell array of strings
k      % Convert all strings to lowercase
4#S    % Sort and output the indices of the sorting
4#S    % Again. This gives the indices that applied to the concatenated
       % array would make it sorted
2#0)   % Separate last index (document) from the others (archive)
>      % Is it greater? Gives zero/one array the size of the archive
t      % Duplicate that array
0wh    % Prepend a 0
Ys     % Cumulative sum. This is first part of the score
w~     % Swap. Negate zero/one array
0h     % Postpend a 0
PYsP   % Reverse, cumulative sum, reverse. Second part of the score
+      % Add. This is the score of each position
K#X>   % Arg max
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.