Perhitungan cinta

39

Sebagai seorang anak, kakak saya menunjukkan kepada saya perhitungan cinta kecil ini untuk melihat seberapa besar peluang yang Anda miliki untuk mendapatkan hubungan yang sukses dengan kekasih Anda. Yang Anda butuhkan hanyalah 2 nama dan selembar kertas.

  • John
  • Jane

Kemudian, Anda memisahkan nama-nama ini dengan kata Loves . Anda dapat menulis ini di satu baris atau di baris baru.

John
Loves
Jane

Kemudian perhitungan dimulai. Anda memulai dengan menghitung berapa kali karakter muncul dari kiri ke kanan dan jika Anda menggunakan garis baru juga dari atas ke bawah. Setiap karakter dihitung sekali, jadi setelah menghitung J John Anda tidak perlu menghitungnya lagi ketika Anda mulai dengan Jane. Hasil dari contoh ini adalah sebagai berikut:

J: 2 ([J] ohn | [J] ane)
O: 2 (J [o] hn | L [o] ves)
H: 1 (Jo [h] n)
N: 2 (Joh [n] | Ja [n] e)
__
L: 1 ([L] oves)
O: dilewati
V: 1 (Lo [v] es)
E: 2 (Lov [e] s | Jan [e])
S: 1 (Love [s] ])
__
J: dilewati
A: 1 (J [a] ne)
N: dilewati
E: dilewati
__
Hasil akhir: 2 2 1 2 1 1 2 2 1 1

Langkah selanjutnya adalah menambahkan digit yang bekerja dari luar ke tengah.

2 2 1 2 1 1 2 1 1 (2 + 1 = 3)
2 2 1 2 1 1 2 1 1 (2 + 1 = 3)
2 2 1 2 1 1 2 1 1 (1 + 2 = 3)
2 2 1 2 1 1 2 1 1 (2 + 1 = 3)
2 2 1 2 1 1 2 1 1 (1)
__
Hasil: 3 3 3 3 1

Anda akan terus melakukan ini sampai Anda memiliki bilangan bulat yang tersisa kurang atau sama dengan 100.

3 3 3 3 1
4 6 3
76%

Bisa jadi jumlah 2 digit menjadi ≥ 10, dalam hal ini angkanya akan dibagi 2 pada baris berikutnya.
Contoh:

5 3 1 2 5 4 1 8
13 (Akan digunakan sebagai 1 3)
1 3 4 5 7
8 8 4 (8 + 4 = 12 digunakan sebagai 1 2)
1 2 8
92%

Persyaratan

  • Program Anda harus dapat menerima nama apa pun dengan panjang yang masuk akal (100 karakter)
  • Karakter [A..Z, a..z] diizinkan.
  • Huruf besar-kecil sehingga A == a

Bebas bagi Anda untuk memutuskan

  • Cara menangani karakter khusus (Ö, è, dll.)
  • Sertakan nama belakang ya atau tidak, spasi akan diabaikan
  • Bahasa apa pun diizinkan.

Pemenang akan ditentukan oleh suara pada tanggal 28 Februari Februari.

Selamat coding

Ps Ini adalah pertama kalinya saya meletakkan sesuatu di sini, jika ada cara untuk memperbaikinya, beri tahu saya = 3

Sunting: Tanggal akhir yang diubah menjadi hari kasih sayang, berpikir bahwa akan lebih sesuai untuk tantangan ini :)

Teun Pronk
sumber
Contoh Anda tidak menunjukkan apa yang terjadi ketika jumlah angka genap perlu ditambahkan, atau ketika Anda memiliki angka dengan 2 digit. Lebih baik tambahkan itu untuk menjelaskan.
Kendall Frey
5
<berpikir volume = "dengan keras"> Jadi perhitungan berhenti di 91%. Aneh. Saya tahu banyak kasus di mana melanjutkan ke 10% atau bahkan lebih baik 1% akan memberikan skor yang jauh lebih realistis. Dengan manipulasi perhitungan yang begitu komersial, saya yakin ini sebenarnya yang digunakan oleh layanan kalkulator cinta SMS. </thinking>
manatwork
8
inb4 seseorang memposting kode dalam bentuk hati dan memenangkan popularitas
Cruncher
1
@ user2509848 kolom pada beberapa huruf pertama adalah kebetulan, dan bukan keharusan. Anda cukup menghitung jumlah kemunculan surat itu.
Danny
3
Bertanya-tanya bagaimana hasilnya berubah jika Anda mengonversi nama (dan "cinta") ke kode integer ASCII mereka. Untuk itu, apa yang terjadi jika Anda mengganti "cinta" dengan "benci" - Anda akan berharap untuk mendapatkan 1-love_result :-)
Carl Witthoft

Jawaban:

35

Sclipting

글⓵닆뭶뉗밃變充梴⓶壹꺃뭩꾠⓶꺐合合替虛終梴⓷縮⓶終併❶뉀大套鈮⓶充銻⓷加⓶鈮⓶終併❶뉀大終깐

Mengharapkan input sebagai dua kata yang dipisahkan oleh spasi (mis John Jane.). Ini case-insensitive, tetapi hanya mendukung karakter yang bukan karakter regex khusus (jadi jangan gunakan (atau atas *nama Anda!). Itu juga hanya mengharapkan dua kata, jadi jika minat cinta Anda adalah "Mary Jane", Anda harus memasukkan MaryJanesatu kata; jika tidak maka akan mengevaluasi "YourName mencintai Mary mencintai Jane".

Penjelasan

Bagian tersulit adalah menangani kasus jumlah digit ganjil: Anda harus meninggalkan digit tengah saja alih-alih menambahkannya sendiri. Saya pikir solusi saya menarik.

글⓵닆뭶뉗밃變 | replace space with "loves"
充 | while non-empty...
    梴 | get length of string
    ⓶壹 | get first character of string (let’s say it’s “c”)
    꺃뭩꾠⓶꺐合合 | construct the regex “(?i:c)”
    替虛終 | replace all matches with empty string
    梴 | get new length of that
    ⓷縮 | subtract the two to get a number
    ⓶ | move string to front
終 | end while
併 | Put all the numbers accrued on the stack into a single string
❶뉀大 | > 100
套 | while true...
    鈮⓶ | chop off the first digit
    充 | while non-empty... (false if that digit was the only one!)
        銻⓷加 | chop off last digit and add them
        ⓶鈮⓶ | chop off the first digit again
                 (returns the empty string if the string is empty!)
    終 | end while
    併 | Put all the numbers (± an empty string ;-) ) on the stack into a single string
    ❶뉀大 | > 100
