İnişli çıkışlı bir kelime mi?


31

( Puzzling'deki bu zorluğa ilham - bu bulmacanın SPOILERS'ı aşağıdadır, o yüzden bu bulmacayı kendin çözmek istiyorsan burada okumayı bırak!)

Sözcükteki bir harf, sözcükteki önceki harflerden alfabetik olarak daha sonra meydana gelirse, buna iki harf arasında bir artış diyoruz . Aksi takdirde, aynı harf ise , buna düşüş denir .

Örneğin, kelime ACEiki yükselir sahiptir ( Aüzere Cve Chiç E) ve süre herhangi bir düşme, THE(iki falls Tiçin Hve Hiçin E) ve hiç yükselir.

Dizinin yükselip alçalması halinde Bumpy kelimesini kullanıyoruz . Örneğin, BUMPyükselmeye ( Bto U), düşmeye ( Uto M), yükselmeye ( Mto P) gider . İlk dizinin bir yükselişe gerek olmadığını unutmayın - BALDdüşmeye-düşmeye gider ve aynı zamanda Bumpy'dir.

Meydan okuma

Bir kelime verdiğinizde, inişli çıkışlı olup olmadığını çıktı.

Giriş

  • Yalnızca ASCII alfabesi ( [A-Z]veya [a-z]) harflerinden oluşan, herhangi bir uygun biçimde bir kelime (zorunlu olarak bir sözlük kelimesi değildir) .
  • Seçiminiz, girişin tümü büyük harf veya tümü küçük harf ise, ancak tutarlı olmalıdır.
  • Sözcük uzunluğu en az 3 karakter olacak.

Çıktı

Girilen kelimenin Bumpy (truthy) olup olmadığına ilişkin bir truthy / falsey değeri (Balsi) (falsey).

Kurallar

  • Tam bir program veya bir işlev kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Örnekler

Truthy:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


Dangit. Aynı harf yükselmezse veya düşmezse bu daha kolay olurdu.
mbomb007 12:16

BUMPSunulan örnekleri anlamıyorum: Truthy'de (ör. Bumpy) listeleniyorsa neden BUMPYFalsey listesinde? "Artış ve düşme alternatifleri" ne demektir? İki yükselme art arda olamaz mı?
VolAnd

4
@VolAnd Evet, yükselişin daima bir düşüş izlediği ve tersi anlamına gelir. BUMPYsahte çünkü MPYiki ardışık yükseliş veriyor. Başka bir deyişle, hiçbir kelimenin engebeli olması için (3 ardışık iki harfin aynı olduğu özel durum dışında), hiçbir uzunluk 3 alt dizgesi artan veya azalan şekilde sıralanmamalıdır.
Martin Ender

Puzzling.SE sorusunun cevabını bozabilir misiniz? Böylece onu çözmek isteyen başkaları da yapabilir?
OldBunny2800

1
@ OldBunny2800 Tam bir spoiler yerleştirmeyeceğim (Burada bir spoylerin arkasındaki önemli bilgileri gizleyerek okumayı zorlaştırmak istemiyorum), ama üstüne uyarı olarak ilave bir metin ekleyeceğim. Teşekkürler!
AdmBorkBork,

Yanıtlar:


31

MATL, 4 bayt

d0>d

Açıklama:

d     % Implicitly take input. Take difference between each element
 0>   % Check whether diff's are positive. Should result in [0 1 0 1 ...] pattern.
   d  % Again take the difference. Any consecutive rises or falls results in a 
      % difference of 0, which is a falsy value in MATL

Bu benim ilk MATL girişim, bu yüzden bu saf limandan MATLAB / Octave girişimden (ki @(a)all(diff(diff(a)>0))) ne kadar iyileşme olabileceğini merak ediyorum . Bunun allgerekli olmadığını unutmayın, çünkü herhangi bir sıfır bir diziyi yanlış yapar, dolayısıyla AMATL portunda yoktur.


Düzeltilmiş mücadeleye bakın. Bir test davasında bir yazım hatası vardı. Yaklaşımın doğruydu. Aslında, d0>dçalışmalı ( Atruthy / falsey tanımımıza göre ihtiyacınız yok )
Luis Mendo

1
Güzel iş, Luis'i kendi dilinde aşmak! Daha önce denedim ve bu kolay bir iş değil. ;)
DJMcMayhem

@DJMcMayhem Haha. Bu zorluğu çabucak okumak için elime geçen şey. Savunmamda, iki eşit harfin bir düşüş olması sezgiseldir. Ve (şimdi düzeltilmiş) yanıltıcı test davaları da yardımcı olmadı :-)
Luis Mendo

