Buat angka terbesar dan terkecil

13

Terinspirasi oleh pos ini pada Puzzling. Spoiler untuk puzzle itu ada di bawah ini.

Diberikan tiga bilangan bulat positif sebagai input,, (x, y, z)buat rentang inklusif [x, y], gabungkan kisaran itu bersama-sama, lalu hapus zangka yang tidak harus berturut-turut untuk menghasilkan bilangan bulat positif terbesar dan terkecil yang mungkin. Angka nol di depan tidak diizinkan (yaitu angka harus dimulai dengan [1-9]). Keluarkan kedua angka itu dalam urutan apa pun.

Sebagai contoh dari pos membingungkan, untuk masukan (1, 100, 100), jumlah terbesar yang mungkin 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100,
dan jumlah terkecil 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100,
mengikuti logika di bawah ini dari jawaban jafe yang diposting di sana:

  • Kami tidak dapat memengaruhi panjang angka (ada jumlah digit tetap), jadi untuk memaksimalkan nilai kami mengambil digit pertama maksimal, lalu digit kedua dll.
  • Hapus 84 non-sembilan pertama (16 digit tersisa untuk menghapus): 999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Angka terbesar dalam 17 digit berikutnya adalah 7, jadi dari sini, digit berikutnya dalam jawaban bisa paling banyak 7 (kita tidak bisa menghapus lebih dari 16 digit). Jadi hapus 15 non-7 ... (1 digit tersisa untuk dihapus):999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Dari sini, angka berikutnya bisa paling banyak 8 jadi hapus satu non-8 dari tengah: 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Logika yang serupa, tetapi terbalik (yaitu, kami ingin memimpin 1, bukan memimpin9 s) untuk angka terkecil.

Ini contoh yang lebih kecil: (1, 10, 5) .

Kami membangun rentang 12345678910dan menentukan 5digit mana yang dapat kami hapus dengan meninggalkan angka terbesar yang mungkin. Jelas, itu berarti kami ingin memaksimalkan digit terdepan, karena kami tidak dapat memengaruhi panjang output. Jadi, jika kita menghapus 12345, kita tinggal bersama 678910, dan itu yang terbesar yang bisa kita buat. Membuat yang terkecil adalah sedikit lebih sulit, karena kita bisa memetik angka dari tengah saja, meninggalkan 123410yang terkecil mungkin.

Sebab (20, 25, 11), hasilnya agak membosankan, seperti 5dan 1.

Akhirnya, untuk mengesampingkan jawaban yang mencoba memimpin nol, (9, 11, 3)berikan 91011yang pada gilirannya menghasilkan 91dan 10sebagai yang terbesar dan terkecil.

I / O dan Aturan

  • Jika lebih mudah / lebih pendek, Anda dapat membuat kode dua program / fungsi - satu untuk yang terbesar dan satu untuk yang terkecil - dalam hal ini skor Anda adalah jumlah dari kedua bagian.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Input dapat dianggap sesuai dengan jenis nomor asli bahasa Anda, namun , baik angka gabungan atau output tidak dapat diasumsikan demikian.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
daftar digit dapat diterima sebagai keluaran?
Rod
Sebuah test case yang akan menghasilkan minimum palsu ketika mengevaluasi mereka yang memiliki angka nol terkemuka mungkin bermanfaat - saya pikir 9, 11, 3akan berhasil.
Jonathan Allan
@Rod Yap, daftar angka baik untuk output.
AdmBorkBork
@Rod Saya tidak tahu apa yang Anda bicarakan, saya jelas mengetik "output" di atas. ;-)
AdmBorkBork
@ JonathanAllan Panggilan bagus. Ditambahkan.
AdmBorkBork

Jawaban:

5

Haskell , 162 byte

l=length
((m,f)%n)s|n>=l s=[]|n>0,(p,c:r)<-span(/=m(f$take(n+1)s))s=c:((m,id)%(n-l p)$r)|1>0=s
(x#y)z=[p%z$show=<<[x..y]|p<-[(maximum,id),(minimum,filter(>'0'))]]

Cobalah online!

Menggunakan algoritma yang dijelaskan oleh jafe. Mungkin lebih pendek untuk menggunakan metode yang kurang efisien, tapi ini lebih menyenangkan untuk ditulis :)

