Tính toán tình yêu


39

Khi còn bé, em gái tôi đã chỉ cho tôi tính toán tình yêu nhỏ này để xem bạn có bao nhiêu cơ hội có được mối quan hệ thành công với người bạn yêu. Tất cả bạn cần là 2 tên và một mảnh giấy.

  • John
  • Jane

Sau đó, bạn tách những tên này bằng từ Yêu . Bạn có thể viết cái này trên một dòng hoặc trên dòng mới.

John
yêu
Jane

Rồi việc tính toán bắt đầu. Bạn bắt đầu bằng cách đếm số lần một nhân vật xuất hiện từ trái sang phải và trong trường hợp bạn sử dụng các dòng mới cũng từ trên xuống dưới. Mỗi nhân vật được tính một lần, vì vậy sau khi đếm J của John, bạn không cần phải đếm lại họ khi bạn bắt đầu với Jane. Kết quả của ví dụ này sẽ như sau:

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: bỏ qua
V: 1 (Lo [v] es)
E: 2 (Lov [e] s | Jan [e])
S: 1 (Yêu [s ])
__
J: bỏ qua
A: 1 (J [a] ne)
N: bỏ qua
E: bỏ qua
__
Kết quả cuối cùng: 2 2 1 2 1 1 2 1 1

Bước tiếp theo sẽ là thêm các chữ số làm việc từ bên ngoài vào giữa.

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)
__
Kết quả: 3 3 3 3 1

Bạn sẽ tiếp tục làm điều này cho đến khi bạn có một số nguyên còn lại ít hơn hoặc bằng 100.

3 3 3 3 1
4 6 3
76%

Có thể xảy ra rằng tổng của 2 chữ số trở thành ≥ 10, trong trường hợp này, số sẽ được chia thành 2 trên hàng tiếp theo.
Thí dụ:

5 3 1 2 5 4 1 8
13 (Sẽ được sử dụng là 1 3)
1 3 4 5 7
8 8 4 (8 + 4 = 12 được sử dụng như 1 2)
1 2 8
92%

Yêu cầu

  • Chương trình của bạn sẽ có thể chấp nhận bất kỳ tên nào có độ dài hợp lý (100 ký tự)
  • Các ký tự [A..Z, a..z] được cho phép.
  • Trường hợp không nhạy cảm nên A == a

Miễn phí cho bạn quyết định

  • Cách xử lý các ký tự đặc biệt (Ö, è, v.v.)
  • Bao gồm tên cuối có hoặc không, dấu cách sẽ bị bỏ qua
  • Bất kỳ ngôn ngữ được cho phép.

Người chiến thắng sẽ được xác định bằng phiếu bầu vào ngày 28 tháng 2.

Chúc mừng mã hóa

Ps Đây là lần đầu tiên tôi đặt thứ gì đó lên đây, nếu có cách nào cải thiện thì cứ cho tôi biết = 3

Chỉnh sửa: Thay đổi ngày kết thúc thành ngày valentine, nghĩ rằng sẽ phù hợp hơn cho thử thách này :)


Ví dụ của bạn không hiển thị những gì xảy ra khi cần thêm số chẵn hoặc khi bạn có một số có 2 chữ số. Tốt hơn thêm những người để làm rõ.
Kendall Frey

5
<think volume = "aloud"> Vì vậy, tính toán dừng ở mức 91%. Lạ thật. Tôi biết khá nhiều trường hợp tiếp tục 10% hoặc thậm chí tốt hơn 1% sẽ cho điểm thực tế hơn nhiều. Với cách tính toán thương mại rõ ràng như vậy, tôi cá rằng đây thực sự là một tính toán được sử dụng bởi các dịch vụ máy tính tình yêu SMS. </
Think

8
inb4 ai đó đăng mã theo hình trái tim và giành được sự yêu mến
Cruncher

1
@ user2509848 các cột trên một vài chữ cái đầu tiên là trùng hợp ngẫu nhiên và không phải là một yêu cầu. Bạn chỉ cần đếm số lần xuất hiện của bức thư.
Danny

3
Tự hỏi kết quả thay đổi như thế nào nếu bạn chuyển đổi tên (và "tình yêu") thành mã số nguyên ASCII của họ. Đối với vấn đề đó, điều gì xảy ra nếu bạn thay thế "yêu" bằng "ghét" - bạn hy vọng sẽ nhận được 1-love_result :-)
Carl Witthoft

Câu trả lời:


35

Đánh bóng

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

