중복 범위를 채우십시오


15

하자 특별한 순서와 양의 정수의 목록, 그리고 중복되는 포함 할 수 있습니다. 양의 정수 (순서가 중요하지 않은) 의 목록을 출력하는 프로그램이나 함수를 작성 하여 과 을 병합 하면 동일한 범위의 정수 로 완전히 분할 될 수있는 가장 작은 목록이됩니다 . 여기서 는 에서 가장 큰 요소M L M [ 1 .. i ] i LLMLM[1..i]iL

하자 L = [5,3,3,2,7]. 의 최대 요소는 L입니다 7. 특정 정수가 가장 많이 발생하는 횟수는 2( 32 번 나타남)입니다. 따라서 정수 범위를에서 까지 범위를 구성 할 수 있도록 M완료 할 수 있는 목록을 출력해야 합니다 .L217

따라서 M = [1,1,2,4,4,5,6,6,7]각 정수부터 시작 1하여 시간 이 7표시 되도록 을 출력해야합니다 2.

입력 및 출력

  • 귀하의 언어로 목록과 유사한 것을 사용하십시오. 입력과 출력에 사용 된 데이터 구조는 같아야합니다.
  • 입력 목록에는 양의 정수만 포함됩니다.
  • 입력 목록이 비어 있지 않습니다.
  • 당신은 할 수 입력리스트가 정렬됩니다 가정합니다.
  • 출력 목록의 순서는 중요하지 않습니다.

테스트 사례

Input                  Output
[1]                    []
[7]                    [1, 2, 3, 4, 5, 6]
[1, 1, 1]              []
[1, 8]                 [2, 3, 4, 5, 6, 7]
[3, 3, 3, 3]           [1, 1, 1, 1, 2, 2, 2, 2]
[5, 2, 4, 5, 2]        [1, 1, 3, 3, 4]
[5, 2, 4, 5, 5]        [1, 1, 1, 2, 2, 3, 3, 3, 4, 4]
[5, 3, 3, 2, 7]        [1, 1, 2, 4, 4, 5, 6, 6, 7]

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


테스트 사례와 진술이 서로 상충되므로 명확하게 말하자면 또는 i의 가장 큰 요소는 무엇입니까? LM
Kroppeb

@Kroppeb i의 가장 큰 요소 L는 사양의 오타였습니다.
페이탈 라이즈

"L과 M을 병합하면 동일한 범위의 정수 [1..i]로 완전히 분리 될 수있는 목록이 결과 로 반환 M=[1,1,2,2,3]되는 것이 괜찮 L=[3]습니까?"
tsh

@tsh 아니요,를 반환해야합니다 [1,2]. 최소 범위 수를 나타내도록 명확하게 설명하겠습니다.
페이탈 라이즈

1
@digEmAll 완료.
페이탈 라이즈

답변:


5

젤리 , 9 바이트

Jonathan Allan 덕분에 1 바이트를 절약했습니다 . 바닥 글은 기본 링크를 호출하고 테스트 사례와 일치하도록 결과를 정렬하고 출력을 그리드로 형식화합니다.

RṀẋLƙ`Ṁœ-

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

대안

ṀRẋLƙ`Ṁœ-
RṀẋṢŒɠṀƊœ-
ṀRẋṢŒɠṀƊœ-
LƙɓṀRẋṀœ-⁸
LƙɓRṀẋṀœ-⁸

온라인 중 하나를 사용해보십시오!

설명

ṀRẋLƙ`Ṁœ- 전체 프로그램. N = 입력.
ṀR 1 ~ max (N) 범위 : [1 ... max (N)]
   Lƙ` 동일한 요소로 구성된 그룹에 대한 맵 길이.
  above 위 결과에서 각 T에 대해 범위 T를 반복합니다.
      Ṁ 최대. 기본적으로 범위 반복 최대 (^^) 번을 얻으십시오.
       –- N과의 다중 집합 차이.

7

펄 6 , 37 33 바이트

nwellnhof 덕분에 -4 바이트!

{^.keys.max+1 xx.values.max$_}

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

Bag을 가져 와서 Bag 값을 리턴하는 익명 코드 블록.

설명:

{                             } # Anonymous code block
 ^.keys.max+1  # Create a range from 1 to the maximum value of the list
              xx  # Multiply the list by:
                .values.max      # The amount of the most common element
                           $_   # Subtract the original Bag

