지수와 가치 교환


29

작업

그 입력리스트 / 배열되는 프로그램이나 함수 작성 X 출력 정수와 정수의 집합의 목록 Y , 이러한 각 요소에 대한 예를 각 세트 Y [ I ], X [ E ] = I , 및 Y 의 집합에있는 요소의 총 수가 X 의 요소 수와 같도록합니다 .

(이것은 기본적으로 배열에 적용되는 것을 제외하고 해시 테이블 / 사전을 뒤집는 것과 동일한 작업입니다.)

이 예제에서는 1 기반 인덱싱을 가정하지만 원하는 경우 0 기반 인덱싱을 대신 사용할 수 있습니다.

X             Y
[4]           [{},{},{},{1}]
[1,2,3]       [{1},{2},{3}]
[2,2,2]       [{},{1,2,3}]
[5,5,6,6]     [{},{},{},{},{1,2},{3,4}]
[6,6,5,5]     [{},{},{},{},{3,4},{1,2}]

설명

  • 원하는 경우 세트를 목록으로 표시 할 수 있습니다. 그렇게하면 요소의 순서는 중요하지 않지만 요소를 반복 할 수는 없습니다.
  • 합리적인 모호하지 않은 I / O 형식을 사용할 수 있습니다. 예를 들어, 세트의 요소를 공백으로 분리하고 세트 자체를 개행으로 분리 할 수 ​​있습니다.
  • Y 는 유한하게 길어야하고 X의 모든 요소 를 배열 인덱스로 가질 수있을 정도로 길어야 합니다. 그러나 X 의 최대 요소보다 길 수 있습니다 (추가 요소는 빈 세트 임).
  • X 의 요소 는 모두 유효한 배열 인덱스입니다. 즉, 0부터 시작하는 인덱싱을 사용하는 경우 음이 아닌 정수 또는 1부터 시작하는 인덱싱을 사용하는 경우 양의 정수입니다.

승리 조건

A와 도전, 짧은 더 낫다.


관련 . 에서 샌드 박스 포스트 (지금은 삭제하지만 명성이있는 경우를 볼 수 있습니다), 우리는 아마 중복되지라고 판단했습니다,하지만 당신은 동의하지 않을 경우 주변에 투표 주시기 바랍니다.

"요소들의 순서는 중요하지 않다"를 출력하는 뜻 [5,5,6,6]하고 [6,6,5,5]동일 할 수 있을까?
Leaky Nun

1
@LeakyNun 출력 목록에서 세트의 요소 순서는 중요하지 않습니다. 그래서 [5,5,6,6][6,6,5,5]동일한 출력을 할 수는 없지만에 대한 출력은 [5,5,6,6], 예를 들어, 또한 수 있었다 [{},{},{},{},{2,1},{4,3}].
ngenisis

X에 색인의 가정 가능한 최대 값이 있습니까? 또한 빈 세트는 실제로 비어있는 대신 0을 가질 수 있습니까? 예를 들어 것이 [{0},{0},{0},{0},{1,2},{3,4}]유효 출력 [5,5,6,6]?
Skidsdev

@Mayube : 첫 번째 대답에는 아니요 (정수의 범위가 제한된 언어를 사용하는 경우 정수가 무한대로 커질 수있는 것처럼 프로그램을 작성할 수 있으며 누군가가 당신에게 아웃을 주면 깨질 염려가 없습니다. 입력 범위의 정수). 두 번째 질문과 관련하여 1 기반 인덱싱을 사용할 때 모호하지 않은 (이상한 경우) 구문이므로 0의 경우 0을 사용하면 0을 기반으로하는 인덱싱을 사용하는 경우에는 아니요 다른).

답변:


9

MATL , 8 바이트

tn:IXQ&D

입력은 ;구분 기호로 사용 되는 열 벡터입니다 (예 :) [2;2;2]. 출력은 행 벡터의 셀형 배열 (예 :)의 문자열 표현입니다 {[]; [1 2 3]}. 단일 요소의 행 벡터는 숫자와 동일하므로 ( {1; 2; 3}대신에 출력됩니다 {[1]; [2]; [3]}).

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

