Tantangan
Tujuan Anda adalah untuk menulis program sesingkat mungkin yang akan mengambil daftar acara (seperti upvote, downvote, dll) dan mengembalikan reputasi pengguna dan hak istimewa yang ia dapatkan.
Peristiwa macam apa?
Berikut adalah bagan acara yang tercantum dalam urutan reputasi yang diperoleh:
-15 answer unaccepted
-10 answer unupvoted
-5 question unupvoted
-2 answer downvoted
-2 question downvoted
-2 unaccept answer
-1 downvote answer
+1 join website
+1 undownvote answer
+2 accept answer
+2 question undownvoted
+2 answer undownvoted
+5 question upvoted
+10 answer upvoted
+15 answer accepted
+100 association bonus
Keistimewaan apa?
Berikut adalah daftar hak istimewa, sesuai dengan reputasi yang diperlukan.
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
200 retag questions
250 view close votes
500 cast close and reopen votes
750 established user
1000 edit questions and answers
1000 create gallery chat rooms
1250 create tag synonyms
1500 approve tag wiki edits
2000 access to moderator tools
3500 protect questions
4000 trusted user
Memasukkan
Input (pada STDIN) akan menjadi daftar acara, satu per baris, persis bagaimana mereka muncul di grafik pertama (kecuali untuk jumlah reputasi). Baris kosong mewakili akhir input. Berikut ini sebuah contoh (harus ada baris kosong di akhir):
join website
association bonus
answer upvoted
answer upvoted
question upvoted
answer accepted
answer upvoted
accept answer
unaccept answer
question unupvoted
accept answer
question upvoted
Keluaran
Baris pertama output (ke STDOUT) harus menyebutkan jumlah rep yang terakumulasi. Setiap baris setelah itu harus mencantumkan satu hak istimewa yang diperoleh, persis seperti yang muncul dan dalam urutan yang sama dengan bagan kedua. Output yang diharapkan untuk input di atas:
153 reputation
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
Aturan, Batasan, dan Catatan
Ini golf kode. Aturan golf kode standar berlaku.
(EDIT: Karena saya memiliki dua entri yang mengakses file, saya ingin menunjukkan bahwa panjang file perlu ditambahkan ke panjang kode sebagai bagian dari aturan standar untuk kode golf)
sumber
Jawaban:
GolfScript (
569 568 475473 karakter)Ini menggunakan karakter yang tidak dapat dicetak untuk mengompres string yang diperlukan, jadi dalam format xxd:
Modulo kompresi string, programnya adalah
Cukup sepele dalam banyak hal, tetapi ada dua hal yang menarik.
Yang pertama adalah fungsi hash untuk string input. Saya kagum dengan betapa sederhananya fungsi hash menghasilkan hasil yang unik untuk masing-masing
un
string 9 (sekali dihapus), dan sebagai bonus itu juga menghasilkan hasil yang berbeda untuk string kosong, yang menyimpan pengupasan garis kosong akhir dari memasukkan.Perhitungan rep untuk setiap baris adalah
Pertama, ia menghapus
un
dari string, dan membuat catatan apakah itu ditemukan. Kemudian itu menerapkan fungsi hash super-sederhanah(s) = ( sum over i: (-1)^i s[i] ) % 11
,. (Anda dapat melihat mengapa saya terkejut ketika saya menemukannya). Stringadalah tabel pencarian yang memetakan nilai hash ke perubahan dalam rep (kurangi 110 dari nilai ASCII), dan kemudian jika ditemukan
un
di awal itu meniadakan perubahan.Poin kedua yang menarik adalah filter untuk hak istimewa. Saya mencoba yang sedikit lebih sederhana:
yang mengevaluasi baris (kata-kata tidak terdefinisi tidak melakukan apa-apa) untuk mendapatkan skornya untuk dibandingkan dengan reputasi (disimpan dalam
^
). Ini hampir bekerja. Hal yang memecahnya adalah yangand
terjadi di beberapa string, dan merupakan fungsi yang telah ditentukan. Solusi: potong garis cukup sehinggaand
tidak lagi terjadi. (Ada kasus yang dibuat bahwa menghapus spasi akan lebih baik daripada menghapus surata
, tetapi tidak ada bedanya dengan panjangnya).sumber
Ruby 1.9.3,
514467459 (507460452 + 7 untuk bendera)Jalankan dengan
ruby -rzlib <program>
.Jika literal string biner tidak menempel dengan benar (yang mungkin tidak mereka lakukan), inilah dump hex:
sumber
Haskell, 787 karakter
sumber
C #
127112081206sumber
C -
10831069Saya menyadari bahwa saya agak terlambat ke permainan, tetapi C tidak diwakili, jadi saya pikir saya akan mencoba.
Ini versi yang sedikit kurang golf:
Saya pikir ide dasarnya mirip dengan banyak pendekatan orang lain. Saya menggunakan sedikit hash buatan sendiri untuk berurusan dengan mengenali input. Hash dengan mudah memberikan nol untuk string kosong, membuat garis pembacaan input sangat kompak. Saya yakin bahwa hash dapat sangat ditingkatkan. Beberapa penghematan karakter yang baik dapat diperoleh dengan memungkinkan beberapa tabrakan hash strategis untuk hal-hal yang memiliki reputasi yang sama.
Saya juga bersenang-senang sesat bersembunyigoto
di dalam makro (pertama kali saya menggunakangoto
, saya bangga mengatakan).Satu tempat di mana saya yakin saya memiliki banyak ruang untuk perbaikan adalah di bagian keluaran. Saya bahkan belum mencoba untuk mengompresi logika pencetakan yang sebenarnya, jadi saya yakin saya dapat menyimpan beberapa karakter di sana juga.
sumber
puts
bukanprintf
.goto E
denganreturn
(menghilangkan label) dan menghapus!=0
fungsi hash (itu berlebihan).C (
765737 karakter)Atau sedikit lebih mudah dibaca dengan menambahkan linebreak dan indentasi:
Kode-kode di atas mengasumsikan satu baris baru di akhir file. Jika ada dua, maka orang perlu menulis
s+=*l?e[…]:0
alih-alihs+=e[…]
, dengan biaya tambahan 5 chars . Menuliswhile(*gets(l))
akan lebih pendek tetapi tidak akan berhasil karena saya tidak menyertakan header, jadi kompiler menganggap tidakgets
kembali .int
char*
Ekspresi hashing
(l[11]%8^l[7])-97
ditemukan dengan mencoba semua ekspresi dari bentuk berikut, mencari yang dengan panjang kode yang paling pendek:Representasi karakter ASCII yang cocok dan dapat dicetak ditemukan menggunakan pencarian brute force yang serupa.
Python 3 (
743715 karakter)Dengan semangat yang sama seperti di atas. Yang ini mengandalkan baris baru kedua di akhir input.
sumber
Jawa - 1519 karakter
Untuk menemukan reputasi, ia menambahkan semua karakter dalam string input (contoh 'bergabung dengan situs web' menambah formulir 1219) dan ketika b == 1219, r = r + 1.
sumber
c
melakukanif
pemeriksaan untuk memutuskan apakah atrue
atau afalse
harus dikembalikan di mana karena iniboolean
dariif
dapat langsung dikembalikan untuk membawa ukuran ke 1470 ;) Saya telah menyarankan peningkatan untuk jawaban Anda. Ini sedang menunggu peer review :)Scala 1089
Tulis ulang dari awal, hampir. Jika saya harus menghitung data, lebih murah (sementara jelek) untuk memasukkan data secara langsung.
Pendekatan pertama, membaca harga acara dan tab privilege dari file:
membaca data dari file: 405
sumber
J (704)
Program ini terdiri dari empat bagian:
skrip dekoder berikut ( 277 byte)
file kata-kata biner, disebut
w
, juga 277 byte (unduh di sini ).Format file adalah sebagai berikut: setiap kata dikodekan sebagai grup lima-bit "byte". Setiap kelompok yang terdiri dari lima bit dapat memiliki nilai dari
1
untuk27
mewakili huruf, atau0
menjadi pemisah. Setiap kata unik dalam deskripsi acara dan hak istimewa disimpan di sini.file peristiwa biner, disebut
e
, yaitu 54 byte (unduh di sini ).Setiap acara terdiri dari reputasi 12-byte dan satu atau lebih kata-kata 6-byte. Misalnya,
accept answer
dikodekan sebagai berikut:file privilege biner, disebut
p
, yang berukuran 96 byte (unduh di sini ).Format file sama dengan
e
, misalnyaaccess to moderator tools
dikodekan sebagai berikut:sumber
Perl,
856849 karaktercukup menambahkan linebreak setelah beberapa titik koma untuk keterbacaan;):
sumber
Jawa (1470 karakter)
Catatan: Ini adalah modifikasi dari jawaban Aman ZeeK Verma tetapi karena hasil edit saya tidak diterima dan jawaban saya jauh lebih pendek daripada jawabannya, saya mempostingnya di sini.
Versi yang Dapat Dibaca:
Versi Diminimalkan:
sumber
PHP: 676 karakter
Itu tidak akan memenangkan hadiah apa pun, tapi astaga, saya tidak tahu bagaimana cara membuatnya lebih kecil, jadi saya hanya akan mempostingnya:
Karena bagian yang menghitung rep sangat sulit dibaca, ini dia format tambahan. Ini menyalahgunakan konstanta yang tidak terdefinisi dan menggunakan @ untuk menutupnya:
sumber
APL (549)
Yang ini mengemas data dalam karakter Unicode.
sumber
Python 3.x (801 karakter)
Terbaik yang bisa saya lakukan sejauh ini, hanya perlu bekerja dengan pengkodean yang lebih baik daripada base64 (petunjuk: Dapatkah seseorang membantu?).
sumber