Isi hingga rentang duplikat

15

Biarkan menjadi daftar bilangan bulat positif tanpa urutan tertentu, dan yang dapat berisi duplikat. Tulis sebuah program atau fungsi yang menampilkan daftar bilangan bulat positif (yang urutannya tidak penting) sehingga penggabungan dan menghasilkan daftar terkecil yang seluruhnya dapat dibagi menjadi rentang identik bilangan bulat [ 1 .. i ] , di mana i adalah elemen terbesar di LM L MLMLM[1..i]iL

Contoh

Mari L = [5,3,3,2,7]. Elemen maksimum Ladalah 7. Yang paling sering terjadi bilangan bulat spesifik adalah 2( 3muncul 2 kali). Oleh karena itu, kita perlu menampilkan daftar Myang akan memungkinkan untuk menyelesaikan Lsehingga kita dapat membangun 2rentang bilangan bulat dari 1ke 7.

Oleh karena itu, kita perlu output M = [1,1,2,4,4,5,6,6,7], sehingga setiap bilangan bulat dari 1ke 7muncul 2kali.

Masukan dan keluaran

  • Gunakan apa pun dalam bahasa Anda yang mirip dengan daftar. Struktur data yang digunakan untuk input dan output harus sama.
  • Daftar input hanya akan berisi bilangan bulat positif.
  • Daftar input tidak akan kosong.
  • Anda tidak dapat menganggap daftar input diurutkan.
  • Pemesanan dalam daftar output tidak penting.

Uji kasus

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]

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Untuk lebih jelasnya, karena kasus uji dan pernyataan Anda saling bertentangan, apakah ielemen terbesar Latau M?
Kroppeb
@ Kalpeb iadalah elemen terbesar L, itu salah ketik dalam spesifikasi.
Fatalkan
Apakah boleh kembali M=[1,1,2,2,3]untuk L=[3]sementara "menggabungkan L dan M menghasilkan daftar yang sepenuhnya dapat dibagi menjadi rentang identik bilangan bulat [1..i]"?
tsh
@ tt Tidak, itu harus kembali [1,2]. Saya akan mengklarifikasi sehingga jelas harus menghasilkan jumlah minimum rentang.
Fatalkan
1
@digEmAll Selesai.
Fatalkan

Jawaban:

5

Jelly , 9 byte

Disimpan 1 byte berkat Jonathan Allan . Footer memanggil tautan utama, mengurutkan hasil untuk mencocokkan kasus uji dan memformat output sebagai kisi.