終 | end while
깐 | add "%"

Ketika Anda pergi dengan sesuatu ≤ 100, loop hanya akan berakhir, jawabannya akan ada di tumpukan dan karena itu output.

Timwi
sumber
46
Dan saya pikir APL sulit dibaca ...
Dr. belisarius
5
Halo Timwi, saya dapat melihat Anda kembali dalam permainan: solusi bagus
Pierre Arlaud
12
Tunggu, dia menemukan bahasanya sendiri untuk codegolf ?! Itu curang!
Mooing Duck
2
Sebenarnya bahasa ini mudah dibaca (jika Anda tahu bahasa Cina).
eiennohito
8
@MooingDuck: Pemahaman saya tentang aturan ini adalah bahwa Anda tidak dapat menggunakan bahasa yang diterbitkan setelah tantangan dipublikasikan. Karena itu, saya selalu menggunakan instruksi yang saya perkenalkan sebelumnya. Sebagai contoh, saya memperkenalkan (case-insensitive string-replace) dalam menanggapi tantangan ini, tapi saya tidak akan memanfaatkannya di sini.
Timwi
29

Funciton

Program ini mengharapkan input dipisahkan oleh spasi (mis John Jane .). Huruf besar-huruf kecil untuk karakter AZ / az; untuk karakter Unicode lainnya, itu akan "membingungkan" dua karakter yang sama ketika ored dengan 32 (misalnya Ādan Ġ, atau ?dan _). Selain itu, saya tidak tahu apa yang akan dilakukan program ini jika inputnya mengandung karakter NUL ( \0), jadi jangan gunakan itu :)

Juga, karena StackExchange menambahkan terlalu banyak spasi baris, berikut adalah teks mentah pada pastebin . Atau, jalankan kode berikut di konsol JavaScript browser Anda untuk memperbaikinya di sini:$('pre').css('line-height',1)

                               ╓───╖ ╓───╖ ╓───╖ ╓───╖ ╓───╖ ╓───╖
                               ║ Ḷ ║┌╢ Ọ ╟┐║ Ṿ ║ ║ Ẹ ║┌╢ Ṛ ╟┐║ Ṣ ╟┐
                               ╙─┬─╜│╙───╜│╙─┬─╜ ╙─┬─╜│╙─┬─╜│╙─┬─╜│
                                 │  │     │  │     │  │  │  │  │  │
                                 │  │     │  │     │  │  │  │  │  │
                                 │  │     │  │     │  │  │  │  │  │
                                 │  │     │  │     │  │  │  │  │  └───────────┐
                                 │  │     │  │     │  │  │  │  └─────────────┐│
                         ┌───────┘  │     │  │     │  │  │  └───────────────┐││
                         │┌─────────┘     │  │     │  │  └─────────────────┐│││
                         ││┌──────────────┘  │     │  └───────────────────┐││││
                         │││     ┌───────────┘     └──────────────────┐   │││││
                         │││ ┌───┴───┐  ┌─────────────────────────────┴─┐ │││││
                         │││ │ ╔═══╗ │  │                               │ ││││└─────────┐
                         │││ │ ║ 2 ║ │  │     ┌───┐   ┌───┐             │ │││└─────────┐│
                         │││ │ ║ 1 ║ │  │    ┌┴┐  │  ┌┴┐  │             │ ││└─────────┐││
                         │││ │ ║ 1 ║ │  │    └┬┘  │  └┬┘  │             │ │└─────────┐│││
