Код анаграммирования

10

Давайте попробуем это снова.

Цель этого конкурса - создать две части кода, которые являются анаграммами друг друга (они должны содержать одни и те же байты в разном порядке), и они будут выполнять следующие задачи:

  • Нужно проверить, является ли введенное число счастливым или простым , и вывести, если число либо (например, 7должно вывести happy primeи 4вывести sad non-prime).

  • Другой должен вывести свой размер кода в байтах в виде слова (60-байтовая программа выведет sixty, 39-байтовая программа выведет thirty-nine).

Если какие-либо разъяснения необходимы по правилам, не стесняйтесь, сообщите мне.

Это кодовое соревнование по гольфу, поэтому выигрывает самая короткая программа!

Джозия Уинслоу
источник
Что мешает делать, /*program1*/program2а потом program1/*program2*/? Я думаю, что вы должны запретить комментарии.
Уильям Барбоза,
@WilliamBarbosa Почему? Это вряд ли будет оптимальным решением.
Мартин Эндер,
Но вы могли бы также поделиться некоторыми частями, а не поделиться другими, что делает это намного проще
гордый haskeller
1
@proudhaskeller Запрещенные комментарии не решают это все же. Вы всегда можете вставить символы в строки, имена переменных или части кода, которые не выполняются по другим причинам.
Мартин Эндер,
1
FWIW, я не думаю, что вы должны были удалить свое собственное представление. ОП или нет, это был интересный ответ.
Деннис

Ответы:

6

CJam, 80 49 48 символов

ОБНОВЛЕНИЕ : Вдохновленный реализацией Дениса для вычисления суммы квадратов цифр, вот более короткая версия

Happy / Sad Prime / Не премьер:

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

Как это работает:

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"

сорок восемь

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

Как это работает:

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

Попробуйте онлайн

Первая программа читает номер из STDIN


Мое оригинальное 80-символьное решение

Happy / Sad Prime / Не премьер:

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

восемьдесят

"eigHTY""r:N{1/~]{i_*T+:T}/_s\1=:H!X):XK<&0:T}happysad?SNmp";"prim_";"non-\?:+";
оптимизатор
источник
4

CJam, 50 49 байтов

Тест на счастье и первичность

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

Читает число из STDIN. Оба теста работают только для 64-битных целых чисел.

Попробуйте онлайн.

Собственная длина

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

Печать СОРОК девять .

Деннис
источник
+1 для 31-байтового улучшения и «для девятого».
Джозия Уинслоу
3

Golfscript - 81

Эта программа проверяет, является ли число счастливым и / или простым.

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

Эта программа, анаграмма последней, выдает «восемьдесят один» (его байтовый размер как слово).

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

Это должно служить примером.

Джозия Уинслоу
источник
2
Хм, предоставление эталонной реализации для вызова кода в GolfScript может быть не лучшей идеей. Я считаю, что это довольно трудно победить и, следовательно, немного разочаровывает участников.
Мартин Эндер
Я вижу, что люди не замечают, что ты написал вопрос, и голосуют против тебя ... Я полностью согласен с Мартином.
гордый haskeller
@proudhaskeller В автоответчике нет ничего плохого.
Джастин
Я говорю, что нет ничего плохого в том, чтобы отвечать на себя или комментировать код.
Джозия Уинслоу
2
@JosiahWinslow В этом нет ничего плохого. Я просто говорю, что вы можете упустить некоторые интересные более длинные ответы, если вы отправите очень хорошее решение прямо сейчас.
Мартин Эндер
1

J - 87 символов

Наивная попытка сделать это в J. Не использовать стандартную библиотеку, хотя я сомневаюсь, что с ее использованием она станет еще короче.

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

Строка вверху - это глагол, принимающий целое число и определяющий его счастье и первичность в качестве выходной строки. Вторая строка - это выражение, возвращающее строку eighty-seven, а третья - постоянная функция, выполняющая то же самое. Я включил оба, потому что они оба были возможны, и потому что я не знаю, какое будет правление для ответов на функции, в отличие от программных, и у J нет такого понятия, как функции без аргументов - вы просто даете функции фиктивный аргумент.

Мы теряем большинство символов, проверяя на счастье. (,[:+/@:*:,.&.":@{:)является основным телом, которое суммирует квадраты цифр числа, и (1-{:e.}:)является проверкой того, произошло ли это число еще. sad`happy{~1 e.превращает это в слово-результат, и мы присоединяем его к non-primeначалу строки , потенциально обрезая четыре символа, если число было на самом деле простым.

В анаграмме мы просто скрываем все биты, которых нет 'eighty-seven'в строке, которую мы игнорируем. Я мог бы сделать лучше, если бы у J было больше букв для повторного использования, но это не так, ну да ладно.

algorithmshark
источник
Это хорошее решение.
Джозия Уинслоу