Anagramming Code

10

Versuchen wir es noch einmal.

Das Ziel dieses Wettbewerbs ist es, zwei Codeteile zu erstellen, die Anagramme voneinander sind (die beiden müssen dieselben Bytes in einer anderen Reihenfolge enthalten) und die folgenden Aufgaben ausführen:

  • Man muss testen, ob eine eingegebene Zahl glücklich oder prim ist , und ausgeben, wenn die Zahl entweder ist (muss zum Beispiel 7ausgeben happy primeund 4muss ausgeben sad non-prime).

  • Der andere muss seine Codegröße in Bytes als Wort ausgeben (ein 60-Byte-Programm würde ausgeben sixty, ein 39-Byte-Programm würde ausgeben thirty-nine).

Wenn eine Klärung der Regeln erforderlich ist, zögern Sie nicht, mich zu informieren.

Dies ist ein Code-Golf-Wettbewerb, also gewinnt das kürzeste Programm!

Josiah Winslow
quelle
Was hindert einen daran /*program1*/program2und dann program1/*program2*/? Ich denke, Sie sollten Kommentare nicht zulassen.
William Barbosa
@ WilliamBarbosa Warum? Das wird kaum eine optimale Lösung sein.
Martin Ender
Sie können aber auch einige Teile teilen und andere nicht, was es viel einfacher macht
stolzer Haskeller
1
@proudhaskeller Das Verbot von Kommentaren löst das allerdings nicht. Sie können Zeichen jederzeit in Zeichenfolgen, Variablennamen oder Teile des Codes einfügen, die aus anderen Gründen nicht ausgeführt werden.
Martin Ender
1
FWIW, ich denke nicht, dass Sie Ihre eigene Einreichung hätten löschen sollen. OP oder nicht, es war eine interessante Antwort.
Dennis

Antworten:

6

CJam, 80 49 48 Zeichen

UPDATE : Inspiriert von Dennis 'Implementierung zur Berechnung der Summe der Quadrate der Ziffern, ist hier eine kürzere Version

Happy / Sad Prime / Non-Prime:

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

Wie es funktioniert:

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

Achtundvierzig

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

So funktioniert das:

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

Probieren Sie es online aus

Das erste Programm liest die Nummer von STDIN


Meine ursprüngliche 80-Zeichen-Lösung

Happy / Sad Prime / Non-Prime:

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

achtzig

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

CJam, 50 49 Bytes

Glücks- und Primalitätstest

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

Liest eine Nummer von STDIN. Beide Tests funktionieren nur für 64-Bit-Ganzzahlen.

Probieren Sie es online aus.

Eigene Länge

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

Druck neunundvierzig .

Dennis
quelle
+1 für die 31-Byte-Verbesserung und "für neunundneunzig".
Josiah Winslow
3

Golfscript - 81

Dieses Programm testet, ob eine Zahl glücklich und / oder prim ist.

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

Dieses Programm, ein Anagramm des letzten, gibt "einundachtzig" aus (seine Bytesize als Wort).

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

Dies sollte als Beispiel dienen.

Josiah Winslow
quelle
2
Hm, eine Referenzimplementierung für eine Code-Golf-Herausforderung in GolfScript bereitzustellen, ist möglicherweise nicht die beste Idee. Ich glaube, dieser ist ziemlich schwer zu schlagen und daher für die Teilnehmer etwas entmutigend.
Martin Ender
Ich sehe, dass die Leute nicht bemerken, dass Sie die Frage geschrieben und Sie positiv bewertet haben ... Ich stimme Martin voll und ganz zu.
stolzer Haskeller
@proudhaskeller Es ist absolut nichts falsch daran, sich selbst zu beantworten.
Justin
Ich sage, es ist nichts Falsches daran, mir selbst zu antworten oder Code zu kommentieren.
Josiah Winslow
2
@ JosiahWinslow Es ist nichts falsch daran. Ich sage nur, dass Sie möglicherweise einige interessante längere Antworten verpassen, wenn Sie selbst sofort eine sehr gute Lösung veröffentlichen.
Martin Ender
1

J - 87 char

Ein naiver Versuch dies in J. Keine Verwendung der Standardbibliothek, obwohl ich bezweifle, dass sie dadurch kürzer werden würde.

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

Die Zeile oben ist ein Verb, das eine Ganzzahl nimmt und deren Glück und Ursprünglichkeit als Ausgabezeichenfolge diagnostiziert. Die zweite Zeile ist ein Ausdruck, der die Zeichenfolge zurückgibt eighty-seven, während die dritte eine konstante Funktion ist, die dasselbe tut. Ich habe beide eingeschlossen, weil beide möglich waren und weil ich nicht weiß, wie das Urteil über Funktionsantworten im Gegensatz zu Programmantworten lauten wird, und J keine Funktionen ohne Argumente hat - Sie geben einfach eine Funktion a Dummy-Argument.

Wir verlieren die meisten Zeichen, die nach Glück suchen. (,[:+/@:*:,.&.":@{:)ist der Hauptteil, der die Quadrate der Ziffern einer Zahl summiert, und (1-{:e.}:)ist der Test, ob diese Zahl bereits aufgetreten ist. sad`happy{~1 e.verwandelt dies in ein Wortergebnis, und wir hängen es an die Vorderseite der Zeichenfolge an non-primeund schneiden möglicherweise vier Zeichen ab, wenn die Zahl tatsächlich eine Primzahl war.

Im Anagramm verstecken wir einfach alle Bits, die nicht 'eighty-seven'in einer Zeichenfolge enthalten sind, die wir ignorieren. Ich könnte es besser machen, wenn J mehr Buchstaben zur Wiederverwendung hätte, aber das tut es nicht, also na ja.

Algorithmushai
quelle
Das ist eine gute Lösung.
Josiah Winslow