The %operasi memakan waktu 4 argumen (sebenarnya 3, tapi apa pun): myang merupakan fungsi yang memilih "optimal" anggota dari daftar (baik maximumatau minimumtergantung pada apa yang kita inginkan); fyang merupakan fungsi "filter"; njumlah digit yang tersisa untuk turun; dan ssenarnya. Pertama kita periksa apakah n sama dengan jumlah digit yang tersisa dalam string (saya gunakan >=untuk keselamatan) dan menjatuhkan sisanya sjika demikian. Kalau tidak, kita periksa apakah kita masih perlu menjatuhkan digit ( n>0), maka kita gunakan spanuntuk memecah string kita menjadi tiga bagian: pdigit untuk dijatuhkan, cdigit yang dapat dijangkau optimal, danrstring yang tersisa. Kami melakukan ini dengan melewati rentang predikat yang memeriksa kesetaraan terhadap digit optimal kami. Untuk menemukan digit itu, kita mengambil pertaman+1digit string, saring, lalu kirimkan ke fungsi "pemilih" kami. Sekarang kita hanya menghasilkan digit optimal dan berulang, dengan mengurangi panjang p(jumlah digit yang dijatuhkan) dari n. Perhatikan bahwa kami tidak meneruskan fungsi pemfilteran kami ke panggilan rekursif, dan, sebaliknya, kami menggantinya dengan id. Itu karena filter hanya ada untuk menghindari memilih 0s terkemuka dalam minimumkasus yang hanya relevan pada iterasi pertama. Setelah itu kita tidak lagi membutuhkan filter apa pun.

%benar-benar hanya fungsi pembantu untuk #yang kami fungsi "nyata", mengambil x, ydan z. Kami menggunakan daftar pemahaman hanya untuk menghindari sedikit pengulangan, iterasi fungsi tuple kami dan meneruskannya untuk %bersama dengan zdan string yang digabungkan. String itu dibuat menggunakan operator monad ajaib (=<<)yang, dalam konteks ini, berfungsi seperti concatMap.

pengguna1472751
sumber
3

Jelly , 17 byte

r/VDœcL_¥¥ḷ/ƇVṢ.ị

Cobalah online!

Hitung semua kemungkinan lalu pertahankan yang terbesar dan terkecil.

Argumen kiri: x,yuntuk membuat kisaran. Argumen yang benar: zdigit yang akan dihapus.

r/VDœcL_¥¥ḷ/ƇVṢ.ị
r/                 Inclusive range from x to y
  V                Concatenate the digits together
   D               Get the resulting digits
         ¥         Dyad:
        ¥            Dyad:
      L                Length of the list of digits in the concatenated number.
       _               Subtract the number of digits to be removed.
    œc               Combinations without replacement. (remove z digits)
            Ƈ      Keep lists of digits that:
          ḷ/       have a positive first element (no leading zeros).
             V     Combine digits into integers. (vectorizes to ldepth 1)
              Ṣ    Sort the numbers
               .ị  Indexes at value 0.5 which yields the first and last elements.
dylnan
sumber
2

Python 2 , 143 byte

import itertools
s,e,r=input()
l=''.join(map(str,range(s,e+1)))
L=[i for i in itertools.combinations(l,len(l)-r)if'0'<i[0]]
print min(L),max(L)

Cobalah online!

Ini bekerja dengan menghitung semua kombinasi ukuran target (urutan elemen dipertahankan) dan mendapatkan angka terkecil / terbesar darinya

tongkat
sumber
Oh ... kurasa itu berhasil lol. Saya berusaha sangat keras untuk membuat program yang benar-benar menghitungnya secara deterministik.
Don Thousand
@RushabhMehta Perhitungan brute force masih bersifat deterministik, lebih lambat.
dylnan
2

Arang , 56 byte atau 21 + 46 35 = 67 56 byte

≔⪫…·NNωθFN≔⌈EθΦθ⁻λνθθ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⪫…·NNωθ

Input xdan y, buat rentang inklusif dan gabungkan angka ke dalam string.

FN

Ulangi sekali untuk setiap digit yang akan dihapus.

≔⌈EθΦθ⁻λνθ

Buat daftar string yang dibentuk dengan menghapus setiap karakter yang mungkin dari string saat ini dan ambil maksimum.

θ

Cetak hasilnya.

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌊Φ✂θκLυ¹∨κIλ⊞Oυω

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⪫…·NNωθ

