Kode Anagram

10

Mari kita coba ini lagi.

Objek dari kontes ini adalah membuat dua bagian kode yang merupakan anagram satu sama lain (keduanya harus berisi byte yang sama dalam urutan yang berbeda), dan mereka akan melakukan tugas-tugas berikut:

  • Seseorang harus menguji apakah nomor yang dimasukkan bahagia atau prima , dan mengeluarkan jika nomornya baik (misalnya, 7harus keluar happy primedan 4harus keluar sad non-prime).

  • Yang lain harus menampilkan ukuran kode dalam byte sebagai kata (program 60-byte akan menghasilkan sixty, program 39-byte akan menampilkan thirty-nine).

Jika ada klarifikasi yang diperlukan pada peraturan, jangan ragu untuk memberi tahu saya.

Ini adalah kompetisi kode golf, jadi program terpendek menang!

Josiah Winslow
sumber
Apa yang mencegah seseorang dari melakukan /*program1*/program2dan kemudian program1/*program2*/? Saya pikir Anda harus melarang komentar.
William Barbosa
@WilliamBarbosa Kenapa? Itu tidak akan menjadi solusi yang optimal.
Martin Ender
Tetapi Anda juga dapat berbagi beberapa bagian dan tidak berbagi bagian lain yang membuatnya lebih mudah
haskeller bangga
1
@proudhaskeller Melarang komentar tidak menyelesaikan itu. Anda selalu dapat memasukkan karakter ke string, nama variabel atau bagian dari kode yang tidak dieksekusi karena alasan lain.
Martin Ender
1
FWIW, saya tidak berpikir Anda harus menghapus kiriman Anda sendiri. OP atau tidak, itu jawaban yang menarik.
Dennis

Jawaban:

6

CJam, 80 49 48 karakter

UPDATE : Terinspirasi oleh implementasi Dennis untuk menghitung jumlah kuadrat angka, ini adalah versi yang lebih pendek

Happy / Sad Prime / Non-prime:

ri:T{Ab2f#:+}G*X="happy""sad"?STmp4*"non-prime">

Bagaimana itu bekerja:

ri:T                                "Read input as integer and store it in T"
    {       }G*                     "Run this code block 16 times"
     Ab                             "Convert the number into base 10"
       2f#                          "Calculate square of each digit"
          :+                        "Sum all the squared digits and put the sum on stack"
X=                                  "Compare the sum after 16th iteration to 1"
  "happy""sad"?                     "If sum is 1, put `happy` to stack, otherwise `sad`"
               ST                   "Put space on stack then put the value of T on stack"
                 mp4*               "Put 4 to stack if input is prime, otherwise 0"
                     "non-prime">   "Put `non-prime` to stack and slice out first four characters if the input number is prime"

empat puluh delapan

""A"forTy-eiGhT""ri:{b2#:+}*X=appsadSmp4*nnpm>"?

Bagaimana ini bekerja:

""                                  "Push empty string to stack"
  A                                 "Push 10 to stack"
   "forTy-eiGhT"                    "Push `forTy-eiGhT` to stack"
                "ri:....pm>"        "Push this string to stack too"
                            ?       "Keep `forTy-eiGhT` on stack and pop the other string"

Cobalah online

Program pertama membaca nomor dari STDIN


Solusi 80 karakter asli saya

Happy / Sad Prime / Non-prime:

r:N{1/~]{i_*T+:T;}/T_s\1=:H!X):XK<&0:T;}g;H"happy""sad"?SNimp"prime"_"non-"\+?:Y

eigHTY

"eigHTY""r:N{1/~]{i_*T+:T}/_s\1=:H!X):XK<&0:T}happysad?SNmp";"prim_";"non-\?:+";
Pengoptimal
sumber
4

CJam, 50 49 byte

Tes kebahagiaan dan keutamaan