1
@DJMcMayhem Teşekkürler - belki de sadece şanslı oldum, çünkü aslında ardışık eşit harfleri düşünmedim, ama bu tam olarak ne istendiği ortaya çıktı ...
Sanchises

1
@ immibis MATL (AB) ve Octave'de, evet. Bu Meta cevabına bakınız .
Sanchises

24

JavaScript (ES6), 75 69 63 46 43 bayt

Neil sayesinde 3 bayt kurtarıldı:

f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1

String parametresini yerine yok etmek s.slice(1).


Önceki çözüm:
ETHproductions sayesinde 17 bayt kurtardı:

f=s=>s[2]?s[0]<s[1]^s[1]<s[2]&&f(s.slice(1)):1

Önceki çözüm adım adım ne oldu:

f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b // (63) Original
f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(s[i]<s[i+1]))?f(s,i):b   // (61) No point in reassigning `a`, it's not used again
f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^s[i]<s[i+1])?f(s,i):b     // (59) Remove unnecessary parentheses
f=(s,i=0)=>s[i+2]&&(b=s[i++]<s[i]^s[i]<s[i+1])?f(s,i):b         // (55) `a` is now just a waste of bytes
f=(s,i=0)=>s[i+2]?(b=s[i++]<s[i]^s[i]<s[i+1])?f(s,i):b:1        // (56) Rearrange conditional expressions to allow for more golfing
f=(s,i=0)=>s[i+2]?(b=s[i++]<s[i]^s[i]<s[i+1])&&f(s,i):1         // (55) Rearrange conditional expression
f=(s,i=0)=>s[i+2]?(s[i++]<s[i]^s[i]<s[i+1])&&f(s,i):1           // (53) `b` is now also a waste of bytes
f=(s,i=0)=>s[i+2]?s[i++]<s[i]^s[i]<s[i+1]&&f(s,i):1             // (51) Remove unnecessary parentheses
f=s=>s[2]?s[0]<s[1]^s[1]<s[2]&&f(s.slice(1)):1                  // (46) Use `s.slice(1)` instead of `i`


Önceki çözümler:
ETHproductions sayesinde 63 bayt:

f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b

69 bayt:

f=(s,i=0,a=s[i++]<s[i])=>i+1<s.length&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b

75 bayt:

f=(s,a=s[0]<s[1])=>{for(i=1;i+1<s.length&&(b=a^(a=s[i++]<s[i])););return b}

Bir kelimedeki tüm harfler aynı durumda olmalıdır.



@ETHproductions Bağlantınızın içeriğini yayınlamalı mıyım?
Hedi

İsterseniz yapabilirsiniz :-)
ETHproductions 12:16

!s[2]|...Aynı şeyi yapabilir miyim s[2]?...:1?
Titus

1
Partiye geç kaldığım için üzgünüm ama 43 byte için sana vereceğim:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil

14

LabVIEW, 36 eşdeğer bayt

Mantıksal denklikleri kullanarak aşağı Golf:

golfed

Ungolfed:

ungolfed

Önce küçük harfe, sonra byte dizisine dönüştük. Bayt dizisinin ilk öğesini, önceliğine sahip olmadığı için kesin. Ardından, dizideki her öğe için öncekinden daha büyük olup olmadığını kontrol edin (beklediğiniz gibi U8 karakterleri ASCII'ye eşlenir) ve sonucu bir sonraki yinelemenin yanı sıra genel kabarıklığı görüntülemek için bir dizide saklayın. Mevcut ve önceki boolean kontrol eşitse, döngüyü sonlandırırız ve engebeli değildir. Başka, engebeli!


1
Ne harika bir dil! PPCG'ye Hoşgeldiniz!
DJMcMayhem

1
Teşekkürler! Asla 4 baytlık cevaplarla rekabet etmeyeceğim, ancak yeteneklerimi geliştirmek için güzel bir yol :)
ijustlovemath

Buraya bakınız . Skorunuz kesinlikle yanlıştır ve aşırıdır . Cevabınızın gerçekten 246450 - 246549 bayt olduğunu sanmıyorum.
Outgolfer Erik

LabVIEW için eşdeğer baytlık bir konsept olduğunu bilmiyordum çünkü Bellek sekmesinden çıkıyordum. Onları saymak ve daha sonra bugün cevabı düzenleyecektir.
ijustlovemath 13:16

1
@Erik Windows'ta Firefox'tayım, ancak mobilde açmak da işleri bozuyor. Sadece meta.ppcg.lol çalışır. Neyse, bu yorumlar için kapsam dışında.
Fon Monica'nın Davası

8

Python, 56 bayt