┌────────────────────────┘││ │ ║ 1 ║ │  │   ┌─┴─╖ │ ┌─┴─╖ │     ┌───╖   │ └─────────┐││││
│┌────────────────────────┘│ │ ║ 0 ║ │  │   │ ♯ ║ │ │ ♯ ║ ├─────┤ ℓ ╟───┴─┐         │││││
││┌────────────────────────┘ │ ║ 6 ║ │  │   ╘═╤═╝ │ ╘═╤═╝ │     ╘═══╝   ┌─┴─╖       │││││
│││                    ┌─────┘ ║ 3 ║ │  │    ┌┴┐  │  ┌┴┐  └─────────────┤ · ╟──────┐│││││
│││┌───────────────────┴┐┌───╖ ║ 3 ║ │  │    └┬┘  │  └┬┘                ╘═╤═╝      ││││││
││││                   ┌┴┤ = ╟─╢ 3 ║ │  │ ┌───┘   └───┴─────┐         ┌───┴───┐    ││││││
││││      ╔════╗ ┌───╖ │ ╘═╤═╝ ║ 1 ║ │  │ │ ╔═══╗         ┌─┴─╖       │ ╔═══╗ │    ││││││
││││      ║ 37 ╟─┤ ‼ ╟─┘ ┌─┘   ║ 9 ║ │  │ │ ║ 1 ║ ┌───────┤ · ╟─┐     │ ║ 0 ║ │    ││││││
││││      ╚════╝ ╘═╤═╝  ┌┴┐    ║ 6 ║ │  │ │ ╚═╤═╝ │       ╘═╤═╝ ├─────┘ ╚═╤═╝ │    ││││││
││││ ┌───╖ ┌───╖ ┌─┴─╖  └┬┘    ║ 3 ║ │  │ │ ┌─┴─╖ │ ╔═══╗ ┌─┴─╖ │ ╔═══╗ ┌─┴─╖ │    ││││││
│││└─┤ Ẹ ╟─┤ Ṿ ╟─┤ ? ╟───┤     ║ 3 ║ │  │ └─┤ ʃ ╟─┘ ║ 1 ╟─┤ ʃ ╟─┘ ║ 1 ╟─┤ ʃ ╟─┘    ││││││
│││  ╘═══╝ ╘═══╝ ╘═╤═╝  ┌┴┐    ║ 7 ║ │  │   ╘═╤═╝   ╚═══╝ ╘═╤═╝   ╚═══╝ ╘═╤═╝      ││││││
│││                │    └┬┘    ╚═══╝ │  │     │  ┌──────────┘             └──────┐ ││││││
│││              ╔═══╗ ┌─┴─╖ ┌───╖   │  │     │  │ ┌─────────╖ ┌───╖ ┌─────────╖ │ ││││││
│││              ║ 3 ╟─┤ > ╟─┤ ℓ ╟───┘  │     │  └─┤ str→int ╟─┤ + ╟─┤ str→int ╟─┘ ││││││
│││              ╚═══╝ ╘═══╝ ╘═══╝      │     │    ╘═════════╝ ╘═╤═╝ ╘═════════╝   ││││││
││└───────────────────────────────────┐ │     │             ┌────┴────╖            ││││││
│└───────────────────────────────┐    │ │     │             │ int→str ║            ││││││
│          ╔═══╗                 │    │ │     │ ┌───╖ ┌───╖ ╘════╤════╝            ││││││
│          ║ 0 ║                 │    │ │     └─┤ Ẹ ╟─┤ ‼ ╟──────┘                 ││││││
│          ╚═╤═╝                 │    │ │       ╘═══╝ ╘═╤═╝   ┌────────────────────┘│││││
│    ╔═══╗ ┌─┴─╖                 │    │ │             ┌─┴─╖ ┌─┴─╖ ╔═══╗             │││││
│    ║ 1 ╟─┤ ʃ ╟─────────────────┴┐   │ └─────────────┤ ? ╟─┤ ≤ ║ ║ 2 ║             │││││
│    ╚═══╝ ╘═╤═╝                  │   │               ╘═╤═╝ ╘═╤═╝ ╚═╤═╝             │││││
│          ┌─┴─╖                  │   │                 │     └─────┘               │││││
│        ┌─┤ Ṣ ╟──────────────────┴┐  │    ╔═══╗   ┌────────────────────────────────┘││││
│        │ ╘═╤═╝                   │  │    ║   ║   │  ┌──────────────────────────────┘│││
│        │ ┌─┴─╖                   │  │    ╚═╤═╝   │  │    ┌──────────────────────────┘││
│        └─┤ · ╟─────────────┐     │  │    ┌─┴─╖   │┌─┴─╖┌─┴─╖                         ││
│          ╘═╤═╝             │     │  │    │ Ḷ ║   └┤ · ╟┤ · ╟┐                        ││
│      ┌─────┴───╖         ┌─┴─╖ ┌─┴─╖│    ╘═╤═╝    ╘═╤═╝╘═╤═╝│                        ││
│      │ int→str ║ ┌───────┤ · ╟─┤ · ╟┴┐     │      ┌─┴─╖  │  │                        ││
│      ╘═════╤═══╝ │       ╘═╤═╝ ╘═╤═╝ │           ┌┤ · ╟──┘  │                        ││
│            │   ┌─┴─╖ ┌───╖ │     │   │         ┌─┘╘═╤═╝   ┌─┴─╖                      ││
│            │   │ ‼ ╟─┤ Ọ ╟─┘     │   │         │ ┌──┴─────┤ · ╟───────┐              ││
│            │   ╘═╤═╝ ╘═╤═╝       │   │         │ │ ╔════╗ ╘═╤═╝ ╔═══╗ │              ││
│            └─────┘     │         │   │         │ │ ║ 21 ║   │   ║ 2 ║ │              ││
│                ┌───╖ ┌─┴─╖       │   │  ┌──────┘ │ ╚═══╤╝   │   ║ 0 ║ │              ││
│            ┌───┤ Ṿ ╟─┤ ? ╟───────┘   │  │┌───╖ ┌─┴─╖ ┌─┴──╖ │   ║ 9 ║ │              ││
│            │   ╘═══╝ ╘═╤═╝           │ ┌┴┤ ♯ ╟─┤ Ṛ ╟─┤ >> ║ │   ║ 7 ║ │              ││
│            │           │             │ │ ╘═══╝ ╘═╤═╝ ╘══╤═╝ │   ║ 1 ║ │              ││
│            └─────────┐   ┌───────────┘ │ ╔═══╗ ┌─┴─╖    ├───┴─┬─╢ 5 ║ │              ││
└───────────────────┐  └───┘             │ ║ 0 ╟─┤ ? ╟────┘     │ ║ 1 ║ │              ││
╔════╗              │                    │ ╚═══╝ ╘═╤═╝   ┌──────┤ ╚═══╝ │              ││
║ 21 ║              │                    │       ┌─┴─╖ ┌─┴─╖ ╔══╧══╗    │              ││
╚═╤══╝              │                    └───────┤ ? ╟─┤ ≠ ║ ║ −33 ║    │              ││
┌─┴─╖ ┌────╖        │                            ╘═╤═╝ ╘═╤═╝ ╚══╤══╝   ┌┴┐             ││
│ × ╟─┤ >> ╟────────┴────────────┐                 │     └──────┤      └┬┘             ││
╘═╤═╝ ╘═╤══╝ ┌───╖   ╔═════════╗ │                              └───────┘              ││
┌─┴─╖   └────┤ ‼ ╟───╢ 2224424 ║ │                ┌────────────────────────────────────┘│
│ ♯ ║        ╘═╤═╝   ║ 4396520 ║ │                │    ┌────────────────────────────────┘
╘═╤═╝        ┌─┴─╖   ║ 1237351 ║ │                │    │    ┌─────────────────────┐
  └──────────┤ · ╟─┐ ║ 2814700 ║ │                │  ┌─┴─╖  │     ┌─────┐         │
             ╘═╤═╝ │ ╚═════════╝ │              ┌─┴──┤ · ╟──┤     │    ┌┴┐        │
 ╔═══╗ ┌───╖ ┌─┴─╖ │   ╔════╗    │            ┌─┴─╖  ╘═╤═╝┌─┴─╖   │    └┬┘        │
 ║ 0 ╟─┤ Ọ ╟─┤ ‼ ║ │   ║ 32 ║    │   ┌────────┤ · ╟────┴──┤ Ṛ ╟───┤   ┌─┴─╖       │
 ╚═══╝ ╘═╤═╝ ╘═╤═╝ │   ╚═╤══╝    │   │        ╘═╤═╝       ╘═╤═╝   │   │ ♯ ║       │
         │   ┌─┴─╖ ├─┐ ┌─┴─╖     │ ┌─┴─╖      ┌─┴─╖       ╔═╧═╗   │   ╘═╤═╝       │
           ┌─┤ ʃ ╟─┘ └─┤ ʘ ║     │┌┤ · ╟──────┤ · ╟───┐   ║ 1 ║   │    ┌┴┐        │
           │ ╘═╤═╝     ╘═╤═╝     ││╘═╤═╝      ╘═╤═╝   │   ╚═══╝   │    └┬┘        │
           │ ╔═╧═╗       ├───────┘│  │       ┌──┴─╖ ┌─┴─╖ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╔═══╗ │
           │ ║ 0 ║       │        │  │       │ >> ╟─┤ Ṣ ╟─┤ ‼ ╟─┤ · ╟─┤ ʃ ╟─╢ 0 ║ │
           │ ╚═══╝       │        │  │       ╘══╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╚═══╝ │
           └─────────────┘        │  │ ╔════╗ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┘     ├─────────┘
                                  │  │ ║ 21 ╟─┤ × ╟─┤ · ╟─┤ · ╟─┴─┐     │
                                  │  │ ╚════╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝   │     │
                                  │  └────────────────┘   ┌─┴─╖   │     │
                                  │                   ┌───┤ ? ╟───┴┐    │
                                  │                   │   ╘═╤═╝    │    │
                                  │           ┌───╖ ┌─┴─╖   │    ┌─┴─╖  │
                                  └───────────┤ ♯ ╟─┤ · ╟─┐   ┌──┤ ? ╟─ │
                                              ╘═══╝ ╘═╤═╝ └───┘  ╘═╤═╝  │
                                                      │          ╔═╧═╗  │
                                                      │          ║ 0 ║  │
                                                      │          ╚═══╝  │
                                                      └─────────────────┘