Input xdan y, buat rentang inklusif dan gabungkan angka ke dalam string.

F⊕N⊞υω

Masukkan zdan tambahkan itu. Saya kemudian membuat daftar dengan panjang itu: Saya harus bisa menambahkan zdi dalam filter berikut, tetapi hanya perintah yang diizinkan untuk menambah variabel; ada celah dalam PushOperatorpeningkatan panjang daftar.

 θ                      String of digits
Φ                       Filter over characters
         κ              Current index
          Lυ            Length of list i.e. current `z` value
            ¹           Literal 1
       ✂θ               Slice string of digits
      Φ                 Filter over characters
              κ         Outer index
               Iλ       Cast inner character to number
             ∨          Logical OR
     ⌊                  Minimum
   ⁼ι                   Equals the outer character
  ∧              ⊞Oυω   And also push to list i.e. increment `z`
                        Implicitly print

Saring pada karakter yang diinginkan dengan memeriksa bahwa tidak ada karakter yang lebih rendah di wilayah sliceable. Wilayah dimulai dengan z+1karakter pertama (karena dimungkinkan untuk mengiris yang pertamaz jika perlu) dan peningkatan titik akhir untuk setiap karakter yang disimpan. Perawatan diambil untuk tidak memilih nol untuk karakter pertama.

Algoritma yang lebih cepat adalah 30 byte ketika digunakan untuk menghitung jumlah terbesar yang mungkin:

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Saya sejak itu dapat menggabungkan dua di atas menjadi solusi 56 byte kedua yang menghasilkan kedua hasil:

≔⪫…·NNωθF⊕N⊞υω≔⮌υη⟦Φθ∧⁼ι⌈✂θκLυ¹⊞OυωΦθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⪫…·NNωθ

Hasilkan string awal.

F⊕N⊞υω

Diwakili z+1sebagai panjang daftar.

≔⮌υη

Balikkan daftar sehingga mengkloningnya dan menyimpan hasilnya.

Cetak dua hasil pada garis yang terpisah. (Cara lain untuk melakukan ini adalah dengan memisahkan hasil dengan \rkarakter literal .)

Φθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Hasilkan angka sebanyak mungkin.

Φθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Hasilkan nomor sekecil mungkin menggunakan daftar hasil kloning z.

Neil
sumber
1

Jelly ,  19  18 byte

rDẎœcL_⁵Ɗ$ị@Ƈ1ḌṢ.ị

Cobalah online!

1, 100, 100(19292)=305812874887035355118559193163641366325011573739619723360

Jonathan Allan
sumber
1

05AB1E , 16 byte

ŸSDg³-.Æʒ¬Ā}{Ć`‚

Cobalah online!

Program lengkap, membaca input dalam urutan ini: y, x, z . Menghasilkan daftar dua daftar karakter.

Penjelasan

ŸSDg³-.Æʒ¬Ā}{Ć`‚    Full program. Inputs: y, x, z.
Ÿ                   Inclusive binary range from x to y. Push [x ... y].
 S                  Dump the digits separately in a list.
  Dg                Duplicate, and use the second copy to get its length.
    ³-              Subtract z from the length.
      .Æ            Retrieve all combinations of length - z elements from the digits.
        ʒ  }        Keep only those that...
         ¬Ā         Don't start with a 0 (head, then Python-style boolean).
            {       Sort the remaining elements.
             Ć      Enclose. Pushes list + list[0] (appends its tail to itself)
              `     Dump all elements separately on the stack.
               ,    Pair, to get the last two, min and max (after enclosing)
Tuan Xcoder
sumber
Oh, Ć`‚cukup cerdas, jawaban yang bagus!
Kevin Cruijssen
0

Matlab, 95 byte

function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

Cobalah secara Online!

Mengembalikan matriks 1x2 dengan min dan maks.

Bagaimana itu bekerja

% Full code
function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

% The function
function[m]=f(s,e,c),                                                                       end

                     % Creates the range in a single string
                     a=sprintf('%d',s:e);

                                                   % Gets all the combinations
                                                   combnk(a,length(a)-c)

                                         % Converts the string combinations to integers
                                         x=str2num(                     );

                                                                          % Finds min and max
                                                                          m=[min(x),max(x)];
DimChtz
sumber