좋은! 두 번째 피연산자를 Bag으로 강제 변환하여 몇 바이트를 절약 할 수 있습니다.{^.max+1 xx.Bag.values.max∖.Bag}
nwellnhof

@nwellnhof 아, 감사합니다! 나는 두 번째 주장이 백이 될 수 있다는 것을 몰랐다
Jo King

OTOH의 과제는 입력과 출력을위한 데이터 구조가 동일해야한다는 것입니다. 백을 입력으로 사용 {^.keys.max+1 xx.values.max∖$_}하면 다른 바이트를 저장합니다.
nwellnhof

6

R , 59 49 48 바이트

rep(s<-1:max(L<-scan()),max(y<-table(c(L,s)))-y)

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


기본적으로 두 번째 인수를 rep다르게 생성하는 55 바이트 답변이 있지만 그렇지 않으면 귀하의 것과 동일합니다. 나는 그것을 직접 게시 할 수는 있지만 당신을 먼저 보지 않으면 그것을 생각했을 것이라고 생각하지 않습니다. 나는 당신이 그것을 찾도록 도전합니다!
Giuseppe

@Giuseppe : 그의 당신의 접근 방식과 유사했다 나도 몰라,하지만 난 10 바이트 저장 : D
digEmAll

허, 아니, 나는 사용하고 split있었지만 tabulate훨씬 낫다!
주세페

흠 ... 이제 궁금합니다. 어떻게 split을 사용하셨습니까?
digEmAll

1
나는 있었다 x=max(L<-scan());rep(1:x,1:x-lengths(split(L,c(L,1:x))))같은 테스트 케이스에 대한 작업을하지 않는 추가 시험시에있는 7...
주세페


4

05AB1E , 17 16 17 바이트

