Mengoptimalkan gips mantra saya!

8

Saya seorang penyihir muda, dan saya berusaha sangat keras untuk tidak menyia-nyiakan mana selama pertemuan magis saya.
Saya memiliki mantra X yang tersedia pada waktu tertentu dan masing-masing dari mereka memiliki biaya mana sendiri Y.
X, Y menjadi bilangan bulat positif benar-benar lebih rendah dari 11.
Sebagai pemula, kumpulan mana saya berfluktuasi banyak (selalu lebih rendah dari 11) , dan saya butuh bantuan untuk melemparkan mantra sesedikit mungkin (gulungan mahal, ya tahu) sambil mengosongkan kolam mana saya. Jika Anda tidak dapat menemukan kombinasi mantra yang sama persis dengan ukuran mana kolam renang saya, Anda harus menawari saya yang terdekat (dan lebih murah).

Saya datang kepada Anda dan kebijaksanaan Anda yang tak terbatas untuk membantu saya menjadi penyihir hitam terhebat. Saya tidak akan kecewa.

INPUT style (karena style adalah segalanya):
Y; abcdef
Y adalah ukuran pool mana. (a, b, c, d, e, f) adalah mantra. Ada 6 mantra, yang pertama biaya 'a' mana, biaya mantra kedua 'b' mana, dll.

INPUT: 4; 1 2 3 3 7 6
Saya memiliki 4 manas tersedia, dan 6 mantra tersedia. Dua mantra biaya 1 mana, 1 mantra biaya 2 mana, dua mantra biaya 3 mana, dll.

OUTPUT: (3,1)


INPUT: 3; 1 3 5 2 10
OUTPUT: (3)


INPUT: 8; 4 1 9
OUTPUT: (4,1)


INPUT: 4; 1 2 2 3
OUTPUT: (2,2), (1,3)

Anda harus mengeluarkan setiap kombinasi mantra, tetapi tidak perlu mantra yang berbeda yang harganya sama.

Mantra terpendek untuk mesin apa pun yang Anda inginkan akan diberikan banyak terima kasih, dan cambuk takdir.

Hebat
sumber
Saya pikir saya kehilangan intinya atau mungkin saya hanya tidak mengerti contoh Anda: contoh pertama: Saya menemukan 7 mantra - dapatkah Anda mengklarifikasi? Juga yang terakhir: mengapa output yang benar tidak (4)? Ini memiliki lebih sedikit mantra seperti (2,2) dan teka-teki menyatakan "Saya butuh bantuan untuk melemparkan mantra sesedikit mungkin". Apakah itu juga berarti bahwa kita harus mengeluarkan semua solusi jika ada beberapa solusi dengan jumlah mantra yang sama?
Howard
Jelas, saya mengacaukan input dan output saya, ini mungkin diperbaiki. Untuk pertanyaan terbaru, Ya, Anda harus mengeluarkan setiap kombinasi yang memiliki jumlah mantra yang sama. Terima kasih.
Fabinout
apakah input / output format yang diberikan, atau apa pun berjalan dengan baik itu adalah angka + array angka => array angka 2d?
John Dvorak
Saya akan mengakomodasi, selama baik output dan input dari gulungan bahasa Anda yang ambigu (brainfck) jelas dan dapat dibaca.
Fabinout
atau, dapatkah kita menulis suatu fungsi dengan dua argumen dan bukannya keseluruhan program? Atau bahkan ekspresi?
John Dvorak

Jawaban:

4

GolfScript, 55 karakter

[[]]\{{+}+1$%|}/.@{1$0+{+}*.@>!*100*\,-~}+:s%$0={\s=}+,

Cobalah online .

> 4 [1 1 2 3 3 7 6]
[[1 3]]

> 3 [1 3 5 2 10]
[[3]]

> 8 [4 1 9]
[[4 1]]

> 4 [1 2 2 3]
[[2 2] [1 3]]
Howard
sumber
5

APL (87)

↑∪m/⍨t=⌊/t←⊃∘⍴¨m←m/⍨t=⌈/t←+/¨m←{a/⍨⊃i≥+/a←k[⍵]}¨⊃,/g,{z/⍨∧/¨2>/¨z←,⍳⍵/⍴k}¨1↓g←⍳⍴k←1↓i←⎕

Format input adalah daftar APL, di mana elemen pertama adalah kolam mana dan sisanya elemen adalah mantra. Output memiliki masing-masing kemungkinan kombinasi mantra pada baris yang terpisah.

⎕:    4, 1 2 3 3 7 6
3 1
⎕:    3, 1 3 5 2 10
3
⎕:    8, 4 1 9
1 4
⎕:    4, 1 2 2 3
2 2
3 1

