APL, 36 34 39 36 33 29 27
*+/x={(∇⍣(⊃x>¯1↑⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Keluaran 1
jika Keith, 0
jika tidak
GolfScript menyerang lagi !!
Edit
+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Menggunakan Pengurangan Hak (⊢/
) alih-alih Take minus 1 ( ¯1↑
), langsung menyimpan 1 char dan secara tidak langsung menghemat 1 dari Disclose ( ⊃
)
Penjelasan
⍎¨⍕x←⎕
mengambil input yang dievaluasi (diperlakukan sebagai angka) dan menetapkannya untuk x
. Mengubahnya menjadi array karakter (alias "string" dalam bahasa lain), dan loop melalui masing-masing karakter (digit), mengubahnya menjadi angka. Jadi ini menghasilkan array angka digit.
{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}
adalah fungsi "loop" utama:
+/⍵↑⍨-⍴⍕x
mengambil angka terakhir ⍴⍕x
(no. digit x
) dari array dan menjumlahkannya.
⍵,
menggabungkannya ke akhir array.
(x>⊢/⍵)
periksa apakah angka terakhir pada array (yang belum +/⍵↑⍨-⍴⍕x
digabungkan) lebih kecil dari x
dan mengembalikan 1
atau 0
∇⍣
mengeksekusi fungsi ini pada array baru yang berkali-kali. Jadi jika angka terakhir lebih kecil darix
, fungsi ini berulang. Jika tidak, kembalikan saja array yang baru
Setelah menjalankan fungsi, array berisi jumlah sampai ke titik di mana 2 angka lebih besar atau sama dengan x
(misalnya 14
akan menghasilkan 1 4 5 9 14 23
, 13
akan menghasilkan 1 3 4 7 11 18 29
)
Akhirnya memeriksa apakah setiap angka sama denganx
dan output jumlah dari biner yang dihasilkan Himpunan.
Edit
1=+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Menambahkan 2 karakter :-( untuk membuat output 0
jika inputnya satu digit
Sunting lagi
+/x=¯1↓{(∇⍣(x>⊢/⍵))1↓⍵,+/⍵}⍎¨⍕x←⎕
Penjelasan
Fungsi sekarang menjatuhkan angka pertama ( 1↓
) dari array alih-alih mengambil yang terakhir ⍴⍕x
( ↑⍨-⍴⍕x
).
Namun, pendekatan ini membuat 1=
tidak memadai untuk menangani angka satu digit. Jadi sekarang menjatuhkan nomor terakhir dari array sebelum memeriksa kesetaraan x
, menambahkan 1 karakter
Anda dapat menebaknya: EDIT
+/x=1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕
Bandingkan x
dengan item yang baru ditambahkan daripada item terakhir yang lama, jadi jatuhkan item pertama (bukan yang terakhir) sebelum memeriksa kesetaraan kex
sudah mencukupi, menyimpan tanda minus. Menghemat 3 lainnya dengan menggunakan bentuk lain dari operator Power ( ⍣
)
Dan jawaban 25-char gs muncul (Orz)
Sunting terakhir
x∊1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕
Tidak percaya saya melewatkan itu.
Tidak bisa bermain golf lagi.