APL, 36 34 39 36 33 29 27
*+/x={(∇⍣(⊃x>¯1↑⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Keluaran 1jika Keith, 0jika 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:
+/⍵↑⍨-⍴⍕xmengambil angka terakhir ⍴⍕x(no. digit x) dari array dan menjumlahkannya.
⍵,menggabungkannya ke akhir array.
(x>⊢/⍵)periksa apakah angka terakhir pada array (yang belum +/⍵↑⍨-⍴⍕xdigabungkan) lebih kecil dari xdan mengembalikan 1atau 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 14akan menghasilkan 1 4 5 9 14 23, 13akan 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 0jika 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 xdengan 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.