¢Z¹ZLŠŠи{ðý¹vyõ.;

@ Mr.Xcoder 덕분에 -1 바이트 .
해결 방법을 버그 수정 한 후 +1 바이트

어쩌면 내가 완전히 과거 보이지만, 05AB1E 심지어 제거를 목록의 모든 요소가 있습니까 B 목록에서 ... (편집 : 그것은 참으로하지 않습니다 ..) 나는 모든 여러 번 제거하는 방법을 알고 있지만 각 한 번 .. (멀티 세트 차이)

확실히 골프를 칠 수 있습니다. 정말 마음에 들지 않습니다. tbh .. 설명을 추가하기 전에 골프를 좀 더 할 수 있는지 알아볼 것입니다. 편집 : 설명을 추가했습니다 ..

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

¢         # Get the occurrences for each item in the (implicit) input-List
          #  i.e. [5,3,3,2,7] → [1,2,2,1,1]
 Z        # And get the maximum
          #  i.e. [1,2,2,1,1] → 2
¹Z        # Also get the maximum from the input-list itself
          #  i.e. [5,3,3,2,7] → 7
  L       # And create a list in the range [1, max]
          #  i.e. 7 → [1,2,3,4,5,6,7]
ŠŠ        # Two triple-swaps so the stack order becomes:
          # trash we don't need; ranged list; occurrence max
  и       # Repeat the ranged list the occurence amount of times
          #  i.e. [1,2,3,4,5,6,7] and 2 → [1,2,3,4,5,6,7,1,2,3,4,5,6,7]

          #Now the work-around bit because 05AB1E lacks a builtin for multiset difference..
{         # Sort the list
          #  i.e. [1,2,3,4,5,6,7,1,2,3,4,5,6,7] → [1,1,2,2,3,3,4,4,5,5,6,6,7,7]
 ðý       # Join this list by spaces
          #  i.e. [1,1,2,2,3,3,4,4,5,5,6,6,7,7] → '1 1 2 2 3 3 4 4 5 5 6 6 7 7'
   ¹v     # Loop `y` over the input-List:
     yõ.; # Replace every first occurrence of `y` with an empty string
          #  i.e. '1 1 2 2 3 3 4 4 5 5 6 6 7 7' and 3 → '1 1 2 2  3 4 4 5 5 6 6 7 7'

당신을 찾고 K a,b Push a without b's있습니까? 아 잠깐만, "각각 한 번씩"... 흠
Jonathan Allan

@JonathanAllan 아니요, 작동하지 않습니다 . 각 항목의 첫 번째 항목이 아닌 모든 항목을 제거 합니다 . Kevin은 다중 집합의 차이와 같은 것을 찾고 있습니다
Mr. Xcoder

@JonathanAllan 거의. [1,2,3,4,5,6,7,1,2,3,4,5,6,7][5,3,3,2,7]K결과 [1,4,6,1,4,6]불행하게도. 다중 집합 차이를 수행하는 대신 모든 항목을 제거합니다.
Kevin Cruijssen

1
¢ZIZLŠŠи1 바이트를 저장해야합니다
Mr. Xcoder

@ Mr.Xcoder 고마워하지만, 내가 골프를 찾는 부분은 아니 었습니다. ; p 카운트 후 액세스를 제거하는 것보다 2 개의 3 중 스왑이 얼마나 짧은 지 재미 있음.
Kevin Cruijssen

3

R , 59 55 바이트

vecsets패키지를 사용하면 응답 길이를 약간 줄일 수 있습니다. 함께 gl우리 정렬 된 출력을 얻을 수 있습니다. TIO에서는 작동하지 않습니다. 함수 정의가없는 @digEmAll의 (아주 영리한) 솔루션 스타일을 따르면 55 바이트 솔루션으로 간주 될 수 있습니다.

vecsets::vsetdiff(c(gl(m<-max(L<-scan()),sum(L==m))),L)

f=function(x){scan<-function()x
vecsets::vsetdiff(c(gl(m<-max(L<-scan()),sum(L==m))),L)
}

f(c(1))                # expected: integer(0)
f(c(7))                # expected: c(1, 2, 3, 4, 5, 6)
f(c(1, 1, 1))          # expected: integer(0)
f(c(1, 8))             # expected: c(2, 3, 4, 5, 6, 7)
f(c(3, 3, 3, 3))       # expected: c(1, 1, 1, 1, 2, 2, 2, 2)
f(c(5, 2, 4, 5, 2))    # expected: c(1, 1, 3, 3, 4)
f(c(5, 2, 4, 5, 5))    # expected: c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4)

2
digEmAll의 답변은 완벽하게 유효합니다. stdin을 통한 입력이 필요합니다!
주세페

1
또한 이것은 기본 R이 아니므로 별도의 언어 "R + vecsets"로 간주되어야합니다 (관련 메타 토론을 찾을 수 없지만 표준 관행임을 알 수 있습니다)
Giuseppe

1
최대 값이 최대 반복 값이 아닌 경우에 실패합니다. 예 : tryf(c(5,3,3,2,7))
digEmAll

3

JavaScript (ES6), 98 바이트

이것은 100 바이트 이하로 골프를 치는 것은 꽤 어려운 것으로 판명되었습니다. 더 나은 접근 방식이있을 수 있습니다.

a=>(a.map(o=M=m=n=>m=(c=o[M=n<M?M:n,n]=-~o[n])<m?m:c),g=k=>k?o[k]^m?[...g(k,o(k)),k]:g(k-1):[])(M)

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

어떻게?

먼저 입력 배열 a[]을 살펴 보고 다음 데이터를 수집합니다.

  • M = 입력 배열에서 발견 된 가장 높은 요소
  • m = 동일한 요소의 최대 발생 횟수
  • o[n] = 발생 횟수 n

참고 o주로 함수로서 정의되어 있지만, 기본 객체도 발생 횟수를 저장하는 데 사용된다.

a.map(                      // a[] = input array()
  o =                       // o = callback function of map()
  M = m =                   // initialize m and M to non-numeric values
  n =>                      // for each value n in a[]:
    m = (                   //   this code block will eventually update m
      c = o[                //     c = updated value of o[n]
        M = n < M ? M : n,  //     update M to max(M, n)
        n                   //     actual index into o[]
      ] = -~o[n]            //     increment o[n]
    ) < m ?                 //   if o[n] is less than m:
      m                     //     let m unchanged
    :                       //   else:
      c                     //     set it to c
)                           // end of map()

그런 다음 재귀 함수 g()를 사용하여 출력을 빌드합니다.

(g = k =>                   // k = current value
  k ?                       // if k is not equal to 0:
    o[k] ^ m ?              //   if o[k] is not equal to m:
      [ ...g(k, o(k)),      //     increment o[k] and do a recursive call with k unchanged
        k ]                 //     append k to the output
    :                       //   else:
      g(k - 1)              //     do a recursive call with k - 1
  :                         // else:
    []                      //   stop recursion
)(M)                        // initial call to g() with k = M

3

하스켈, 72 바이트

import Data.List
f l=(last(sortOn(0<$)$group$sort l)>>[1..maximum l])\\l

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

            sort l      -- sort input list
       group            -- group identical elements
   sortOn(0<$)          -- sort by length
 last                   -- take the last element, i.e. the list
                        -- of the most common element
      >>[1..maximum l]  -- replace each of it's elements
                        -- with the list [1..maximum l]
  \\l                   -- remove elements of the input list

3

Brachylog , 18 17 바이트

⌉⟦₁;Ij₎R⊇p?;.cpR∧

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

@Kroppeb 덕분에 1 바이트를 절약했습니다.

설명

⌉                  Take the largest element in the Input
 ⟦₁                 Construct the range [1, …, largest element in the Input]
   ;Ij₎R            Juxtapose that range to itself I times, I being unknown; 
                       call the result R
       R⊇p?         The Input must be an ordered subset of R, up to a permutation
          ?;.c      Concatenate the Input and the Output 
                       (the Output being unknown at this point)
              pR    This concatenation must result in R, up to a permutation
                ∧   (Find a fitting value for the Output that verifies all of this)

1
대신 사용할 수 있습니다ot
Kroppeb

2

자바 10, 186 바이트

import java.util.*;L->{Integer m=0,f=0,t;for(int i:L){m=i>m?i:m;f=(t=Collections.frequency(L,i))>f?t:f;}var r=new Stack();for(;m>0;m--)for(t=f;t-->0;)if(!L.remove(m))r.add(m);return r;}

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

설명:

import java.util.*;   // Required import for Collections and Stack
L->{                  // Method with Integer-list as both parameter and return-type
  Integer m=0,        //  Max, starting at 0
          f=0,        //  Max frequency, starting at 0
          t;          //  Temp integer
  for(int i:L){       //  Loop over the input-List
    m=i>m?i:m;        //   If the current item is larger than the max, set it as new max
    f=(t=Collections.frequency(L,i))>f?t:f;}
                      //   If the current frequency is larger than the max freq, set it as new max
  var r=new Stack();  //  Result-List
  for(;m>0;m--)       //  Loop the maximum in the range [m,0)
    for(t=f;t-->0;)   //   Inner loop the frequency amount of times
      if(!L.remove(m))//    Remove `m` from the input list
                      //    If we were unable to remove it:
        r.add(m);     //     Add it to the result-List
  return r;}          //  Return the result-List



2

MATL , 14 바이트

입력 값은 ;구분 기호 가있는 열 벡터 입니다.

llXQtn:yX>b-Y"

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 ( --빈 출력을 식별 할 수 있도록 각 출력 후에 표시됨 ).

설명

[5; 2; 4; 5; 5]예를 들어 입력 을 고려하십시오 .

llXQ     % Implicit input. Accumarray with sum. This counts occurrences
         % of each number, filling with zeros for numbers not present
         % STACK: [0; 1; 0; 1; 3]
tn:      % Duplicate, number of elements, range
         % STACK: [0; 1; 0; 1; 3], [1 2 3 4 5]
yX>      % Duplicate from below, maximum of array
         % STACK: [0; 1; 0; 1; 3], [1 2 3 4 5], 3 
b        % Bubble up
         % STACK: [1 2 3 4 5], 3, [0; 1; 0; 1; 3] 
-        % Subtract, element-wise
         % STACK: [1 2 3 4 5], [3; 2; 3; 2; 0] 
Y"       % Repelem (run-length decode). Implicit display
         % STACK: [1 1 1 2 2 3 3 3 4 4]


1

, 19 바이트

F…·¹⌈θE⁻⌈Eθ№θκ№θιIι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 정수가 양수가 아닌 음수가 아닌 경우 16 바이트 였을 것입니다. 설명:

     θ              First input
    ⌈               Maximum
 …·¹                Inclusive range starting at 1
F                   Loop over range
          θ         First input
         E          Loop over values
            θ       First input
             κ      Inner loop value
           №        Count occurrences
        ⌈           Maximum
               θ    First input
                ι   Outer loop value
              №     Count occurrences
       ⁻            Subtract
      E             Map over implicit range
                  ι Current value
                 I  Cast to string
                    Implicitly print on separate lines


1

프롤로그 (SWI) , 211 바이트

프롤로그에서 프로그래밍한지 오래되었습니다. 확실히 더 골프를 칠 수는 있지만 하하하를 위해 공부하는 시험이 있습니다.

암호

f(L,X):-max_list(L,M),f(L,M,[],X,M).
f([],0,_,[],_).
f(L,0,_,A,M):-f(L,M,[],A,M).
f([],I,H,[I|A],M):-N is I-1,f(H,N,[],A,M).
f([I|R],I,H,A,M):-append(H,R,S),f(S,I,[],[I|A],M).
f([H|R],I,G,A,M):-f(R,I,[H|G],A,M).

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

언 골프 버전

f(List, Result) :- 
    max_list(List, MaxIndex), 
    f(List, MaxIndex, [], Result, MaxIndex).

f([], 0, _, [], _).

f(List, 0, _, Acc, MaxIndex) :- 
    f(List, MaxIndex, [], Acc, MaxIndex).

f([], Index, History, [Index | Acc], MaxIndex) :- 
    NewIndex is Index - 1, f(History, NewIndex, [], Acc, MaxIndex).

f([Index | Remaining], Index, History, Acc, MaxIndex) :-
    append(History, Remaining, Result),
    f(Result, Index, [], [Index | Acc], MaxIndex).

f([Head | Remaining], Index, History, Acc, MaxIndex) :- 
    f(Remaining, Index, [Head | History], Acc, MaxIndex).

1
놀랍게도 그렇게 길지 않았습니다!
Fatalize

1

클로저, 94 바이트

#(for[F[(frequencies %)]i(range 1(+(apply max %)1))_(range(-(apply max(vals F))(or(F i)0)))]i)

1

C ++, 234 바이트

#include<vector>
#include<map>
using X=std::vector<int>;
X f(X x){int q,z;q=z=0;std::map<int,int>y;X o;
for(auto i:x)++y[i];for(auto i:y)q=q>i.second?q:i.second;
for(;++z<=y.rbegin()->first;)for(;y[z]++<q;)o.push_back(z);return o;}

(함수 본문의 줄 바꿈은 가독성을위한 것입니다).

이 함수는 정수 벡터를 가져와 반환합니다. 그것은 활용 std::map각각 별개의 요소의 발생을 카운트 또한 입력 목록의 최대 요소를 찾아 내고하십시오.

설명:

// necessary includes. Note that each of these is longer than whole Jelly program!
#include <vector>
#include <map>

// this type occurs three times in the code
using X = std::vector<int>;

// The function
X f (X x)
{
   // initialize some variables
   int q, z; // q will hold the max count
   q = z = 0;
   std::map <int, int> y; // The map for sorting
   X o; // The output vector

   // Populate the map, effectively finding the max element and counts for all of them
   for (auto i : x)
       ++y[i];

   // find the max count
   for (auto i : y)
       q = q > i.second ? q : i.second;

   // Populate the output vector

   // Iterate all possible values from 1 to the max element (which is the key at y.rbegin ())
   // Note that z was initialized at 0, so we preincrement it when checking the condition
   for (; ++z <= y.rbegin ()->first;)
       // for each possible value, append the necessary quantity of it to the output
       for(; y[z]++ < q;)
           o.push_back (z);

   return o;
}


1

C (gcc) , 177 바이트

입력 및 출력은 stdin 및 stdout을 통해 수행됩니다. 두 배열 모두 2 ^ 15 요소로 제한되지만 2 ^ 99 요소만큼 클 수 있습니다.

f(j){int n=0,m=0,i=0,a[1<<15],b[1<<15]={0};for(;scanf("%i",&a[i])>0;i++)j=a[i],m=j>m?j:m,b[j-1]++;for(i=m;i--;)n=b[i]>n?b[i]:n;for(i=m;i--;)for(j=n-b[i];j--;)printf("%i ",i+1);}

몇 가지 형식으로 :

f(j){
  int n=0, m=0, i=0, a[1<<15], b[1<<15]={0};
  for(;scanf("%i",&a[i])>0;i++) j=a[i], m=j>m?j:m, b[j-1]++;
  for(i=m;i--;) n=b[i]>n?b[i]:n;
  for(i=m;i--;) for(j=n-b[i];j--;) printf("%i ",i+1);
}

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

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