RṀẋLƙ`Ṁœ-

Cobalah online! atau Lihatlah test suite!

Alternatif

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

Coba salah satunya online!

Penjelasan

ṀRẋLƙ`Ṁœ- Program lengkap. N = Input.
ṀR Rentang dari 1 hingga maks (N): [1 ... maks (N)]
   Lƙ` Panjang peta di atas grup yang dibentuk oleh elemen identik.
  ẋ Ulangi rentang T kali, untuk setiap T dalam hasil di atas.
      Ṁ Maksimum. Pada dasarnya, dapatkan rentang ulangi maks (^^) kali.
       œ- Perbedaan multiset dengan N.
Tuan Xcoder
sumber
7

Perl 6 , 37 33 byte

-4 byte terima kasih kepada nwellnhof!

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

Cobalah online!

Blok kode anonim yang mengambil Tas dan mengembalikan Tas nilai.

Penjelasan:

{                             } # 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
Jo King
sumber
Bagus! Anda dapat menyimpan beberapa byte dengan memaksa operan kedua ke Bag:{^.max+1 xx.Bag.values.max∖.Bag}
nwellnhof
@nwellnhof Ah, terima kasih! Saya tidak menyadari argumen kedua bisa menjadi Tas
Jo King
OTOH, tantangannya mensyaratkan bahwa struktur data untuk input dan output harus sama. Dengan Tas sebagai input, {^.keys.max+1 xx.values.max∖$_}simpan byte lain.
nwellnhof
6

R , 59 49 48 byte

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

Cobalah online!

menggali semua
sumber
Saya punya jawaban 55 byte yang pada dasarnya menghasilkan argumen kedua repberbeda, tetapi sebaliknya sama dengan Anda. Saya dapat mempostingnya sendiri tetapi saya tidak berpikir saya akan memikirkannya kecuali saya sudah melihat milik Anda terlebih dahulu. Saya menantang Anda untuk menemukannya!
Giuseppe
@ Giuseppe: Saya tidak tahu apakah itu mirip dengan pendekatan Anda, tapi saya menyimpan 10 byte: D
digEmAll
ya, tidak, saya menggunakan splittetapi tabulatejauh lebih baik!
Giuseppe
mmh ... sekarang saya penasaran, bagaimana Anda menggunakan split untuk ini?
digEmAll
1
Saya punya x=max(L<-scan());rep(1:x,1:x-lengths(split(L,c(L,1:x))))yang pada pengujian lebih lanjut tidak bekerja untuk kasus uji seperti 7...
Giuseppe
5

Python 2 , 86 83 80 72 byte

def f(l):m=range(1,max(l)+1)*max(map(l.count,l));map(m.remove,l);print m

Cobalah online!

TFeld
sumber
4

05AB1E , 17 16 17 byte

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

-1 byte terima kasih kepada @ Mr.Xcoder .
+1 byte setelah memperbaiki bug-perbaikan ..

Mungkin saya benar-benar melihat melewatinya, tetapi apakah 05AB1E bahkan memiliki menghapus semua elemen daftar b dari daftar a .. (EDIT: Memang tidak ..) Saya tahu bagaimana menghapus semua beberapa kali, tetapi tidak masing-masing sekali .. (perbedaan multiset)

Pasti bisa main golf. Tidak terlalu senang dengan itu, tbh .. Akan kulihat apakah aku bisa bermain golf lagi sebelum menambahkan penjelasan. EDIT: Menambahkan penjelasan ..

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

¢         # 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'
Kevin Cruijssen
sumber
Apakah Anda mencari K a,b Push a without b's:? Oh, tunggu, "masing-masing sekali" ... hmm
Jonathan Allan
@JonathanAllan Tidak, itu tidak akan berhasil, itu menghapus semua kejadian daripada kejadian pertama masing-masing. Kevin mencari sesuatu seperti perbedaan multiset
Tn. Xcoder
@JonathanAllan Almost. [1,2,3,4,5,6,7,1,2,3,4,5,6,7]dan [5,3,3,2,7]dengan Khasil [1,4,6,1,4,6]sayangnya. Ini menghapus semua item alih-alih melakukan perbedaan multiset.
Kevin Cruijssen
1
¢ZIZLŠŠиharus menyimpan 1 byte
Tn. Xcoder
@ Mr.Xcoder Terima kasih, tapi itu bukan bagian yang saya cari golf. ; p Lucu bagaimana dua triple-swap lebih pendek daripada menghapus akses setelah penghitungan ..
Kevin Cruijssen
3

R , 59 55 byte

Dengan menggunakan vecsetspaket tersebut, kita dapat memberikan sedikit jawaban. Dengan glkita bisa mendapatkan output yang dipesan. Ini tidak berfungsi di TIO. Mengikuti solusi gaya @ digEmAll (agak pintar) tanpa definisi fungsi, ini dapat dianggap sebagai solusi 55 byte.

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)
J.Apakah
sumber
2
Jawaban digEmAll benar-benar valid; dibutuhkan input melalui stdin!
Giuseppe
1
Juga, karena ini bukan basis R, ini harus dianggap sebagai bahasa terpisah "R + vecsets" (Saya tidak dapat menemukan diskusi meta yang relevan untuk itu, tapi saya tahu itu praktik standar)
Giuseppe
1
Ini gagal ketika nilai maksimum bukan yang diulang maksimum, misalnya cobaf(c(5,3,3,2,7))
digEmAll
3

JavaScript (ES6), 98 byte

Ini ternyata cukup sulit untuk bermain golf di bawah 100 byte. Mungkin ada pendekatan yang lebih baik.

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)

Cobalah online!

Bagaimana?

Kami pertama kali berjalan melalui array input a[]untuk mengumpulkan data berikut:

  • M = elemen tertinggi yang ditemukan dalam array input
  • m = jumlah kemunculan tertinggi dari elemen yang sama
  • o[n] = jumlah kemunculan n

Catatan yang oterutama didefinisikan sebagai fungsi, tetapi objek yang mendasarinya juga digunakan untuk menyimpan jumlah kejadian.

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()

Kami kemudian menggunakan fungsi rekursif g()untuk membangun output.

(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
Arnauld
sumber
3

Haskell, 72 byte

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

Cobalah online!

            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
nimi
sumber
3

Brachylog , 18 17 byte

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

Cobalah online!

Disimpan 1 byte berkat @ Kalpeb.

Penjelasan

⌉                  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)
Fatalisasi
sumber
1
Anda dapat menggunakan sebagai gantinyaot
Kroppeb
2

Java 10, 186 byte

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

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
2

MATL , 24 21 byte

X>:GS&Y'X>yGhS&Y'q-Y"

Cobalah online!

sundar - Pasang kembali Monica
sumber
2

MATL , 14 byte

Input adalah vektor kolom, dengan ;sebagai pemisah.

llXQtn:yX>b-Y"

Cobalah online! Atau verifikasi semua kasus uji (ini ditampilkan --setelah setiap output sehingga output kosong dapat diidentifikasi).

Penjelasan

Pertimbangkan input [5; 2; 4; 5; 5]sebagai contoh.

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]
Luis Mendo
sumber
1

Arang , 19 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Akan menjadi 16 byte jika bilangan bulat non-negatif, bukan positif. Penjelasan:

     θ              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
Neil
sumber
1

Prolog (SWI) , 211 byte

Sudah lama sejak saya memprogram di Prolog. Pasti bisa bermain golf lebih lanjut, tapi saya punya ujian untuk belajar hahaha.

Kode

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).

Cobalah online!

Versi tidak disatukan

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).
Adnan
sumber
1
Anehnya tidak selama itu!
Fatalkan
1

Clojure, 94 byte

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

C ++, 234 byte

#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;}

(Baris baru di badan fungsi adalah agar mudah dibaca).

Fungsi ini mengambil dan mengembalikan vektor int. Itu memanfaatkanstd::map untuk menemukan elemen maks dari daftar input dan juga untuk menghitung kemunculan setiap elemen yang berbeda.

Penjelasan:

// 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;
}
Max Yekhlakov
sumber
1

Gaia , 12 byte

::⌉┅¤:C¦⌉&¤D

Cobalah online!

Tuan Xcoder
sumber
1

C (gcc) , 177 byte

Input dan output dilakukan melalui stdin dan stdout. Kedua array dibatasi pada 2 ^ 15 elemen, tetapi mereka bisa sebesar 2 ^ 99 elemen.

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);}

Dengan beberapa format:

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);
}

Cobalah online!

Curtis Bechtel
sumber