lambda s:all((x<y)^(y<z)for x,y,z in zip(s,s[1:],s[2:]))

Tüm test vakaları ideone altında

S karakterindeki üçlü karakterleri sıkıştırır ve tüm bu üçlülerin farklı yükselme / düşme özelliklerine sahip sol ve sağ çiftleri olduğunu test eder.
Tüm büyük harf veya küçük harf için çalışır.


6

Ruby, 57 48 bayt

Girişin tümünün büyük harf olmasını bekliyor.

->s{!s.gsub(/.(?=(.)(.))/){($&<$1)^($1<$2)}[?f]}

Repl.it üzerinde bakın: https://repl.it/D7SB

açıklama

Normal ifade /.(?=(.)(.))/, iki karakter daha izleyen her karakterle eşleşir. (?=...)Pozitif bir bakış açısıdır, yani sonraki iki karakterle eşleşiriz, ancak eşleşmenin bir parçası olarak "tüketmeyin". Kıvrımlı parantezlerin içinde $&eşleşen metin (üçlünün ilk karakteri) ve $1ve görünümün $2içindeki yakalanan karakterler. Dizedir Başka bir deyişle, "BUMPY"bu ilk maç olacak "B"(ve bunu koymak $&) ve yakalama "U"ve "M"(ve koyun $1ve $2). Daha sonra eşleşecek "U"ve yakalanacak "M"ve "P", vb.

Bloğun içinde, ilk karakter çiftinin ( $&ve $1) yükselip yükselmediğini ve ikincisinin ( $1ve $2) diğer cevapların çoğunda olduğu gibi düşme veya tersi olup olmadığını kontrol ederiz . Bu ^ifade , bir dizgeye dönüştürülür ve eşleşmenin yerine eklenir trueveya döndürür false. Sonuç olarak, örneğimiz "BUMPY"şudur:

"truetruefalsePY"

Girdilerin tümü büyük harf olduğunu bildiğimiz için "f", yalnızca bir parçası olarak olacağını "false"ve !result[?f]bize cevabımızı verdiğini biliyoruz .


O nasıl çalışır?
GreenAsJade 13:16

1
@GreenAsJade Cevabımı bir açıklama ekledim.
Ürdün

6

C #, 64 63 55 bayt

unsafe bool B(char*s)=>1>s[2]||*s<s[1]!=*++s<s[1]&B(s);

- Scepheo'nun önerisinden 8 bayt

Bu Hedi'nin çözümünün limanı. C # . Ayrıca özyinelemeli bir çözüm buldum ama özyineleme o kadar iyi değildi. Orijinal çözümüm aşağıda.

Orijinal C #, 96 94 91 bayt

unsafe bool B(char*s,bool f=1>0,int i=0)=>1>s[1]||(s[0]<s[1]?f:1>i?!(f=!f):!f)&B(s+1,!f,1);

-2 bayt 1>0yerine kullanarak true.

Scepheo'nun yukarıdaki liman çözümü için önerilerinden -3 bayt

Her seferinde yükselen / düşen değerlerin değişip değişmediğini tekrar tekrar kontrol etmeye çağırır.

Ungolfed:

// unsafe in order to golf some bytes from string operations.
// f alternates with each recursive call
// i is 0 for the first call, 1 for all subsequent calls
unsafe bool B(char* s, bool f = 1 > 0, int i = 0) =>
    1 > s[1] ? 1 > 0// (instead of 1 == s.Length) check if s[1] = NULL, and return true.
    : (
        s[0] < s[1] ? f // Rising, so use f...
        : // Else falling
            1 > i ? !(f=!f) // But this is the first call, so use true (but flip f)...
            : !f // Not first call, so use !f...
    )
    & B(s+1, !f, 1) // ...AND the previous value with a recursive call
                    // s+1 instead of s.Substring(1)
;

Sonuncusu ?:operatör veya parantez olmadan yapabilecek gibi görünüyor :unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo

Aslında, bunu test edemememe rağmen, işaretçiyi kullanmak bile ters görünüyor:unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
Scepheo

@Scepheo Bu önerilere göre StackOverflowExceptions var, ancak ||bit bit VEYA yerine boolean VEYA kullanarak çalışıyorlar |. Yayın güncellendi, teşekkürler.
süt

6

C 59 Bayt

r;f(s)char*s;{for(r=0;r=*s?~r&1<<(*s>=*++s):0;);return!*s;}

70 çözelti halinde getiri 1 (doğru) bayt AAA- ilk "Falsey" örneklerde
VOLAND

