Tantangan
Diberikan array nomor digit tunggal, tentukan jika ada 2 dari mereka yang menambahkan hingga 10 dan cetaklah
Contoh
Memasukkan
(1,2,3,4,5,5,6,7)
Ini kembali ((4,6),(5,5),(3,7))
Memasukkan
(1,2,3,4,5)
Ini kembali ()
. karena hanya ada satu 5
Memasukkan
(5,5,5,5,5)
Ini kembali ((5,5),(5,5))
karena ada jumlah ganjil dari 5s dan masing-masing 5 hanya dapat digunakan sekali
Aturan
Ini peraturannya!
- Asumsikan input hanya akan berupa array bilangan bulat digit positif tunggal
- Setiap angka hanya akan berpasangan satu kali, yang berarti jika ada tiga 5 itu hanya membentuk 1 pasangan (5,5). Jika ada (3,3,7) itu hanya akan membentuk 1 pasang (3,7)
- Untuk input: Anda dapat menggunakan semua jenis tanda kurung (atau kurang dari) selama pembaca dapat mengetahui bahwa input adalah satu array angka.
- Untuk hasilnya: Ini harus terlihat seperti array pasangan. Di mana array adalah bentuk yang sama dengan input Anda. (Jika Anda tidak menggunakan tanda kurung di input Anda, Anda harus menggunakan beberapa jenis simbol sehingga setiap pembaca dapat mengatakan mereka berpasangan dalam array)
Uji Kasus
(1,2,3,4,5,5,6,7) =((4,6),(5,5),(3,7))
(1,2,3,4,5) = ()
(5,5,5,5,5) = ((5,5),(5,5))
(1,2,3,3,4,5,6,7)=((3,7),(4,6))
(9,8,7,6,4,4,3,1)=((9,1),(7,3),(6,4))
Semoga berhasil!
The shorter
jawaban, semakin baik!
Sunting 1: perbarui aturan dan Testcases dari komentar
Sunting 2: perbarui aturan untuk menentukan format input.
Sunting 3: perbarui aturan untuk menentukan format output. berusaha semaksimal mungkin.
(5,5)
untuk kasus ujian akhir?(1,2,3,3,4,5,6,7)
1,2,3,4,5,5,6,7
?Jawaban:
GolfScript,
454237 karakterPendekatan baru juga mengambil array dengan satu item sebagai input. Selain itu, beberapa karakter lebih pendek.
Versi sebelumnya:
Algoritma yang digunakan dalam kode ini dijelaskan sebagai berikut:
Kode mengharapkan array setidaknya dua digit pada STDIN.
Contoh (lihat online ):
sumber
Python 2.7 (70)
Testcases:
Satu byte tambahan untuk tanda kurung yang bagus.
sumber
<?$a=fgetcsv(STDIN);while($a){$b=10-array_pop($a);if($a[$b]){unset($a[$b]);echo"($b,",10-$b,")";}}
Javascript,
18818318115314112112311210598karakterGolf di JS agak sulit, tapi saya hanya ingin memiliki masalah pada masalah ini, jadi inilah kodenya:
Input: mis
[1,2,3,3,4,5,6,7]
. Keluaran misalnya[[4,6],[3,7]]
ke konsol.105-> 98: Menggunakan algoritma hebat Daniel untuk menulis ulang kode sepenuhnya! Lihat jawabannya untuk algoritma yang dapat dibaca.Barang-barang benar-benar kacau sehingga dikembalikan ke 105 karakter.112-> 105: Diinisialisasi
i
ke nol, menggunakan outputo.push
untuk setk
(k=a[i]=a[j]=-o.push...
) dan output log ke konsol bukannya memperingatkan untuk menghilangkan"["+
dan+"]"
karena konsol sudah output dengan baik.123-> 112: Sekarang dihapus tanda kurung luar dalam output, karena golfscript mungkin :) Juga akhirnya diterapkan saran untuk menghapus
|=0
.121-> 123: Diubah
o+="("+p+","+k+"),"
menjadio.push("("+[p,k]+")")
(menambahkan 2 karakter :() dan membuato
array bukan string (o=""
->o=[]
). Sekarang output tidak salah lagi (seperti((5,5),(5,5),)
).141-> 121: Mulai sekarang diasumsikan bahwa pertanyaan itu berarti bahwa kita bisa mendapatkan input dalam format array bahasa, yang dalam kasus JS
[a,b,c,...]
dibuat dan dibuato
, output "akumulator" string bukan array (o.push(...),
->o+=...,
).153-> 141: Setel ulang entri array alih-alih menghapusnya setelah digunakan.
181-> 153: Perubahan yang diterapkan
u=[]
, loop yang diatur ulang,a[i]
&a[j]
-> temp vars, dikonversi jika logika dan dikonversi ke logika inta[i]|=0
.183-> 181: Diganti
i<=0
dengani+1
dan sama untukj
.188-> 183: Ditempatkan
o=[]
di dalamprompt()
() dan diganti;
for(j=i;
denganfor(j=i-1;
().i==j&&
(Terima kasih mellamokb, Paul Walls dan ryan!)
sumber
i>=0
dengani+1
danj>=0
denganj+1
untuk menyimpan 2 karakter.u=[]
bukanx
), menata ulang loop untuk pergi dari 0 ke atas, ditugaskana[i]
dana[j]
untuk variabel temporer untuk menyimpan referensi berulang, memindahkan beberapa inisialisasi variabel ke dalam pernyataan lain, mengubahif
logika menjadi||
logika rantai , dan mengkonversi int parsing ke yang lebih ringkasa[i]|=0
, untuk mendapatkan total penghematan 30 karakter :). Inilah harness pengujian saya yang menunjukkan keakuratan solusi: jsfiddle.net/GKUDb/8 , dan solusi kerja golf 151 karakter: jsfiddle.net/DVtW2 .o+="("+[p,k]+")"
).for(a=eval(prompt(o=[])),i=-1;k=a[j=++i]|=0;)for(;p=a[--j];)k+p-10||(o.push("["+[p,k]+"]"),k=a[i]=a[j]=-1);alert(o)
membawanya ke 115a=eval(prompt(o=[])),i=-1
ke dalama=eval(prompt(i=o=[]))
tanpa kehilangan kesetiaan, untuk 3 tabungan karakter lebih lanjut.J,
545350464544 karakterPemakaian:
Algoritma pada dasarnya adalah:
+/|:(1+i.9)=/
(<.|.)
(jadi 1 dan 9, 2 dan 8 dll)1 9
angka 1, Anda hanya akan memiliki satu pasangan) dan lepaskan semuanya setelah lima pasangan pertama<.4({.,-:@{::)
mengimplementasikan kedua langkah sebelumnya)-
angkanya(>:,.9&-)I.
sumber
Python (142)
Masukan harus diberikan dengan tanda kurung siku alih-alih tanda kurung bulat. http://ideone.com/p2QR11
Algoritma:
Jika output dengan kelainan serius diizinkan (90) : http://ideone.com/GR762f
sumber
C,
142.138, 124Pengujian:
Catatan implementasi:
sumber
Perl 52
Bukti:
Dan ada kode komentar ungolfed:
Mungkin penjelasannya seperti pidgin Prancis (saya bukan penulis bahasa Inggris asli), jadi jika seseorang ingin mengeditnya dan membuatnya lebih dimengerti, silakan lakukan.
sumber
Javascript -
131129125 karakterSaya berasumsi, urutan dan dalam array hasil bersarang tidak wajib :)
Kasus uji yang dievaluasi:
Sunting : Seperti uraian masalah yang tertulis 'Array', kita berbicara tentang notasi khusus bahasa array, kan?
sumber
Mathematica 70
Pemakaian
sumber
PostScript (46)
Ini menggunakan token biner berkode tangan, oleh karena itu, inilah hexdump:
Saya mengunggah file biner jika Anda ingin mencobanya.
Ini mengharapkan nomor berada di tumpukan. Mereka dapat didahului dengan kode atau disediakan pada baris perintah, misalnya ketika menggunakan Ghostscript seperti:
Jika Anda bersikeras pada sintaks array untuk input, maka ini membutuhkan dua token (
aload pop
) yang tepat di awal. Dalam token biner, ini adalah empat byte lagi.Berhenti bermain golf dan berkomentar:
sumber
Python 84
Membutuhkan input dalam tanda kurung bukan tanda kurung.
Untuk jawaban yang kira-kira sama dengan golf, lebih baik lihat jawaban Daniel .
sumber
PHP
150149148146142-> 140Gunakan dengan PHP CLI.
Memasukkan:
1,2,3,4,5,5,6,7
Keluaran:
(3,7)(4,6)(5,5)
Tidak golf:
sumber
SED, 112 karakter
Mungkin agak lebih sederhana daripada solusi lainnya
sumber
Perl, 72 dengan
-p
benderasumber
-p
harus dihitung karena yang setara akan menambahLINE: while (<ARGV>){...}continue{die "-p destination: $!\n" unless print $_}
#!perl -p
plus baris baru.