Yêu cầu đầu vào là hai từ được phân tách bằng dấu cách (ví dụ John Jane). Nó không phân biệt chữ hoa chữ thường, nhưng chỉ hỗ trợ các ký tự không phải là ký tự regex đặc biệt (vì vậy đừng sử dụng (hoặc *trong tên của bạn!). Nó cũng chỉ mong đợi hai từ, vì vậy nếu sở thích tình yêu của bạn là Mary Mary Jane, bạn phải đặt MaryJanemột từ; nếu không nó sẽ đánh giá "YourName yêu Mary yêu Jane".

Giải trình

Phần khó nhất là xử lý trường hợp số chữ số lẻ: bạn phải để chữ số ở giữa một mình thay vì thêm nó với chính nó. Tôi nghĩ rằng giải pháp của tôi là thú vị.

글⓵닆뭶뉗밃變 | 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 "%"

Khi bạn còn lại một cái gì đó ≤ 100, vòng lặp sẽ kết thúc, câu trả lời sẽ nằm trên ngăn xếp và do đó xuất ra.


46
Và tôi nghĩ APL rất khó đọc ...
Tiến sĩ belisarius

5
Xin chào Timwi, tôi có thể thấy bạn trở lại trong trò chơi: p giải pháp tốt đẹp
Pierre Arlaud

12
Đợi đã, anh ta đã phát minh ra ngôn ngữ của riêng mình cho codegolf?! Như thế là gian lận!
Vịt mướp

2
Trên thực tế ngôn ngữ này là (loại) có thể đọc được (nếu bạn biết tiếng Trung Quốc).
eiennohito

8
@MooingDuck: Hiểu biết của tôi về quy tắc là bạn không thể sử dụng ngôn ngữ được xuất bản sau khi thử thách được xuất bản. Do đó, tôi đưa ra quan điểm luôn chỉ sử dụng các hướng dẫn mà tôi đã giới thiệu trước đây. Ví dụ, tôi đã giới thiệu (thay thế chuỗi không phân biệt chữ hoa chữ thường) để đối phó với thử thách này, nhưng tôi sẽ không sử dụng nó ở đây.
Timwi

29

Chức năng

Chương trình này dự kiến ​​đầu vào được phân tách bằng khoảng trắng (ví dụ John Jane). Nó không phân biệt chữ hoa chữ thường cho các ký tự AZ / az; cho bất kỳ ký tự Unicode khác, nó sẽ “nhầm lẫn” hai nhân vật đều bình đẳng khi or'ed với 32 (ví dụ ĀĠhay ?_). Hơn nữa, tôi không biết chương trình này sẽ làm gì nếu đầu vào chứa ký tự NUL ( \0), vì vậy đừng sử dụng nó :)

Ngoài ra, vì StackExchange thêm quá nhiều khoảng cách dòng, đây là văn bản thô trên pastebin . Hoặc, chạy mã sau trong bảng điều khiển JavaScript của trình duyệt của bạn để sửa lỗi ngay tại đây:$('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 ║  │
                                                      │          ╚═══╝  │
                                                      └─────────────────┘

Giải thích nhanh

  • Chương trình chỉ cần STDIN và gọi với nó.

  • tìm khoảng trống đầu tiên trong chuỗi, thay thế nó bằng lovesvà chuyển kết quả đến .

  • liên tục lấy ký tự đầu tiên từ chuỗi đầu vào, gọi với nó và nối các số lần xuất hiện vào một chuỗi kết quả. Khi chuỗi đầu vào là trống rỗng, nó gọi với chuỗi kết quả.

  • liên tục gọi cho đến khi nhận được kết quả bằng "100"hoặc có độ dài nhỏ hơn 3. ( 100thực tế có thể xảy ra: xem xét đầu vào lovvvv eeeeeess.) Khi thực hiện, nó sẽ thêm "%"và trả về kết quả đó.

  • tính toán một lần lặp hoàn chỉnh của thuật toán tính toán tình yêu; tức là, nó lấy một chuỗi các chữ số và trả về chuỗi chữ số tiếp theo.

  • lấy một đống cỏ khô và một cây kim và tìm ra chỉ số về sự xuất hiện đầu tiên của kim trong đống cỏ khô bằng cách sử dụng tiêu chí không nhạy cảm trường hợp giả ( or 32).

  • lấy một đống cỏ khô và một cây kim và liên tục áp dụng để loại bỏ tất cả các trường hợp của kim . Nó trả về kết quả cuối cùng sau khi tất cả các lần xóa cũng như số lần xóa được thực hiện.


12
Tôi không biết những gì đang xảy ra ở đây, nhưng nó trông rất ấn tượng!
ossifrage squeamish

27

Hồng ngọc

     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

In một trái tim nếu cơ hội của một mối quan hệ là hơn 50%

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

Và in một trái tim tan vỡ nếu cơ hội dưới 50% :(

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

John ...

Dù sao, nó không phân biệt chữ hoa chữ thường và hỗ trợ các truy vấn đa thê (ví dụ ruby ♥.rb Alice Bob Carol Dave).


1
Đó là nghệ thuật thuần túy :)

11

APL, 80

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

Bởi vì tình yêu là tình yêu (ngay cả khi nó không)

Phiên bản hình chữ nhật bắt buộc ♥:

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

Phiên bản chơi gôn mang lại cho tôi hành vi hơi thất thường, do lỗi ∪⍦mà tôi đang điều tra với các nhà phát triển của NARS:

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

Nhưng tôi đã có thể chạy nó từng phần và nhận được kết quả chính xác:

      '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

8

Javascript

Có lẽ có thể sạch hơn, nhưng nó hoạt động. Ví dụ dài dòng

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 + "%")

7

Con trăn

Chà, tôi nghĩ đó là một ...

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))+"%"