Kullanarak test gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)ediyorum ve aaa için yanlış alıyorum ve heyecanlıyım. Bu versiyonda sıfır olmayan falsey, sıfır ise hakikaten sıfırdır. Aslında buna izin verilip verilmediğini şimdi merak ediyorum.
cleblanc

f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")Visual Studio 2012'de derlenmiş çağrı , bu değerin "Falsey" bölümünde olduğu, ancak soruda 23olduğu gibi ele alınabilecek bir değer döndürür True, bu nedenle 0beklenen değerdir .
VolAnd

True ve Falsey için izin verilenleri yanlış anladım. Şimdi bu yazıyı okudum ve değerlerin "C" için ne olması gerektiği açık görünüyor.
cleblanc

Meta konsensüsünü temel alan truthy ve falsey için standart tanımlarımız .
AdmBorkBork

5

Jöle , 6 bayt

OI>0IẠ

@Sanchises ' cevabı dayanarak .

Çevrimiçi deneyin! veya Tümünü doğrula.

açıklama

OI>0IẠ  Input: string S
O       Convert each char in S to an ordinal
 I      Get the increments between each pair
  >0    Test if each is positive, 1 if true else 0
    I   Get the increments between each pair
     Ạ  Test if the list doesn't contain a zero, 1 if true else 0


5

Python 2,8 bayt

Basit çözüm

