Tantangan
Diberikan bilangan bulat positif N
yaitu 28 atau di atas, mengeluarkan daftar angka yang menjumlahkan N
yang menggunakan setiap digit 1
melalui 7
tepat satu kali. Anda dapat memberi sebagai program atau fungsi.
Digit dapat muncul sendiri atau digabungkan, selama Anda menggunakan masing-masing satu kali tanpa pengulangan. Misalnya, [12, 34, 56, 7]
valid, apa adanya [1, 27, 6, 4, 35]
dan [1234, 567]
, tetapi tidak [123, 34567]
atau [3, 2, 1476]
. Urutan nomornya terdaftar tidak masalah.
Jika N
tidak dapat dibuat dengan 1-7, kembalikan atau hasilkan apa-apa.
Informasi lainnya
Ini adalah kode golf, jadi kode terpendek dalam byte pada hari Kamis tanggal 15 Oktober menang.
Ajukan pertanyaan di komentar.
Apa pun yang saya tidak tentukan dalam tantangan terserah Anda.
Celah standar tidak diijinkan.
Contohnya
Ini dapat menghapus segala kebingungan:
Memasukkan
28
Keluaran
[1, 2, 3, 4, 5, 6, 7]
Memasukkan
100
Keluaran
[56, 7, 4, 31, 2]
Memasukkan
1234567
Keluaran
[1234567]
Memasukkan
29
Keluaran
Tidak ada, 29 tidak valid.
Memasukkan
1891
Keluaran
[1234, 657]
Memasukkan
370
Keluaran
[15, 342, 7, 6]
Saya akan menghasilkan lebih banyak jika dibutuhkan.
Berikut adalah pastebin dari semua angka yang mungkin dibuat dengan tujuh angka ini, milik FryAmTheEggman.
29
?(N/A)
sebagai output.[1234566, 1]
bukan output yang valid, karena 6 diulang. Anda tidak boleh mengulangi angka dalam output.1, ..,, 7
sehingga ada setidaknya sebanyak1
's sebagai10
' s, setidaknya sebanyak10
's sebagai100
' s, dan sebagainya.Jawaban:
Pyth,
1814 byteTerima kasih kepada @isaacg untuk bermain golf 2 byte dan membuka jalan untuk 2 lebih.
Kode akan macet jika tidak menghasilkan output, yang menyebabkan tidak ada output yang dihasilkan.
Ini akan bekerja untuk input ish kecil jika Anda cukup sabar, dan untuk input yang lebih besar jika diberikan cukup waktu dan memori.
Untuk memverifikasi bahwa kode bekerja sebagaimana dimaksud, Anda dapat mengganti
7
dengan3
untuk jumlah dari angka 1 sampai 3 . Klik di sini untuk test suite.Contoh berjalan
Bagaimana itu bekerja
sumber
r\1\8
. Juga@ .. 0
sama denganh
.h
, tetapi saya tidak tahu Anda bisa menggunakanS
cara itu. (Referensi char di interpreter online tidak menyebutkannya.)jkS7
Tampaknya bahkan lebih pendek, karena saya tidak perlus
lagi.Python 3, 109
Fungsi yang mengambil angka dan menghasilkan tuple di sejenisnya
123,4567,
. Ya, ini adalah tuple yang valid.Idenya adalah untuk menghasilkan semua string yang mungkin seperti
43,126,7,5,
yang memiliki digit1
melalui7
dipisahkan oleh koma, tanpa dua koma berturut-turut. Evaluasi ungkapan ini sebagai tuple, dan jumlahnya sama dengann
, cetak dan akhiri dengan kesalahan.Untuk membangun semua string seperti itu, kami melacak serangkaian
s
karakter yang akan digunakan, dan mencoba menambahkan masing-masing dengan koma, yang membuat digit mengakhiri entri, atau tanpa, dalam hal ini digit selanjutnya akan bergabung dengannya.Hubungan arus pendek yang digunakan untuk memeriksa bahwa
s
kosong karena daftar-comp kosong, dan bahwan==sum(eval(l))
, dalam hal ini kita mencetakl
dan mengakhiri dengan kesalahan dengan mengambil~
dariNone
kembali dengan mencetak (terima kasih kepada Sp3000 untuk ini.).Saya percaya bahwa dalam Python 3.5, dua karakter dapat disimpan dengan menulis
s={*'1234567'}
(terima kasih Sp3000).Ada beberapa gangguan kecil yang memakan chars. Salah satunya adalah bahwa dalam kasus yang
l
terlihat seperti1234567
tanpa koma, itu diurai sebagai nomor tunggal dan panggilansum
memberikan kesalahan. Ini ditangani dengan retasan mulail
dengan elemen0
dan melepasnya saat mencetak. Ini biaya 6 karakter.Iterasi di
c
atas koma dan string kosong bertele-tele menjengkelkanfor c in(',','')
, karena Python 3 tidak mengizinkan tuple ini telanjang. Saya ingin ada beberapa char?
yang diabaikan dalam jumlah untuk melakukan',?'
kurang dari 4 karakter, tapi sepertinya tidak ada char seperti itu.Metode lama:
Python 2, 117
Menentukan fungsi yang mengambil nomor dan mencetak daftar.
Idenya adalah menggunakan rekursi untuk mencoba setiap cabang. Jalur variabel adalah
n
dibutuhkans
tersisa untuk digunakanl
angka yang dibuat sejauh inip
Saat
n==0
dans
kosong, cetakl
dan akhiri karena kesalahan.Jika angka yang terbentuk sebagian saat
p
ini bukan nol, coba tambahkan ke daftar dan hapus dari jumlah yang tersisa.Untuk setiap digit yang
x
dapat kita gunakans
, coba tambahkanp
dan hapuss
.sumber
Pyth, 23
Brute force naif, terlalu lambat online, membutuhkan waktu sekitar satu menit di komputer saya. Menggunakan pola "loop selamanya sampai pengecualian" yang umum dari golf pyth di mana mengakses daftar kombinasi yang difilter menyebabkan kesalahan pada angka yang tidak mungkin, misalnya
29
.Output seperti daftar pythonic, mis
Ini adalah pasta dari semua angka 10136 yang dapat dibuat dengan cara ini.
sumber
Python 2.7,
178172169 bytePerhatikan bahwa tiga baris terakhir seharusnya diindentasi dengan tab tetapi saya tidak tahu bagaimana melakukannya di editor ini.
Sunting: Ratakan satu lapisan sarang dengan bantuan Sp3000
sumber
JavaScript (ES6), 165
196Sunting Dipendekkan sedikit. Bisa menggunakan lebih pendek
eval
, tapi saya suka itu cepatBrute force, memalukan lebih lama dari versi Pith, tetapi lebih cepat. Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6.
sumber
Python 2,
270268 byteMasih berusaha bermain golf.
Loop ini sampai ditemukan kecocokan.
sumber
import as
jarang diperlukan - bisa Anda lakukanfrom itertools import*;P=permutations
map(str,i)
daripada pemahaman daftar, dan Anda dapat membuat daftar r secara langsung daripada dengan meratakan daftar bersarang:,r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]
dan hal serupa untuk t.`n`
sebagai gantistr(n)
, karenan
tidak akan pernah berada di atas bilangan bulat maksimum.Haskell (145 byte)
Gunakan rekursi.
Tidak Terkumpul (337 bytes):
sumber
Scala, 195 byte
Ini bukan yang paling efisien dan butuh lebih dari 15 menit untuk mendapatkan output selama 29 tetapi berhasil
Ini beberapa output
sumber
Ruby, 105 byte
Paksaan! Periksa setiap subset panjang antara 0 dan 7 bilangan bulat antara 1 dan 7654321 dan lihat apakah ada yang cocok dengan kriteria kami. Anda mungkin tidak ingin menunggu ini berakhir.
Untuk menjalankan dan memverifikasi algoritme, Anda dapat mempersempit ruang pencarian dengan mengganti
7654321
dengan jumlah terbesar yang Anda tahu ada di jawabannya. Misalnya, 56 untuk n = 100, atau 1234 untuk n = 1891. Berikut ini adalah uji coba yang terakhir:sumber