Ung dung:

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)) + "%"

Nếu bạn muốn làm cho nó càng ngắn càng tốt, bạn có thể thay thế reduce(list.__add__,xyz)bằng 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";
}

kết quả mẫu

$ 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 :) !!

4

GolfScript

Mã câu trả lời bắt buộc trong GolfScript:

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

Chấp nhận đầu vào dưới dạng tên được phân tách bằng dấu cách

echo 'John Jane' | ruby golfscript.rb love.gs
-> 76

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);
        }
    }
}

Điều này có hoạt động chính xác khi q[i] + q[j]10 hoặc lớn hơn?
Danny

@Danny Dòng đầu tiên trong fn lấy từng số nguyên trong đầu vào, chuyển đổi từng chuỗi thành chuỗi, sau đó chuyển đổi tất cả các ký tự trong chuỗi này thành số nguyên từ 0 đến 9 (phần c - '0') và trả về ... IOW, nó sẽ xây dựng một mảng các số nguyên bao gồm mỗi chữ số trong đầu vào. Nếu không yêu cầu không hợp lệ :-)
Luc

ah đã bỏ lỡ điều đó
Danny

4

Haskell

Phiên bản của tôi khá dài, vì tôi quyết định tập trung vào khả năng đọc, tôi nghĩ sẽ rất thú vị khi chính thức hóa thuật toán của bạn bằng mã. Tôi tổng hợp các ký tự trong một nếp gấp bên trái , về cơ bản, nó ném tuyết chúng lại với nhau và thứ tự là theo thứ tự xuất hiện của chúng trong chuỗi. Tôi cũng đã quản lý để thay thế một phần của thuật toán thường yêu cầu lập chỉ mục mảng bằng cách uốn danh sách . Hóa ra thuật toán của bạn về cơ bản liên quan đến việc gấp danh sách các số thành một nửa và cộng các số liên kết với nhau. Có hai trường hợp uốn cong, thậm chí các danh sách được phân chia ở giữa độc đáo, các danh sách lẻ uốn quanh một phần tử trung tâm và phần tử đó không tham gia thêm vào. Phân hạch đang lấy danh sách và tách các số không còn là một chữ số, như> = 10 . Tôi đã phải viết riêng của tôi unfoldl , tôi không chắc chắn nếu nó thực sự là một unfoldl , nhưng có vẻ như để làm những gì tôi cần. Thưởng thức.

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) ++ "%"

Một số kết quả:

"Romeo" "Juliet" 97% - Thử nghiệm thực nghiệm là quan trọng
"Romeo" "Julier" 88% - Phiên bản rút gọn hiện đại ...
"Horst Draper" "Jane" 20%
"Horst Draper" "Jane (Ngựa)" 70% - Đã có một sự phát triển ...
"Bender Bender Rodriguez" "Fenny Wenchworth" 41% - Bender nói "Folding là dành cho phụ nữ!"
"Philip Fry" "Turanga Leela" 53% - Chà bạn có thể hiểu tại sao phải mất 7 Mùa để họ kết hôn với
"Maria" "Abraham" - 98%
"John" "Jane" 76%


3

Hồng ngọc

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

Giảm thiểu:

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

Gọi nó đi:

$ ruby love.rb "John" "Jane"
76

1
Để giảm thiểu nhiều hơn, bạn có thể sử dụng l=->a{...}thay vì l=lambda do|a|...endvà bạn cũng có thể làm l[...]thay vì l.call(...).
Doorknob

Điểm tốt Doorknob.
Andrew Hubbs

2

Con trăn 3

Một giải pháp đơn giản không sử dụng mô-đun. I / O là đủ đẹp.

Tôi đã sử dụng bắt lỗi như một bản sao lưu khi iterator thứ hai nằm ngoài giới hạn; nếu nó bắt lỗi chỉ mục của Python, nó giả sử 1. Lạ, nhưng nó hoạt động.

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) + "%")

Đây là một mẫu chạy:

Name 1: John
Name 2: Jane

221211211
33331
463
76

76%

