Setiap bilangan bulat positif dapat diperoleh dengan memulai dengan 1 dan menerapkan urutan operasi, yang masing-masing dapat "dikalikan dengan 3" atau "dibagi dengan 2, membuang sisanya" .
Contoh (menulis f untuk * 3 dan g untuk / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Tulis program dengan perilaku berikut:
Input : bilangan bulat positif, melalui stdin atau hard-coded. (Jika hard-coded, numeral input akan dikecualikan dari panjang program.)
Output : string f's dan g's sedemikian rupa <input> = 1 <string>
(seperti dalam contoh). String seperti itu dalam urutan terbalik juga dapat diterima. NB: Output hanya berisi f's dan g's, atau kosong.
Pemenangnya adalah entri dengan byte terkecil dari program-plus-output ketika 41 adalah input.
sumber
x mod 3
: jikax=3y
membangun y dan kemudian menerapkanf
; jikax=3y+1
membangun2y+1
dan menerapkanf
kemudiang
; jikax=3y+2
kemudian menjadi rumit tetapi pada dasarnya bersifat rekursif.Jawaban:
GolfScript, skor 64 (43-2 + 23)
(41 hardcoded, oleh karena itu -2 karakter untuk skor). Outputnya adalah
yaitu 23 karakter (tanpa baris baru). Dengan konstruksi kode menjamin bahwa ia selalu mengembalikan (salah satu) representasi terpendek.
sumber
"1 "
seharusnya tidak dimasukkan dalam output.Kita menjadi kotor, teman-teman!
JAWA
210 207199 karakternon-golf:
output: tergantung pada kepercayaan para dewa lama, yang terpendek yang saya miliki adalah 30. Perhatikan bahwa output harus dibaca dari kanan.
234
108
sunting 45
poin:
318199 + 30 = 229edit1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bene jika Anda menggunakan Java 6 dan bukan Java 7 saat bermain golf, Anda dapat menggunakannya
Struktur 39 karakter alih-alih struktur standar yang panjangnya 53 karakter.
sumber
(2*i+1)%3==0
setara dengani%3==1
if(X){A}else{if(Y){B}else{C}}
lebih panjang dariif(X){A}else if(Y){B}else{C}
. Anda juga dapat mengganti==
kondisi Anda dengan<
kondisi yang lebih pendek .Python, skor 124 (90-2 + 36)
90 karakter kode (baris baru masing-masing 1) - 2 untuk angka input hard-coded + 36 karakter output
Keluaran:
sumber
m=f=0
Anda dapat membuat lingkaran luarwhile(n!=x)*(m!=x)
dan menghapus istirahat. Membawa ke 95 karakter kode.n
dengan3**f
.print'f'*f+'g'*g
, yang akan memberikan skor 90-2 + 36 = 124.Python, skor 121 (87 - 2 + 36)
sumber
l,n,f=len(t),1,0
, dan menghapus'1',
dari pernyataan cetak, skor Anda akan menjadi 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
memberikan jumlah karakter yang sama, bukan? (Untuk setiap variabel, sebuah=
dan baris baru diganti dengan dua,
s.)Perl, skor 89 (63 - 2 + 28)
Dugaan: Jika pendekatan naif yang dijelaskan dalam solusi asli saya di bawah ini pernah mencapai siklus, siklus itu akan menjadi [21, 7, 15, 5, 10, 21, ...] . Karena tidak ada contoh tandingan untuk 1 ≤ n ≤ 10 6 , ini sepertinya benar. Untuk membuktikan ini, cukuplah untuk menunjukkan bahwa ini adalah satu-satunya siklus yang bisa ada, yang mungkin saya lakukan atau tidak mungkin lakukan di kemudian hari.
Solusi di atas menghindari siklus segera, alih-alih menebak (salah), dan menghindarinya untuk kedua kalinya.
Output (28 byte):
Perl, skor 100 (69 - 2 + 33)
Menggunakan pendekatan tebak-dan-periksa. String dibangun menggunakan operasi terbalik (mengubah nilai menjadi 1 , bukan sebaliknya), dan string menjadi dicerminkan sesuai, yang diizinkan oleh spesifikasi masalah.
Setiap kali non-kelipatan tiga ditemui, itu akan dikalikan dengan dua, menambahkan satu jika hasilnya kemudian kelipatan dari tiga. Ketika kelipatan tiga ditemui, itu akan dibagi tiga ... kecuali nilai ini sebelumnya telah ditemui, menunjukkan siklus, maka tebak-dan-periksa.
Output (33 byte):
sumber
J, skor 103 (82-2 + 23)
* Catatan: Saya menamai kata kerja saya
f
dang
, jangan dikelirukan dengan string keluaranf
dang
.Hard-kode:
Fungsi umum:
Tidak jauh dengan beroperasi pada blok angka biner, yang merupakan perubahan paling penting sejauh pemadatan
g
. Mengganti nama variabel dan menghapus beberapa spasi putih untuk itu, tapi semuanya masih sama secara fungsional. (Penggunaan:g 41
)J, skor 197 (174 + 23)
Keluaran:
ffffffffggggggggfgffggg
f
mengubah daftar booleans menjadi angka, menggunakan 0s as*3
dan 1s as/2
(danfloor
).#:i.2^i
menciptakan array peringkat 2 yang berisi semua array boolean peringkat 1 panjangi
.sumber