Penjelasan cepat

  • Program hanya mengambil STDIN dan memanggilnya .

  • menemukan spasi pertama dalam string, menggantinya dengan loves dan meneruskan hasilnya ke .

  • berulang kali mengambil karakter pertama dari string input, panggilan dan menyatukan jumlah kemunculan ke string hasil. Ketika string input kosong, ia memanggil dengan string hasil.

  • panggilan berulang kali sampai mendapat hasil yang sama dengan "100"atau memiliki panjang kurang dari 3. ( 100benar-benar dapat terjadi: pertimbangkan inputlovvvv eeeeeess .) Ketika itu terjadi, ia menambah "%"dan mengembalikannya.

  • menghitung satu iterasi lengkap dari algoritma cinta-komputasi; yaitu, dibutuhkan string digit dan mengembalikan string digit berikutnya.

  • mengambil tumpukan jerami dan jarum dan menemukan indeks kemunculan pertama jarum di tumpukan jerami menggunakan kriteria ketidaksensitifan case-faux (or 32 ).

  • mengambil tumpukan jerami dan jarum dan berulang kali berlaku untuk menghapus semua contoh jarum . Ini mengembalikan hasil akhir setelah semua pemindahan serta jumlah pemindahan yang dilakukan.

Timwi
sumber
12
Saya tidak tahu apa yang terjadi di sini, tetapi itu terlihat sangat mengesankan!
squeamish ossifrage
27

Rubi

     f=IO.         read(
   __FILE__)     .gsub(/[^
 \s]/x,?#);s=   $**'loves';s
.upcase!;i=1;a =s.chars.uniq.
map{|c|s.count(c)};loop{b='';
b<<"#{a.shift.to_i+a.pop.to_i
 }"while(a.any?);d=b.to_i;a=
   b.chars;d<101&&abort(d>
     50?f:f.gsub(/^.*/){
       |s|i=13+i%3;s[\
         i...i]=040.
           chr*3;s
             })}
              V

Mencetak hati jika peluang hubungan melebihi 50%

$ ruby ♥.rb sharon john
     #####         #####
   #########     #########
 ############   ############
############## ##############
#############################
#############################
 ###########################
   #######################
     ###################
       ###############
         ###########
           #######
             ###
              #

Dan mencetak patah hati jika peluangnya di bawah 50% :(

$ ruby ♥.rb sharon epidemian
     #####            #####
   #########        #########
 ############      ############
##############    ##############
###############   ##############
#############   ################
 #############   ##############
   ############   ###########
     ########   ###########
       #######   ########
         ######   #####
           ##   #####
             #   ##
              # 

Frigging John ...

Bagaimanapun, ini case-insensitive dan mendukung permintaan poligami (mis ruby ♥.rb Alice Bob Carol Dave.).

epidemi
sumber
1
Itu murni seni :)
11

APL, 80

{{n←⍎∊⍕¨(⍵[⌈m]/⍨m≠⌊m),⍨+/(⌊m←2÷⍨≢⍵)↑[1]⍵,⍪⌽⍵⋄n≤100:n⋄∇⍎¨⍕n}∪⍦32|⎕UCS⍺,'Loves',⍵}

Karena cinta adalah cinta adalah (meskipun tidak)

Versi wajib berbentuk ♥ ︎:

    {f←{m←  2÷⍨≢⍵
  n←+/(⌊m)↑[1]⍵,⍪⌽⍵
n←⍎∊⍕¨n,(⍵[⌈m]/⍨m≠⌊m)
n≤100:n⋄∇⍎¨⍕n}⋄u←⎕UCS
   s←u⍺,'Loves',⍵
       f∪⍦32|s
          }

Versi golf memberi saya perilaku yang agak tidak menentu, karena bug dengan ∪⍦yang saya selidiki dengan pengembang NARS:

      'John'{{n←⍎∊⍕¨(⍵[⌈m]/⍨m≠⌊m),⍨+/(⌊m←2÷⍨≢⍵)↑[1]⍵,⍪⌽⍵⋄n≤100:n⋄∇⍎¨⍕n}∪⍦32|⎕UCS⍺,'Loves',⍵}'Jane'
VALUE ERROR

Tapi saya bisa menjalankannya sedikit demi sedikit dan mendapatkan hasil yang benar:

      'John'{∪⍦32|⎕UCS⍺,'Loves',⍵}'Jane'
2 2 1 2 1 1 2 1 1
      {n←⍎∊⍕¨(⍵[⌈m]/⍨m≠⌊m),⍨+/(⌊m←2÷⍨≢⍵)↑[1]⍵,⍪⌽⍵⋄n≤100:n⋄∇⍎¨⍕n}2 2 1 2 1 1 2 1 1
76
Tobia
sumber
8

Javascript

Mungkin bisa lebih bersih, tetapi berhasil. Contoh verbose

function z(e) {
    for (var t = 0, c = '', n = e.length - 1; n >= t; n--, t++) {
        c += n != t ? +e[t] + (+e[n]) : +e[t];
    }
    return c
}
for (var s = prompt("Name 1").toLowerCase() + "loves" + prompt("Name 2").toLowerCase(),b = '', r; s.length > 0;) {
    r = new RegExp(s[0], "g");
    b+=s.match(r).length;
    s = s.replace(r, "")
}
for (; b.length > 2; b = z(b)) {}
console.log("Chances of being in love are: " + b + "%")
Danny
sumber
7

Python

Yah, saya pikir itu adalah ...

