Liebesrechnung

39

Als Kind hat mir meine Schwester diese kleine Liebesberechnung gezeigt, um zu sehen, wie groß die Chance ist, dass Sie eine erfolgreiche Beziehung mit Ihrem Schwarm eingehen. Sie benötigen lediglich 2 Namen und ein Blatt Papier.

  • John
  • Jane

Dann trennen Sie diese Namen mit dem Wort Loves . Sie können dies entweder in eine Zeile oder in neue Zeilen schreiben.

John
liebt
Jane

Dann beginnt die Berechnung. Sie zählen zunächst, wie oft ein Zeichen von links nach rechts vorkommt, und falls Sie neue Zeilen verwenden, auch von oben nach unten. Jeder Charakter wird einmal gezählt. Nachdem Sie also das J von John gezählt haben, müssen Sie sie nicht erneut zählen, wenn Sie mit Jane beginnen. Das Ergebnis dieses Beispiels lautet wie folgt:

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: übersprungen
V: 1 (Lo [v] es)
E: 2 (Lov [e] s | Jan [e])
S: 1 (Love [s ])
__
J: übersprungen
A: 1 (J [a] ne)
N: übersprungen
E: übersprungen
__
Endergebnis: 2 2 1 2 1 1 2 1 1

Der nächste Schritt wird das Hinzufügen der Ziffern von außen zur Mitte sein.

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 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)
__
Ergebnis: 3 3 3 3 1

Sie werden dies so lange tun, bis eine ganze Zahl kleiner oder gleich 100 übrig ist.

3 3 3 3 1
4 6 3
76%

Es kann vorkommen, dass die Summe der 2 Ziffern ≥ 10 wird. In diesem Fall wird die Zahl in der nächsten Zeile in 2 geteilt.
Beispiel:

5 3 1 2 5 4 1 8
13 (Wird als 1 3 verwendet)
1 3 4 5 7
8 8 4 (8 + 4 = 12 wird als 1 2)
1 2 8
92%

Bedarf

  • Ihr Programm sollte in der Lage sein, jeden Namen mit angemessener Länge (100 Zeichen) zu akzeptieren.
  • [A..Z, a..z] Zeichen sind erlaubt.
  • Groß- und Kleinschreibung wird nicht berücksichtigt, also A == a

Sie können frei entscheiden

  • Umgang mit Sonderzeichen (Ö, è usw.)
  • Nachnamen mit Ja oder Nein, Leerzeichen werden ignoriert
  • Jede Sprache ist erlaubt.

Der Gewinner wird am 28. und 14. Februar durch Abstimmung ermittelt .

Fröhliches Codieren

PS: Es ist das erste Mal, dass ich hier etwas aufstelle. Wenn es eine Möglichkeit gibt, es zu verbessern, lass es mich wissen = 3

Edit: Enddatum in Valentinstag geändert, dachte, das wäre besser für diese Herausforderung geeignet :)

Teun Pronk
quelle
Ihr Beispiel zeigt nicht, was passiert, wenn eine gerade Zahl hinzugefügt werden muss oder wenn Sie eine zweistellige Zahl haben. Fügen Sie diese zur Verdeutlichung hinzu.
Kendall Frey
5
<thinking volume = "aloud"> Die Berechnung endet also bei 91%. Seltsam. Ich kenne ziemlich viele Fälle, in denen eine Fortsetzung auf 10% oder noch besser 1% eine viel realistischere Punktzahl ergibt. Mit solch einer eindeutig kommerziellen Manipulation der Berechnung, wette ich, ist dies tatsächlich diejenige, die von den SMS-Liebesrechner-Diensten verwendet wird. </ Thinking>
manatwork
8
inb4 jemand postet Code in Form eines Herzens und gewinnt Popularität
Cruncher
1
@ user2509848 Die Spalten in den ersten Buchstaben waren ein Zufall und keine Bedingung. Sie zählen nur die Anzahl der Vorkommen des Buchstabens.
Danny
3
Fragen Sie sich, wie sich die Ergebnisse ändern, wenn Sie die Namen (und "love") in ihre ASCII-Integer-Codes konvertieren. Was passiert in diesem Fall, wenn Sie "Liebe" durch "Hass" ersetzen - Sie würden es gerne bekommen 1-love_result :-)
Carl Witthoft

Antworten:

35

Sclipting

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

