Гетерограми, Паліндроми, о, мій!


28

(Перший виклик, будь ласка, повідомте мене, чи є з цим якісь проблеми.)

Heterogram цього слова , де немає літери алфавіту не зустрічається більше одного разу, і паліндром є фразою , яка є тим же назад і вперед.

Завдання тут полягає в тому, щоб написати фрагмент коду, який вводить слово (лише літери) як вхідне та виводить, чи це гетерограма (правда / хибність). Зрозуміло, що програма повинна бути паліндром - читається однаково назад і вперед. Капіталізація НЕ має значення тут, так і для heterogram , щоб мати силу , вона не може мати як ^ і Q, наприклад. Ніякі коментарі не дозволені, і ви не можете розміщувати рядки, що містять ваш код (або значну частину вашого коду), щоб спробувати полегшити частину паліндрому: P

Це код-гольф, тому найкоротший код виграє. Удачі!

РЕДАКТУВАННЯ: Парели, дужки або інші символи, які мають ліву та праву форми, повинні бути повернені відповідним чином для частини паліндром. Отже (helloolleh) - це паліндром, але (helloolleh (ні. Очевидно, це називається зручним паліндром).

EDIT 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

Відповідь Майка Pyth перетворюється на малі регістри, перш ніж робити це. {Ви впевнені, що вам теж не потрібно цього робити?
Спарр

18

Піт, 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 для істинного та -1 для помилкового (я міг би змінити його на 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

Ось як працює згорнута заміна ( :{:@=?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 - це Брахілог 1 для старих часів. Також незвично для Брахілога це повна програма, а не функція. (Повні програми в Брахілозі неявно виводять булі, а це саме те, що ми хочемо для цього питання.)

Загальний принцип тут полягає в тому, що розміщення предиката між парою однакових великих літер є твердженням, що поточне значення є інваріантним під цим присудком. Тому ви часто бачите речі типу AoA"сортується" ("інваріант під сортуванням"); A↔Aозначав би (у Брахілогів 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.