Kod anagramowy

10

Spróbujmy jeszcze raz.

Celem tego konkursu jest stworzenie dwóch fragmentów kodu, które są wzajemnie anagramami (dwa muszą zawierać te same bajty w innej kolejności) i wykonają następujące zadania:

  • Trzeba sprawdzić, czy wprowadzona liczba jest szczęśliwa czy pierwsza , i wypisać, jeśli liczba jest albo (na przykład, 7musi wypisać happy primei 4musi wypisać sad non-prime).

  • Drugi musi wypisać swój rozmiar kodu w bajtach jako słowo (wyprowadziłby program 60-bajtowy, wyemitowałby program sixty39-bajtowy thirty-nine).

Jeśli potrzebne jest wyjaśnienie zasad, nie wahaj się mi powiedzieć.

To zawody w golfa kodu, więc wygrywa najkrótszy program!

Josiah Winslow
źródło
Co przeszkadza w zrobieniu /*program1*/program2tego program1/*program2*/? Myślę, że powinieneś zabronić komentarzy.
William Barbosa,
@WilliamBarbosa Dlaczego? To nie będzie optymalne rozwiązanie.
Martin Ender
Ale możesz również udostępnić niektóre części i nie udostępniać innych, co znacznie ułatwia
dumny haskeller
1
@proudhaskeller Zakaz komentarzy nie rozwiązuje tego. Zawsze możesz wstawiać znaki do ciągów, nazw zmiennych lub części kodu, które nie są wykonywane z innych powodów.
Martin Ender
1
FWIW, nie sądzę, że powinieneś usunąć własne zgłoszenie. OP czy nie, to była interesująca odpowiedź.
Dennis,

Odpowiedzi:

6

CJam, 80 49 48 znaków

AKTUALIZACJA : Inspirowana implementacją Dennisa do obliczania sumy kwadratów cyfr, oto krótsza wersja

Happy / Sad Prime / non-prime:

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

Jak to działa:

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"

czterdzieści osiem

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

Jak to działa:

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

Wypróbuj online

Pierwszy program odczytuje numer ze STDIN


Moje oryginalne rozwiązanie z 80 postaciami

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

osiemdziesiąt

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

CJam, 50 49 bajtów

Test szczęścia i pierwszeństwa

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

Odczytuje liczbę ze STDIN. Oba testy działają tylko dla 64-bitowych liczb całkowitych.

Wypróbuj online.

Własna długość

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

Wydruki za Tydzień dziewięć .

Dennis
źródło
+1 za 31-bajtowe ulepszenie i „forTy-nine”.
Josiah Winslow,
3

Golfscript - 81

Ten program sprawdza, czy liczba jest szczęśliwa i / lub pierwsza.

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

Ten program, anagram ostatniego, zwraca „osiemdziesiąt jeden” (jego bajt jest wielkością słowa).

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

To powinno służyć jako przykład.

Josiah Winslow
źródło
2
Hm, zapewnienie referencyjnej implementacji kodu golfowego w GolfScript może nie być najlepszym pomysłem. Uważam, że ten jest dość trudny do pokonania i dlatego nieco zniechęca uczestników.
Martin Ender
Widzę, że ludzie nie zauważają, że napisałeś pytanie i głosujesz cię ... Całkowicie zgadzam się z Martinem.
dumny haskeller
@proudhaskeller Nie ma absolutnie nic złego w samo-odpowiedzi.
Justin
Mówię, że nie ma nic złego w odpowiadaniu na siebie lub komentowaniu kodu.
Josiah Winslow,
2
@JosiahWinslow Nie ma w tym nic złego. Mówię tylko, że możesz przegapić kilka interesujących dłuższych odpowiedzi, jeśli od razu sam opublikujesz bardzo dobre rozwiązanie.
Martin Ender
1

J - 87 znak

Naiwna próba tego w J. Nie ma zastosowania standardowej biblioteki, choć wątpię, by przy jej użyciu byłaby krótsza.

((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'"_)

Linia na górze to czasownik przyjmujący liczbę całkowitą i diagnozujący jej szczęście i pierwotność jako ciąg wyjściowy. Druga linia to wyrażenie zwracające ciąg znaków eighty-seven, a trzecia to stała funkcja, która robi to samo. Dołączyłem oba, ponieważ były one możliwe i ponieważ nie wiem, jakie będą rozstrzygnięcia w odpowiedziach funkcji w przeciwieństwie do odpowiedzi programowych, a J nie ma czegoś takiego jak funkcje bez argumentu - po prostu dajesz funkcji fałszywy argument.

Tracimy większość znaków, sprawdzając szczęście. (,[:+/@:*:,.&.":@{:)jest głównym ciałem, które sumuje kwadraty cyfr liczby i (1-{:e.}:)jest testem, czy ta liczba już się pojawiła. sad`happy{~1 e.zamienia to w wynik słowny, a my dołączamy to z przodu łańcucha non-prime, potencjalnie usuwając cztery znaki, jeśli liczba rzeczywiście była liczbą pierwszą.

Na anagramie po prostu ukrywamy wszystkie bity, które nie są 'eighty-seven'w ciągu, który ignorujemy. Mógłbym zrobić lepiej, gdyby J miał więcej listów do ponownego wykorzystania, ale tak nie jest, więc cóż.

algorytmshark
źródło
To dobre rozwiązanie.
Josiah Winslow,