Spontanicznie wpadłem na pomysł stworzenia szeregu wyzwań dla użytkowników, którzy pomogli i nadal pomagają społeczności PPCG być przyjemnym miejscem dla wszystkich, a może tylko dla mnie. : P
Jeśli przekonwertujesz nazwę Dennisa na tablicę 1
s i 0
s, w której znajduje się każda spółgłoska 1
i każda samogłoska 0
, tablica [1, 0, 1, 1, 0, 1]
jest symetryczna. Zatem Twoim wyzwaniem jest określenie, jakie są inne nazwy.
Wyzwanie
Biorąc pod uwagę ciąg ASCII, usuń wszystkie znaki, które nie są literami, i określ, czy konfiguracja samogłosek i spółgłosek jest symetryczna. y
nie jest samogłoską.
Pamiętaj, że twój program nie musi być tego typu ciągiem.
Przypadki testowe
Dennis -> truthy
Martin -> truthy
Martin Ender -> truthy
Alex -> falsy
Alex A. -> truthy
Doorknob -> falsy
Mego -> falsy
Wdrożenie referencyjne
Ten kod w Pythonie 3 da poprawne dane wyjściowe w przypadku testowym. Jest tak niezgrabny, jak tylko mogłem, bez śmieszności.
Python 3
s = input()
l = []
for c in s:
if c in 'AEIOUaeiou':
l.append(0)
elif c in 'BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz':
l.append(1)
print(l == list(reversed(l)), end = '')
źródło
Odpowiedzi:
05AB1E , 9 bajtów
Wypróbuj online!
-2 dzięki Adnan .
To atakuje dokładnie punkt bólu Jelly. Wykorzystuje
l
iA
równoważniki 1-bajtowy dla JellyŒl
iØa
odpowiednio.źródło
AÃ
przezá
iDR
przezÂ
.á
, nie wiedziałem, coÂ
robi, dzięki!00
doFF
tych 256 znaków, patrz odpowiedź JellyGalaretka , 11 bajtów
Wypróbuj online!
Alternatywne wersje:
Oczywiście wyzwanie doceniające Dennisa musi mieć odpowiedź w jego języku.
źródło
x86 32-bitowa funkcja kodu maszynowego,
4241 bajtówObecnie najkrótsza odpowiedź w języku innym niż golf, 1B krótsza niż q / kdb + streetstera .
Zerem dla prawdy i niezerowym dla fałszu:
4140 bajtów. (generalnie zapisuje 1 bajt dla wersji 32-bitowej, 2 bajty dla wersji 64-bitowej).Z ciągami o niejawnej długości (w stylu C zakończonym 0):
4544 bajtówkod maszynowy x86-64 (z 32-bitowymi wskaźnikami, takimi jak x32 ABI):
4443 bajty .x86-64 z ciągami o niejawnej długości, wciąż 46 bajtów (strategia bitmapy shift / mask jest teraz na progu rentowności).
Jest to funkcja z C podpisu
_Bool dennis_like(size_t ecx, const char *esi)
. Konwencja wywoływania jest nieco niestandardowa, zbliżona do MS wektorcall / fastcall, ale z różnymi rejestrami arg: ciąg znaków w ESI i długość w ECX. Blokuje tylko arg-regy i EDX. AL przechowuje wartość zwracaną, przy czym wysokie bajty przechowują śmieci (zgodnie z ABI SysV x86 i x32. IDK to, co ABI MS mówią o wysokich śmieciach podczas zwracania wartości bool lub wąskich liczb całkowitych.)Objaśnienie algorytmu :
Pętla nad ciągiem wejściowym, filtrując i klasyfikując do tablicy boolowskiej na stosie: Dla każdego bajtu sprawdź, czy jest to znak alfabetyczny (jeśli nie, przejdź do następnego znaku) i przekształć go na liczbę całkowitą od 0-25 (AZ) . Użyj tej liczby całkowitej 0-25, aby sprawdzić bitmapę samogłoski = 0 / spółgłoska = 1. (Mapa bitowa jest ładowana do rejestru jako 32-bitowa stała natychmiastowa). Wciśnij 0 lub 0xFF na stos zgodnie z wynikiem bitmapy (w rzeczywistości w niskim bajcie elementu 32-bitowego, który może zawierać śmieci w pierwszych 3 bajtach).
Pierwsza pętla tworzy tablicę 0 lub 0xFF (w elementach dword wypełnionych śmieciami). Wykonaj zwykłe sprawdzanie palindromu za pomocą drugiej pętli, która zatrzymuje się, gdy wskaźniki przecinają się na środku (lub gdy oba wskazują na ten sam element, jeśli występuje nieparzysta liczba znaków alfabetycznych). Wskaźnik w górę jest wskaźnikiem stosu i używamy POP do ładowania + przyrostu. Zamiast porównywać / ustawiać w tej pętli, możemy po prostu użyć XOR do wykrycia tego samego / innego, ponieważ istnieją tylko dwie możliwe wartości. Możemy kumulować (za pomocą OR), czy znaleźliśmy jakieś niepasujące elementy, ale wczesna gałąź na flagach ustawionych przez XOR jest co najmniej tak dobra.
Zauważ, że druga pętla używa
byte
wielkości operandu, więc nie ma znaczenia, jakie śmieci pozostawia pierwsza pętla poza niskim bajtem każdego elementu tablicy.Używa nieudokumentowanej
salc
instrukcji, aby ustawić AL z CF w taki sam sposób, jaksbb al,al
by to zrobił. Jest obsługiwany na każdym procesorze Intel (z wyjątkiem trybu 64-bitowego), nawet w Knight's Landing! Agner Fog podaje również czasy dla wszystkich procesorów AMD (w tym Ryzen), więc jeśli dostawcy x86 nalegają na ograniczenie tego bajtu przestrzeni opcode od 8086, równie dobrze moglibyśmy z niego skorzystać.Ciekawe sztuczki:
bt
, zainspirowana jakimś ładnym wyjściem kompilatora dlaswitch
.stosb
.cmp
/salc
nie jest opcją, ponieważsalc
działa tylko dla CF, a 0xFF-0 nie ustawia CF.sete
ma 3 bajty, ale uniknieinc
zewnętrznej pętli, koszt netto 2 bajtów (1 w trybie 64-bitowym )) vs. xor w pętli i ustalanie jej za pomocą inc.Jest to prawdopodobnie jedna z najszybszych odpowiedzi, ponieważ żadna gra w golfa nie boli tak bardzo, przynajmniej dla łańcuchów poniżej kilku tysięcy znaków, w których użycie pamięci 4x nie powoduje wielu braków pamięci podręcznej. (Może również stracić odpowiedzi, które wymagają wcześniejszego wypuszczenia ciągów niepochodzących od Dennisa przed zapętleniem wszystkich znaków.)
salc
Jest wolniejsze niżsetcc
na wielu procesorach (np. 3 ulepszenia vs. 1 na Skylake), ale sprawdzenie bitmapy zbt/salc
jest nadal szybszy niż wyszukiwanie ciągów lub dopasowanie do wyrażenia regularnego. I nie ma narzutu związanego z uruchamianiem, więc jest wyjątkowo tani w przypadku krótkich ciągów.Wykonanie tego w jednym przejściu w locie oznaczałoby powtórzenie kodu klasyfikacji dla kierunków w górę i w dół. Byłoby to szybsze, ale większy rozmiar kodu. (Oczywiście, jeśli chcesz szybko, możesz robić 16 lub 32 znaki jednocześnie za pomocą SSE2 lub AVX2, wciąż używając sztuczki porównywania, przesuwając zakres na dół podpisanego zakresu).
Program testowy (dla systemu Linux ia32 lub x32), aby wywołać tę funkcję za pomocą argumentu cmdline i wyjść ze statusu = zwracana wartość.
strlen
wdrożenie z int80h.org .Można użyć 64-bitowej wersji tej funkcji
sbb eax,eax
, dla której są tylko 2 bajty zamiast 3setc al
. Potrzebowałby także dodatkowego bajtu na końcudec
lubnot
na końcu (ponieważ tylko 32-bit ma 1 bajt inc / dec r32). Używając x32 ABI (32-bitowe wskaźniki w trybie długim), nadal możemy uniknąć prefiksów REX, nawet jeśli kopiujemy i porównujemy wskaźniki.setc [rdi]
może zapisywać bezpośrednio do pamięci, ale rezerwowanie bajtów ECX miejsca na stosie kosztuje więcej kodu niż to oszczędza. (I musimy przechodzić przez tablicę wyjściową.[rdi+rcx]
Zajmuje jeden dodatkowy bajt dla trybu adresowania, ale tak naprawdę potrzebujemy licznika, który nie aktualizuje filtrowanych znaków, więc będzie gorzej.)To jest źródło YASM / NASM z parametrami
%if
warunkowymi. Może być zbudowany z-felf32
(kod 32-bitowy) lub-felfx32
( kod 64-bit z ABI x32) oraz z niejawną lub jawną długością . Przetestowałem wszystkie 4 wersje. Zobacz tę odpowiedź dotyczącą skryptu do tworzenia statycznego pliku binarnego ze źródła NASM / YASM.Aby przetestować wersję 64-bitową na komputerze bez obsługi ABI x32, możesz zmienić rejestr wskaźnika na 64-bit. (Następnie wystarczy odjąć liczbę prefiksów REX.W = 1 (0x48 bajtów) od liczby. W takim przypadku 4 instrukcje wymagają prefiksów REX do działania na 64-bitowych rejestrach). Lub po prostu nazwij to wskaźnikiem
rsp
i wskaźnikiem wejściowym w niskim 4G przestrzeni adresowej.Patrzyłem na bałagan z DF (flagą kierunkową, która kontroluje
lodsd
/scasd
i tak dalej), ale nie wydawało się to zwycięstwem. Zwykłe ABI wymagają wyczyszczenia DF przy wejściu i wyjściu funkcji. Zakładając, że wyczyszczone przy wjeździe, ale pozostawienie go ustawionego przy wyjściu byłoby oszustwem, IMO. Byłoby miło użyć LODSD / SCASD, aby uniknąć 3-bajtówsub esi, 4
, szczególnie w przypadku braku śmieci.Alternatywna strategia bitmapowa (dla ciągów o niejawnej długości x86-64)
Okazuje się, że nie zapisuje to żadnych bajtów, ponieważ
bt r32,r32
nadal działa z dużymi śmieciami w indeksie bitów. Po prostu nie jest to udokumentowaneshr
.Zamiast
bt / sbb
wprowadzić bit do / z CF, użyj shift / mask, aby odizolować bit, który chcemy od bitmapy.Ponieważ daje to 0/1 w AL na końcu (zamiast 0 / 0xFF), możemy wykonać niezbędną inwersję wartości zwracanej na końcu funkcji za pomocą
xor al, 1
(2B) zamiastdec eax
(również 2B w x86-64), aby nadal generuje poprawnąbool
/_Bool
zwracaną wartość.W ten sposób zapisywano 1B dla x86-64 z ciągami o niejawnej długości, unikając konieczności zerowania wysokich bajtów EAX. (Używałem
and eax, 0x7F ^ 0x20
do wymuszania wielkich liter i zerowania reszty eax za pomocą 3-bajtowegoand r32,imm8
. Ale teraz używam 2-bajtowego kodowania natychmiastowego z AL, które ma większość instrukcji 8086, tak jak już to robiłem dlasub
icmp
.)Traci do
bt
/salc
w trybie 32-bitowym, a ciągi o jawnej długości potrzebują ECX do zliczania, więc to też tam nie działa.Ale potem zdałem sobie sprawę, że się myliłem:
bt edx, eax
nadal działa z wysokimi śmieciami w eax. To widocznie maski Shift liczyć tak samoshr r32, cl
ma (patrząc tylko na niskich 5 bitów CL). Różni się to od tegobt [mem], reg
, który może uzyskiwać dostęp poza pamięcią, do której odnosi się tryb / rozmiar adresowania, traktując to jako ciąg bitów. (Crazy CISC ...)Instrukcja odnawiania wewnętrznego zestawu Intela nie dokumentuje maskowania, więc może to nieudokumentowane zachowanie, które Intel na razie zachowuje. (Takie rzeczy nie są rzadkie.
bsf dst, src
Przy src = 0 zawsze pozostawia dst niezmodyfikowane, nawet jeśli udokumentowano, że dst ma w tym przypadku niezdefiniowaną wartość. AMD faktycznie dokumentuje zachowanie src = 0). Testowałem na Skylake i Core2, abt
wersja działa z niezerowymi śmieciami w EAX poza AL.Dobrą sztuczką jest użycie
xchg eax,ecx
(1 bajtu), aby uzyskać licznik w CL. Niestety BMI2shrx eax, edx, eax
ma 5 bajtów, a tylko 2 bajtyshr eax, cl
. Korzystaniebextr
wymaga 2 bajtówmov ah,1
(do liczby bitów do wyodrębnienia), więc znów jest to 5 + 2 bajtów, takich jak SHRX + AND.Kod źródłowy stał się dość niechlujny po dodaniu
%if
warunkowych. Oto demontaż ciągów o niejawnej długości x32 (przy użyciu alternatywnej strategii dla mapy bitowej, więc nadal jest to 46 bajtów).Główną różnicą w stosunku do wersji o jawnej długości jest pierwsza pętla. Zauważ, że jest
lods
przed nim i na dole, zamiast tylko jednego na górze pętli.źródło
Siatkówka ,
49 4745 bajtówWypróbuj online!
Zaoszczędzono 2 bajty dzięki Neilowi.
Zaoszczędził kolejne 2 bajty dzięki Martinowi.
Usuwa nieliterowe litery, a następnie zamienia samogłoski na 1 i spółgłosek na 2, aby uzyskać spójne wartości. Następnie wielokrotnie usuwa pierwszy i ostatni znak, jeśli są one takie same. Kiedy już nie są, słowo było symetryczne, jeśli pozostał jeden lub zero znaków.
źródło
\D
2
praca pozwala Ci zaoszczędzić kilka bajtówT`lL`2
?PHP, 82 bajty
Wypróbuj online!
źródło
(bool)
i wyjąć$s=
i==$s
sprawdzić, aby zapisać 1 bajt.(bool)
tylko0||
powiedzieć fałsz” lub… zamiast tego, oszczędzając 3 dodatkowe bajty.\w
do słownych znaków zamiasta-z
?\w
zawiera cyfry podkreślenia i litery. To nie zadziała i[^/p{L}]
jest dłuższe niż[^a-z]
plus. Porównuję łańcuch odwrotny z łańcuchem, więc$s
jest potrzebny do utworzenia wartości logicznejMATL, 14 bajtów
Wypróbuj w MATL Online .
Oto nieco zmodyfikowana wersja, aby sprawdzić wszystkie przypadki testowe.
Wyjaśnienie
źródło
Haskell,
84757469 bajtów-10 dzięki @nimi
-5 dzięki @Zgarb
Zrozumienie listy zastępuje każdą literę logiczną i usuwa wszystkie inne znaki. Pierwsza część sprawdza, czy wynikowa lista jest palindromem.
Wypróbuj online!
źródło
filter
po niej,map
nawet jeśli musisz przełączyć się na tryb wolny od poitfree. 2)<$>id
Jest zbyteczny.f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,c
elem['A'..'Z']++['a'..'z']]
.c
i"
dla jeszcze jednego bajtu.c`elem`['A'..'Z']++['a'..'z']
można go skrócić do'@'<c,c<'{','`'<c||c<'['
Pyth,
1815 bajtówWypróbuj tutaj.
-2 dzięki KarlKastor , a następnie -1.
źródło
_I/L"aeiou"@Grz0
(przy użyciu operatora niezmienniczości I)z
,Brachylog , 13 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Alice , 28 bajtów
Wypróbuj online!
Rezultaty
1
są prawdomówne, a nic nie jest fałszywe.Wyjaśnienie
Każde polecenie w tym programie wykonuje się w trybie porządkowym, ale z lekkim zwrotem w szablonie, który pozwala mi zapisać bajt. Jeśli nowa linia jest akceptowalną wartością prawdziwości, mogę zapisać jeszcze jeden bajt tą samą metodą.
Zlinearyzowany program jest następujący:
źródło
Python 3 ,
7271 bajtów-1 bajt dzięki @ovs
Wypróbuj online!
źródło
def f(s):s=[c in'AEIOU'for c in s.upper()if'@'<c<'['];return s==s[::-1]
dla 71 bajtówJavaScript (ES6),
7269 bajtówZaoszczędzono 3 bajty dzięki Neilowi
Zwraca wartość logiczną.
Przypadki testowe
Pokaż fragment kodu
źródło
2
.+''
na końcu? To oszczędziłoby 3 bajty.Mathematica, 113 bajtów
źródło
PalindromeQ@StringReplace[#,{Characters@"aeiouAEIOU"->"1",LetterCharacter->"0",_->""}]&
GolfScript , 42 bajty
Wypróbuj online!
Trudna część generuje zarówno wielkie, jak i małe litery w jednym ciągu, którego użyjemy w funkcji filtrowania, aby odfiltrować litery z wprowadzonego tekstu. Na szczęście, ponieważ ciągi znaków w GolfScript są tylko tablicami współrzędnych kodowych ze specjalną właściwością, dzięki czemu możemy po prostu generować te współrzędne w efektywny sposób. Oto jak je generujemy:
Najpierw generujemy zakres [0..122], przy czym 122 jest punktem kodowym dla
z
. Następnie bierzemy elementy od elementu o indeksie 65 wzwyż. 65 jest punktem kodowym dlaA
. W tej chwili mamy [65..122]. Wszystko w porządku, z wyjątkiem tego, że mamy tam trochę niechcianych współrzędnych kodowych ([91..96]). Najpierw tworzymy duplikat tego zakresu. Następnie bierzemy elementy od indeksu 26 i otrzymujemy [91..122]. Następnie otrzymujemy elementy aż do indeksu 5. Teraz mamy [91..96]. Na koniec usuwamy te elementy z naszego [65..122], pozostawiając nam wil [65..90, 97..122]. To są punkty kodowe, których chcemy.Teraz, gdy stworzyliśmy górną / dolną listę kodową alfabetu, kontynuujemy naszą funkcję filtrowania. Funkcja jest odwzorowywana na każdy znak w ciągu wejściowym, który, jak początkowo powiedziałem, jest analizowany jako punkt kodowy. Więc teraz w zasadzie mamy
[codepoint, [65..90, 97..122]]
. Aby dowiedzieć się, czy charcodepoint
jest literą, po prostu bierzemy jej indeks z utworzonej przez nas listy. Jeśli go nie ma,-1
zamiast tego otrzymamy indeks.W tej chwili otrzymujemy wartość falsey tylko wtedy
codepoint == 65
, gdy , tj. Pierwszy indeks naszej listy, ponieważ tylko wtedy indeks będzie wynosił 0. Ale pojedynczy przyrost rozwiąże ten problem, a teraz, jeślicodepoint
jest na naszej liście, będziemy dostajemy jego indeks + 1, który jest zawsze liczbą dodatnią, a zatem zawsze prawdziwą, a jeśli go nie ma, otrzymamy -1 + 1 = 0, tj. falsey.W końcu stosujemy funkcję, którą opisałem, do każdego znaku wejściowego i pobieramy tylko znaki, dla których funkcja zwróciła prawdziwy wynik.
Następnie musimy ustalić, czy każdy znak jest samogłoską czy spółgłoską. Ponieważ samogłosek jest mniej niż spółgłosek, tworzenie ciągu samogłosek, dzięki czemu sprawdzamy, czy ten warunek jest krótszy niż tworzenie ciągu spółgłosek, więc sprawdzamy, czy każdy znak jest samogłoską. Aby jednak sprawdzić, czy lista wartości logicznych jest palindromiczna, potrzebujemy wartości logicznych, których nie otrzymujemy po prostu biorąc indeks + 1, ponieważ może to skutkować dowolną liczbą [1..10], jeśli char jest samogłoską. I, jak większość języków golfowych, ten też nie ma żadnej
bool
funkcji. Po prostu używamynot not x
, ponieważnot
zawsze zwraca wartość logiczną. Ale poczekaj; czy naprawdę potrzebujemy konkretnych booleanów? Ponieważnot
zawsze zwraca wartość logiczną, dlaczego po prostu nie usuwamy drugiegonot
i faktycznie sprawdź, czy każdy znak jest spółgłoską? Tak, właśnie to zrobimy!Po sprawdzeniu, które zwraca listę wartości logicznych, sprawdzamy, czy otrzymana przez nas lista wartości logicznych jest palindromem, o co prosi nas to wyzwanie. Jaka jest definicja palindromu? Tak, palindrom to lista lub ciąg znaków, który jest równy jego odwrotności. Jak więc sprawdzamy? Proste, powielamy go, robimy odwrotność i porównujemy z oryginalną listą. W rezultacie otrzymujemy to, wreszcie , co nasz kod powinien wrócić.
źródło
PHP , 87 bajtów
Darmowa wersja PHP Regex. Dodano „samogłoskę”, ponieważ paski mogą zwracać 0, co w PHP jest fałszem.
Błąd naprawiony przez Jörga.
Wypróbuj online!
źródło
for(;a&$c=$argn[$p++];)ctype_alpha($c)?$s.=stripos(_aeiou,$c)?0:1:0;echo$s==strrev($s);
ale otrzyma właściwy wynik dla ciągów zawierających zeroq / kdb +,
4238 bajtówRozwiązanie:
Przykład:
Wyjaśnienie:
Edycje:
reverse
na k równoważnika|:
źródło
CJam , 26 bajtów
Wypróbuj online!
-1 dzięki Esolanging Fruit .
źródło
26,'af+
z'{,97>
zapisać bajt.Braingolf,
43 bajty-1 bajt dzięki Erik the Outgolfer
Okazuje się, że miałem je
P
cały czas, nawet przed tym wyzwaniem.J
jednak, mimo że został stworzony przed tym wyzwaniem, nie został zepchnięty na github przed wyzwaniem, dlatego nadal nie konkuruje.Wyjaśnienie:
źródło
n
?Alex A.
?Python 2, 83 bajty
Definiuje funkcję, która daje
True
alboFalse
źródło
"aeiouAEIOU".__contains__
zamiastlambda y:y.lower()in"aeiou"
.CJam , 79 bajtów
Nowicjusz! (Zrobiłem co mogłem)
Wypróbuj online!
źródło
Python 3 ,
928774726968 bajtówWypróbuj online!
źródło
for c in s
s
zmienną, zastępującs
w drugim wierszuinput().lower()
Rubinowy, 57 bajtów
Wypróbuj online!
źródło
Bash , 82 bajty
Wypróbuj online!
Pobiera nazwę jako parametr, usuwa litery nie będące literami, zamienia samogłoski na 0, nie samogłosek i 0 na 1 i porównuje z tym samym odwróconym.
Mógłby grać w golfa więcej, jeśli może dostać podwójną lub potrójną zmianę
Status wyjścia to 0 dla prawdy i 1 dla nie.
źródło
i=${i^^*};
konwertujei
na wielkie litery. Ale myślę, że to tylko oszczędza cia-z
orazaeiou
, co jest mniej niż 10B to kosztuje.Japt v2.0a0,
1911 bajtówWypróbuj online
Wyjaśnienie
źródło
APL (Dyalog) ,
3433 bajtyWypróbuj online!
Gra w golfa w toku.
źródło
819⌶⍨∘1
(⊢≡⌽)
PowerShell, 108 bajtów
źródło
Aksjomat, 126 bajtów
test
źródło
Pyke, 12 bajtów
Wypróbuj tutaj!
źródło
PowerShell, 87 bajtów
Uzyskaj kopię ciągu, w którym samogłoski mają wartość 0, a spółgłoski mają wartość 1, po usunięciu wszystkich znaków specjalnych, porównaj ten ciąg z wersją odwróconą połączoną z powrotem z ciągiem znaków
Wynik:
źródło
Siatkówka , 47 bajtów
Wypróbuj online!
To jest po prostu inne podejście do znaków innych niż alfabet
źródło