Erwartet die Eingabe als zwei durch Leerzeichen getrennte Wörter (z John Jane. B. ). Die Groß- und Kleinschreibung wird nicht beachtet, es werden jedoch nur Zeichen unterstützt, bei denen es sich nicht um reguläre Sonderzeichen handelt (verwenden Sie also nicht (oder *in Ihrem Namen!). Es werden auch nur zwei Wörter erwartet. Wenn Ihr Liebesinteresse also "Mary Jane" lautet, müssen Sie MaryJaneein Wort eingeben. Andernfalls wird "YourName liebt Mary liebt Jane" ausgewertet.

Erläuterung

Das Schwierigste war, den Fall einer ungeraden Anzahl von Ziffern zu behandeln: Sie müssen die mittlere Ziffer in Ruhe lassen, anstatt sie mit sich selbst zu addieren. Ich finde meine Lösung interessant.

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

Wenn etwas ≤ 100 übrig bleibt, endet die Schleife, die Antwort befindet sich auf dem Stapel und wird daher ausgegeben.

Timwi
quelle
46
Und ich dachte, APL sei schwer zu lesen ...
Dr. belisarius
5
Hallo Timwi, ich kann sehen, dass du wieder im Spiel bist: p nette Lösung
Pierre Arlaud
12
Warten Sie, er hat seine eigene Sprache für Codegolf erfunden ?! Das ist Betrug!
Mooing Duck
2
Eigentlich ist diese Sprache ist (Art) lesbar (wenn Sie wissen , Chinesisch).
Eiennohito
8
@MooingDuck: Mein Verständnis der Regel ist, dass Sie keine Sprache verwenden können, die nach der Veröffentlichung der Challenge veröffentlicht wurde. Deshalb benutze ich immer nur die Anweisungen, die ich zuvor eingeführt habe. Als Reaktion auf diese Herausforderung habe ich beispielsweise " String-Ersetzen ohne Berücksichtigung der Groß- / Kleinschreibung" eingeführt , aber ich werde es hier nicht verwenden.
Timwi
29

Funktion

Dieses Programm erwartet die Eingabe durch ein Leerzeichen (zB John Jane) getrennt. Bei den Zeichen AZ / az wird die Groß- / Kleinschreibung nicht berücksichtigt. Für jedes andere Unicode-Zeichen werden zwei Zeichen "verwechselt", die gleich oder gleich 32 sind (z. B. Āund Ġ, oder ?und _). Außerdem habe ich keine Ahnung, was dieses Programm tun wird, wenn die Eingabe ein NUL ( \0) -Zeichen enthält, also benutze das nicht :)

Da StackExchange zu viel Zeilenabstand hinzufügt, ist hier der Rohtext im Pastebin . Alternativ können Sie den folgenden Code in der JavaScript-Konsole Ihres Browsers ausführen, um ihn hier zu beheben:$('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 ║  │
                                                      │          ╚═══╝  │
                                                      └─────────────────┘

Schnelle Erklärung

  • Das Programm nimmt nur STDIN und ruft damit auf.

  • findet das erste Leerzeichen in der Zeichenkette, ersetzt es durch lovesund übergibt das Ergebnis an .

  • Nimmt wiederholt das erste Zeichen aus der Eingabezeichenfolge, ruft damit auf und verknüpft die Anzahl der Vorkommen mit einer Ergebniszeichenfolge. Wenn die Eingabezeichenfolge leer ist, wird sie mit der Ergebniszeichenfolge aufgerufen.

  • ruft wiederholt auf, bis das Ergebnis gleich "100"oder kürzer als 3 ist. ( 100Kann tatsächlich auftreten: Eingabe berücksichtigen lovvvv eeeeeess.) Wenn dies der Fall ist, wird dies hinzugefügt "%"und zurückgegeben.

  • berechnet eine vollständige Iteration des Liebesberechnungsalgorithmus; Das heißt, es wird eine Ziffernfolge verwendet und die nächste Ziffernfolge zurückgegeben.

  • Nimmt einen Heuhaufen und eine Nadel und ermittelt den Index des ersten Auftretens einer Nadel im Heuhaufen unter Verwendung des Kriteriums der Unterscheidung nach Groß- und Kleinschreibung ( or 32).

  • Nimmt einen Heuhaufen und eine Nadel und wiederholt angewendet , um alle Instanzen der Nadel zu entfernen . Es wird das Endergebnis nach allen Entfernungen sowie der Anzahl der vorgenommenen Entfernungen zurückgegeben.

Timwi
quelle
12
Ich habe keine Ahnung, was hier los ist, aber es sieht sehr beeindruckend aus!
Squeamish Ossifrage
27

Rubin

     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

Druckt ein Herz, wenn die Wahrscheinlichkeit einer Beziehung über 50% liegt

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

Und druckt ein gebrochenes Herz, wenn die Chancen unter 50% liegen :(

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

Verdammter John ...

Auf jeden Fall wird die Groß- und Kleinschreibung nicht berücksichtigt und polygame Abfragen (z ruby ♥.rb Alice Bob Carol Dave. B. ) werden unterstützt.

Epidemie
quelle
1
Das ist reine Kunst :)
11

APL, 80

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

Denn Liebe ist Liebe ist (auch wenn es nicht ist)

Obligatorische ♥ ︎-Form:

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

Die Golf-Version verhält sich etwas unberechenbar, da ∪⍦ich wegen eines Fehlers bei den Entwicklern von NARS nachforsche:

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

Aber ich konnte es stückweise ausführen und das richtige Ergebnis erzielen:

      '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
quelle
8

Javascript

Wahrscheinlich könnte sauberer sein, aber es funktioniert. Ausführliches Beispiel

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
quelle
7

Python

Nun, ich dachte, es wäre ein ...

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

Ungolfed:

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
quelle
Wenn Sie es so kurz wie möglich machen möchten, können Sie ersetzen reduce(list.__add__,xyz)mit 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";
}

