Heterogramy, palindromy, o mój!

28

(Pierwsze wyzwanie, daj mi znać, jeśli są jakieś problemy).

Heterogram to słowo, którym brak litery alfabetu występuje więcej niż jeden raz, a palindrom to wyrażenie, które jest takie samo w tył iw przód.

Wyzwanie polega na napisaniu fragmentu kodu, który przyjmuje słowo (tylko litery) jako dane wejściowe i wypisuje, czy jest to heterogram (prawda / fałsz). Problem polega na tym, że program musi być palindromem - czyta to samo w przód iw tył. Wielkie litery nie mają tutaj znaczenia, więc aby heterogram był poprawny, nie może mieć na przykład zarówno q, jak i Q. Komentarze są niedozwolone i nie można umieszczać ciągów zawierających kod (lub znaczną część kodu), aby ułatwić palindrom: P

To jest golf golfowy, więc wygrywa najkrótszy kod. Powodzenia!

EDYCJA: Pareny, nawiasy klamrowe lub inne symbole, które mają lewą i prawą formę, muszą zostać odwrócone w części palindromowej. Więc (helloolleh) jest palindromem, ale (helloolleh (nie jest.) Najwyraźniej nazywa się to wygodnym palindromem.

EDYCJA 2: Nie dostaniesz żadnych pustych danych wejściowych, danych wejściowych zawierających wiele słów lub znaków innych niż litery. Więc nie martw się o to :)

spaghetto
źródło
Czy nawiasy są uważane za równoważne z palindromicznością? To znaczy, czy (hellolleh)ważny jest palindrom? Podobne dla [], {}i <>(w stosownych przypadkach).
Glen O
Tak. Przepraszam, powinienem to wyjaśnić.
spaghetto
Co z nowymi liniami, będzie asdsauważany za równy asd\nsa?
wendelbsilva
Nie, nie będą równoważne.
spaghetto
5
Uważam, że nazywa się to wygodnym palindromem .
lirtosiast

Odpowiedzi:

9

Pyth - 11 bajtów

(Konieczne i policzone spacje końcowe i wiodące).

 z.{ z }.z 

Pakiet testowy .

<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
Maltysen
źródło
Odpowiedź Pyth'a przed konwersją jest przekształcana na małe litery. {Czy na pewno też nie musisz tego robić?
Sparr,
18

Pyth, 17 bajtów

 Z.{rzZ.q.Zzr}.Z 

Wypróbuj online tutaj.

Potrzebna jest wiodąca przestrzeń. Policzyłem to i końcową spację w liczbie bajtów.

Oto podział:

     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
Mike Bufardeci
źródło
3
Jezu, i martwiłem się, że to będzie zbyt trudne ... Dobra robota!
spaghetto
2
Masz .qw swoich komentarzach, ale .ww swoim programie.
James Webster,
@JamesWebster Dzięki za zwrócenie na to uwagi. Powinno być .q
Mike Bufardeci,
16

Python 3, 125

Główny problem polega na tym, aby odwrotność kodu była przetwarzalna. Wówczas możemy pozwolić, aby pomylił się z niezdefiniowanymi identyfikatorami.

w=[str.lower][0]((input)())
(print)((max)((map)(w.count,w))<2)
(2>((w,tnuoc.w)(pam))(xam))(tnirp)
(()(tupni))[0][rewol.rts]=w
feersum
źródło
Bardzo drobna uwaga, ale z zasad należy zmienić drugą <w >!
Jarmex
12

Perl, 43 bajty

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

Przykład użycia:

echo "abcde" | perl -n entry.pl
Jarmex
źródło
Łał, to niesamowite. Dobra robota!
spaghetto
6

> <> , 137 131 bajtów

Kiedy zobaczyłem to wyzwanie, pomyślałem, że> <> może w końcu być dobrym wyborem języka, ponieważ używając go można w większości zignorować palindromy; łatwo jest upewnić się, że wskaźnik pozostaje tylko tam, gdzie powinien. Chociaż jest to prawda,> <> niestety powoduje, że warunki do gry w golfa są męczące (lub po prostu gra w golfa w ogóle). Mam nadzieję, że skorzystam z kilku dziwnych sztuczek, o których pomyślałem, aby to zrekompensować, ale oto „szybka” (właściwie nie programowa i kreacyjna) odpowiedź. Możesz spróbować online tutaj .

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

Zwraca 1 dla prawdy i -1 dla fałszu (mógłbym zmienić to na 0, ale długość pozostanie taka sama, niestety)

Jak zawsze, daj mi znać, jeśli to nie zadziała i jeśli masz jakieś pomysły na grę w golfa. Przetestowałem to na kilku testowych przypadkach, ale zawsze może istnieć wyjątek.