Penjelasan:

  • k←1↓i←⎕: baca daftar dari input, dan simpan di i. Letakkan elemen pertama (mana) dan simpan sisanya di k.
  • 1↓g←⍳⍴k: buat daftar dari 1hingga panjang k, dan simpan di g. Jatuhkan elemen pertama, memberi [2..len k].
  • {... : Untuk masing-masingnya, dapatkan indeks dari setiap kombinasi unik dengan kpanjang :
    • z←,⍳⍵/⍴k: dapatkan matriks -dimensi indeks panjang k, ratakan, dan simpan di z.
    • ∧/¨2>/¨: untuk setiap koordinat dalam setiap indeks, lihat apakah semua koordinat untuk Ndimensi th lebih tinggi daripada koordinat untuk dimensi N-1th.
    • z/⍨: pilih dari zelemen-elemen yang benar di atas
  • ⊃,/g,: karena di atas tidak berfungsi untuk vektor satu dimensi, tambahkan gke depan. Kami sekarang memiliki daftar daftar daftar (karena foreach) dari semua indeks unik k. Gabungkan daftar bersama-sama dan lepaskan (jadi kita berakhir dengan daftar daftar).
  • {... : untuk setiap daftar koordinat yang mungkin, cari kombinasi nilai yang sesuai k, dan filter yang terlalu mahal:
    • a←k[⍵]: cari kombinasi saat ini di kdan simpan di a.
    • a/⍨⊃i≥+/a: pilih ahanya jika item pertama dalam i(kumpulan mana) sama dengan atau lebih besar dari jumlah elemen a.
  • m←: menyimpan semua kombinasi mantra yang tidak melebihi batas mana dalam m.
  • m←m/⍨t=⌈/t←+/¨m: pilih mhanya dari kombinasi yang jumlahnya sama dengan jumlah kombinasi paling mahal, dan simpan mkembali.
  • m/⍨t=⌊/t←⊃∘⍴¨m: pilih mhanya dari kombinasi yang panjangnya sama dengan panjang kombinasi terpendek.
  • ↑∪: hapus duplikat, dan konversikan ke matriks (untuk menampilkan setiap kombinasi pada baris terpisah).
marinus
sumber
1
Ini misterius! Sempurna untuk penyihir ...
Mark Thomas
5

Rubi, 114 113 karakter

x,y=eval gets
(d=0..10).find{|r|d.find{|c|s=y.sort.combination(c).select{|s|s.reduce(:+)==x-r}.uniq
p s if s[0]}}

Input: array dua elemen dari mana wizard dan daftar ejaan, memformat JSON satu baris.

Output: array 2D dari daftar ejaan, diformat sebagai JSON satu baris, atau niljika wizard tidak dapat membuat mantra.

Saya terutama cinta x,y = eval gets. Begitu berbahaya dan jahat, namun begitu kuat dan sederhana. Sempurna untuk bermain golf.

Keduanya sortdan uniqperlu. Jika tidak, ini akan menghasilkan duplikat untuk input seperti [4, [1, 3, 1]]. Saya tidak senang dengan hal ini.

findadalah metode yang berguna untuk aliran kontrol. Nilai kembalinya tidak berguna di sini. Panjang-bijaksana, itu setara dengan any?, yang mengembalikan nilai bahkan kurang bermanfaat.

Contoh:

> [4, [1, 2, 3, 3, 7, 6]]
# [[1, 3]]
> [3, [1, 3, 5, 2, 10]]
# [[3]]
> [8, [4, 1, 9]]
# [[1, 4]]
> [4, [1, 2, 2, 3]]
# [[1, 3], [2, 2]]
> [4, [5, 6, 7]]
# nil
John Dvorak
sumber
Tidak bisakah Anda menggunakan mapbukan find? Juga,, .reduce(:+)tidak &diperlukan
Gagang Pintu
maptidak berhenti pada hasil positif pertama. Itu akan mencetak semua kemungkinan, dikelompokkan berdasarkan biaya dan ukuran mana. Terima kasih atas saran kedua.
John Dvorak
1

Haskell (GHC), 172 167 143 karakter

import Data.List
import GHC.Exts
f(x:y)=head.groupWith length.last.groupWith sum.filter((<=x).sum).nub$subsequences y
main=interact$show.f.read

Deobfuscated:

import Data.List
import GHC.Exts

f (x:xs) = head
         . groupWith length
         . last
         . groupWith sum
         . filter ((<= x) . sum)
         . nub
         $ subsequences xs

main = interact (show . f . read)
  • Format input: daftar dikurung dengan kepala sebagai mana tersedia, ekor sebagai mantra yang tersedia (misalnya [4,1,2,3,3,7,6]).
  • Format output: daftar daftar kurung, masing-masing sublist mewakili satu set mantra yang mungkin.

Solusi mudah: ambil rangkaian input, lalu kurangi dengan memfilter kombinasi yang memiliki cukup untuk mana, dll.

FireFly
sumber
0

Mathematica 131

Pasti ada cara yang lebih pendek, tapi ini yang bisa saya lakukan.

l=Length;
f[{a_,b_}]:=Select[t=Cases[s=SortBy[Union@Cases[Subsets[b],x_/;0<Tr@x<a+1:>{x,Tr@x}],Last],
{x_,s[[-1,2]]}:> x],l@#==l@t[[1]]&]

f[{4, {1, 2, 3, 7, 6}}]

{{1, 3}}


f[{3, {1, 3, 5, 2, 10}}]

{{3}}


f[{8, {4, 1, 9}}]

{{4, 1}}


f[{4, {1, 2, 2, 3}}]

{{1, 3}, {2, 2}}

DavidC
sumber