a=filter(str.isalpha,raw_input()+"loves"+raw_input()).lower();a=[x[1]for x in sorted(set(zip(a,map(str.count,[a]*len(a),a))),key=lambda(x,y):a.index(x))]
while reduce(lambda x,y:x*10+y,a)>100:a=reduce(list.__add__,map(lambda x: x<10 and[x]or map(int,str(x)),[a[n]+a[-n-1]for n in range(len(a)/2)]+(len(a)%2 and[a[len(a)/2]]or[])))
print str(reduce(lambda x,y:x*10+y,a))+"%"

Tidak Disatukan:

a = filter(str.isalpha,
           raw_input() + "loves" + raw_input()).lower()

a = [x[1] for x in sorted(set(zip(a,
                                  map(str.count, [a] * len(a), a))),
                          key=lambda (x, y): a.index(x))]

while reduce(lambda x, y: x * 10 + y, a) > 100:
    a = reduce(list.__add__,
               map(lambda x: x < 10 and [x] or map(int, str(x)), 
                   [a[n] + a[-n - 1] for n in range(len(a) / 2)] + (len(a) % 2 and [a[len(a) / 2]] or [])))

print str(reduce(lambda x, y: x * 10 + y, a)) + "%"
Oberon
sumber
Jika Anda ingin membuatnya sesingkat mungkin, Anda dapat menggantinya reduce(list.__add__,xyz)dengan sum(xyz,[]). :)
flornquake
5

PHP

<?php

$name1 = $argv[1];
$name2 = $argv[2];

echo "So you think {$name1} and {$name2} have any chance? Let's see.\nCalculating if \"{$name1} Loves {$name2}\"\n";

//prepare it, clean it, mince it, knead it
$chances = implode('', array_count_values(str_split(preg_replace('/[^a-z]/', '', strtolower($name1.'loves'.$name2)))));
while(($l = strlen($chances))>2 and $chances !== '100'){
    $time = time();
    $l2 = intval($l/2);
    $i =0;
    $t = '';
    while($i<$l2){
        $t.=substr($chances, $i, 1) + substr($chances, -$i-1, 1);
        $i++;
    }
    if($l%2){
        $t.=$chances[$l2];
    }
    echo '.';
    $chances = $t;
    while(time()==$time){}
}

echo "\nTheir chances in love are {$chances}%\n";
$chances = intval($chances);
if ($chances === 100){
    echo "Great!!\n";
}elseif($chances > 50){
    echo "Good for you :) !!\n";
}elseif($chances > 10){
    echo "Well, it's something.\n";
}else{
    echo "Ummm.... sorry.... :(\n";
}

hasil sampel

$ php loves.php John Jane
So you think John and Jane have any chance? Let's see.
Calculating if "John Loves Jane"
...
Their chances in love are 76%
Good for you :) !!
Einacio
sumber
4

GolfScript

Jawaban golf kode wajib dalam GolfScript:

' '/'loves'*{65- 32%65+}%''+:x.|{{=}+x\,,}%{''\{)\(@+@\+\.(;}do 0+{+}*+{[]+''+~}%.,((}do{''+}%''+

Menerima input sebagai nama yang dipisahkan oleh spasi mis

echo 'John Jane' | ruby golfscript.rb love.gs
-> 76
Ben Reich
sumber
4

C #

using System;
using System.Collections.Generic;
using System.Linq;

namespace LovesMeWhat
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 2) throw new ArgumentException("Ahem, you're doing it wrong.");

            Func<IEnumerable<Int32>, String> fn = null;
            fn = new Func<IEnumerable<Int32>, String> (input => {
                var q = input.SelectMany(i => i.ToString().Select(c => c - '0')).ToArray();

                if (q.Length <= 2) return String.Join("", q);

                IList<Int32> next = new List<Int32>();
                for (int i = 0, j = q.Length - 1; i <= j; ++i, --j)
                {
                    next.Add(i == j ? q[i] : q[i] + q[j]);
                }
                return fn(next);
            });

            Console.Write(fn(String.Concat(args[0], "LOVES", args[1]).ToUpperInvariant().GroupBy(g => g).Select(g => g.Count())));
            Console.Write("%");
            Console.ReadKey(true);
        }
    }
}
Luc
sumber
Apakah ini berfungsi dengan benar ketika q[i] + q[j]10 atau lebih besar?
Danny
@Danny Baris pertama dalam fn mengambil setiap integer dalam input, mengubah masing-masingnya menjadi string, kemudian mengubah semua karakter dalam string ini menjadi integer dari 0 hingga 9 (c - '0' bagian) dan mengembalikannya ... TUNGGU, itu akan membangun array bilangan bulat yang terdiri dari setiap digit pada input. Jika tidak, persyaratannya tidak valid :-)
Luc
ah melewatkan itu.
Danny
4

Haskell

Versi saya cukup panjang, itu karena saya memutuskan untuk fokus pada keterbacaan, saya pikir akan menarik untuk memformalkan algoritma Anda dalam kode. Saya menggabungkan jumlah karakter dalam lipatan kiri , itu pada dasarnya bola salju mereka bersama-sama dan urutan sesuai dengan kemunculannya dalam string. Saya juga berhasil mengganti bagian dari algoritma yang biasanya memerlukan pengindeksan array dengan bending daftar . Ternyata algoritma Anda pada dasarnya melibatkan melipat daftar angka menjadi dua dan menambahkan angka-angka yang disejajarkan bersama-sama. Ada dua case untuk bending, bahkan daftar terbelah di tengah dengan baik, daftar aneh membungkuk di sekitar elemen tengah dan elemen itu tidak ikut serta. Fission mengambil daftar dan membagi nomor yang bukan lagi satu digit, seperti> = 10 . Saya harus menulis unfoldl saya sendiri, Saya tidak yakin apakah itu sebenarnya buka , tetapi tampaknya melakukan apa yang saya butuhkan. Nikmati.

import qualified Data.Char as Char
import qualified System.Environment as Env

-- | Takes a seed value and builds a list using a function starting 
--   from the last element
unfoldl :: (t -> Maybe (t, a)) -> t -> [a]
unfoldl f b  =
  case f b of
   Just (new_b, a) -> (unfoldl f new_b) ++ [a]
   Nothing -> []

-- | Builds a list from integer digits
number_to_digits :: Integral a => a -> [a]
number_to_digits n = unfoldl (\x -> if x == 0 
                                     then Nothing 
                                     else Just (div x 10, mod x 10)) n

-- | Builds a number from a list of digits
digits_to_number :: Integral t => [t] -> t
digits_to_number ds = number
  where (number, _) = foldr (\d (n, p) -> (n+d*10^p, p+1)) (0,0) ds