nó sẽ không được rõ ràng hơn để chạy fortrên namestrực tiếp?
Einacio

@Einacio Sau đó, làm thế nào để tôi biết cái nào cần kiểm tra một cách chính xác?
cjfaure

kết quả của bạn với "Maria" và "Áp-ra-ham" là gì?
Einacio

@Einacio Tôi nhận được 75%.
cjfaure

Tôi đã nhận được 98, đây là các bước 25211111111.363221.485.98. tôi nghĩ rằng mã của bạn không thể thêm 5 "a"
Einacio

2

Java

Có thể xảy ra rằng tổng của 2 chữ số trở nên lớn hơn 10, trong trường hợp này, số sẽ được chia thành 2 trên hàng tiếp theo.

Nếu số bằng 10 thì sao? Tôi chỉ cần thêm 1 và 0, điều đó có đúng không?

Tôi quyết định bỏ qua trường hợp.

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;
    }
}

đầu vào:

Maria
Abraham

đầu ra:

98%

đầu vào:

Wasi
codegolf.stackexchange.com

đầu ra:

78%

Tôi rất thích nhìn thấy câu trả lời này chơi golf cho đá và cười khúc khích!
Josh

Điều đó làm cho âm 144 ký tự và một vài dòng. Tôi chỉ được sử dụng để lập trình có thể đọc và hiệu quả bộ nhớ ...
Rolf

Đó là lý do tại sao nhìn thấy Java golf luôn làm tôi khó chịu.
Josh

Đối với tôi, đó là niềm vui khi tạo ra một ngôn ngữ như chơi golf này .. hãy tưởng tượng nó sẽ buồn cười thế nào khi chơi một lớp java ngẫu nhiên, nó sẽ trở nên nhỏ hơn ít nhất 2 lần XD
Rolf ツ

1
Java là về ngôn ngữ tồi tệ nhất để chơi golf. Thật không may, đó chỉ là ngôn ngữ mà tôi biết rõ, haha. Oh tốt, ít nhất tôi có thể đọc những thứ ở đây.
Andrew Gies

2

C

Có thể có nhiều cải tiến, nhưng điều này rất thú vị để viết mã.

#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;
    }
}

Và tất nhiên, phiên bản golf bắt buộc: 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;}}

2

Con trăn 3

Điều này sẽ lấy hai tên làm đầu vào. tước thêm không gian và sau đó tính toán tình yêu. Kiểm tra đầu ra đầu vào để biết thêm chi tiết.

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)

đầu vào:

Maria
Abraham

đầu ra:

98%

Hoặc, hãy thử cái này;)

đầu vào:

Wasi Mohammed Abdullah
code golf

đầu ra:

99%

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}

Đây là một hoạt động của nó:

{{$[(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

2

J

Đây là một điều đơn giản trong J:

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

Nó lấy tên trên dòng lệnh, vd:

$ jconsole love.ijs John Jane
76

2

Groovy

Đây là phiên bản hấp dẫn, với các bài kiểm tra.

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%'

Giải trình:

  • "CountChars" chỉ đơn giản là đệ quy và xóa trong khi xây dựng một chuỗi các chữ số
  • "addPairs" lấy một chuỗi chữ số thêm các chữ số từ bên ngoài vào ** "coll..join" thực hiện việc thêm các chữ số làm việc bên ngoài vào và nối lại chúng thành một chuỗi ** "+ (... c [ (int) len]) "ném lại chữ số ở giữa khi c là độ dài lẻ
  • "recudeToPct" tự gọi mình thêm các cặp cho đến khi nó xuống dưới 3 chữ số

CodeGolf Groovy, 213 char

Thấy đây là chúng ta có thể sắp xếp các phần đóng và giải quyết vấn đề này:

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())))

lưu nó dưới dạng lovecalc.groovy. chạy "Groovy lovecalc john jane"

Đầu ra:

$ 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%

1

Java

Thao tác này sẽ lấy 2 tham số Chuỗi khi bắt đầu và in ra số lượng của từng ký tự và kết quả.

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);
        }
    }
}

Chắc chắn không phải là cái ngắn nhất (đó là Java), nhưng là một thứ rõ ràng và dễ đọc.

Vì vậy, nếu bạn gọi

java -jar LUV.jar JOHN JANE

bạn nhận được đầu ra

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

1

R

Sẽ không giành được bất kỳ giải thưởng nhỏ gọn nào, nhưng dù sao tôi cũng rất vui:

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=''))
}

Đã kiểm tra: hợp lệ cho 'john' & 'jane' và cho 'romeo' & 'juliet'. theo nhận xét của tôi dưới câu hỏi,

Rgames> problove('john','jane','hates')
[1] 76
Rgames> problove('romeo','juliet','hates')
[1] 61
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.