동일한 일련의 각 숫자를 제자리에 열거


27

엄격하게 양의 정수 목록이 제공되면 각각의 고유 한 숫자를 살펴보고 모든 발생을 새로운 계열의 연속 인덱스 (0 또는 1 기준)로 바꿉니다.

[][]/[]

[42][0]/[1]

[7,7,7][0,1,2]/[1,2,3]

[10,20,30][0,0,0]/[1,1,1]

[5,12,10,12,12,10][0,0,0,1,2,1]/[1,1,1,2,3,2]

[2,7,1,8,2,8,1,8,2,8][0,0,0,0,1,1,1,2,2,3]/[1,1,1,1,2,2,2,3,3,4]

[3,1,4,1,5,9,2,6,5,3,5,9][0,0,0,1,0,0,0,0,1,1,2,1]/[1,1,1,2,1,1,1,1,2,2,3,2]


2
기본적으로 지금까지 시퀀스가 ​​나타난 횟수는?
조 왕

1
@JoKing 네, 그것은 그것을 표현하는 또 다른 방법입니다. 그러나 "지금까지"는 0부터 시작하는 것을 의미하고 "이것을 포함하고 포함 할 때까지"는 1부터 시작합니다. 나는 선택을 유지하고 싶었다.
Adám

답변:


23

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

1- 색인.

a=>a.map(o=x=>o[x]=-~o[x])

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

댓글

a =>                // a[] = input array
  a.map(o =         // assign the callback function of map() to the variable o, so that
                    // we have an object that can be used to store the counters
    x =>            // for each value x in a[]:
      o[x] = -~o[x] //   increment o[x] and yield the result
                    //   the '-~' syntax allows to go from undefined to 1
  )                 // end of map()

1
나는 그것이 어떻게 작동하는지 전혀 모른다. 그러나 그것은 우아하게 보인다.
Adám

나는 -~전에 본 적이 없다 -그것은 절대적인 보석이다.
DaveMongoose

또는, 사용할 수의 a값을 저장할 수 있지만에 필요한 것 -/ ~더 바이트가 저장되지 않도록 인덱스입니다.
user202729


1
@DaveMongoose는 -~사실에 일반적으로 사용되는 대안이 +1여러 언어 (서로 다른 우선 순위가 있기 때문에)
ASCII 전용

10

R , 27 바이트

function(x)ave(x,x,FUN=seq)

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

설명 :

ave(x,x,FUN=seq)그룹화 키 x값을 사용하여 벡터 를 하위 벡터 로 분할 x합니다. 그런 다음 seq각 그룹에 대해 함수가 호출되고 각 결과는 원래 그룹 위치로 다시 정렬됩니다.

예를 더 잘보십시오.

x <- c(5,7,5,5,7,6)
ave(x, x, FUN=seq) # returns 1,1,2,3,2


 ┌───┬───┬───┬───┬───┐57557
 └───┴───┴───┴───┴───┘            
   |   |   |    |  |     |   ▼    ▼  |
 GROUP A : seq(c(5,5,5)) = c(1,2,3)
   |   |   |    |  |     |   ▼    ▼  |
 ┌───┐ | ┌───┬───┐ |1|23|
 └───┘ | └───┴───┘ |
       ▼           ▼
 GROUP B : seq(c(7,7)) = c(1,2)
       |           |
       ▼           ▼
     ┌───┐       ┌───┐1 │       │ 2
     └───┘       └───┘ 

   |   |   |   |   |
   ▼   ▼   ▼   ▼   ▼ 
 ┌───┬───┬───┬───┬───┐11232
 └───┴───┴───┴───┴───┘  

노트 :

seq(y)연속 함수가 리턴 1:length(y)경우는 y가지고 length(y) > 1있지만, 복귀에서 서열 1:y[1]경우 y단지 하나의 요소를 포함한다.
이 경우 R- 많은 경고로 불평- 우연히 우리가 원하는 것의 첫 번째 값 만 선택 하기 때문에 이것은 문제가되지 않습니다. :)