-- | Bends a list at n and returns a tuple containing both parts 
--   aligned at the bend
bend_at :: Int -> [a] -> ([a], [a])
bend_at n xs = let 
                 (left, right) = splitAt n xs
                 in ((reverse left), right)

-- | Takes a list and bends it around a pivot at n, returns a tuple containing 
--   left fold and right fold aligned at the bend and a pivot element in between
bend_pivoted_at :: Int -> [t] -> ([t], t, [t])
bend_pivoted_at n xs
  | n > 1 = let 
              (left, pivot:right) = splitAt (n-1) xs
              in ((reverse left), pivot, right)

-- | Split elements of a list that satisfy a predicate using a fission function
fission_by :: (a -> Bool) -> (a -> [a]) -> [a] -> [a]
fission_by _ _ [] = []
fission_by p f (x:xs)
  | (p x) = (f x) ++ (fission_by p f xs)
  | otherwise = x : (fission_by p f xs)

-- | Bend list in the middle and zip resulting folds with a combining function.
--   Automatically uses pivot bend for odd lists and normal bend for even lists
--   to align ends precisely one to one
fold_in_half :: (b -> b -> b) -> [b] -> [b]
fold_in_half f xs
  | odd l = let 
              middle = (l-1) `div` 2 + 1
              (left, pivot, right) = bend_pivoted_at middle xs
              in pivot:(zipWith f left right)
  | otherwise = let 
                  middle = l `div` 2
                  (left, right) = bend_at middle xs
                  in zipWith f left right
  where 
    l = length xs

-- | Takes a list of character counts ordered by their first occurrence 
--   and keeps folding it in half with addition as combining function
--   until digits in a list form into any number less or equal to 100 
--   and returns that number
foldup :: Integral a => [a] -> a
foldup xs
  | n > 100 = foldup $ fission $ reverse $ (fold_in_half (+) xs)
  | otherwise = n
  where 
    n = (digits_to_number xs)
    fission = fission_by (>= 10) number_to_digits 

-- | Accumulate counts of keys in an associative array
count_update :: (Eq a, Integral t) => [(a, t)] -> a -> [(a, t)]
count_update [] x = [(x,1)]
count_update (p:ps) a
  | a == b = (b,c+1) : ps
  | otherwise = p : (count_update ps a)
  where
    (b,c) = p

-- | Takes a string and produces a list of character counts in order 
--   of their first occurrence
ordered_counts :: Integral b => [Char] -> [b]
ordered_counts s = snd $ unzip $ foldl count_any_alpha [] s
  where 
    count_any_alpha m c
      | Char.isAlpha c = count_update m (Char.toLower c)
      | otherwise = m

-- | Take two names and perform the calculation
love_chances n1 n2 =  foldup $ ordered_counts (n1 ++ " loves " ++ n2) 

main = do
   args <- Env.getArgs
   if (null args) || (length args < 2)
     then do
            putStrLn "\nUSAGE:\n"
            putStrLn "Enter two names separated by space\n"
     else let 
            n1:n2:_ = args 
            in putStrLn $ show (love_chances n1 n2) ++ "%"

Beberapa hasil:

"Romeo" "Juliet" 97% - Pengujian empiris penting
"Romeo" "Julier" 88% - Versi singkat modern ...
"Horst Draper" "Jane" 20%
"Horst Draper" "Jane (Horse)" 70% - Sudah ada perkembangan ...
"Bender Bender Rodriguez" "Fenny Wenchworth" 41% - Bender Mengatakan "Lipat adalah untuk wanita!"
"Philip Fry" "Turanga Leela" 53% - Anda bisa tahu mengapa butuh 7 Musim bagi mereka untuk menikahi
"Maria" "Abraham" - 98%
"John" "Jane" 76%

vlsh
sumber
3

Rubi

math = lambda do |arr|
  result = []
  while arr.any?
    val = arr.shift + (arr.pop || 0)
    result.push(1) if val >= 10
    result.push(val % 10)
  end
  result.length > 2 ? math.call(result) : result
end
puts math.call(ARGV.join("loves").chars.reduce(Hash.new(0)) { |h, c| h[c.downcase] += 1; h }.values).join

Diperkecil:

l=->{|a|r=[];while a.any?;v=a.shift+(a.pop||0);r.push(1) if v>=10;r.push(v%10) end;r[2]?l[r]:r}
puts l[ARGV.join("loves").chars.reduce(Hash.new(0)){|h, c| h[c.downcase]+=1;h}.values].join

Sebut saja:

$ ruby love.rb "John" "Jane"
76
Andrew Hubbs
sumber
1
Untuk mengecilkan lebih lanjut, Anda bisa menggunakan l=->a{...}bukan l=lambda do|a|...end, dan Anda juga bisa melakukan l[...]bukan l.call(...).
Gagang Pintu
Poin bagus, gagang pintu.
Andrew Hubbs
2

Python 3

Solusi sederhana yang tidak menggunakan modul. I / O cukup cantik.

Saya menggunakan error catching sebagai cadangan ketika iterator kedua berada di luar batas; jika menangkap kesalahan indeks Python, ia mengasumsikan 1. Aneh, tetapi berhasil.

names = [input("Name 1: ").lower(), "loves", input("Name 2: ").lower()]
checkedLetters = []

def mirrorAdd(n):
    n = [i for i in str(n)]
    if len(n) % 2:
        n.insert(int(len(n)/2), 0)
    return(int(''.join([str(int(n[i]) + int(n[len(n)-i-1])) for i in range(int(len(n)/2))])))

cn = ""

positions = [0, 0]
for i in [0, 1, 2]:
    checkAgainst = [0, 1, 2]
    del checkAgainst[i]
    positions[0] = 0
    while positions[0] < len(names[i]):
        if not names[i][positions[0]] in checkedLetters:
            try:
                if names[i][positions[0]] in [names[checkAgainst[0]][positions[1]], names[checkAgainst[1]][positions[1]]]:
                    positions[1] += 1
                    cn = int(str(cn) + "2")
                else:
                    cn = int(str(cn) + "1")
            except:
                cn = int(str(cn) + "1")
            checkedLetters.append(names[i][positions[0]])
        positions[0] += 1

print("\n" + str(cn))

while cn > 100:
    cn = mirrorAdd(cn)
    print(cn)

print("\n" + str(cn) + "%")

Inilah contoh menjalankan:

Name 1: John
Name 2: Jane

221211211
33331
463
76