li_{Ab2f#:+}30*(T="happy""sad"?S@mp4*"non-prime">

Membaca angka dari STDIN. Kedua tes hanya berfungsi untuk bilangan bulat 64-bit.

Cobalah online.

Panjang sendiri

A"forTy-nine""l_{b2#:+}30*(=happsadS@mp4*pim>"?""

Mencetak untukTy-sembilan .

Dennis
sumber
+1 untuk peningkatan 31 byte, dan "forTy-nine".
Josiah Winslow
3

Golfscript - 81

Program ini menguji apakah suatu angka senang dan / atau prima.

~.:a;0.{).a\%!@+\}a*;2="""non-"if"prime"@ {`0\{48-.*+}/}9*("sad ""happy "if@@#get

Program ini, sebuah anagram yang terakhir, menampilkan "delapan puluh satu" (bytesize sebagai kata).

;"eighty-one"#   !""""""""%()***++-..../002489:;=@@@@\\\`aaaaadffiimnppprs{{{}}}~

Ini harus menjadi contoh.

Josiah Winslow
sumber
2
Hm, memberikan implementasi referensi untuk tantangan kode golf di GolfScript mungkin bukan ide terbaik. Saya percaya yang satu ini cukup sulit dikalahkan dan karenanya sedikit mengecewakan bagi para peserta.
Martin Ender
Saya melihat orang-orang tidak memperhatikan Anda menulis pertanyaan dan meyakinkan Anda ... Saya sepenuhnya setuju dengan martin.
haskeller bangga
@proudhaskeller Sama sekali tidak ada yang salah dengan menjawab sendiri.
Justin
Saya katakan tidak ada yang salah dengan menjawab sendiri atau berkomentar kode.
Josiah Winslow
2
@JosiahWinslow Ada adalah tidak ada yang salah dengan itu. Saya hanya mengatakan, Anda mungkin kehilangan beberapa jawaban menarik yang lebih lama jika Anda memposting sendiri solusi yang sangat bagus.
Martin Ender
1

J - 87 char

Upaya naif ini di J. Tidak menggunakan perpustakaan standar, meskipun saya ragu itu akan menjadi lebih pendek dengan menggunakan itu.

((sad`happy{~1 e.(,[:+/@:*:,.&.":@{:)^:(1-{:e.}:)^:_);@,' ';'gtv]non-prime'}.~4+4*1&p:)
'((ad`app{~1 .(,[:+/@:*:,.&.":@{:)^:(1-{:.}:)^:_);@, ;onprm}.~4+4*1&p:)']'eighty-seven'
('(ad`app{~1 .(,[:+/@:*:,.&.:@{:)^:(1-{:.}:)^:);@, ;onprm}.~4+4*1&p:']'eighty-seven'"_)

Baris di atas adalah kata kerja yang mengambil bilangan bulat dan mendiagnosis kebahagiaan dan keutamaannya sebagai string keluaran. Baris kedua adalah ekspresi yang mengembalikan string eighty-seven, sedangkan yang ketiga adalah fungsi konstan melakukan hal yang sama. Saya memasukkan keduanya karena keduanya mungkin dan karena saya tidak tahu apa putusannya pada jawaban fungsi yang berlawanan dengan jawaban program, dan J tidak memiliki fungsi tanpa argumen — Anda hanya memberi fungsi a argumen bodoh.

Kita kehilangan sebagian besar karakter untuk memeriksa kebahagiaan. (,[:+/@:*:,.&.":@{:)adalah badan utama yang menjumlahkan kuadrat dari angka, dan (1-{:e.}:)merupakan ujian apakah angka itu telah terjadi. sad`happy{~1 e.mengubah ini menjadi hasil kata, dan kami lampirkan itu di bagian depan string non-prime, berpotensi memotong empat karakter jika angka itu sebenarnya prima

Dalam anagram kita hanya menyembunyikan semua bit yang tidak ada 'eighty-seven'dalam string yang kita abaikan. Saya bisa melakukan lebih baik jika J memiliki lebih banyak surat untuk digunakan kembali, tetapi tidak, jadi oh well.

algoritme hiu
sumber
Itu solusi yang bagus.
Josiah Winslow