2
훌륭한! 이에 대한 현상금을 추가하겠습니다. ave전에 본 적이 없습니다 .
주세페

영광입니다, 정말 고마워요! :)
digEmAll

6

MATL , 4 바이트

&=Rs

이 솔루션은 1 기반입니다

MATL Online 에서 사용해보십시오 !

설명

용도 [1,2,3,2]예를 들어

    # Implicitly grab the input array of length N
    #
    #   [1,2,3,2]
    #
&=  # Create an N x N boolean matrix by performing an element-wise comparison
    # between the original array and its transpose:
    #
    #     1 2 3 2
    #     -------
    # 1 | 1 0 0 0
    # 2 | 0 1 0 1
    # 3 | 0 0 1 0
    # 2 | 0 1 0 1
    #
R   # Take the upper-triangular portion of this matrix (sets below-diagonal to 0)
    #
    #   [1 0 0 0
    #    0 1 0 1
    #    0 0 1 0
    #    0 0 0 1]
    #
s   # Compute the sum down the columns
    #
    #   [1,1,1,2]
    #
    # Implicitly display the result

2
아, 나는 비슷한 것을 생각하게하는 오래된 문제가 있다는 것을 알고 있었고, Unique is Cheap이고, MATL 솔루션 에는 한 문자가 다릅니다!
주세페

5

APL (Dyalog 유니 코드) , 7 바이트

디버깅 및 수정에 도움을 주신 H.PWiz, Adám 및 dzaima에게 감사드립니다.

+/¨⊢=,\

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

설명

10 바이트의 무소음 버전이 먼저 설명하기 쉬울 것입니다

{+/¨⍵=,\⍵}

{         } A user-defined function, a dfn
      ,\⍵  The list of prefixes of our input list 
           (⍵ more generally means the right argument of a dfn)
           \ is 'scan' which both gives us our prefixes 
           and applies ,/ over each prefix, which keeps each prefix as-is
    ⍵=     Checks each element of  against its corresponding prefix
           This checks each prefix for occurrences of the last element of that prefix
           This gives us several lists of 0s and 1s
 +/¨       This sums over each list of 0s and 1s to give us the enumeration we are looking for

암묵적인 버전은 세 가지 일을한다

  • 첫째, 그것은 인스턴스 제거 에 사용 ,\⍵으로 ,\암시 적으로 적절한 인수에서 작동하도록 해야하는 것을 알아낼 수 자체 오른쪽에 있습니다.
  • 대한 둘째, ⍵=우리는 교체 오른쪽 인자를 의미하는,
  • 셋째, 이제 명시 적 인수 (이 경우 ) {}가 없으므로 암묵적 함수가이를 사용하지 않으므로 중괄호 를 제거 할 수 있습니다.


5

J , 7 바이트

1#.]=]\

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

1- 색인.

설명:

]\ all the prefixes (filled with zeros, but there won't be any 0s in the input):
   ]\ 5 12 10 12 12 10
5  0  0  0  0  0
5 12  0  0  0  0
5 12 10  0  0  0
5 12 10 12  0  0
5 12 10 12 12  0
5 12 10 12 12 10

]= is each number from the input equal to the prefix:
   (]=]\) 5 12 10 12 12 10
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 1 0 1 0 0
0 1 0 1 1 0
0 0 1 0 0 1