76%
cjfaure
sumber
apakah tidak akan lebih jelas untuk menjalankan forpada nameslangsung?
Einacio
@ Einacio Lalu bagaimana saya tahu yang mana yang harus diperiksa dengan begitu ringkas?
cjfaure
apa hasil Anda dengan "Maria" dan "Abraham"?
Einacio
@ Einacio saya mendapat 75%.
cjfaure
saya mendapat 98, ini langkah-langkahnya 25211111111.363221.485.98. saya pikir Anda kode gagal untuk menambahkan 5 "a"
Einacio
2

Jawa

Bisa jadi jumlah 2 digit menjadi lebih besar dari 10, dalam hal ini angkanya akan dibagi 2 pada baris berikutnya.

Bagaimana jika jumlahnya sama dengan 10? Saya baru saja menambahkan 1 dan 0, apakah itu benar?

Saya memutuskan untuk mengabaikan kasus.

public class LoveCalculation {
    public static void main(String[] args) {
        String chars = args[0].toLowerCase() + "loves" + args[1].toLowerCase();
        ArrayList<Integer> charCount = new ArrayList<Integer>();
        HashSet<Character> map = new HashSet<Character>();
        for(char c: chars.toCharArray()){
            if(Pattern.matches("[a-z]", "" + c) && map.add(c)){
                int index = -1, count = 0;
                while((index = chars.indexOf(c, index + 1)) != -1)
                    count++;
                charCount.add(count);
            }
        }
        while(charCount.size() > 2){
            ArrayList<Integer> numbers = new ArrayList<Integer>();
            for(int i = 0; i < (charCount.size()/2);i++)
                addToArray(charCount.get(i) + charCount.get(charCount.size()-1-i), numbers);
            if(charCount.size() % 2 == 1){
                addToArray(charCount.get(charCount.size()/2), numbers);
            }
            charCount = new ArrayList<Integer>(numbers);
        }
        System.out.println(Arrays.toString(charCount.toArray()).replaceAll("[\\]\\[,\\s]","") + "%");
    }
    public static ArrayList<Integer> addToArray(int number, ArrayList<Integer> numbers){
        LinkedList<Integer> stack = new LinkedList<Integer>();
        while (number > 0) {
            stack.push(number % 10);
            number = number / 10;
        }
        while (!stack.isEmpty())
            numbers.add(stack.pop());
        return numbers;
    }
}

memasukkan:

Maria
Abraham

keluaran:

98%

memasukkan:

Wasi
codegolf.stackexchange.com

keluaran:

78%
Rolf ツ
sumber
Saya akan senang melihat jawaban ini bermain golf untuk iseng dan cekikikan!
Josh
Itu membuat minus 144 karakter dan beberapa baris. Saya hanya terbiasa dengan program yang dapat dibaca dan hemat memori ...
Rolf ツ
Itu sebabnya melihat Java golf selalu membuatku jengkel.
Josh
Bagi saya itu menyenangkan dalam membuat bahasa seperti golf ini .. bayangkan saja betapa lucunya mencoba bermain golf di kelas java acak itu akan menjadi setidaknya 2 kali lebih kecil XD
Rolf ツ
1
Jawa adalah tentang bahasa terburuk untuk bermain golf. Sayangnya hanya bahasa yang saya kenal baik, haha. Oh well, setidaknya saya bisa membaca barang di sini.
Andrew Gies
2

C

Mungkin ada banyak peningkatan, tapi ini menyenangkan untuk dikodekan.

#include <stdio.h>
#include <string.h>
int i, j, k, c, d, r, s = 1, l[2][26];
char a[204], *p, *q;

main(int y, char **z) {
    strcat(a, z[1]);
    strcat(a, "loves");
    strcat(a, z[2]);
    p = a;
    q = a;
    for (; *q != '\0'; q++, p = q, i++) {
        if (*q == 9) {
            i--;
            continue;
        }
        l[0][i] = 1;
        while (*++p != '\0')
            if ((*q | 96) == (*p | 96)&&*p != 9) {
                (l[0][i])++;
                *p = 9;
            }
    }
    for (;;) {
        for (j = 0, k = i - 1; j <= k; j++, k--) {
            d = j == k ? l[r][k] : l[r][j] + l[r][k];
            if (d > 9) {
                l[s][c++] = d % 10;
                l[s][c++] = d / 10;
            } else l[s][c++] = d;
            if (k - j < 2)break;
        }
        i = c;
        if (c < 3) {
            printf("%d", l[s][0]*10 + l[s][1]);
            break;
        }
        c = r;
        r = s;
        s = c;
        c = 0;
    }
}

Dan tentu saja, versi golf wajib: 496

#include <stdio.h>
#include <string.h>
int i,j,k,c,d,r,s=1,l[2][26];char a[204],*p,*q;main(int y,char **z){strcat(a,z[1]);strcat(a,"loves");strcat(a,z[2]);p=q=a;for(;*q!='\0';q++,p=q,i++){if(*q==9){i--;continue;}l[0][i]=1;while(*++p!='\0')if((*q|96)==(*p|96)&&*p!=9){(l[0][i])++;*p=9;}}for(;;){for(j=0,k=i-1;j<=k;j++,k--){d=j==k?l[r][k]:l[r][j]+l[r][k];if(d>9){l[s][c++]=d%10;l[s][c++]=d/10;}else l[s][c++]=d;if(k-j<2)break;}i=c;if(c<3){printf("%d",l[s][0]*10+l[s][1]);break;}c=r;r=s;s=c;c=0;}}
Allbeert
sumber
2

Python 3

Ini akan mengambil dua nama sebagai input. menanggalkan ruang ekstra dan kemudian menghitung cinta. Lihat output input untuk detail lebih lanjut.

s=(input()+'Loves'+input()).strip().lower()
a,b=[],[]
for i in s:
    if i not in a:
        a.append(i)
        b.append(s.count(i))
