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 z
angka 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 12345678910
dan menentukan 5
digit 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 123410
yang terkecil mungkin.
Sebab (20, 25, 11)
, hasilnya agak membosankan, seperti 5
dan 1
.
Akhirnya, untuk mengesampingkan jawaban yang mencoba memimpin nol, (9, 11, 3)
berikan 91011
yang pada gilirannya menghasilkan 91
dan 10
sebagai 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 kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
sumber
9, 11, 3
akan berhasil.Jawaban:
Haskell , 162 byte
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):m
yang merupakan fungsi yang memilih "optimal" anggota dari daftar (baikmaximum
atauminimum
tergantung pada apa yang kita inginkan);f
yang merupakan fungsi "filter";n
jumlah digit yang tersisa untuk turun; dans
senarnya. Pertama kita periksa apakah n sama dengan jumlah digit yang tersisa dalam string (saya gunakan>=
untuk keselamatan) dan menjatuhkan sisanyas
jika demikian. Kalau tidak, kita periksa apakah kita masih perlu menjatuhkan digit (n>0
), maka kita gunakanspan
untuk memecah string kita menjadi tiga bagian:p
digit untuk dijatuhkan,c
digit yang dapat dijangkau optimal, danr
string yang tersisa. Kami melakukan ini dengan melewati rentang predikat yang memeriksa kesetaraan terhadap digit optimal kami. Untuk menemukan digit itu, kita mengambil pertaman+1
digit string, saring, lalu kirimkan ke fungsi "pemilih" kami. Sekarang kita hanya menghasilkan digit optimal dan berulang, dengan mengurangi panjangp
(jumlah digit yang dijatuhkan) darin
. Perhatikan bahwa kami tidak meneruskan fungsi pemfilteran kami ke panggilan rekursif, dan, sebaliknya, kami menggantinya denganid
. Itu karena filter hanya ada untuk menghindari memilih 0s terkemuka dalamminimum
kasus 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", mengambilx
,y
danz
. Kami menggunakan daftar pemahaman hanya untuk menghindari sedikit pengulangan, iterasi fungsi tuple kami dan meneruskannya untuk%
bersama denganz
dan string yang digabungkan. String itu dibuat menggunakan operator monad ajaib(=<<)
yang, dalam konteks ini, berfungsi seperticoncatMap
.sumber
Jelly , 17 byte
Cobalah online!
Hitung semua kemungkinan lalu pertahankan yang terbesar dan terkecil.
Argumen kiri:
x,y
untuk membuat kisaran. Argumen yang benar:z
digit yang akan dihapus.sumber
Python 2 , 143 byte
Cobalah online!
Ini bekerja dengan menghitung semua kombinasi ukuran target (urutan elemen dipertahankan) dan mendapatkan angka terkecil / terbesar darinya
sumber
Arang , 56 byte atau 21 +
4635 =6756 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Input
x
dany
, buat rentang inklusif dan gabungkan angka ke dalam string.Ulangi sekali untuk setiap digit yang akan dihapus.
Buat daftar string yang dibentuk dengan menghapus setiap karakter yang mungkin dari string saat ini dan ambil maksimum.
Cetak hasilnya.
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Input
x
dany
, buat rentang inklusif dan gabungkan angka ke dalam string.Masukkan
z
dan tambahkan itu. Saya kemudian membuat daftar dengan panjang itu: Saya harus bisa menambahkanz
di dalam filter berikut, tetapi hanya perintah yang diizinkan untuk menambah variabel; ada celah dalamPushOperator
peningkatan panjang daftar.Saring pada karakter yang diinginkan dengan memeriksa bahwa tidak ada karakter yang lebih rendah di wilayah sliceable. Wilayah dimulai dengan
z+1
karakter 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:
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:
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Hasilkan string awal.
Diwakili
z+1
sebagai 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
\r
karakter literal .)Hasilkan angka sebanyak mungkin.
Hasilkan nomor sekecil mungkin menggunakan daftar hasil kloning
z
.sumber
Jelly ,
1918 byteCobalah online!
1, 100, 100
sumber
05AB1E , 16 byte
Cobalah online!
Program lengkap, membaca input dalam urutan ini: y, x, z . Menghasilkan daftar dua daftar karakter.
Penjelasan
sumber
Ć`‚
cukup cerdas, jawaban yang bagus!Matlab, 95 byte
Cobalah secara Online!
Mengembalikan matriks 1x2 dengan min dan maks.
Bagaimana itu bekerja
sumber