s=input()
m=map(lambda x,y:y>x,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

Çevrimiçi deneyin

Bir satırdaki aynı harfler ne bir yükseliş ne de bir düşüş olsaydı, çözüm 79 bayt olurdu:

s=input()
m=map(cmp,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

5

Perl, 34 bayt

İçin +3 içerir -p(kod içeriyor 'böylece-e kullanılamaz)

STDIN'de büyük harf girin:

bump.pl <<< AAA

bump.pl

#!/usr/bin/perl -p
s%.%$&.z lt$'|0%eg;$_=!/(.)\1./

5

Python, 51 bayt

g=lambda a,b,c,*s:((a<b)^(b<c))*(s==()or g(b,c,*s))

Gibi giriş alır g('B','U','M','P')ve çıkışlar 1veya 0.

İlk üç harfi almak için açma paketini kullanır ve ilk ikisinin ikinci ikisinden farklı olup olmadığını kontrol eder. Ardından, için çarpımı kullanarak, kalanı tekrarlar and.


Güzel giriş golfü. ;-)
AdmBorkBork 13:16

5

Jöle , 6 5 bayt

@Dennis sayesinde -1 bayt (kümülatif bir azaltma kullanın)

<2\IẠ

Tüm test vakaları TryItOnline'da

Nasıl?

<2\IẠ - main link takes an argument, s,    e.g. "BUMP"    or "BUMPY"
<    - less than comparison (a dyad)
 2   - literal 2 (a nilad)
  \  - n-wise overlapping reduction when preceded by a dyad-nilad chain
       (i.e. reduce the list by pairs with less than)
                                           e.g. [1,0,1]   or [1,0,1,1]
   I  - consecutive differences,           e.g. [-1,1]    or [-1,1,0]
    Ạ - All, 0 if any values are 0 else 1, e.g. 1         or 0

Tüm büyük harf veya küçük harf için çalışır.


4

Japt, 8 bayt

Uä> ä- e

Çevrimiçi test edin!

Nasıl çalışır

Uä> ä- e  // Implicit: U = input string
Uä>       // Map each pair of chars X, Y in U to X > Y.
    ä-    // Map each pair of items in the result to X - Y.
          // If there are two consecutive rises or falls, the result contains a zero.
       e  // Check that every item is truthy (non-zero).
          // Implicit: output last expression

Benim çözümümle aynı. 11x daha kısa hariç. : P
mbomb007 12:16

4

C # 105 104 Bayt

bool f(char[]x){int t=1;for(int i=2,p=x[1],f=x[0]-p>>7;i<x.Length;)f^=t&=p<(p=x[i++])?1-f:f;return t>0;}

105 baytlık Çözüm:

bool f(char[]x){bool t=1>0,f=x[0]<x[1];for(int i=2,p=x[1];i<x.Length;)f^=t&=p<(p=x[i++])?!f:f;return t;}

Çevrimiçi deneyin

Boşlukların parantezlerden sonra atlanabileceğinden, bir baytlık bir karakter dizisi kullanılarak kaydedilmiştir. f(string x)vsf(char[]x)

Bool true / false yerine int 1/0 döndürürsem 101 bayttır.

int f(char[]x){int t=1;for(int i=2,p=x[1],f=x[0]-p>>7;i<x.Length;)f^=t&=p<(p=x[i++])?1-f:f;return t;}

4

Haskell, 52 bayt

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y

Sanırım "where" yapısından kurtulmayı başarırsam, bu parçayı küçültebileceğimi sanıyorum, ama muhtemelen zipWith ile sıkıştığımı düşünüyorum.

Bu, yükselişlerin (Gerçek) ve düşmelerin (Yanlış) bir listesini yaparak ve ardından bu listedeki belli başlı girdilerin farklı olup olmadıklarının bir listesini yaparak çalışır.


Bu benim bunlardan birine ilk girişim, bu yüzden bir yerde çok yanlış gittiğimden dolayı düşünce sürecimden geçeceğim.

Ungolfed Versiyonu (168 bayt)

isBumpy :: [Char] -> Bool
isBumpy input = and $ areBumps $ riseFall input
  where
    riseFall ax@(x:xs) = zipWith (>) xs ax
    areBumps ax@(x:xs) = zipWith (/=) xs ax

Adları kısaltın, tür bilgisini kaldırın (100 bayt)

f x = and $ g $ h x
  where
    h ax@(x:xs) = zipWith (>) xs ax
    g ax@(x:xs) = zipWith (/=) xs ax

H işlevini yalnızca bir kez kullanıldığından (86 bayt) ana işleve taşıyın

f ax@(x:xs) = and $ g $ zipWith (>) xs ax
  where
    g ax@(x:xs) = zipWith (/=) xs ax

Darbelerin ve yükselişin farkına varmak soyutla aynıdır (73 byte)

f x  = and $ g (/=) $ g (>) x
  where
    g h ya@(y:ys) = zipWith h ys ya

(Kuyruk y) ya @ (y: ys) (70 byte) 'dan daha kısa olduğuna dikkat edin.

f x  = and $ g (/=) $ g (>) x
  where
    g h y = zipWith h (tail y) y

Toparlanma; gereksiz alanları kaldır (52 bayt)

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y

... ve ben de daha önce temelde aynı şeyi yapan benimkinden gönderilen daha kısa bir Haskell cevabını fark ettim. Bazı şeyleri tespit etmekte berbatım.
Teron

İşe yaramaz olanı mı kastediyorsun? ;-) Anahtar kelimeyi g h=tail>>=zipWith hönlemek için onu kullanabilir ve genel bir işlev yapabilirsiniz where.
Christian Sievers

@HristianSievers Düzeltildi ve şimdi benimkiyle tamamen aynı olan bu cevabı fark ettim, cevabımı bu yorum için daha uygun hale getirdim.
BlackCap

4

Java 7, 157 153 150 125 117 bayt

int c(char[]z){for(int i=2,a,b,c;i<z.length;i++)if(((a=z[i-1])<(c=z[i])&(b=z[i-2])<a)|(a>=c&b>=a))return 0;return 1;}

Ungolfed ve test durumları:

Burada dene.

class M{
  static int c(char[] z){
    for(int i = 2, a, b, c; i < z.length; i++){
      if(((a = z[i-1]) < (c = z[i]) & (b = z[i-2]) < a) | (a >= c & b >= a)){
        return 0; //false
      }
    }
    return 1; //true
  }

  public static void main(String[] a){
    System.out.print(c("ABA".toCharArray()) + ", ");
    System.out.print(c("ABB".toCharArray()) + ", ");
    System.out.print(c("BAB".toCharArray()) + ", ");
    System.out.print(c("BUMP".toCharArray()) + ", ");
    System.out.print(c("BALD".toCharArray()) + ", ");
    System.out.print(c("BALDY".toCharArray()) + ", ");
    System.out.print(c("UPWARD".toCharArray()) + ", ");
    System.out.print(c("EXAMINATION".toCharArray()) + ", ");
    System.out.print(c("AZBYCXDWEVFUGTHSIRJQKPLOMN".toCharArray()) + ", ");

    System.out.print(c("AAA".toCharArray()) + ", ");
    System.out.print(c("ACE".toCharArray()) + ", ");
    System.out.print(c("THE".toCharArray()) + ", ");
    System.out.print(c("BUMPY".toCharArray()) + ", ");
    System.out.print(c("BALDING".toCharArray()) + ", ");
    System.out.print(c("ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) + ", ");
  }
}

Çıktı:

1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0

@TimmyD Hmm, demek 's yükselişi zaman a > b, ama ne zaman düşecek a <= b, yerine >ve <?
Kevin Cruijssen 12:16

@TimmyD Tamam, sabit ve hatta 3 byte kazandırır. :)
Kevin Cruijssen 12:16

1
yönteminizi kabul etmek için yeniden tanımlayabilirsiniz, char[]böylece girdi dizginizi char dizilimine dönüştürmeniz gerekmez. Bu birkaç byte tasarruf etmelidir. PS: Java ftw!
peech

1
Belki de değişmeyi mi istediniz String s-> char[]z?

1
Bir değeri truthyveya falseydeğerini geri döndürebilir , bu nedenle yönteminizi int yapar ve 1 veya 0 döndürür :) .. Sizi 117 bayta
Shaun Wild

3

PowerShell v2 +, 83 bayt

param($n)($a=-join(1..($n.Length-1)|%{+($n[$_-1]-lt$n[$_])}))-eq($a-replace'00|11')

Biraz farklı bir yaklaşım. Girişi yoluyla bu döngüler $n, her yineleme önceki karakteri olmadığını görünce $n[$_-1]olan -lesini than akım karakteri $n[$_]daha sonra bir int o Boole operatörüne sonucunu döküm, +. Bunlar -joinbirlikte saklanmış bir dizgede birleştirilir $a. Sonra kontrol $aolduğunu -equal için $aherhangi altdizgelerin ile 00veya 11kaldırıldı.


3

Python 2.7, 84 bayt

s=input()
b=s[0]<s[1]
o=1
for i in range(len(s)-1):o&=(s[i]<s[i+1])==b;b^=1
print o

Engebeli için 1, aksi halde 0 döndürür

Bitsel ve ^ ile bazı güzel şeyler öğrendim.
Boole b ile ilk çifti yukarı / aşağı olarak tanımlayan b ile başlar, daha sonra her bir çift için b test eder ve çevirir.
o Test başarısız olursa ve yapışırsa yanlış çevirir.
Giriş kuralına göre tırnak gerektirir (eğer bazı kurallara aykırıysa raw_input () için +4 bayt)

Dene


3

05AB1E , 9 bayt

SÇ¥0›¥_O_

açıklama

SÇ          # convert to list of ascii values
  ¥         # take delta's
   0›       # check if positive, giving a list of 1's and 0's
            # if they alternate, the word is bumpy
     ¥      # take delta's again, if we have any 0's in the list the word is not bumpy
      _     # logical negation, turning 0 into 1 and everything else to 0
       O    # sum, producing 0 for a bumpy word and 1 for a non-bumpy word
        _   # logical negation, inverting the previous 1 into 0 and vice versa

Çevrimiçi deneyin!


2

Python 2.7 (tekrar, 84 83 bayt)

def a(s):x=s[1:];return[cmp(s[0],x)]+a(x) if x else []
print len(set(a(input())))>1

Veya, 78 baskı olmadan 77 bayt.

Bu arada, yukarıdaki 56 bayt Python 2.7 örneği, örneğin "abbab"veya yinelenen karakterleri olan herhangi bir girişi keser . Aldırma, talimatları okumadım. Ücret Değişikliği.

Tamam, 83'e düştü. Üçlü bir olsa yine de daha güzel.


İşte size bazı ipuçları. 1. Biraz boşluk bırakın a(x)if x else[]. 2. Bunun yerine bir lambda kullanın. a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. Sonunda yazdırmak yerine bir lambda kullanın. lambda s:len(set(a(s)))>14. len(set(a(s)))1'den büyük değilse , zaten sahte olduğundan, bu yüzden ayrılabilirsiniz>1
DJMcMayhem

2

CJam , 15 bayt

l2ew::<2ew::^:*

Çevrimiçi deneyin! (Satır ayrılmış bir test takımı olarak.)

açıklama

l    e# Read input.
2ew  e# Get all (overlapping) pairs.
::<  e# Check whether each pair is strictly ascending (1) or not (0).
2ew  e# Get all (overlapping) pairs.
::^  e# Take the bitwise XOR of each pair, giving 1 if a rise and a fall alternate,
     e# and zero if there are two rises or two falls in succession.
:*   e# Product. Gives 1 only if the previous step yielded a list of 1s, meaning
     e# that any two consecutive rises/falls will turn this into a zero.

2

PHP, 80 bayt

$s=$argv[1];for($c=$s[0];$n=$s[++$i];$c=$n,$d=$e)if($d===$e=$n>$c)break;echo!$n;

veya

for($c=$argv[1][0];$n=$argv[1][++$i];$c=$n,$d=$e)if($d===$e=$n>$c)break;echo!$n;

false için boş çıktı, 1 true için

veya Hedi’nin özyinelemeli yaklaşımı anlatıldı ve 70 bayt için biraz golf oynadı:

function f($s){return!$s[2]|$s[0]<$s[1]^$s[1]<$s[2]&&f(substr($s,1));}

Aslında, bu inişli çıkışlı kelimeler için sonsuzca tekrarlanmalıdır, ama olmaz!


2

Haskell, 30 37 bayt

q f=tail>>=zipWith f;k=and.q(/=).q(>)

Kullanımı:

Prelude> k <$> words "ABA ABB BAB BUMP BALD BALDY UPWARD EXAMINATION AZBYCXDWEVFUGTHSIRJQKPLOMN"
[True,True,True,True,True,True,True,True,True]

Prelude> k <$> words "AAA BBA ACE THE BUMPY BALDING ABCDEFGHIJKLMNOPQRSTUVWXYZ"
[False,False,False,False,False,False,False]

Bu "kel" i kabul foldl1(/=)etmiyor , yaptığını düşündüğün şeyi yapmıyor.
Christian Sievers

@ ChristianSievers Auch, haklısın.
Başınız

2

PHP 7, 137 118 bayt

for($i=0;$i<strlen($argv[1])-2;$i++)if(((($s[$i]<=>$s[$i+1])<0)?1:0)==((($s[$i+1]<=>$s[$i+2])<0)?1:0)){echo"0";break;}

İnişli çıkışlı olmayanlar için boş çıkış 0.

Bu benim kod golf çalışmamdaki ilk girişimdi ve çok daha fazla geliştirmem gerekiyor ama benim için yeni şeyler öğrenmek için harika bir yöntemdi. Yeni PHP 7'yi kullanarak kendime bu görevde meydan okumak istedim. çok ilginç görünen Uzay Gemisi Operatörünü .

Her neyse, bu konuda tatmin olmadım, her şeyden önce if(isset($s[$i+2])), değişkenin var olup olmadığını kontrol etmek için fazladan bir ilave eklemek zorunda olduğum için, çünkü sorun için başka bir geçici çözüm bulamadım, ama bu şimdilik. (Not: Ben sadece değiştirerek bu sabit strlen($s)-1için strlen($s)-2, gerçekten ... önce göremiyordu).

Test kodu:

$as = array("ABA", "ABB", "BAB", "BUMP", "BALD", "BALDY", "UPWARD", 
            "EXAMINATION", "AZBYCXDWEVFUGTHSIRJQKPLOMN", "AAA", "BBA", 
            "ACE", "THE", "BUMPY", "BALDING", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");

foreach ($as as $s) {
    for($i=0;$i<strlen($s)-2;$i++)if(((($s[$i]<=>$s[$i+1])<0)?1:0)==((($s[$i+1]<=>$s[$i+2])<0)?1:0)){echo"0";break;}
}

Çevrimiçi test


Merhaba, PPCG'ye hoş geldiniz! Harika ilk mesaj!
NoOneIsHere

PPCG'ye Hoşgeldiniz! Güzel ilk mesaj. Check out PHP için ipuçları bazı ek golf öneriler için.
AdmBorkBork

1

Javascript ES6, 100 bayt

d="charCodeAt";a=b=>{f=r=0;for(i=1;i<b.length;i++){if(b[d](i)<=b[d](i-1)){f=1}else{r=1}}return f&&r}

Burada dene:

d="charCodeAt";a=b=>{f=r=0;for(i=1;i<b.length;i++){if(b[d](i)<=b[d](i-1)){f=1}else{r=1}}return f&&r}
alert(a(prompt()));

Oh hadi ama, iki kişi beni zaten 40 bayt ...


İpucu: "A"<"B"yani karakterlerin kodlarını almanıza gerek kalmaz.
ETHProductions 12:16

Ayrıca, bu (ya bir yükseliş ve bir düşme içeren herhangi bir şey) 1için geri döner BUMPY.
ETHProductions 12:16

Bu tam olarak işe yaramaz gibi görünmüyor.
AdmBorkBork 13:16

1

Python 3, 148 139 127 bayt

def _(w):*r,=map(lambda a,b:0>ord(a)-ord(b)and-1or 1,w,w[1:]);s=len(r)%2==0and r+[r[0]]or r;return sum(s)in(-1,1)and s==s[::-1]

test kodu

positives = ('ABA', 'ABB', 'BAB', 'BUMP', 'BALD', 'BALDY', 'UPWARD', 'EXAMINATION', 'AZBYCXDWEVFUGTHSIRJQKPLOMN')
negatives = ('AAA', 'BBA', 'ACE', 'THE', 'BUMPY', 'BALDING', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')

for w in positives:
    print(_(w), w)
    assert _(w)

for w in negatives:
    print(_(w), w)
    assert not _(w)

gerçekten bu #facepalm emmek
Jeffrey04

PPCG'ye Hoşgeldiniz! Check out Python Golf için ipuçları ve diğer cevaplar ilham alır.
AdmBorkBork 13:16

1

C 65 57 60 bayt

 r;f(char*s){for(r=0;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

düzeltildi

r;f(char*s){for(;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

bu sadece herhangi bir fonksiyon çağrısında herhangi bir veriyle doğru çalışır (genel değişken rsıfıra başlatıldığında).

Ancak, her durumda bu kullanım foryerine önceki çözümden (65 byte) daha kısadır while. Ancak önceki (aşağıdaki) anlamak biraz daha kolaydır:

r;f(char*s){while(*++s)if(!(r=~r&1<<(*s>*(s-1))))break;return r;}

Benim çözümüm, karakter kodunun artması için ( ) veya ( ) başka türlü &yönlendirme kodunun 2( 1<<1) olabileceği, tersine çevrilmiş önceki ve şimdiki yön koduna dayanarak bit yönündedir . Bu işlemin sonucu, önceki ve şimdiki gibi aynı yön kodunu kullanırsak, yani kelime Bumpy olmadığında 0 olmuştur.*s > *(s-1)11<<0

GÜNCELLEŞTİRME:

Test için kod:

#include <stdio.h>
#include <string.h>

r;f(char*s){for(;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

int main(void)
{
    char * Truthy[] = { "ABA", 
                        "ABB", 
                        "BAB",
                        "BUMP",
                        "BALD",
                        "BALDY",
                        "UPWARD",
                        "EXAMINATION",
                        "AZBYCXDWEVFUGTHSIRJQKPLOMN" };
    char * Falsey[] = { "AAA",
                        "BBA",
                        "ACE",
                        "THE",
                        "BUMPY",
                        "BALDING",
                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    int posTestNum = sizeof(Truthy) / sizeof(char *);
    int negTestNum = sizeof(Falsey) / sizeof(char *);
    int i;
    int rate = 0;
    int tests = 0;
    int res = 0;
    printf("Truthy (%d tests):\n", posTestNum);
    for (i = 0; i < posTestNum; i++)
    {
        tests++;
        printf("%s - %s\n", Truthy[i], f(Truthy[i]) ? (rate++, "OK") : "Fail");
        r = 0;
    }
    printf("\nFalsey (%d tests):\n", negTestNum);
    for (i = 0; i < negTestNum; i++)
    {
        tests++;
        printf("%s - %s\n", Falsey[i], f(Falsey[i]) ? "Fail" : (rate++, "OK"));
        r = 0;
    }
    printf("\n%d of %d tests passed\n", rate, tests);
    return 0;
}

Meta konsensüs başına, işlevlerin yeniden kullanılabilir olması gerekir . Araçlarla Yani sıfırlayamıyorsanız riçin 0ücretsiz, ancak işlev içinde yapmalıdır.
Dennis,

@Dennis You're right, initialization is required, but only for repeated calls. Let's assume that for a single call that works with any data because compiler provide initialisation for global variables
VolAnd

I think you should make the 60 byte solution your main one, since the 57 byte version isn't valid by that meta post I cited.
Dennis

@Dennis Done! +3 bytes
VolAnd

1

PHP, 100 bytes

for($s=$argv[1];$i<strlen($s)-1;$i++)$s[$i]=$s[$i+1]>$s[$i]?r:f;echo str_replace([rr,ff],'',$s)==$s;

Replaces every char of the string (except the last one obviously) with an r for rise or an f for fall and then checks whether rr or ff occur in the string. To avoid that the last remaining character interfers with that, input must be all uppercase.

I'm very unsatisfied with the loop, for example I have a feeling that there must be a way to combine the $i++ into one of the several $is used in the loop, but I failed to find that way. Maybe someone else sees it.

(That's also why I posted my code, despite it being 20 (!) bytes longer than Titus' nice solution.)


0

Java 8, 114 90 bytes

(c,b)->{b=c[0]<c[1];for(int i=2;i<c.length;i++)if(c[i]>c[i-1]!=(b=!b))return 0;return 1;};

Ungolfed test program

public static void main(String[] args) {
    BiFunction<char[], Boolean, Integer> func = (c, b) -> {
        b = c[0] < c[1];
        for (int i = 2; i < c.length; i++) {
            if (c[i] > c[i - 1] != (b = !b)) {
                return 0;
            }
        }
        return 1;
    };

    System.out.println(func.apply("ABCDEFG".toCharArray(), false));
    System.out.println(func.apply("AZBYCXDGEF".toCharArray(), false));
    System.out.println(func.apply("ZXZXZX".toCharArray(), false));
    System.out.println(func.apply("ZXCYZ".toCharArray(), false));
    System.out.println(func.apply("AAA".toCharArray(), false));
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.