Гетерограммы, палиндромы, о боже!


28

(Первая проблема, пожалуйста, дайте мне знать, если есть какие-либо проблемы с этим.)

Heterogram этого слова , где нет буквы алфавита не встречается более одного раза, и палиндром является фразой , которая является тем же назад и вперед.

Задача здесь состоит в том, чтобы написать кусок кода, который принимает слово (только буквы) в качестве входных данных и выводит, является ли это гетерограммой (правда / ложь). Подвох в том, что программа должна быть палиндромом - читает то же самое вперед и назад. Капитализация здесь не имеет значения, поэтому для правильности гетерограммы не должно быть, например, q и Q. Комментарии не допускаются, и вы не можете размещать строки, содержащие ваш код (или значительную часть кода), чтобы попытаться упростить часть палиндрома: P

Это код-гольф, поэтому выигрывает самый короткий код. Удачи!

РЕДАКТИРОВАТЬ: Parens, скобки или другие символы, которые имеют левую и правую формы, должны быть обращены вспять для части палиндрома. Итак (helloolleh) это палиндром, а (helloolleh (нет). Видимо, это называется удобным палиндромом.

РЕДАКТИРОВАТЬ 2: Вы не получите пустой ввод, ввод с несколькими словами или ввод с символами, отличными от букв. Так что не беспокойся об этом :)


Считается ли скобки эквивалентными для палиндромности? То есть (hellolleh)действительный палиндром? Аналогично для [], {}и <>(при необходимости).
Глен О,

Да. Извините, я должен был это объяснить.
спагетто

А как насчет новых строк, будет asdsaсчитаться равным asd\nsa?
wendelbsilva

Нет, они не будут эквивалентны.
спагетто

5
Я считаю, что это называется удобным палиндромом .
lirtosiast

Ответы:


9

Pyth - 11 байт

(Конечные и ведущие пробелы необходимы и учитываются).

 z.{ z }.z 

Тестовый пакет .

<space>        Suppress print
 z             Input (for palindromness)
.{             Unique - actually does testing
  z            Input
<space>        Suppress print
  }            In operator
   .z          Cached input list
   <space>     At end of program makes empty tuple

