(Inspiriert von dieser Herausforderung bei Puzzling - SPOILERS für dieses Rätsel finden Sie weiter unten. Lesen Sie hier also nicht weiter, wenn Sie das Rätsel selbst lösen möchten!)
Wenn ein Buchstabe in einem Wort alphabetisch später als der vorherige Buchstabe im Wort vorkommt, nennen wir dies einen Anstieg zwischen den beiden Buchstaben. Andernfalls, auch wenn es derselbe Buchstabe ist , spricht man von einem Sturz .
Zum Beispiel hat das Wort ACE
zwei Anstiege ( A
zu C
und C
zu E
) und keine Anstiege , während THE
es zwei Anstiege ( T
zu H
und H
zu E
) und keine Anstiege hat.
Wir nennen ein Wort holprig, wenn sich die Abfolge von Anstieg und Abfall abwechselt. Zum Beispiel BUMP
steigt ( B
nach U
), fällt ( U
nach M
), steigt ( M
nach P
). Beachten Sie, dass es sich bei der ersten Sequenz nicht unbedingt um einen Anstieg handelt, sondern um einen BALD
Fall-Anstieg-Fall-Vorgang, der ebenfalls holprig ist.
Die Herausforderung
Geben Sie bei gegebenem Wort aus, ob es holprig ist oder nicht.
Eingang
- Ein Wort (nicht unbedingt ein Wörterbuchwort), das nur aus ASCII-Buchstaben (
[A-Z]
oder [a-z]
Buchstaben) in einem geeigneten Format besteht .
- Sie können wählen, ob die Eingabe nur in Groß- oder Kleinbuchstaben erfolgen soll, sie muss jedoch konsistent sein.
- Das Wort wird mindestens 3 Zeichen lang sein.
Ausgabe
Ein Wert für Wahr / Falsch, der angibt , ob das Eingabewort holprig (wahr) oder nicht holprig (falsch) ist.
Die Regeln
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
Beispiele
Wahrheit:
ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN
Falsey:
AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](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
in Truthy (dh Bumpy) aufgeführt, warumBUMPY
in der Falsey-Liste? Was bedeutet "steigt und fällt abwechselnd"? Zwei Aufstiege können nicht hintereinander sein?BUMPY
ist falsch, weilMPY
es zwei aufeinander folgende Anstiege gibt. Mit anderen Worten, kein Teilstring der Länge 3 muss auf- oder absteigend sortiert werden, damit ein Wort holprig wird (mit Ausnahme des Sonderfalls, bei dem zwei aufeinanderfolgende Buchstaben identisch sind).Antworten:
MATL, 4 Bytes
Erläuterung:
Dies ist mein erster MATL-Eintrag, daher frage ich mich, wie viel sich von diesem naiven Port ausgehend von meinem MATLAB / Octave-Versuch (der wäre
@(a)all(diff(diff(a)>0))
) verbessern lässt . Beachten Sie, dass diesall
nicht erforderlich ist, da eine Null ein Array falsch macht, sodassA
der MATL-Port leer ist.quelle
d0>d
sollte funktionieren (Sie brauchen nicht dieA
gemäß unserer Definition von Wahrhaftigkeit / Falschheit)JavaScript (ES6),
7569634643 Byte3 Bytes gespart dank Neil:
Destructuring the string parameter statt
s.slice(1)
.Bisherige Lösung:
17 Bytes gespart dank ETHproductions:
Was passierte aus der vorherigen Lösung Schritt für Schritt:
Bisherige Lösungen:
63 Bytes dank ETHproductions:
69 Bytes:
75 Bytes:
Alle Buchstaben in einem Wort müssen die gleiche Groß- und Kleinschreibung haben.
quelle
!s[2]|...
das gleiche tun wies[2]?...:1
?f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
LabVIEW, 36 äquivalente Bytes
Golfen mit logischen Äquivalenzen:
Ungolfed:
Zuerst konvertieren wir in Kleinbuchstaben, dann in Bytearray. Schneiden Sie das erste Element des Byte-Arrays ab, da es keinen Präzedenzfall hat. Überprüfen Sie dann für jedes Element im Array, ob es größer als das vorherige ist (U8-Zeichen wird erwartungsgemäß in ASCII abgebildet), und speichern Sie das Ergebnis für die nächste Iteration sowie in einem Array, um die allgemeine Unebenheit anzuzeigen. Wenn die aktuelle und die vorherige Boolesche Prüfung gleich sind, beenden wir die Schleife und sie ist nicht holprig. Sonst ist es holprig!
quelle
Python, 56 Bytes
Alle Testfälle sind auf ideone
Zippt durch Dreiergruppen von Zeichen in s und prüft, ob alle Dreiergruppen linke und rechte Paare mit unterschiedlichen Anstiegs- / Abfall-Eigenschaften haben.
Funktioniert entweder für Groß- oder Kleinbuchstaben.
quelle
Ruby,
5748 BytesErwartet, dass die Eingabe in Großbuchstaben erfolgt.
Siehe es auf repl.it: https://repl.it/D7SB
Erläuterung
Der reguläre Ausdruck
/.(?=(.)(.))/
entspricht jedem Zeichen, auf das zwei weitere Zeichen folgen.(?=...)
ist ein positiver Lookahead, was bedeutet, dass wir die folgenden beiden Zeichen abgleichen, sie jedoch nicht als Teil des Abgleichs "verbrauchen". In geschweiften Klammern,$&
ist die abgestimmte text das erste Zeichen des Drei und$1
und$2
sind im Inneren des Vorgriffs - die erfassten Zeichen. Mit anderen Worten, wenn es sich um eine Zeichenfolge handelt"BUMPY"
, wird diese zuerst mit der Zeichenfolge übereinstimmen"B"
(und sie einfügen$&
) und sie erfassen"U"
und"M"
(und sie einfügen$1
und$2
). Als nächstes wird es passen"U"
und zu erfassen"M"
und"P"
, und so weiter.Innerhalb des Blocks prüfen wir, ob das erste Zeichenpaar (
$&
und$1
) ein Anstieg und das zweite ($1
und$2
) ein Abfall ist oder umgekehrt, ähnlich wie bei den meisten anderen Antworten. Dieser^
Ausdruck gibttrue
oder zurückfalse
, das in eine Zeichenfolge konvertiert und anstelle der Übereinstimmung eingefügt wird. Infolgedessen lautet unser Beispiel wie"BUMPY"
folgt:Da wir wissen, dass die Eingabe nur in Großbuchstaben erfolgt, wissen wir, dass
"f"
sie nur als Teil von auftritt"false"
und!result[?f]
geben uns unsere Antwort.quelle
C #,
646355 Bytes-8 Bytes aus Scepheos Vorschlägen
Dies ist eine Portierung von Hedis Lösung für C #. Ich habe auch eine rekursive Lösung gefunden, aber die Rekursion war nicht so gut. Meine ursprüngliche Lösung ist unten.
My Original C #,
969491 Bytes-2 Bytes mit
1>0
anstelle vontrue
.-3 Bytes aus Scepheos Vorschlägen für die Port-Lösung oben
Ruft sich selbst rekursiv auf und prüft, ob das Steigen / Fallen jedes Mal wechselt.
Ungolfed:
quelle
?:
Operator oder die Klammern verzichten kann: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);
||
anstelle von bitweisem ODER|
. Aktualisiert den Beitrag, danke.C 59 Bytes
quelle
AAA
- das erste "Falsey" in den Beispielengcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
und werde für aaa falsch und aufgeregt. In dieser Version ist Nicht-Null falsch und Null ist wahr. Eigentlich frage ich mich jetzt, ob das erlaubt ist.f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
In Visual Studio 2012 kompilierter Aufruf gibt einen Wert zurück23
, der behandelt werden kann,True
aber in der Frage befindet sich dieser Wert im Abschnitt "Falsey", sodass ein Wert0
erwartet wird.Gelee , 6 Bytes
Basierend auf der Antwort von @sanchises .
Probieren Sie es online! oder Alle überprüfen.
Erläuterung
quelle
JavaScript (ES6), 65 Byte
.map
ist definitiv nicht die beste lösung .quelle
Python 2, 88 Bytes
Einfache lösung.
Probieren Sie es online aus
Wenn die gleichen Buchstaben in einer Reihe weder ein Anstieg noch ein Abfall wären, wäre die Lösung 79 Bytes:
quelle
Perl, 34 Bytes
Beinhaltet +3 für
-p
(Code enthält'
so-e
kann also nicht verwendet werden)Geben Sie bei STDIN Großbuchstaben ein:
bump.pl
quelle
Python, 51 Bytes
Nimmt Ein-
g('B','U','M','P')
und Ausgänge wie1
oder0
.Verwendet das Auspacken von Argumenten, um die ersten drei Buchstaben zu nehmen und zu prüfen, ob die ersten beiden anders sind als die zweiten beiden. Wiederholt dann den Rest mit der Multiplikation für
and
.quelle
Gelee ,
65 Bytes-1 Byte dank @Dennis (verwenden Sie eine kumulative Reduktion)
Alle Testfälle sind bei TryItOnline
Wie?
Funktioniert entweder für Groß- oder Kleinbuchstaben.
quelle
Japt, 8 Bytes
Online testen!
Wie es funktioniert
quelle
C #
105104 Bytes105 Bytes Lösung:
Probieren Sie es online aus
Durch die Verwendung eines Arrays von Zeichen wurde ein Byte gespart, da das Leerzeichen hinter den Klammern weggelassen werden kann.
f(string x)
vsf(char[]x)
Es sind 101 Bytes, wenn ich ein int 1/0 anstelle von bool true / false zurückgeben kann
quelle
Haskell, 52 Bytes
Ich vermute, ich könnte diesen Teil verkleinern, wenn ich das "where" -Konstrukt entfernen könnte, aber ich stecke wahrscheinlich mit zipWith fest.
Dies funktioniert, indem eine Liste der Aufstiege (True) und Abfälle (False) erstellt und dann eine Liste erstellt wird, ob die angrenzenden Einträge in dieser Liste unterschiedlich sind
Dies ist mein erster Versuch, also werde ich meinen Denkprozess durchgehen, falls ich irgendwo schrecklich schief gelaufen bin.
Ungolfed Version (168 Bytes)
Namen kürzen, Typinformationen entfernen (100 Bytes)
Bewegen Sie h in die Hauptfunktion, da diese nur einmal verwendet wird (86 Bytes)
Stellen Sie fest, dass areBumps und riseFall abstrakt genug sind (73 Byte)
Beachten Sie, dass (tail y) kürzer ist als ya @ (y: ys) (70 Bytes)
Aufräumen; entferne nicht benötigte Leerzeichen (52 Bytes)
quelle
g h=tail>>=zipWith h
eine globale Funktion verwenden und verwenden, um daswhere
Schlüsselwort zu vermeiden .Java 7,
157153150125117 BytesUngolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
quelle
a > b
, fällt wanna <= b
, statt>
und<
?char[]
damit Sie Ihre Eingabezeichenfolge nicht in ein Zeichen-Array umwandeln müssen. das sollte ein paar bytes sparen. PS: Java ftw!String s
->char[]z
?truthy
oder einenfalsey
Wert zurückgeben, also machen Sie Ihre Methode zu einem int und geben 1 oder 0 zurück :) .. Setzt Sie auf 117 Bytes zurückPowerShell v2 +, 83 Byte
Ein etwas anderer Ansatz. Diese Schleifen durch den Eingang
$n
, da jede Iteration , ob die vorhergehenden Zeichen$n[$_-1]
sind-l
esst
han das aktuelle Zeichen$n[$_]
, dann mit dem Ergebnis des booleschen Operators in einen int Gießen+
. Diese werden-join
zu einer Zeichenfolge zusammengefasst und in gespeichert$a
. Wir prüfen dann , ob$a
ist-eq
ual zu$a
mit irgendwelchen Teil von00
oder11
entfernt.quelle
Python 2.7, 84 Bytes
Gibt 1 für holprig, 0 für sonst
Ich habe ein paar coole Sachen mit bitweise & und ^ gelernt.
Beginnt mit dem Booleschen Wert b, der das erste Paar als Auf / Ab definiert, und testet und kippt b für jedes folgende Paar.
o wechselt zu false, wenn der Test fehlschlägt und nicht erfolgreich ist.
Erfordert Anführungszeichen um die Eingabe (+4 Bytes für raw_input (), wenn dies gegen eine Regel verstößt)
Probier es aus
quelle
05AB1E , 9 Bytes
Erläuterung
Probieren Sie es online!
quelle
Python 2.7 (wieder
8483 Bytes)Oder
7877 Bytes ohne den Druck.Übrigens, das obige 56-Byte-Python-2.7-Beispiel setzt zum Beispiel beiMacht nichts, habe keine Anweisungen gelesen. Überarbeitung."abbab"
jeder anderen Eingabe mit wiederholten Zeichen ein.Okay, bis auf 83. Das Dreifache ist allerdings schöner.
quelle
a(x)if x else[]
. 2. Verwenden Sie stattdessen ein Lambda.a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]
3. Verwenden Sie am Ende ein Lambda, anstatt zu drucken.lambda s:len(set(a(s)))>1
4. Wennlen(set(a(s)))
nicht größer als 1, dann ist es schon falsch, also können Sie abheben>1
CJam , 15 Bytes
Probieren Sie es online!(Als durch Zeilenvorschub getrennte Testsuite.)
Erläuterung
quelle
PHP, 80 Bytes
oder
leere Ausgabe für falsch,
1
für wahroder Hedis rekursiver Ansatz portiert und ein wenig golfen für 70 Bytes:
Eigentlich sollte dies für holprige Wörter unendlich lange dauern, aber das tut es nicht!
quelle
Haskell,
3037 BytesVerwendung:
quelle
foldl1(/=)
tut nicht, was Sie denken, dass es tut.PHP 7,
137118 BytesLeere Ausgabe für Bumpy,
0
für nicht holprig.Dies ist mein erster Versuch, Code Golf zu spielen, und ich muss mich sehr verbessern, aber es war eine wunderbare Methode, um neue Dinge für mich zu lernen. Ich wollte mich bei dieser Aufgabe auch mit dem neuen PHP 7 Spaceship Operator herausfordern, was sehr interessant zu sein scheint.
Jedenfalls bin ich damit nicht zufrieden, vor allem, weil ich ein Extra hinzufügen musste, um(Anmerkung: Ich habe das behoben, indem ich einfach zu gewechseltif(isset($s[$i+2]))
zu überprüfen, ob die Variable existiert, weil ich keine andere Lösung für das Problem gefunden habe, aber das ist es jetzt.strlen($s)-1
habestrlen($s)-2
, das konnte ich vorher nicht wirklich sehen ...).Testcode:
Online testen
quelle
Javascript ES6, 100 Bytes
Probieren Sie es hier aus:
Ach komm schon, zwei Leute haben mich schon um 40 Bytes geschlagen ... was auch immer
quelle
"A"<"B"
Sie müssen also nicht die Zeichencodes der Zeichen abrufen.1
fürBUMPY
(oder alles andere, das sowohl einen Anstieg als auch einen Abfall enthält).Python 3,
148 139127 BytesTestcode
quelle
C,
655760 Bytesist fix von
Das funktioniert mit allen Daten nur bei einem einzelnen Funktionsaufruf (wenn die globale Variable
r
auf Null initialisiert ist).In jedem Fall ist dies jedoch kürzer als die vorherige Lösung (65 Byte), da
for
anstelle von verwendet wirdwhile
. Aber vorheriges (folgendes) ist ein bisschen einfacher zu verstehen:Meine Lösung basiert auf bitweise
&
mit invertiertem vorherigen und aktuellen Richtungscode, wobei der Richtungscode2
(1<<1
) sein kann, um den Zeichencode zu erhöhen (*s > *(s-1)
) oder1
(1<<0
) auf andere Weise. Das Ergebnis dieser Operation wurde 0, wenn wir den gleichen Richtungscode wie zuvor und aktuell verwenden, dh wenn das Wort nicht holprig ist.AKTUALISIEREN:
Code zum Testen:
quelle
r
um0
kostenlos, sondern müssen so innerhalb der Funktion tun.PHP, 100 Bytes
Ersetzt jedes Zeichen der Zeichenkette ( mit Ausnahme des letzten offensichtlich) mit einem
r
für Aufstieg oder einemf
für den Herbst und dann überprüft , obrr
oderff
in der Zeichenfolge auftreten. Um zu vermeiden, dass das letzte verbleibende Zeichen dies beeinträchtigt, muss die Eingabe in Großbuchstaben erfolgen.Ich bin sehr unzufrieden mit der Schleife, zum Beispiel habe ich das Gefühl, dass es eine Möglichkeit geben muss, die
$i++
in einer der mehreren$i
in der Schleife verwendeten S zu kombinieren , aber ich habe diese Möglichkeit nicht gefunden. Vielleicht sieht es jemand anderes.(Das ist auch der Grund, warum ich meinen Code gepostet habe, obwohl er 20 (!) Bytes länger ist als die nette Lösung von Titus.)
quelle
Java 8,
11490 BytesUngolfed Testprogramm
quelle