Probenergebnis

$ 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
quelle
4

GolfScript

Obligatorische Code Golf Antwort in GolfScript:

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

Akzeptiert Eingaben als durch Leerzeichen getrennte Namen, z

echo 'John Jane' | ruby golfscript.rb love.gs
-> 76
Ben Reich
quelle
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
quelle
Funktioniert dies korrekt, wenn q[i] + q[j]10 oder höher ist?
Danny
@Danny Die erste Zeile in fn nimmt jede Ganzzahl in der Eingabe, konvertiert jede in eine Zeichenfolge, konvertiert dann alle Zeichen in dieser Zeichenfolge in eine Ganzzahl von 0 bis 9 (c - '0' Teil) und gibt sie zurück ... IOW, it erstellt ein Array von Ganzzahlen, die aus jeder Ziffer in der Eingabe bestehen. Wenn nicht, sind die Anforderungen ungültig :-)
Luc
ah habe das verpasst.
Danny
4

Haskell

Meine Version ist ziemlich lang, weil ich mich auf die Lesbarkeit konzentriert habe. Ich dachte, es wäre interessant, Ihren Algorithmus in Code zu formalisieren. Wenn ich die Anzahl der Zeichen in einer linken Falte zusammenfasse , werden sie im Grunde genommen zusammengeschneit, und die Reihenfolge ist in der Reihenfolge ihres Auftretens in der Zeichenfolge. Ich habe es auch geschafft, den Teil des Algorithmus, der normalerweise eine Array-Indizierung erfordert, durch List Bending zu ersetzen . Es stellt sich heraus, dass Ihr Algorithmus im Wesentlichen darin besteht, eine Liste von Zahlen in zwei Hälften zu falten und ausgerichtete Zahlen zu addieren. Es gibt zwei Fälle für das Biegen, gerade Listen, die schön in der Mitte geteilt sind, ungerade Listen, die um ein zentrales Element gebogen sind und dieses Element nicht zusätzlich beteiligt ist. Fission nimmt die Liste und teilt Zahlen auf, die keine einzelnen Ziffern mehr sind, wie> = 10 . Ich musste mein eigenes entfalten schreiben , ich bin nicht sicher, ob es tatsächlich ein entfalten ist , aber es scheint zu tun, was ich brauche. Genießen.

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

Einige Ergebnisse:

"Romeo" "Juliet" 97% - Empirische Tests sind wichtig
"Romeo" "Julier" 88% - Moderne Kurzfassung ...
"Horst Draper" "Jane" 20%
"Horst Draper" "Jane (Pferd)" 70% - Es gab eine Entwicklung ...
"Bender Bender Rodriguez" "Fenny Wenchworth" 41% - Bender sagt "Falten ist für Frauen!"
"Philip Fry" "Turanga Leela" 53% - Nun, Sie können sehen, warum sie 7 Saisons gebraucht haben, um "Maria" "Abraham" zu heiraten
- 98%
"John" "Jane" 76%

vlsh
quelle
3

Rubin

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

Minimiert:

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

Nennen:

$ ruby love.rb "John" "Jane"
76
Andrew Hubbs
quelle
1
Um mehr zu minimieren, könnten Sie l=->a{...}anstelle von verwenden l=lambda do|a|...end, und Sie könnten auch l[...]anstelle von tun l.call(...).
Türknauf
Guter Punkt Türknauf.
Andrew Hubbs
2

Python 3

Eine einfache Lösung, die keine Module verwendet. I / O ist hübsch genug.

