Bisakah saya mengemas ulang ember?

30

Anak kecil saya punya mainan seperti ini:

Ditumpuk

Mainan ini terdiri dari 10 ember kecil yang dapat ditumpuk, yang akan kami beri nomor dari 1 (yang terkecil) hingga 10 (yang terbesar). Terkadang dia membuat tumpukan kecil dan mainan berakhir seperti ini:

Tersebar

Secara skematis kita dapat mewakili tumpukan seperti ini:

      1  6
4  9  2  7
5  10 3  8
----------  <-- Floor
1  2  3  4  <-- Pile #

Atau, dengan kata lain:

[[4,5],[9,10],[1,2,3],[6,7,8]]

Set tumpukan ember ini mudah dipasang kembali untuk membangun kembali set asli (gambar pertama) hanya dengan secara berurutan menempatkan tumpukan ember yang lebih kecil di dalam tumpukan ember yang lebih besar:

                             1                            1  6
                             2                            2  7
      1  6                   3        6                   3  8
4  9  2  7                   4  9     7                   4  9
5  10 3  8                   5  10    8                   5  10
---------- > [Pile 3 to 1] > ---------- > [Pile 4 to 2] > ---------- > [Pile 1 to 2] > Done!
1  2  3  4                   1  2  3  4                   1  2  3  4

Meskipun demikian, kadang-kadang anak saya mencoba membangun menara, atau membuang ember, dan tumpukan tersebut akhirnya menjadi tidak konsisten dan set aslinya tidak dapat dibangun kembali hanya dengan menempatkan satu tumpukan di dalam tumpukan lainnya. Contoh dari ini:

[[1,3,2],[4]] (the kid tried to build a tower by placing a bigger bucket
               over a smaller one, we would need to reorder the buckets
               first)