설명

t     % Implicit input, say x. Duplicate
n     % Number of elements, say N
:     % Range: [1 2 ... N]
IXQ   % accumarray(x, [1 2 ... N], [], @(x){sort(x).'})
&D    % String representation

대부분의 작업은 Matlab의 고차 함수에 의해 수행됩니다. Matlab의 고차 함수 accumarray는 첫 번째 값의 일치하는 값에 따라 두 번째 입력의 요소를 그룹화하고 지정된 함수를 각 그룹에 적용합니다. 이 경우의 함수는입니다 @(x){sort(x).'}. 이는 각 그룹의 정렬 된 요소를 출력하고 모든 그룹의 결과가 셀형 배열로 압축되도록합니다.


7

파이썬, 69 바이트

lambda s:[[j for j,x in enumerate(s)if x==i]for i in range(max(s)+1)]

0 기반 인덱싱을 사용합니다.


7

젤리 , 7 5 바이트

=þṀT€

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

작동 원리

=þṀT€  Main link. Argument: A (array)

  Ṁ    Yield m, the maximum of A.
=þ     Equals table; for each t in [1, ..., m], compare all elemnts of A with t,
       yielding a 2D Boolean array.
   T€  Truth each; for each Boolean array, yield all indices of 1.

5

젤리 , 8 바이트

Jẋ"Ṭ€;"/

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

작동 원리

Jẋ"Ṭ€;"/  argument: z           eg. [6,6,4,4]
J         [1 .. len(z)]             [1,2,3,4]
   Ṭ€     untruth each of z         [[0,0,0,0,0,1],
                                     [0,0,0,0,0,1],
                                     [0,0,0,1],
                                     [0,0,0,1]]
 ẋ"       repeat each of ^^         [[[],[],[],[],[],[1]],
          as many times as           [[],[],[],[],[],[2]],
          each of ^                  [[],[],[],[3]],
                                     [[],[],[],[4]]]
       /  reduce by...
     ;"   vectorized concatenation  [[],[],[],[3,4],[],[1,2]]

4

Mathematica, 36 바이트

Join@@@#~Position~n~Table~{n,Max@#}&

설명

여기에 이미지 설명을 입력하십시오

각각의 경우 n{1, 2, ..., Max@#}, Max@#입력리스트에서 가장 큰 정수의 연산 Position들 여기서 n입력에서 나타난다 #. 이후 Position[{6,6,5,5},5](예를 들어) 반환 {{3},{4}}, 우리는 그 다음 Apply Join수준의 모든 요소에 {1}결과.


3

하스켈 , 45 바이트

s정수 목록을 가져와 목록 목록을 반환합니다. 테스트 케이스 입력을 수정하지 않고 유지하기 위해 1- 인덱싱 됨 (출력에 여분의 빈 목록이 추가로 표시됨).

s l=[[i|(i,y)<-zip[1..]l,y==x]|x<-[1..sum l]]

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

이것들은 매우 간단한 중첩 목록 이해입니다. 약간의 비틀기 만 sum대신을 ( 를) 사용하여 더 긴 목록을 만들 수있는 옵션을 활용하고 maximum있습니다.


3

PHP, 55 바이트

<?while($i<=max($_GET))print_r(array_keys($_GET,$i++));

인덱스가 0입니다.


3

R, 68 49 47 바이트

lapply(1:max(x<-scan()),function(y)which(y==x)) 

놀랍게도 더 긴 솔루션보다 훨씬 간단합니다. 벡터 취하고 x, STDIN에서 행 벡터를 생성 1하는 방법에 대해 max(x)암시 길이리스트를 생성 max(x)에있는 인덱스를 확인하고 x새로운리스트의 것과 대응한다. 암시 적으로 출력을 인쇄합니다.

이전 버전 :

o=vector('list',max(x<-scan()));for(i in x)o[[i]]=c(o[[i]],F<-F+1);o

다른 R 답변에 대한 약간 다른 접근법. 벡터를 STDIN으로 가져오고 입력의 최대 값과 길이가 같은 목록을 만듭니다. 입력을 반복하고 인덱스를 올바른 위치에 추가합니다.

1 기반 인덱싱을 사용합니다.



2

젤리 , 9 바이트

Ṭ+\ịĠȧ@"Ṭ

로 표시되는 1- 인덱스, 빈 세트,로 표시된 0하나의 항목 N세트,로 표시된 여러 항목 세트로 표시[M,N,...]

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

방법?

Ṭ+\ịĠȧ@"Ṭ - Main link: list a        e.g. [6,6,4,4]
Ṭ         - untruth a                     [0,0,0,1,0,1]
  \       - cumulative reduce with:
 +        -   addition                    [0,0,0,1,1,2]
    Ġ     - group indices of a by value   [[3,4],[1,2]]
   ị      - index into                    [[1,2],[1,2],[1,2],[3,4],[3,4],[1,2]]
        Ṭ - untruth a                     [0,0,0,1,0,1]
       "  - zip with:
     ȧ@   -   and with reversed @rguments [0,0,0,[3,4],0,[1,2]]

2

자바 스크립트 (ES6), 64 62 바이트

@SteveBennett 덕분에 2 바이트 절약


0 인덱스 입력을받습니다. 쉼표로 구분 된 세트 목록을 반환합니다.

a=>a.map((n,i)=>o[n]=[i,...o[n]||[]],o=[])&&`{${o.join`},{`}}`

테스트 사례


대체 버전, 53 바이트

'||||3,2|1,0'허용되는 것과 같은 단순화 된 출력 이 가능한 경우 다음을 수행 할 수 있습니다.

a=>a.map((n,i)=>o[n]=[i,...o[n]||[]],o=[])&&o.join`|`

와우. `{${o.join`},{`}}`합법적 인 ES2015가 어떻게 혼란 스럽 습니다.
Steve Bennett

@SteveBennett, 템플릿 리터럴 입니다. 이전 버전의 JS에서는 더 "{" + o.join("},{") + "}"명확 해집니다.
얽히고 설킨

아니, 나는 그것들에 대해 알고있다-그것은 나를 혼란스럽게하는 단어 join 이후의 역 인용이다. 문자열을 닫는 중입니까 (이 경우 wtf) 아니면 닫는 중괄호를 피하는 방법입니까?
Steve Bennett

흠, 좋아, 그래서이 맥락 join`에서 동일합니다 join('. 그렇게 할 줄 몰랐어요.
Steve Bennett

아, 이제 알겠습니다. 태그가 지정된 템플릿 리터럴입니다. 하나의 문자열 인수를 사용하고 다른 문자는 무시하는 함수를 호출 할 때마다 몇 개의 문자를 저장하는 것을 남용 할 수 있습니다 array.join` `. 템플릿 문자열에 포함시키기 때문에 혼란 스럽습니다. 더 혼란스럽게도 결합 문자열은 },{우연히 템플릿 문자열의 일부처럼 보였으며 어쨌든 이상하고 추악합니다. :)
Steve Bennett


1

Mathematica 62 바이트

(Y={}~Table~Max@#;Y[[#[[j]]]]~AppendTo~j~Table~{j,Tr[1^#]};Y)&

내가 당신을 위해 그것을 실행합니다

(Y={}~Table~Max@#;Y[[#[[j]]]]~AppendTo~j~Table~{j,Tr[1^#]};Y)&[{4,5,2,3,3,8,6,3}]

{{}, {3}, {4, 5, 8}, {1}, {2}, {7}, {}, {6}}

온라인으로 시도하십시오 (Ctrl-v로 코드를 붙여 넣고 Shift + Enter를 누르십시오)
위의 예와 같이 끝에 입력 목록을 붙여 넣는 것을 잊지 마십시오


PPCG에 오신 것을 환영합니다! 에 대한 표기법을 사용하여 바이트를 저장할 수 있습니다 AppendTo. 또한 짧거나 짧을 수도 {j,1,Length[#1]}있습니다 . A는 매우 일반적인 트릭 사용을 통해 바이트를 저장합니다 . {j,Length@#}{j,Tr[1^#]}Tr[1^#]Length
ngenisis

1

펄 6 ,  36 32  29 바이트

->\a{map {a.grep(*==$_):k},1..a.max}

시도 해봐

{map {.grep(*==$^a):k},1.. .max}

시도 해봐

{map {.grep($^a):k},1.. .max}

시도 해봐


넓히는:

{  # bare block lambda with implicit parameter 「$_」

  map

    {  # bare block lambda with placeholder parameter 「$a」

      .grep(  # grep for the values in 「$_」
        $^a   # that are equal to the currently tested value (and declare param)
      ) :k    # return the key (index) rather than the value
    },

    1 .. .max # Range from 1 to the maximum value in 「$_」

}

op 와 결합 된 1 기반 교차 연산자 ( X)+ 를 얻기 위해 0 기반 인덱스를 반환합니다 . (33 바이트)

{1 X+.grep($^a):k}

얻으려면 그것을 반환 할 설정 의 단지 추가set 가 (총 37 바이트)에

{set 1 X+.grep($^a):k}

1

R, 80 72 바이트

1- 색인, Xstdin 에서 가져 옵니다. NULL빈 집합으로 인덱스의 벡터 목록을 반환합니다 .

X=scan();Y=vector('list',max(X));Y[X]=lapply(X,function(x)which(X==x));Y

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

구 버전:

X=scan();Y=vector('list',max(X));for(i in 1:length(X))Y[[X[i]]]=c(Y[[X[i]]],i);Y

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


나는 그것이 Y=list();잘 작동 한다고 생각합니다
rturnbull

few내 대답에서 바이트를 줄이려고
JAD




0

GNU 제조사 , 214 213 208 204 바이트

X=$(MAKECMDGOALS)
M=0
P=$(eval N=$(word $1,$X))$(if $N,$(if $(shell dc -e$Nd$Mds.\>.p),$(eval M=$N),)$(eval A$N+=$1$(call $0,$(shell expr $1 + 1))),)
$(call P,1)$(foreach K,$(shell seq $M),$(info $(A$K)))

I / O : 인수를 통한 입력 배열, 공백으로 구분 된 행당 하나씩 stdout으로 출력.

$ make -f swap.mk 2 2 2

3 2 1
make: *** No rule to make target `2'.  Stop.

설명

X=$(MAKECMDGOALS)     # Input array
M=0                   # Max value encountered in X
P=$(eval
    N=$(word $1,$X))  # Get next word from X
  $(if $N,$(if $(shell dc -e$Nd$Mds.\>.p),
    $(eval M=$N),)    # Update M
    $(eval A$N+=$1    # Append index to a variable named after value
      $(call $0,      # Recurse (call returns empty string)
        $(shell expr $1 + 1))),)
$(call P,1)           # Initial call to P. 1 is the first index
$(foreach K,          # Print all values of A* variables
  $(shell seq $M),
  $(info $(A$K)))     # Uninitialized ones default to empty strings

P업데이트 전에 호출 자체를 재귀 적으로 호출 하기 때문에 세트의 인덱스 순서가 반대로 됩니다 A$2(오른쪽 평가에서 호출이 실행 됨).


않습니다 make자체 연산 할 수있는 방법이 있나요? 외부 프로그램을 호출하면 사기와 같은 느낌이들 것입니다. 아마도 더 많은 알고리즘을 해당 프로그램에 넣고 더 짧은 프로그램으로 끝날 수 있기 때문입니다.

@ ais523 없습니다. 이전 버전을 사용 bc하고 grep. 나는 또한 사용할 수 test$?. dc간결한 구문이 있지만 솔직히이 모든 것이 동일하게 느껴집니다.
eush77


0

k , 13 바이트

{(=x)@!1+|/x}

이것은 0 인덱스입니다.

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

{           } /function(x)
 (=x)         /make a map/dictionary of values to their indices
         |/x  /get maximum value in x
      !1+     /make a range from 0 to the value, inclusive
     @        /get map value at each of the values in the range
              /    0N is given where there is no result
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.