(zainspirowany tym wyzwaniem na łamigłówkach - SPOILERY dla tej układanki są poniżej, więc przestań czytać tutaj, jeśli chcesz rozwiązać tę zagadkę samodzielnie!)
Jeśli litera w słowie występuje alfabetycznie później niż poprzednia litera w słowie, nazywamy to wzrostem między dwiema literami. W przeciwnym razie, w tym jeśli jest to ta sama litera , nazywa się to upadkiem .
Na przykład słowo ACE
ma dwa wzloty ( A
do C
i C
do E
) i nie ma spadków, podczas gdy THE
ma dwa spadki ( T
do H
i H
do E
) i nie ma wzlotów.
Nazywamy słowo Wyboisty, jeśli sekwencja wzlotów i upadków zmienia się. Na przykład, BUMP
idzie w górę ( B
do U
), w dół ( U
do M
), w górę ( M
do P
). Zauważ, że pierwsza sekwencja nie musi być wzrostem - BALD
przechodzi od spadku do spadku i jest również wyboista.
Wyzwanie
Biorąc pod uwagę słowo, wypisz, czy jest wyboisty, czy nie.
Wkład
- Słowo (niekoniecznie słowo słownikowe) składające się wyłącznie z alfabetu ASCII (
[A-Z]
lub [a-z]
), w dowolnym odpowiednim formacie .
- Twój wybór, jeśli dane wejściowe są pisane wielkimi lub małymi literami, ale muszą być spójne.
- Słowo będzie miało co najmniej 3 znaki.
Wydajność
Truthy / falsey wart, czy słowo wejściowego jest Bumpy (truthy) lub nie Bumpy (falsey).
Zasady
- Dopuszczalny jest pełny program lub funkcja.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Przykłady
Prawda:
ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN
Falsey:
AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=93005,OVERRIDE_USER=42963;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
BUMP
jest wymieniony w Truthy (tj. Bumpy), dlaczegoBUMPY
znajduje się na liście Falsey? Co oznacza „wzloty i upadki na przemian”? Dwa wzrosty nie mogą być sukcesywnie?BUMPY
jest fałszem, ponieważMPY
daje dwa kolejne wzrosty. Innymi słowy, żadne podciągi o długości 3 nie mogą być sortowane rosnąco lub malejąco, aby słowo było wyboiste (poza szczególnym przypadkiem, gdy dwie kolejne litery są identyczne).Odpowiedzi:
MATL, 4 bajty
Wyjaśnienie:
To jest mój pierwszy wpis w MATL, więc zastanawiam się, jak wiele ulepszeń można uzyskać dzięki temu naiwnemu portowi po mojej próbie MATLAB / Octave (która byłaby
@(a)all(diff(diff(a)>0))
). Zauważ, żeall
nie jest to konieczne, ponieważ dowolne zero powoduje, że tablica jest fałszywa, więc nie ma goA
w porcie MATL.źródło
d0>d
powinien działać (nie potrzebujeszA
zgodnie z naszą definicją truey / falsey)JavaScript (ES6),
7569634643 bajtyZaoszczędzono 3 bajty dzięki Neilowi:
Niszczenie parametru ciągu zamiast
s.slice(1)
.Poprzednie rozwiązanie:
Oszczędność 17 bajtów dzięki produktom ETH:
Co się stało z poprzedniego rozwiązania krok po kroku:
Poprzednie rozwiązania:
63 bajty dzięki produktom ETH:
69 bajtów:
75 bajtów:
Wszystkie litery w słowie muszą mieć tę samą wielkość liter.
źródło
!s[2]|...
zrobić to samo cos[2]?...:1
?f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
LabVIEW, 36 równoważnych bajtów
Gra w golfa przy użyciu logicznych równoważników:
Nie golfowany:
Najpierw konwertujemy na małe litery, a następnie na tablicę bajtów. Przytnij pierwszy element tablicy bajtów, ponieważ nie ma on precedensu. Następnie, dla każdego elementu w tablicy, sprawdź, czy jest większy niż poprzedni (znak U8 odwzorowuje na ASCII, jak się spodziewasz) i zapisz wynik dla następnej iteracji, a także w tablicy do przeglądania ogólnej nierówności. Jeśli bieżąca i wcześniejsza kontrola logiczna są równe, przerywamy pętlę i nie jest to wyboista. W przeciwnym razie jest wyboisty!
źródło
Python, 56 bajtów
Wszystkie przypadki testowe są w ideone
Przeskakuje przez trójki znaków ws i sprawdza, czy wszystkie takie trójki mają lewą i prawą parę o różnych właściwościach wznoszenia / opadania.
Działa dla wszystkich wielkich lub małych liter.
źródło
Rubin,
5748 bajtówOczekuje, że dane wejściowe będą składać się z wielkich liter.
Zobacz na repl.it: https://repl.it/D7SB
Wyjaśnienie
Wyrażenie regularne
/.(?=(.)(.))/
pasuje do każdego znaku, po którym następują dwa kolejne znaki.(?=...)
jest pozytywnym spojrzeniem w przyszłość, co oznacza, że dopasowujemy dwa kolejne znaki, ale nie „konsumujemy” ich w ramach meczu. Wewnątrz nawiasów klamrowych$&
znajduje się dopasowany tekst - pierwszy znak z trzech -$1
i$2
są one schwytanymi postaciami z góry. Innymi słowy, jeśli łańcuch jest"BUMPY"
, najpierw dopasuje"B"
(i wstawi$&
) i przechwyci"U"
oraz"M"
(i umieści je w$1
i$2
). Następny będzie pasować"U"
i wychwytywania"M"
i"P"
, i tak dalej.Wewnątrz bloku sprawdzamy, czy pierwsza para znaków (
$&
i$1
) jest wzniesieniem, a druga ($1
i$2
) jest spadkiem lub odwrotnie, podobnie jak większość innych odpowiedzi. To^
wyrażenie zwracatrue
lubfalse
, które jest konwertowane na ciąg znaków i wstawiane w miejsce dopasowania. W rezultacie nasz przykład"BUMPY"
wygląda następująco:Ponieważ wiemy, że dane wejściowe są pisane wielkimi literami, wiemy, że
"f"
wystąpią tylko jako część"false"
i!result[?f]
daje nam odpowiedź.źródło
C #,
646355 bajtów-8 bajtów z sugestii Scepheo
To jest port rozwiązania Hedi do C #. Wymyśliłem również rozwiązanie rekurencyjne, ale rekursja nie była tak dobra. Moje oryginalne rozwiązanie znajduje się poniżej.
My Original C #,
969491 bajtów-2 bajty przy użyciu
1>0
zamiasttrue
.-3 bajty z sugestii Scepheo dla powyższego rozwiązania portu
Nazywa się rekurencyjnie sprawdzając, czy wzrost / opadanie zmienia się za każdym razem.
Nie golfowany:
źródło
?:
operatora lub nawiasów:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
||
zamiast bitowego OR|
. Zaktualizowano wpis, dzięki.C 59 bajtów
źródło
AAA
- pierwszy „Falsey” w przykładachgcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
i otrzymuję fałsz za AAA i jestem podekscytowany. W tej wersji wartość niezerowa to falsey, a zero to prawda. Zastanawiam się teraz, czy jest to dozwolone.f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
skompilowane w Visual Studio 2012 zwraca wartość,23
którą można traktować jako,True
ale w pytaniu ta wartość znajduje się w sekcji „Falsey”, więc0
oczekiwana wartość .Galaretka , 6 bajtów
Na podstawie odpowiedzi @sanchises .
Wypróbuj online! lub Zweryfikuj wszystko.
Wyjaśnienie
źródło
JavaScript (ES6), 65 bajtów
.map
to na pewno nie jest najlepszym rozwiązaniem .źródło
Python 2, 88 bajtów
Proste rozwiązanie.
Wypróbuj online
Gdyby te same litery z rzędu nie były ani wzrostem, ani spadkiem, rozwiązaniem byłoby 79 bajtów:
źródło
Perl, 34 bajty
Obejmuje +3 dla
-p
(kod zawiera,'
więc-e
nie można go użyć)Podaj duże litery w STDIN:
bump.pl
źródło
Python, 51 bajtów
Pobiera dane wejściowe
g('B','U','M','P')
i wyjściowe1
lub0
.Używa rozpakowywania argumentów, aby pobrać pierwsze trzy litery i sprawdzić, czy pierwsze dwa różnią się od dwóch pozostałych. Następnie powtarza się w pozostałej części, używając mnożenia dla
and
.źródło
Galaretka ,
65 bajtów-1 bajt dzięki @Dennis (użyj skumulowanej redukcji)
Wszystkie przypadki testowe znajdują się w TryItOnline
W jaki sposób?
Działa dla wszystkich wielkich lub małych liter.
źródło
Japt, 8 bajtów
Przetestuj online!
Jak to działa
źródło
C #
105104 Bajtów105 bajtów Rozwiązanie:
Wypróbuj online
Za pomocą tablicy znaków zapisano jeden bajt, ponieważ spację można pominąć po nawiasach.
f(string x)
vsf(char[]x)
To 101 bajtów, jeśli mogę zwrócić int 1/0 zamiast bool true / false
źródło
Haskell, 52 bajty
Podejrzewam, że mógłbym zmniejszyć ten kawałek, jeśli udało mi się pozbyć konstruktu „gdzie”, ale prawdopodobnie utknąłem z zipWith.
Działa to poprzez utworzenie listy wzlotów (Prawda) i upadków (Fałsz), a następnie sporządzenie listy, jeśli sąsiednie wpisy na tej liście są różne
To jest moja pierwsza próba jednego z nich, więc przejdę przez proces myślowy, na wypadek, gdybym gdzieś strasznie się pomylił.
Wersja bez golfa (168 bajtów)
Skróć nazwy, usuń informacje o typie (100 bajtów)
Przenieś h do głównej funkcji, ponieważ jest używana tylko raz (86 bajtów)
Zrozum, że areBumps i riseFall są wystarczająco podobne do abstrakcyjnych (73 bajtów)
Zauważ, że (ogon y) jest krótszy niż ya @ (y: ys) (70 bajtów)
Sprzątać; usuń niepotrzebne spacje (52 bajty)
źródło
g h=tail>>=zipWith h
i ustawić ją jako funkcję globalną, aby uniknąćwhere
słowa kluczowego.Java 7,
157153150125117 bajtówPrzypadki bez golfa i testy:
Wypróbuj tutaj.
Wydajność:
źródło
a > b
, ale spada kiedya <= b
zamiast>
i<
?char[]
więc nie musisz przekształcać łańcucha wejściowego na tablicę char. to powinno zaoszczędzić kilka bajtów. PS: java ftw!String s
->char[]z
?truthy
lubfalsey
wartość, więc ustaw metodę na int i zwróć 1 lub 0 :) .. Sprowadza cię do 117 bajtówPowerShell v2 +, 83 bajty
Trochę innego podejścia. Te pętle przez wejście
$n
, każda iteracja widząc czy poprzedni znak$n[$_-1]
jest-l
esst
han obecny charakter$n[$_]
, a następnie rzucając wynik tego operatora logicznego do int z+
. Są one-join
edytowane razem w ciąg, przechowywany w$a
. Następnie sprawdzamy, czy$a
jest to-eq
przydatne$a
przy jakichkolwiek podciągach00
lub11
usuniętych.źródło
Python 2.7, 84 bajty
Zwraca 1 dla wyboistej, 0 dla innej
Nauczyłem się fajnych rzeczy z bitowym & i ^.
Zaczyna się od wartości logicznej b definiującej pierwszą parę jako góra / dół, a następnie testuje i odwraca b dla każdej następnej pary.
o zmienia się na fałsz, jeśli test się nie powiedzie i zaciął.
Wymaga cudzysłowu wokół danych wejściowych (+4 bajty dla raw_input (), jeśli łamie to jakąś regułę)
Sprawdź to
źródło
05AB1E , 9 bajtów
Wyjaśnienie
Wypróbuj online!
źródło
Python 2.7 (ponownie,
8483 bajty)Lub
7877 bajtów bez nadruku.Nawiasem mówiąc, powyższy 56-bajtowy przykład Python 2.7 łamie się, na przykład,Nieważne, nie przeczytałem instrukcji. Korekta"abbab"
lub inne dane wejściowe z powtarzającymi się znakami.Okej, do 83. Trojka jest jednak ładniejsza.
źródło
a(x)if x else[]
. 2. Zamiast tego użyj lambda.a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]
3. Użyj lambda na końcu zamiast drukowania.lambda s:len(set(a(s)))>1
4. jeślilen(set(a(s)))
nie jest większy niż 1, to już jest fałsz, więc możesz się wystartować>1
CJam , 15 bajtów
Wypróbuj online! (Jako pakiet testowy oddzielony od linii).
Wyjaśnienie
źródło
PHP, 80 bajtów
lub
puste wyjście dla false,
1
dla truelub rekursywne podejście Hedi przeniesione i trochę golfa za 70 bajtów:
W rzeczywistości powinno to powtarzać się w nieskończoność dla wyboistych słów, ale tak nie jest!
źródło
Haskell,
3037 bajtówStosowanie:
źródło
foldl1(/=)
nie robi tego, co myślisz.PHP 7,
137118 bajtówPuste wyjście dla Wyboista,
0
dla Nie wyboista.To moja pierwsza próba gry w golfa i muszę wiele poprawić, ale była to dla mnie wspaniała metoda uczenia się nowych rzeczy. Chciałem też rzucić wyzwanie temu zadaniu, używając nowego operatora kosmicznego PHP 7, który wydaje się bardzo interesujący.
W każdym razie nie jestem z tego zadowolony, przede wszystkim dlatego, że musiałem dodać dodatkowy,(Uwaga: Naprawiłem to, zmieniającif(isset($s[$i+2]))
aby sprawdzić, czy zmienna istnieje, ponieważ nie znalazłem innego obejścia problemu, ale na razie to tyle.strlen($s)-1
nastrlen($s)-2
, tak naprawdę nie widziałem tego wcześniej ...).Kod testowy:
Przetestuj online
źródło
JavaScript ES6, 100 bajtów
Wypróbuj tutaj:
Och, dwie osoby już mnie pobiły o 40 bajtów ... cokolwiek
źródło
"A"<"B"
więc nie musisz uzyskiwać kodów znaków.1
doBUMPY
(lub czegokolwiek innego, który zawiera zarówno wzrost i spadek).Python 3,
148 139127 bajtówkod testowy
źródło
DO,
655760 bajtówjest naprawiony
który działa poprawnie z dowolnymi danymi tylko przy wywołaniu jednej funkcji (gdy zmienna globalna
r
jest inicjowana na zero).Ale w każdym razie jest to krótsze niż poprzednie rozwiązanie (65 bajtów) z powodu użycia
for
zamiastwhile
. Ale poprzednie (poniższe) jest nieco łatwiejsze do zrozumienia:Moje rozwiązanie opiera się na bitowym
&
odwróceniu poprzedniego i bieżącego kodu kierunkowego, gdzie kod kierunkowy może być2
(1<<1
) dla zwiększenia kodu znakowego (*s > *(s-1)
) lub1
(1<<0
) w przeciwnym razie. Wynik tej operacji stał się 0, jeśli użyjemy tego samego kodu kierunkowego co poprzedni i bieżący, tj. Gdy słowo nie jest nierówne.AKTUALIZACJA:
Kod do testowania:
źródło
r
do0
nas za darmo, ale musi to zrobić od wewnątrz funkcji.PHP, 100 bajtów
Zastępuje każdy char łańcucha (z wyjątkiem ostatniego, oczywiście) z
r
za wzrost lubf
na jesieni i następnie sprawdza, czyrr
lubff
wystąpić w ciągu. Aby uniknąć sytuacji, w której ostatni pozostały znak przeszkadza w tym, dane wejściowe muszą być pisane wielkimi literami.Jestem bardzo niezadowolony z pętli, na przykład mam wrażenie, że musi istnieć sposób na połączenie
$i++
jednej z kilku$i
używanych w pętli, ale nie udało mi się jej znaleźć. Może ktoś to widzi.(Dlatego też opublikowałem swój kod, mimo że jest on o 20 (!) Bajtów dłuższy niż dobre rozwiązanie Tytusa).
źródło
Java 8,
11490 bajtówNie testowany program testowy
źródło