[[1,3,4],[2]] (the kid left aside an unordered bucket, we would need to remove
               bucket #1 from pile #1 before restacking)
[[1,2,3],[5]] (the kid lost a bucket, we need to find it first)

Tantangan

Diberikan daftar daftar bilangan bulat yang mewakili satu set tumpukan ember, kembalikan nilai yang sebenarnya jika daftar tersebut mewakili kumpulan tumpukan yang mudah diulang kembali, atau kesalahan dalam hal lain.

  • Input akan diberikan sebagai daftar daftar bilangan bulat, mewakili ember dari atas ke bawah untuk setiap tumpukan.
  • Tidak akan ada tumpukan awal yang kosong (Anda tidak akan mendapatkan [[1,2,3],[],[4,5]]input).
  • Jumlah total ember dapat berupa apa pun dalam rentang bilangan bulat yang wajar.
  • Anak saya hanya memiliki satu set ember sehingga tidak akan ada elemen rangkap.
  • Anda dapat memilih dua nilai yang konsisten (dan koheren) untuk truey atau falsey.
  • Bucket akan dilabeli dari # 1 hingga #N, menjadi Nbilangan bulat terbesar dalam daftar bilangan bulat. Anak saya masih belum tahu konsep nol.
  • Anda dapat menerima input dalam format beralasan apa pun asalkan itu mewakili setumpuk ember. Tetapkan saja dalam jawaban Anda jika Anda mengubah cara Anda menerima input.
  • Ini adalah , jadi semoga program / fungsi terpendek untuk setiap bahasa menang!

Contohnya

Input:  [[4,5],[9,10],[1,2,3],[6,7,8]]
Output: Truthy

Input:  [[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
Output: Truthy

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

Input:  [[1,2],[5,6],[7,8,9]]
Output: Falsey (buckets #3 and #4 are missing)

Input:  [[2,3,4],[5,6,7]]
Output: Falsey (bucket #1 is missing)

Input:  [[1,3,4],[5,7],[2,6]]
Output: Falsey (non-restackable piles)

Input:  [[1,4,3],[2],[5,6]]
Output: Falsey (one of the piles is a tower)
Charlie
sumber
Ini berasal dari kotak pasir .
Charlie
2
@ Mr.Xcoder tidak, tidak akan ada elemen duplikat (anak saya hanya memiliki satu set ember dan semuanya berbeda.
Charlie
1
Bolehkah kita berasumsi bahwa ember 1 tidak pernah hilang?
PurkkaKoodari
2
@ Pietu1998 bucket # 1 bisa hilang, saya baru saja menambahkan test case (pada kenyataannya, bucket terkecil adalah yang paling mudah hilang).
Charlie
1
Berbagai tantangan Menara Hanoi terkait (bukan duplikat) dari ini.
AdmBorkBork

Jawaban:

12

Jelly , 6 5 byte

Terima kasih kepada @Lynn karena telah menghemat 1 byte.

ṢFµJ⁼

Cobalah online! (dilengkapi dengan footer test-suite)

Penjelasan

ṢFµJ⁼    Main link. Argument: piles
Ṣ          Sort the piles by the size of the top bucket.
 F         Stack the piles, putting the left one to the top.
   J       See what a full pile with this many buckets would look like.
    ⁼      See if that looks like the pile you built.
PurkkaKoodari
sumber
Saya pikir ṢFµJ⁼berhasil, tapi saya belum memikirkan semua kasus tepi.
Lynn
@ Lynn Itu bekerja dengan asumsi ember 1tidak hilang. Saya tidak yakin apakah ini dijamin oleh OP.
PurkkaKoodari
@Lynn bucket # 1 bisa hilang, ya. Saya baru saja menambahkan test case baru.
Charlie
Jika ada ember yang hilang, maka daftar yang diurutkan akan selalu berisi angka yang lebih besar dari yang Jbisa dikembalikan, menjamin hasil yang salah. apakah saya melewatkan sesuatu?
Lynn
Saya pikir Anda masih dapat menggunakan versi 5-byte dengan bucket # 1 hilang?
Erik the Outgolfer
8

Python 2 , 53 52 byte

Terima kasih untuk byte xnor

lambda x:sum(sorted(x),[0])==range(len(sum(x,[]))+1)

Cobalah online!

Chris_Rands
sumber
Saya suka itu memulai penjumlahan di []. Cukup rumit
bioweasel
2
Anda dapat menyimpan byte dengan memulai penjumlahan di [0]sehingga rentang dapat mulai dari 0.
xnor
5

JavaScript (ES6), 59 58 byte

a=>!(a.sort((a,[b])=>a[i=0]-b)+'').split`,`.some(v=>v-++i)

Penjelasan

a=>                                                        // given a 2D-array 'a'
     a.sort((a,[b])=>a[i=0]-b)                             // sort by first item
                              +''                          // flatten
    (                            ).split`,`                // split again
                                           .some(v=>v-++i) // i such that a[i] != i+1?
   !                                                       // true if none was found

Uji kasus

Arnauld
sumber
5

Haskell , 37 byte

import Data.List
(<[1..]).concat.sort

Cobalah online!

Cek apakah daftar yang disatukan secara leksikografis lebih kecil dari daftar yang tak terbatas [1,2,3,...]. Karena tidak ada duplikat, setiap ember yang hilang atau ember yang tidak sesuai pesanan akan menyebabkan nilai lebih besar daripada kdi ktempat yang pertama, membuat daftar yang dihasilkan menjadi lebih besar ..

Tidak
sumber
4

Pyth, 6 byte

UItMsS

Coba di sini.

Penjelasan:

UItMsSQ
UI      Invariant from U (range(len(A)) for our purpose)
  tM     Map t (A - 1 for our purpose)
    s     s (flatten 1-deep for our purpose)
     S     S (sort for our purpose)
      Q     Q (autoinitialized to input) (implicit)
Erik the Outgolfer
sumber
Wat ?! Tambahkan penjelasan ke UIbagian itu, tolong
Tn. Xcoder
@ Mr.Xcoder U <col>adalah range(len(A)), I <pfn> <any> <n-1:any>adalah A(B, ...) == B.
Erik the Outgolfer
Kemudian saya menjadi sangat outgolf>. <. Saya mungkin golf milik saya. Jenius, solusi cemerlang, sekarang saya bisa melihat cara kerjanya ... Selamat!
Tn. Xcoder
@ Mr.Xcoder Benar-benar hanya mencari dokumen untuk hal-hal ...
Erik the Outgolfer
Tidak, tidak. Saya tahu bahwa U <col>ini range(len(A)), tapi saya tidak menyadari bahwa port solusi Python akan lebih pendek ...
Mr Xcoder
4

PROLOG (SWI), 54 byte

s(L):-sort(L,M),flatten(M,N),last(N,O),numlist(1,O,N).

Nah, itu lebih baik. Masih cukup bertele-tele, sayang.

Cobalah online!

Itu s/1 predikat mengambil daftar sebagai argumen dan benar jika daftar adalah daftar ember mudah stackable.

Peningkatan dalam algoritma: jika saya mengurutkan daftar sebelum saya meratakannya, ini memaksa semua sublists untuk diurutkan agar predikat benar. Sedikit "meminjam" dari jawaban Jelly Pietu1998 . Berkat itu saya dapat membuang forallyang lebih dari setengah dari program (lihat di bawah untuk jawaban yang asli).

Bagaimana cara kerjanya?

Predikat itu benar jika semua klausa itu benar:

s(L) :-
    sort(L,M),                % M is L sorted in ascending order
    flatten(M,N),             % N is the 1-dimention version of M
    last(N,O),                % O is the last elemnt of N
    numlist(1,O,N).           % N is the list of all integers from 1 to O

Jawaban sebelumnya, PROLOG (SWI), 109 byte

s(L):-flatten(L,M),sort(M,N),last(N,O),numlist(1,O,N),forall(member(A,L),(A=[B|_],last(A,C),numlist(B,C,A))).

Cobalah online!

Nathan.Eilisha Shiraini
sumber
3

Pyth , 9 16 11 byte (Tetap)

Menggunakan metode yang sama sekali berbeda dari jawaban lainnya. Pendekatan 7 byte yang lebih pendek dapat ditemukan di bawah.

!.EtM.++0sS

Test Suite.


Penjelasan

! .EtM. ++ 0sSQ -> Program lengkap, dengan input implisit di akhir.

          SQ -> Urutkan input berdasarkan elemen tertinggi di setiap sublist.
         s -> Ratakan.
       +0 -> Sertakan a 0.
     . + -> Dapatkan delta dari daftar (yaitu perbedaan antara elemen berurutan)
   tM -> Mengurangi setiap elemen.
 .E -> Elemen kebenaran apa pun (1d benar, 0d salah)
! -> Negate (untuk memiliki nilai-nilai kebenaran / kepalsuan yang masuk akal)

Bagaimana cara kerjanya?

Mari kita ambil beberapa contoh, yang membuatnya lebih mudah untuk dipahami. Anggap inputnya [[1,3,4],[5,7],[2,6]]. Inti dari algoritma ini adalah bahwa setiap delta dalam daftar tidak rata harus 1 agar ember dapat ditumpuk.

  • Pertama, Smengubahnya menjadi [[1, 3, 4], [2, 6], [5, 7]].

  • Kemudian, smerata itu: [1, 3, 4, 2, 6, 5, 7].

  • Letakkan 0di depan:[0, 1, 3, 4, 2, 6, 5, 7]

  • .+mendapat delta dari daftar [1, 2, 1, -2, 4, -1, 2],.

  • tMmengurangi setiap elemen [0, 1, 0, -3, 3, -2, 1],.

  • Setiap non- 0integer benar dalam Pyth, jadi kami memeriksa apakah ada elemen kebenaran dengan .E(yang berarti tumpukan tidak dapat dibentuk dengan benar). Kami mendapatkan True.

  • !meniadakan hasil, yang berubah Truemenjadi False.

Jika inputnya, misalnya, [[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]algoritma akan bekerja seperti ini:

  • Diurutkan oleh elemen tertinggi: [[1], [2], [3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]dan diratakan, dengan 0prepended: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].

  • Delta: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]. Semua get dikurangi: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].

  • Tidak ada unsur kebenaran, jadi kita dapatkan False. Dengan negasi logis, hasilnya adalah True.


Pyth , 7 byte

qSlsQsS

Test Suite.

Port of the Python menjawab dan variasi dari solusi @ Erik .

Tuan Xcoder
sumber
Terima kasih banyak telah meluangkan waktu untuk menjelaskan bagaimana ini bekerja!
Charlie
Mari kita lanjutkan diskusi ini dalam obrolan .
Tn. Xcoder
@ Mr.Xcoder Apa yang Anda maksud dengan tMpenurunan setiap elemen? Saya akan berpikir bahwa pengurangan setiap elemen [1, 2, 1, -2, 4, -1, 2]akan menghasilkan [0, 1, 0, -3, 3, -2, 1]. Tapi itu tidak akan membantu menyelesaikan masalah, jadi saya harus salah paham apa artinya pengurangan setiap elemen.
Brian J
@BrianJ tMmengurangi setiap elemen dalam daftar dengan 1. Ada kesalahan dalam penjelasan saya. Akan memperbaiki.
Tn. Xcoder
@BrianJ Diperbaiki. Terima kasih telah
melihatnya
3

Brachylog , 5 byte

oc~⟦₁

Cobalah online!

Unifikasi yang dijelaskan:

?o₀c₀~⟦₁.
?         The input (implicit)
 o₀       Sorted (subscript default = 0 => ascending)
   c₀     Concatenated (subscript default = 0 => no length check)
     ~    Inverse (find the input)
      ⟦₁   Range (subscript = 1 => [1..input])
        . The output (implicit)

Penjelasan analitis:

Pertama-tama kita mengurutkan daftar, dan kemudian kita menggabungkan (yaitu meratakan 1-dalam) ( oc) sehingga ember ditumpuk dari kanan ke kiri jika memungkinkan. Kemudian, untuk memeriksa apakah bucket telah ditumpuk dengan benar (mis. Tidak ada bucket atau menara yang hilang), kami memeriksa bahwa daftar yang dihasilkan adalah kisaran inklusif dari 1 hingga panjangnya. Sekarang, alih-alih memeriksa daftar dengan rentang [1..n] yang panjangnya ( {l⟦₁?}), kami mencoba mencari input ke fungsi yang menghasilkan kisaran seperti itu ( ~⟦₁), jika ada. Jika input ditemukan, maka program berakhir tanpa masalah, sehingga memicu true.status. Jika tidak ada input yang ditemukan, program gagal, memicu false.status.

Erik the Outgolfer
sumber
3

Python 2 , 43 byte

lambda l:sum(sorted(l),[0])<range(len(`l`))

Cobalah online!

Cek apakah daftar yang disatukan secara leksikografis lebih kecil daripada [1,2,3,...N]besar N. Karena tidak ada duplikat, setiap ember yang hilang atau ember yang tidak sesuai pesanan akan menyebabkan nilai lebih besar dari kpada ktempatnya, membuat daftar yang dihasilkan menjadi lebih besar. Panjang string input mencukupi sebagai batas atas karena setiap angka membutuhkan lebih dari 1 karakter.

Tidak
sumber
Bagus, saya pikir harus ada cara untuk meningkatkan solusi saya secara substansial, dan ini dia!
Chris_Rands
3

MATL , 5 byte

Sgtf=

Cobalah online!

(Masukan implisit, katakanlah {[4,5],[9,10],[1,2,3],[6,7,8]})

S- urutkan susunan input dalam urutan leksikografis ( {[1,2,3],[4,5],[6,7,8],[9,10]})

g- dikonversi menjadi satu array ( cell2mat)

t - duplikat itu

f- temukan indeks nilai bukan nol. Karena input di sini adalah semua bukan nol, kembalikan daftar indeks dari 1 ke panjang (array) ( [1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10])

= - periksa apakah array sama dengan rentang 1 hingga panjang (array)

sundar - Pasang kembali Monica
sumber
3

Japt , 13 12 11 byte

Ini mungkin bisa lebih pendek.

ñÎc äaT e¥1
  • 1 byte disimpan berkat ETH

Cobalah atau jalankan semua test case


Penjelasan

                :Implicit input of 2D array `U`
ñÎ              :Sort sub-arrays by their first element
  c             :Flatten
      T         :Prepend 0
    äa          :Consecutive absolute differences
        e¥1     :Does every element equal 1?
Shaggy
sumber
Ya, Anda benar saya pikir. Itu layak dicoba
ETHproduk
Saya pikir Anda dapat menyimpan byte pada baris terakhir dengan ä-0 e¥Jatauän0 e¥1
ETHproduksi
Solusi 13 byte yang serupa lainnya: ethproductions.github.io/japt/…
Oliver
@ ETHproductions, saya tidak tahu apa yang terjadi di sana! : D Jangan berpikir saya memiliki kesempatan untuk menyentuh äarray. Terima kasih atas penghematannya.
Shaggy
1
@LuisfelipeDejesusMunoz Ia bekerja ketika Anda menggunakan baris pertama dari solusi ini dan baris kedua dari solusi tertaut, seperti yang saya katakan, sembilan byte: codegolf.stackexchange.com/a/168967/16484
Nit
2

Scala, 49 Bytes

p=>{val s=p.sortBy(_(0)).flatten
s==(1 to s.max)}

Tidak Disatukan:

piles: List[List[Int]] =>
{
  val sorted = piles.sortBy(pile=>pile(0)).flatten //Since piles are sequential, we can sort them by their first element
  sorted == (1 to sorted.max) //If all the buckets are present and in order, after sorting them it should be equivalent to counting up from 1 to the max bucket
}
Ethan
sumber
2

R , 58 byte

function(v,a=unlist(v[order(sapply(v,min))]))any(a-seq(a))

Cobalah online!

NB: SALAH adalah hasil yang benar, BENAR adalah yang palsu

  • -3 byte berkat @JayCe

Penjelasan:

a=unlist(v[order(sapply(v,min))])  # order the list of vector by the min value and flatten
all(a==seq(a=a))                   # if the flattened list is equal to 1:length then it's ok
menggali semua
sumber
1
Cukup seq(a)untuk 2 byte? Juga, itu diizinkan untuk digunakan TRUEsebagai nilai palsu dan sebaliknya (sebutkan dalam jawaban Anda), sehingga Anda dapat melakukannya any(a-seq(a))untuk byte lain.
JayCe
@JayCe: Saya bodoh ... Saya sangat prihatin tentang seq(a)berperilaku berbeda ketika apanjangnya 1 dan saya melewatkan bahwa dalam hal ini kita akan mendapatkan hasil yang sama: D Terima kasih!
digEmAll
1

C # (.NET Core) , 157 145 132 byte

-13 byte terima kasih kepada TheLethalCoder

l=>{var k=l.OrderBy(x=>x[0]).SelectMany(x=>x);return!Enumerable.Range(1,k.Count()).Zip(k,(x,y)=>x==y).Any(x=>!x);}

Jumlah byte juga termasuk

using System.Linq;

Cobalah online!

Tidak Disatukan:

l => {
        var k = l.OrderBy(x=>x[0])              // First, sort stacks by first bucket
                 .SelectMany(x => x);           // Concatenate stacks into one
        return !Enumerable.Range(1, k.Count())  // Create a sequence [1...n]
               .Zip(k, (x, y) => x == y)        // Check if our big stack corresponds the sequence
               .Any(x => !x);                   // Return if there were any differences
     };
Grzegorz Puławski
sumber
1
x.First()-> x[0]? Enumerable.Range-> new int[]dan Zipdengan indeks jika memungkinkan ..? Hapus Wheredan masukkan kondisinya Any.
TheLethalCoder
@TheLethalCoder Terima kasih atas tipsnya! Dan new int[]pendekatan akan membutuhkan penambahan Select()untuk mendapatkan indeks, dan pada akhirnya membuat jumlah byte lebih besar.
Grzegorz Puławski
1

CJam , 11 byte

{$:+:(_,,=}

Cobalah online!

Oww :(... ya!{$:+_,,:)=}

Erik the Outgolfer
sumber
1

Arang , 19 byte (tidak bersaing?)

A▷m⟦▷s▷vθυ⟧θ⁼θ…·¹Lθ

Cobalah online!

-10 byte berkat ASCII saja .

-3 byte terima kasih kepada ASCII-only untuk implementasi selanjutnya (lihat histori revisi untuk kemungkinan versi yang bersaing).

-untuk kebenaran, untuk kepalsuan.

Input adalah daftar tunggal dari daftar daftar, karena cara Arang mengambil input.

Erik the Outgolfer
sumber
Ini jawaban pertama dalam Charcoal yang saya lihat menggunakan UP.
Charlie
@CarlosAlejo Saya harus menemukan cara untuk menyortir, dan cara termudah adalah adil UPsorted.
Erik the Outgolfer
24 byte
ASCII
yang digunakan di sana membuat lingkup hal-hal prioritas meskipun sehingga; s mengapa UPmasih ada tapi saya kira Anda bisa menghindari menggunakan nama fungsi python sebagai varnames?
ASCII
yay menambahkan eval as v, juga O_O ini bahkan bukan tantangan seni ascii (tidak heran itu sangat ungolfy: P
ASCII-satunya
0

Java 10, 213 byte

import java.util.*;m->{Arrays.sort(m,(a,b)->Long.compare(a[0],b[0]));var r=Arrays.stream(m).flatMapToInt(Arrays::stream).toArray();return Arrays.equals(r,java.util.stream.IntStream.range(1,r.length+1).toArray());}

Cobalah online.

Sepertinya ide yang bagus ketika saya mulai, tetapi bawaan ini hanya membuatnya lebih lama .. Pasti bisa bermain golf dengan menggunakan pendekatan yang lebih manual ..

Terinspirasi oleh jawaban 4-byte 05AB1E @EriktheOutgolfer . 4 vs 213 byte, rofl ..>.>

Penjelasan:

import java.util.*;      // Required import for Arrays
m->{                     // Method with 2D integer-array parameter and boolean return-type
  Arrays.sort(m,         //  Sort the 2D input-array on:
    (a,b)->Long.compare(a[0],b[0])); 
                         //  The first values of the inner arrays
var r=Arrays.stream(m).flatMapToInt(Arrays::stream).toArray();
                         //  Flatten the 2D array to a single integer-array
return Arrays.equals(r,  //  Check if this integer-array is equal to:
  java.util.stream.IntStream.range(1,r.length+1).toArray());} 
                         //  An integer-array of the range [1, length+1]
Kevin Cruijssen
sumber