Oto kolejna wersja, która moim zdaniem jest nieco mądrzejsza, ale niestety jest o dziesięć bajtów więcej. Wartości true / falsey tym razem wynoszą 1 i błąd ( 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<

Wyjaśnienie:

Oto kod bez dodanej części, aby uczynić go palindromem. Ten nie używa „bardziej sprytnych” sztuczek, których próbowałem użyć w alternatywnej wersji, więc trochę łatwiej jest to wytłumaczyć (jeśli ktoś jest zainteresowany wyjaśnieniem „sztuczek”, chętnie bym go podał , chociaż).

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

Linia 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

Oto jak działa zawiłe zamiana ( :{:@=?v$) - użyję testowego przypadku tego stosu: [5,1,8,1]gdzie ostatni znak jest na górze.

:{Górna część stosu jest zduplikowana:, [5,1,8,1,1]a stos przesunięto w lewo:[1,8,1,1,5]

:@Góra jest zduplikowana: [1,8,1,1,5,5]następnie trzy górne wartości są przesunięte w prawo:[1,8,1,5,1,5]

=?v Niepotrzebne w tej części wyjaśnień

$Najwyższa wartość jest ponownie wymieniana [1,8,1,5], co daje , jak zauważysz, oryginalny stos przesunięty jeden raz (tak jakby {to było jedyne polecenie).


Więc to, co robi to po angielsku („Dzięki Bogu, on tak naprawdę wyjaśnia”), polega na sprawdzeniu całego stosu względem najwyższej wartości i przejściu do punktu w drugiej linii, jeśli jakakolwiek wartość jest równa górnej. Sprawdzanie odbywa się proporcjonalnie do liczby wartości na stosie ( l - 1gdzie ljest długość stosu), dzięki czemu wszystkie wartości są sprawdzane względem siebie.

Linia 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
kapusta
źródło
Cieszę się, że widzę odpowiedź> <> :)
spaghetto
1
Również ><>to samo palindrom (po prostu nie wygodne jeden)
Jo Król
5

PHP, 126 bajtów

Trzeba uruchomić to z short_tagsini dyrektywy zamienił się w 5,4 lub powyżej.

Pierwszy golf w historii. Dwie kopie, pierwsza drukuje całą masę śmieci z wynikiem fałsz / prawda:

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

W tej wersji nie będzie drukowany żaden żargon (162 bajty):

<?=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=?>

Uruchom z wiersza polecenia za pomocą

php -f golf.php heterogram

Prawdopodobnie można grać w golfa nieco dalej

Scopey
źródło
Sprytne, choć przekraczające granice ważności. Może dla sportu wymyśl rozwiązanie z komentarzami
Martijn
Zamiast tego ?><?możesz użyć //\\. To powinno usunąć ten wymóg. I zamiast __halt_compiler()użyciareturn;
Ismael Miguel
Zignoruj ​​to. Nie możesz używać komentarzy. Ale to return;jest nadal aktualne.
Ismael Miguel
2

05AB1E, 9 bajtów

lDÙQqQÙDl

Wypróbuj online.

* wstaw coś o powrocie do mojego pierwszego wyzwania *

Po tym wyzwaniu nie konkurowano od 05AB1E.

Wyjaśnienie

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.
spaghetto
źródło
1
„Nie konkuruje od 05AB1E przed tym wyzwaniem”. Może miałeś na myśli po tym wyzwaniu? ;)
ETHprodukcje
2

Brachylog , 3 bajty, wyzwanie dla postdate języka

DdD

Wypróbuj online!

Jest to jeden z niewielu programów, który działa zarówno w Brachylog 1, jak i Brachylog 2. Łącze TIO prowadzi do Brachylog 1 ze względu na stare czasy. Również nietypowo dla Brachylog jest to pełny program, a nie funkcja. (Pełne programy w Brachylog domyślnie wypisują wartości logiczne, co jest właśnie tym, czego chcemy w przypadku tego pytania.)

Ogólna zasada jest taka, że ​​umieszczenie predykatu między parą identycznych wielkich liter jest twierdzeniem, że bieżąca wartość jest niezmienna w tym predykacie. Często więc widzisz rzeczy takie jak AoA„sortowane” („niezmiennie sortowane”); A↔Aznaczy (w Brachylog 2) znaczy „jest palindromem” („niezmiennikiem podczas odwrócenia”) i tak dalej. Ten program jest „niezmienny przy usuwaniu duplikatów”, tzn. „Nie zawiera duplikatów”. Naprawdę wygodne jest, że ta metoda określania niezmienności jest palindromem.


źródło
1

Brachylog , 3 bajty

≠ụ≠

Wypróbuj online!

Predykat kończy się powodzeniem, jeśli dane wejściowe są heterogramem, a porażki, jeśli tak nie jest.

≠      The characters of the input are all distinct,
 ụ     and when converted to upper case,
  ≠    are still all distinct.
Niepowiązany ciąg
źródło
0

MATL , 7 bajtów

tuX=Xut

Wypróbuj online!

Zwraca listę [1, 1], jeśli wejście jest heterogramem, a [0, 0], jeśli nie.

Wyjaśnienie:

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
B. Mehta
źródło