Ich habe das Abfangen von Fehlern als Backup verwendet, wenn der zweite Iterator außerhalb der Grenzen liegt. Wenn es den Indexfehler von Python abfängt, nimmt es an, dass 1. Weird, aber es funktioniert.

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

Hier ist ein Probelauf:

Name 1: John
Name 2: Jane

221211211
33331
463
76

76%
cjfaure
quelle
wäre es nicht klarer die laufen forauf namesdirekt?
Einacio
@Einacio Woher soll ich dann wissen, auf welche ich es so genau prüfen soll?
cjfaure
Was ist Ihr Ergebnis mit "Maria" und "Abraham"?
Einacio
@Einacio Ich habe 75%.
cjfaure
Ich habe 98, das sind die Schritte 25211111111.363221.485.98. Ich denke, Sie Code schlägt fehl, die 5 "a" hinzufügen
Einacio
2

Java

Es kann vorkommen, dass die Summe der 2 Ziffern größer als 10 wird. In diesem Fall wird die Zahl in der nächsten Zeile in 2 geteilt.

Was ist, wenn die Zahl gleich 10 ist? Ich habe gerade 1 und 0 hinzugefügt, ist das richtig?

Ich beschloss, den Fall zu ignorieren.

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

Eingang:

Maria
Abraham

Ausgabe:

98%

Eingang:

Wasi
codegolf.stackexchange.com

Ausgabe:

78%
Rolf ツ
quelle
Ich würde es genießen, wenn diese Antwort für Tritte und Kichern golfen würde!
Josh
Das sind minus 144 Zeichen und ein paar Zeilen. Ich bin es nur gewohnt, lesbar und speichereffizient zu programmieren ...
Rolf ツ
Das ist der Grund, warum es mich immer in den Bann zieht, wenn ich Java beim Golfen sehe.
Josh
Für mich ist es der Spaß , eine Sprache wie diese golfed zu machen .. nur vorstellen , wie lustig es wäre zum Golf versucht eine zufällige Java - Klasse würde es mindestens 2 - mal kleiner XD worden
Rolfツ
1
Java ist die schlechteste Sprache zum Golfen. Leider ist es nur eine Sprache, die ich gut kenne, haha. Na ja, wenigstens kann ich hier was lesen.
Andrew Gies
2

C

Es könnte viele Verbesserungen geben, aber das Programmieren hat Spaß gemacht.

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

Und natürlich die obligatorische Golfversion: 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
quelle
2

Python 3

Dies nimmt zwei Namen als Eingabe an. ziehe zusätzliche Räume aus und berechne dann die Liebe. Weitere Informationen finden Sie unter Input output.

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)

Eingang:

Maria
Abraham

Ausgabe:

98%

Oder probier mal dieses;)

Eingang:

Wasi Mohammed Abdullah
code golf

Ausgabe:

99%
War ich
quelle
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}

Hier ist eine kleine Auswahl:

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

J

Hier ist eine einfache in J:

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

Es nimmt die Namen auf der Kommandozeile an, zB:

$ jconsole love.ijs John Jane
76
Marinus
quelle
2

Groovy

Hier ist die groovige Version mit Tests.

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

Erläuterung:

  • "countChars" rekursiert und entfernt einfach, während eine Ziffernfolge erstellt wird
  • "addPairs" nimmt eine Ziffernfolge und fügt die Ziffern von außen in ** hinzu. "collect..join" addiert die Ziffern von außen in ** und fügt sie als Zeichenfolge wieder zusammen. "+ (... c [ (int) len]) "wirft wieder die mittlere Ziffer ein, wenn c eine ungerade Länge ist
  • "recudeToPct" ruft das Hinzufügen von Paaren auf, bis weniger als 3 Stellen erreicht sind

CodeGolf Groovy, 213 Zeichen

Wenn wir sehen, dass dies ist, wir die Verschlüsse inline setzen und es auf folgendes bringen:

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

Speichern Sie es als lovecalc.groovy. starte "groovy lovecalc john jane"

Ausgabe:

$ 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
quelle
1

Java

Beim Start werden 2 String-Parameter verwendet, und die Anzahl der einzelnen Zeichen und das Ergebnis werden ausgedruckt.

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

Sicher nicht die kürzeste (es ist Java), aber eine klare und lesbare.

Also, wenn Sie anrufen

java -jar LUV.jar JOHN JANE

Sie erhalten die Ausgabe

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

R

Ich werde keine Kompaktheitspreise gewinnen, aber ich hatte trotzdem Spaß:

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

Getestet: gültig für 'john' & 'jane' und 'romeo' & 'juliet'. gemäß meinem Kommentar unter der Frage,

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