z=int(''.join(str(i) for i in b))
while z>100:
    x=len(b)
    t=[]
    for i in range(x//2):
        n=b[-i-1]+b[i]
        y=n%10
        n//=10
        if n:t.append(n)
        t.append(y)
    if x%2:t.append(b[x//2])
    b=t
    z=int(''.join(str(i) for i in b))
print("%d%%"%z)

memasukkan:

Maria
Abraham

keluaran:

98%

Atau, coba yang ini;)

memasukkan:

Wasi Mohammed Abdullah
code golf

keluaran:

99%
Wasi
sumber
2

k, 80

{{$[(2=#x)|x~1 0 0;x;[r:((_m:(#x)%2)#x+|x);$[m=_m;r;r,x@_m]]]}/#:'.=x,"loves",y}

Ini dia:

{{$[(2=#x)|x~1 0 0;x;[r:((_m:(#x)%2)#x+|x);$[m=_m;r;r,x@_m]]]}/#:'.=x,"loves",y}["john";"jane"]
7 6
Mollmerx
sumber
2

J

Inilah yang sederhana di J:

r=:({.+{:),$:^:(#>1:)@}:@}.
s=:$:^:(101<10#.])@("."0@(#~' '&~:)@":"1)@r
c=:10#.s@(+/"1@=)@(32|3&u:@([,'Loves',]))
exit echo>c&.>/2}.ARGV

Dibutuhkan nama pada baris perintah, misalnya:

$ jconsole love.ijs John Jane
76
marinus
sumber
2

Asyik

Inilah versi asyik, dengan tes.

countChars = { res, str -> str ? call(res+str.count(str[0]), str.replace(str[0],'')) : res }
addPairs = { num -> def len = num.length()/2; (1..len).collect { num[it-1].toInteger() + num[-it].toInteger() }.join() + ((len>(int)len) ? num[(int)len] : '') }
reduceToPct = { num -> /*println num;*/ num.length() > 2 ? call( addPairs(num) ) : "$num%" }

println reduceToPct( countChars('', args.join('loves').toLowerCase()) )

assert countChars('', 'johnlovesjane') == '221211211'
assert countChars('', 'asdfasdfateg') == '3222111'
assert addPairs('221211211') == '33331'
assert addPairs('33331') == '463'
assert addPairs('463') == '76'
assert addPairs('53125418') == '13457'
assert addPairs('13457') == '884'
assert addPairs('884') == '128'
assert addPairs('128') == '92'
assert reduceToPct( countChars('','johnlovesjane') ) == '76%'

Penjelasan:

  • "countChars" hanya berulang dan menghapus sambil membangun serangkaian angka
  • "addPairs" mengambil satu string digit yang menambahkan digit dari luar dalam ** "collect..join" melakukan penambahan digit yang bekerja di luar dan menggabungkannya sebagai string ** the "+ (... c [ (int) len]) "melempar ke digit tengah lagi ketika c adalah panjang ganjil
  • "recudeToPct" menyebut dirinya menambahkan pasangan hingga turun menjadi kurang dari 3 digit

CodeGolf Groovy, 213 char

Melihat ini adalah kita bisa inline penutupan dan turun ke ini:

println({c->l=c.length()/2;m=(int)l;l>1?call((1..m).collect{(c[it-1]as int)+(c[-it]as int)}.join()+((l>m)?c[m]:'')):"$c%"}({r,s->s?call(r+s.count(s[0]),s.replace(s[0],'')):r}('',args.join('loves').toLowerCase())))

simpan sebagai lovecalc.groovy. jalankan "groovy lovecalc john jane"

Keluaran:

$ groovy lovecalc john jane
76%
$ groovy lovecalc romeo juliet
97%
$ groovy lovecalc mariah abraham
99%
$ groovy lovecalc maria abraham
98%
$ groovy lovecalc al bev
46%
$ groovy lovecalc albert beverly
99%
krs
sumber
1

Jawa

Ini mengambil 2 parameter String pada awal dan mencetak jumlah setiap karakter dan hasilnya.

import java.util.ArrayList;
import java.util.LinkedHashMap;

public class LUV {
    public static void main(String[] args) {
        String str = args[0].toUpperCase() + "LOVES" + args[1].toUpperCase();
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < str.length(); i++) {
            if (!map.containsKey(String.valueOf(str.charAt(i)))) {
                map.put(String.valueOf(str.charAt(i)), 1);
            } else {
                map.put(String.valueOf(str.charAt(i)), map.get(String.valueOf(str.charAt(i))).intValue() + 1);
            }
        }
        System.out.println(map.toString());
        System.out.println(addValues(new ArrayList<Integer>(map.values()))+"%");
    }

    private static int addValues(ArrayList<Integer> list) {
        if ((list.size() < 3) || (Integer.parseInt((String.valueOf(list.get(0)) + String.valueOf(list.get(1))) + String.valueOf(list.get(2))) == 100)) {
            return Integer.parseInt((String.valueOf(list.get(0)) + String.valueOf(list.get(1))));
        } else {
            ArrayList<Integer> list2 = new ArrayList<Integer>();
            int size = list.size();
            for (int i = 0; i < size / 2; i++) {
                int temp = list.get(i) + list.get(list.size() -1);
                if (temp > 9) {
                    list2.add(temp/10);
                    list2.add(temp%10);
                } else {
                    list2.add(temp);
                }
                list.remove(list.get(list.size()-1));
            }
            if (list.size() > list2.size()) {
                list2.add(list.get(list.size()-1));
            }
            return addValues(list2);
        }
    }
}

Tentunya bukan yang terpendek (itu Java), tapi yang jelas dan mudah dibaca.

Jadi, jika Anda menelepon

java -jar LUV.jar JOHN JANE

Anda mendapatkan output

{J=2, O=2, H=1, N=2, L=1, V=1, E=2, S=1, A=1}
76%
Obl Tobl
sumber
1

R

Tidak akan memenangkan penghargaan kekompakan apa pun, tetapi saya tetap bersenang-senang:

problove<-function(name1,name2, relation='loves') {
sfoo<-tolower( unlist( strsplit(c(name1,relation,name2),'') ) )
startrow <- table(sfoo)[rank(unique(sfoo))]
# check for values > 10 . Not worth hacking an arithmetic approach
startrow <- as.integer(unlist(strsplit(as.character(startrow),'')))
while(length(startrow)>2 ) {
    tmprow<-vector()
    # follow  by tacking on middle element if length is odd
    srlen<-length(startrow)
     halfway<-trunc( (srlen/2))
    tmprow[1: halfway] <- startrow[1:halfway] + rev(startrow[(srlen-halfway+1):srlen])
    if ( srlen%%2) tmprow[halfway+1]<-startrow[halfway+1]
    startrow <- as.integer(unlist(strsplit(as.character(tmprow),'')))
    }
as.numeric(paste(startrow,sep='',collapse=''))
}

Diuji: valid untuk 'john' & 'jane' dan untuk 'romeo' & 'juliet'. per komentar saya di bawah pertanyaan,

Rgames> problove('john','jane','hates')
[1] 76
Rgames> problove('romeo','juliet','hates')
[1] 61
Carl Witthoft
sumber