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 :)


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

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

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

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

Ł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

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


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.

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.


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.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.