Ответ Пика Майка преобразуется в нижний регистр, прежде чем делать. {, Вы уверены, что вам не нужно делать это тоже?
Спарр

18

Pyth, 17 байт

 Z.{rzZ.q.Zzr}.Z 

Попробуйте это онлайн здесь.

Ведущее пространство необходимо. Я посчитал это и завершающий пробел в подсчете байтов.

Вот разбивка:

     z            z is initialized to the input
    r Z           Z is initialized to 0, and r(string)0 converts the string to lowercase
  .{              .{ is pyth's builtin uniqueness test
       .q         .q terminates the program
         .Zzr}    This is just the program mirrored
              .Z  . requires a number to immediately follow it
                  If left blank the parser would throw an error
 Z                This is just mirrored from the end
                  The leading space suppresses the automatic printing of this 0
                  The trailing space mirrors the leading space

3
Боже, и я волновался, что это будет слишком сложно ... Отличная работа!
спагетто

2
У вас есть .qв ваших комментариях, но .wв вашей программе.
Джеймс Вебстер

@JamesWebster Спасибо за указание на это. Это должно быть .q
Майк Буфардечи

16

Питон 3, 125

Основная проблема заключается в том, чтобы сделать обратную часть кода доступной для анализа. Тогда мы можем выпустить ошибку из неопределенных идентификаторов.

w=[str.lower][0]((input)())
(print)((max)((map)(w.count,w))<2)
(2>((w,tnuoc.w)(pam))(xam))(tnirp)
(()(tupni))[0][rewol.rts]=w

Очень незначительный момент, но из правил вы должны изменить второй <в >!
Jarmex

12

Perl, 43 байта

print+m:^(?!.*(.).*\1|1/*.(.)*.!?)^:m+tnirp

Пример использования:

echo "abcde" | perl -n entry.pl

Вау, это потрясающе. Хорошая работа!
спагетто

6

> <> , 137 131 байт

Когда я увидел этот вызов, я подумал, что> <>, наконец, может быть хорошим выбором языка, поскольку, используя его, вы в основном можете игнорировать палиндромы; просто убедиться, что указатель остается только там, где и должен. Хотя это и правда,> <>, к сожалению, делает условия для игры в гольф мучительными (или просто для игры в гольф в целом). Я надеюсь использовать некоторые странные уловки, о которых я думал, чтобы компенсировать это, но вот «быстрый» (не на самом деле, как программный, так и творческий) ответ. Вы можете попробовать это онлайн здесь .

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<01-n;  >~00.   >84*-  ^>1n;
<.0e&$v?=@:}:&v?)1:-1lv?("Z":<v?)0:i

Возвращает 1 для true и -1 для false (я мог бы изменить его на 0, но длина, к сожалению, осталась бы прежней)

Как всегда, дайте мне знать, если это не сработает, и если у вас есть идеи о том, как играть в гольф. Я проверил это на нескольких тестовых примерах, но всегда может быть исключение.

Вот еще одна версия, которая, на мой взгляд, немного умнее, но, увы, на десять байтов больше. Значения Truthy / Falsey на этот раз равны 1 и ошибка ( something smells fishy...):

>i:0(?v>:"Z")?vl: 2(?v&{:@$:@=01-*2.
 < ;n1<^  -*48<f6+0.0<
 &1-:1)e*1.1*e(1:-1& 
>0.0+6f>84*-  ^>1n; > 
.2*-10=@:$@:}&v?)2 :lv?("Z":<v?)0:i<

Объяснение:

Вот код без добавленной части, чтобы сделать его палиндромом. В этом не используются «более умные» приемы, которые я пытался использовать для альтернативной версии, так что это немного проще объяснить (если кому-то интересно объяснение «приемов», я был бы рад дать один , хотя).

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<

Линия 1:

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
i:0(?v                                 #Pushes input and directs down if negative
      >:"Z")?v                         #Directs down if input is greater than "Z"
                                       #(reduces lowercase input to uppercase)
              l                        #Pushes length

                                       #Main loop begins
               1-:1(?v                 #Decrements top, and then directs down if less than 1
                      &                #Pushes top of stack onto register (length minus 1)
                       :{              #Duplicates top, shifts stack to the left
                         :@            #Duplicates top, shifts top three values of the stack to the right

                           =?v         #If top two values are equal, directs down
                              $        #Swaps top two values of the stack
                               &       #Pushes register onto stack
                                e0.    #Jumps back to the "1" after "?vl"
                                       #Main loop ends

                                   >   #Makes sure when the pointer jumps back to i it goes the right way

Вот как работает замысловатый swapping ( :{:@=?v$) - я буду использовать тестовый пример этого стека: [5,1,8,1]где последний символ - верхний.

:{Вершина стека дублируется:, [5,1,8,1,1]а стек смещен влево:[1,8,1,1,5]

:@Верх дублируется: [1,8,1,1,5,5]затем три верхних значения сдвигаются вправо:[1,8,1,5,1,5]

=?v Не нужно для этой части объяснения

$Верхнее значение [1,8,1,5]поменяется местами еще раз , что, если вы заметите, является исходным стеком, сдвинутым один раз (как если бы {это была единственная команда).


Итак, что это делает на английском языке («Слава Богу, он на самом деле объясняет вещи») , проверяет весь стек по верхнему значению и перемещается в точку во второй строке, если какое-либо значение равно верхнему. Эта проверка выполняется пропорционально тому, сколько значений в стеке ( l - 1где lдлина стека), чтобы все значения сравнивались друг с другом.

Строка 2:

  ;n1<^  -*48<   .00~<  ;n-10<
   n1<                          #If input is less than 0 (i.e. there is none), print 1
  ;                             #and terminate

             <                  #If redirected because input is greater than "Z"
         -*48                   #Push 32, subtract (reducing lowercase to uppercase, numerically)
      ^                         #And move back to the portion that tests if input 
                                #is uppercase (which it will pass now)

                     <          #If counter is less than 1 (for main loop)
                 .00~           #Pop the counter and jump to the beginning (i)

                             <  #If any two values in the stack are equal
                          -10   #Push -1 (subtract 1 from 0)
                        ;n      #Print and terminate

Рад видеть ответ> <> :)
спагетто

1
Кроме того, ><>сам палиндром (просто не удобный)
Джо Кинг,

5

PHP, 126 байт

Вам нужно запустить это с отключеннойshort_tags директивой ini в 5.4 или выше.

Первый в мире гольф. Две копии, первая печатает целую кучу мусора с ложным / правдивым результатом:

<?=var_dump(max(array_count_values(str_split(end($argv))))<2)?><?(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

Эта версия не будет печатать любой жаргон (162 байта):

<?=var_dump(max(array_count_values(str_split(end($argv))))<2);__halt_compiler()?><?()relipmoc_tlah__;(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

Запустить из командной строки с

php -f golf.php heterogram

Вероятно, можно играть в гольф немного дальше


Умный, хотя и раздвигающий границы действия. Может быть, для спорта придумать решение с комментариями
Martijn

Вместо ?><?, вы можете использовать //\\. Это должно снять это требование. И вместо __halt_compiler()использованияreturn;
Исмаэль Мигель

Не обращайте на это внимания. Вы не можете использовать комментарии. Но return;это все еще действует.
Исмаэль Мигель

2

05AB1E, 9 байтов

lDÙQqQÙDl

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

* вставьте что-нибудь о возвращении к моему самому первому вызову *

Неконкурентный, так как 05AB1E был сделан после этого испытания.

объяснение

lDÙQqQÙDl
l           Take input and lowercase it.
 DÙ         Duplicate and uniquify.
   Q        Compare the two strings.
    q       Immediately exit.
     QÙDl   The rest of the program is ignored.

1
«Не участвуя в конкурсе с 05AB1E, созданного до этого испытания». Возможно, вы имели в виду после этого вызова? ;)
ETHproductions

2

Брахилог , 3 байта, вызов языковых постдат

DdD

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

Это одна из немногих программ, которая работает как в Brachylog 1, так и в Brachylog 2. Ссылка TIO на Brachylog 1 для старых времен. Также необычно для Brachylog, это полная программа, а не функция. (Полные программы в Brachylog неявно выводят логические значения, что нам и нужно для этого вопроса.)

Общий принцип заключается в том, что размещение предиката между парой одинаковых заглавных букв является подтверждением того, что текущее значение является инвариантным относительно этого предиката. Поэтому вы часто видите такие вещи, как AoA«отсортировано» («инвариант при сортировке»); A↔Aбудет (в Brachylog 2) означать «палиндром» («инвариант при обращении») и т. д. Эта программа «инвариантна при удалении дубликатов», то есть «не содержит дубликатов». Действительно удобно, что этот метод определения инвариантности оказывается палиндромом.



0

MATL , 7 байт

tuX=Xut

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

Возвращает список [1, 1], если вход является гетерограммой, и [0, 0], если нет.

Объяснение:

t       % duplicate the input
u       % remove duplicates from the original
X=      % check the two lists are equal
Xu      % unique rows (does nothing as we now have a boolean)
t       % duplicate the result
        % (implicit) convert to string and display
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.