填满重复范围


15

令是没有特定顺序的正整数列表,并且可以包含重复项。编写程序或函数,输出正整数的列表(排序不重要),这样将和合并为最小的列表,可以将其完全拆分为整数范围相同的整数,其中是最大的元素M L M [ 1 .. i ] i LLMLM[1..i]i大号

L = [5,3,3,2,7]。的最大元素L7。特定整数出现的次数最多23出现2次)。因此,我们需要输出M将允许完成的列表,L以便我们可以构造21到的整数范围7

因此,我们需要输出M = [1,1,2,4,4,5,6,6,7],以便从1to的每个整数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]

计分

这是,因此最短的答案以字节为单位。


需要明确的是,由于您的测试用例和陈述相互矛盾,所以or i的最大要素是?LM
Kroppeb

@Kroppeb i是的最大元素L,这是规范中的错字。
致命

是否确定要返回M=[1,1,2,2,3]L=[3]同时“即可以完全分割成的整数[1..i]相同的范围列表合并L和M的结果”?
tsh

@tsh不,它应该返回[1,2]。我将对其进行澄清,以便很明显它应该导致最小数量的范围。
致命的

1
@digEmAll完成。
致命的

Answers:


5

果冻,9 字节

由于乔纳森·艾伦节省了1个字节。页脚调用主链接,对结果进行排序以匹配测试用例,并将输出格式化为网格。

RṀẋLƙ`Ṁœ-

在线尝试!签出测试套件!

备择方案

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

在线尝试其中之一!

说明

ṀRẋLƙ`Ṁœ-完整程序。N =输入。
ṀR范围从1到最大(N):[1 ...最大(N)]
   在相同元素形成的组上的映射长度。
  above对上述结果中的每个T重复范围T倍。
      Ṁ最大。基本上,使范围重复max(^^)次。
       –与N的多重集差异。

7

Perl 6的37个 33字节

-4个字节感谢nwellnhof!

{^.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啊,谢谢!我不知道第二个论点可能是布袋
乔·金

OTOH,挑战在于输入和输出的数据结构必须相同。使用Bags作为输入时,{^.keys.max+1 xx.values.max∖$_}保存另一个字节。
nwellnhof

6

R59 49 48字节

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

在线尝试!


我有一个55字节的答案,该答案基本上会以rep不同的方式生成第二个参数,但其他方面与您的相同。我可以自己张贴它,但除非我先见过你,否则我不会想到的。我挑战你找到它!
朱塞佩

@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……
Giuseppe


4

05AB1E17 16 17 字节

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

-1个字节,感谢@ Mr.Xcoder
错误修复后,+ 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?哦,等等,“每一次” ...嗯
乔纳森·艾伦

@JonathanAllan不,这行不通,它将删除所有出现的事件,而不是第一次出现的所有事件。凯文(Kevin)正在寻找类似多集差异的东西
Xcoder先生,18年

@乔纳森·艾伦几乎。[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]很遗憾。它删除所有项目,而不是进行多集差异。
凯文·克鲁伊森

1
¢ZIZLŠŠи应该保存1个字节
Xcoder先生

@ Mr.Xcoder谢谢,但这不是我想要打高尔夫球的部分。,P滑稽两个三互换是如何不是删除计数后接入短..
凯文Cruijssen

3

R59 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

Haskell,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

Brachylog18 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

Java 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

Prolog(SWI),211字节

自从我在Prolog中编程以来已经有一段时间了。绝对可以打更多的高尔夫球,但是我有考试要学习哈哈哈。

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
出人意料的是,时间不长!
致命

1

Clojure,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;}

(功能体内的换行符是为了便于阅读)。

该函数接受并返回一个int向量。它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);
}

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.