1#. sum each row:
   (1#.]=]\) 5 12 10 12 12 10
1 1 1 2 3 2

K (oK) , 11 10 바이트

ngn 덕분에 -1 바이트!

{+/'x=,\x}

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


1
Heh, 당신은 내가 데이터를 엄격하게 긍정적으로
만들게되어 기쁘다

@ Adám 예, 그렇지 않으면 접두사를 입력해야합니다. :)
Galen Ivanov

1
k : ='->=
ngn






2

R , 41 바이트

function(x)diag(diffinv(outer(x,x,"==")))

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

이상하게도, 0부터 시작하는 인덱스 반환은 R에서 더 짧습니다.


다시 한 번 주세페, R에 대한 당신의 뛰어난 지식이 저를 이겼습니다. 나는 60 바이트에서 상당히 독창적 인 방법을 사용했지만 아쉽게도 충분하지 않았습니다!
Sumner

@ Sumner18 어쨌든 게시! 나는 항상 다른 사람들의 접근 방식에서 많은 것을 배우고 피드백을 얻는 것이 가장 빠른 방법입니다!
주세페

격려해 주셔서 감사합니다! 나는 지금 내 글을 올렸고 개선을위한 제안에 항상 열려 있습니다!
Sumner

2

루비, 35 바이트

->a{f=Hash.new 0;a.map{|v|f[v]+=1}}

불행히도 그것은 평범한 일입니다. 지금까지 발생한 각 항목의 총계를 저장하는 해시를 작성하십시오.

불행히도 다른 재미있는 옵션은 충분히 짧지 않았습니다.

->a{a.dup.map{a.count a.pop}.reverse}   # 37
->a{i=-1;a.map{|v|a[0..i+=1].count v}}  # 38

2

R , 62 43 바이트

x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z

Giuseppe 덕분에 -19 바이트, which 및 table을 제거하고 구현에 약간의 변경 사항 만 있음

기발한

x=z=scan();for(i in names(r<-table(x)))z[which(x==i)]=1:r[i];z

주세페의 지식과 경쟁 할 수 없어서 제출 한 것이 그의 것보다 다소 길지만 기본 지식을 사용하면이 솔루션이 독창적이라고 느꼈습니다.

r<-table(x) 나중에 참조 할 수 있도록 각 숫자가 나타나는 횟수를 세고 r에 저장합니다.

names() 테이블에서 각 고유 항목의 값을 가져오고 for 루프를 사용하여 이러한 이름을 반복합니다.

나머지 부분은 반복과 동일한 항목을 확인하고 값 시퀀스 (1에서 반복의 항목 수까지)를 저장합니다.

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


which()7 바이트를 저장하기 위해를 제거 할 수 있습니다 .
주세페

당신 1:r[i]이 나에게 table()완전히 제거한다는 아이디어를주었습니다 : x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z43 바이트입니다! 이것은 좋은 접근 방법입니다!
주세페

우리 중 누구도 digEmAll의 R 지식 과 경쟁 할 수없는 것 같습니다 !
주세페

나는 그것을 보았고 절대적으로 화를 내었다!
Sumner18

2

하스켈 , 44 바이트

([]#)
x#(y:z)=sum[1|a<-x,a==y]:(y:x)#z
_#e=e

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

설명

x처음에 방문한 요소 의 목록 을 유지하면서 목록을 왼쪽에서 오른쪽으로 순회합니다 [].

y카운트 가 발생할 때마다 목록의 모든 동일한 요소 가 계산됩니다 x.


1
조금 더 길지만 어쩌면 흥미로울 것입니다 : (#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e 온라인으로 사용해보십시오!
Laikoni

@Laikoni : 어떻게 생각해 보니 완전히 게시해야합니다!
ბიმო


2

펄 6 , 15 바이트

*>>.&{%.{$_}++}

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

하나의 기반 인덱스에 대해 ++를 이전으로 이동할 수 있습니다 %.

설명:

*>>.&{        }  # Map the input to
      %          # An anonymous hash
       .{$_}     # The current element indexed
            ++   # Incremented

2

하스켈 , 47 46 바이트

(#(*0))
(x:r)#g=g x:r# \y->0^(y-x)^2+g y
e#g=e

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

조금 더 길어진 BMO의 대답 과 다른 접근법 . (그리고 좋은 시험 복을 친절하게 빌려줍니다.)

아이디어는 입력 목록을 반복하고 함수를 업데이트하여 각 요소가 발생한 횟수를 추적하는 것 g입니다. 언 골프 드 :

f (const 0)
f g (x:r) = g x : f (\ y -> if x==y then 1 + g y else g y) r
f g []    = []

두 가지 흥미로운 골프 기회가 생겼습니다. 먼저의 초기 값에 대해서는 g인수를 무시하고 다음을 반환하는 상수 함수입니다 0.

const 0  -- the idiomatic way
(\_->0)  -- can be shorter if parenthesis are not needed
min 0    -- only works as inputs are guaranteed to be non-negative
(0*)     -- obvious in hindsight but took me a while to think of

그리고 둘째로 변수에 대한 표현식 x이며 같 거나 그렇지 않으면 y산출 1합니다 .xy0

if x==y then 1else 0  -- yes you don't need a space after the 1
fromEnum$x==y         -- works because Bool is an instance of Enum
sum[1|x==y]           -- uses that the sum of an empty list is zero
0^abs(x-y)            -- uses that 0^0=1 and 0^x=0 for any positive x
0^(x-y)^2             -- Thanks to  Christian Sievers!

여전히 더 짧은 방법이있을 수 있습니다. 누구나 아이디어가 있습니까?


1
사용할 수 있습니다 0^(x-y)^2.
Christian Sievers



1

bash, 37 24 바이트

f()(for x;{ r+=$[a[x]++]\ ;};echo $r)

TIO

유효한 경우 DigitalTrauma에서 제안한대로이 변형도 있습니다.

for x;{ echo $[a[x]++];}

TIO


1
tio.run/##S0oszvj/Py2/SKHCuporNTkjX0ElOjG6IlZbO5ar9v///8b/…-24 바이트 만 명령 목록 인수로 목록을 전달하십시오 .
디지털 외상

@DigitalTrauma, 감사하지만 규칙을 어겼는지 모르겠습니다. 또한 목록을 교체하라는 요청을 받았으며
Nahuel Fouilleul

2
@NahuelFouilleul 괜찮아요, 전체 프로그램도 허용되며, 이는 목록을 입력 / 출력하는 유효한 방법입니다 (IMO)
ASCII 전용

1

펄 5, 11 바이트

$_=$h{$_}++

TIO

주석 다음 설명

  • $_입력 ( -p또는 -n스위치)을 반복 할 때 전류 라인을 포함하는 Perl의 특수 변수
  • $h{$_}++지도를 자동으로 활성화하고 %h$_와 증분으로 항목을 작성 하고 증분 전에 값을 제공합니다.
  • -p스위치로 인해 특수 변수가 인쇄되고 , -l스위치는 입력에서 라인 끝을 제거하고 출력에서 ​​라인 끝을 추가합니다

놀랍습니다. 설명 할까?
Adám

@ Adám, 여러분의 의견에 감사드립니다.
Nahuel Fouilleul



1

첨부 , 23 바이트

{`~&>Zip[_,_[0:#_::0]]}

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

설명

{`~&>Zip[_,_[0:#_::0]]}
{                     }    _: input (e.g., [5, 12, 10, 12, 12, 10])
             0:#_          range from 0 to length of input (inclusive)
                           e.g., [0, 1, 2, 3, 4, 5, 6]
                 ::0       descending range down to 0 for each element
                           e.g., [[0], [1, 0], [2, 1, 0], [3, 2, 1, 0], [4, 3, 2, 1, 0], [5, 4, 3, 2, 1, 0], [6, 5, 4, 3, 2, 1, 0]]
           _[       ]      get input elements at those indices
                           e.g., [[5], [12, 5], [10, 12, 5], [12, 10, 12, 5], [12, 12, 10, 12, 5], [10, 12, 12, 10, 12, 5], [nil, 10, 12, 12, 10, 12, 5]]
     Zip[_,          ]     concatenate each value with this array
                           e.g., [[5, [5]], [12, [12, 5]], [10, [10, 12, 5]], [12, [12, 10, 12, 5]], [12, [12, 12, 10, 12, 5]], [10, [10, 12, 12, 10, 12, 5]]]
   &>                      using each sub-array spread as arguments...
 `~                            count frequency
                               e.g. [12, [12, 10, 12, 5]] = 12 ~ [12, 10, 12, 5] = 2

1

C (gcc) , 65 62 바이트

c,d;f(a,b)int*a;{for(;c=d=b--;a[b]=d)for(;c--;d-=a[c]!=a[b]);}

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

ASCII 전용으로 -2 바이트


이것은 너무 솔직하게 느껴졌지만 다른 접근법으로는 더 짧아 질 수 없었습니다.



@ASCII 전용이 유효한 답변입니까? 헤더가 포함되어 있지 않으며 선언이 없으며 스 니펫과 출력이지만 많은 경고가 있습니다.
AZTECCO

@AZTECCO 경고는 허용되는대로하는 한 괜찮습니다 (stderr는 무시 됨). 참고이 있다는 것입니다 함수 선언, 플러스 몇 가지 변수 선언 - 당신은 최고 수준의 표현으로 어디 넣을 수 있으며 벌금을 컴파일합니다. C 응답 (덜 엄격한 구문 언어로 된 것)의 많은 않습니다 일반적 때문에 좋은 코드 스타일하지 bytesaves의 꽤 많은 경고가
ASCII 전용

좋아, 이해할 수 있지만 여전히 나에게 부적절한 것이 있습니다. 다른 크기 (크기)로 테스트하려면 인쇄 루프에서도 코드를 수정해야합니다. 또한 입력은 크기가 아니라 단지 세트 여야합니다. "엄수 양의 정수 목록을 제공합니다. "입력이 목록 일 뿐이라고 생각합니다.
AZTECCO

@AZTECCO이 토론이이 답변의 의견에 속하는지 확실하지 않지만, 특히 I / O답변 형식 에 관한 메타를 살펴볼 수 있습니다.
attinat

1

K (ngn / k) , 18 바이트

(,/.!'#'=x)@<,/.=x

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


오래된 접근법

K (ngn / k) , 27 23 22 바이트

{x[,/.=x]:,/.!'#'=x;x}

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


이것은 예쁘지 않습니다 ... 빠르고 더러운 해결책입니다. 나중에 더 나은 접근 방식을 생각할 때 이것을 정제 할 것입니다.

설명:

  • =x키가 x의 항목이고 값이 색인 ( 3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)) 인 dict를 반환합니다.
  • i: 받아쓰기 i
  • #:'각 키의 개수 값 ( 3 1 4 5 9 2 6!2 2 1 3 2 1 1)
  • !:'각 값을 열거 ( 3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0))
  • ,/.:값 추출 및 평평한 목록 ( 0 1 0 1 0 0 1 2 0 1 0 0)
  • x[,/.:i]: i에서 인덱스를 추출하고 평평하게 만들고이 인덱스의 오른쪽 목록에서 각 값을 할당합니다

짜증나게, 목록은 업데이트되지만 할당에 의해 null 값이 반환되므로 세미콜론 ( ;x) 뒤에 목록을 반환해야합니다.

편집 : 외부 콜론 제거

edit2 : 불필요한 할당 제거


0

레티 나 0.8.2 , 30 바이트

\b(\d+)\b(?<=(\b\1\b.*?)+)
$#2

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 1- 색인. 설명 : 정규식의 첫 번째 부분은 목록의 각 정수와 차례로 일치합니다. lookbehind의 그룹은 현재 정수를 포함하여 해당 행에서 해당 정수의 각 발생을 일치시킵니다. 그런 다음 정수는 일치 횟수로 대체됩니다.


0

배치, 61 바이트

@setlocal
@for %%n in (%*)do @set/ac=c%%n+=1&call echo %%c%%

1- 색인. 변수 대체는 구문 분석 전에 발생하므로, set/a명령은 문자 c를 목록의 정수 로 연결하여 주어진 변수 이름을 증가시킵니다 (숫자 변수는 기본적으로 배치에서 0으로 설정 됨). 결과는 출력을 쉽게하기 위해 다른 정수로 복사됩니다 (보다 정확하게는 바이트를 절약합니다).



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