Dalgalı Kelimeleri Bulun!


18

(Not: Bu benim önceki meydan okuma daha kolay bir spin- in Sonsuzluk Kelimeleri Bul!, Önceki diğer meydan okuma bir spin- up Dönen Kelimeleri Bul! :))

Dalgalı Bir Kelimenin Tanımı :

  1. Alfabedeki (AZ) bir Dalgalı Sözün tüm karakterlerini eğrilerle bağlarsanız, aşağıdaki diyagramlarda olduğu gibi sürekli olarak sağa veya sola doğru giden ve asla yönü değiştirmeyen bir dalganın yolunu elde edersiniz.
  2. Dalgalı Bir Kelime olabilir:
    • Birbirini izleyen her karakter bir öncekinin sağında (alfabesinde) bulunuyorsa yükseltme .
    • Birbirini izleyen her karakterin bir öncekinin solunda (alfabesinde) azalması.
  3. Tüm eşit bağlantı kesilmiş, tüm tek bağlantılar yukarı olmalıdır.
  4. Büyük / küçük harfleri yok sayabilir veya tümünü büyük harfe veya tümünü küçük harfe çevirebilir / dönüştürebilirsiniz.
  5. Giriş sözcükleri yalnızca AZ alfabe aralığındaki karakterler, boşluk, noktalama işareti veya simge içermez.
  6. Bir kelimenin "SPOON" gibi çift karakterleri varsa, çiftleri bir karaktere daraltmanız gerekir: "SPOON"> "SPON" (eğer O'dan O'ya giderseniz sıfır mesafedir).
  7. Dalgalı Kelimeler (çiftler çöken sonra bile) en az 3 ayrı karakterleri içerecek.

İşte bazı örnekler:

resim açıklamasını buraya girin

Görev:

Standart girdiden bir sözcük alacak ve bir Dalgalı Sözcük ise veya çıkmayacak ve pozitif durumda, yükseliyor veya azalıyorsa çıktı alacak tam bir program veya işlev yazın . Çıkış olabilir True/False/Null, 2/1/0, 1/Null/0, -1/0/1, NO/WR/WD, vb, bunu temsil etmek nasıl karar verirler.

Test senaryoları:

WAVY WORDS:
  ADEPT, BEGIN, BILL, BOSS, BOOST, CHIMP,
  KNOW, SPONGE, SPOON, TROLL, WOLF  

ADEPT  > YES > RAISING
BEGIN  > YES > RAISING
BILL   > YES > RAISING
BOSS   > YES > RAISING
BOOST  > YES > RAISING
CHIMP  > YES > RAISING
KNOW   > YES > RAISING
SPONGE > YES > DECREASING
SPOON  > YES > DECREASING
TROLL  > YES > DECREASING
WOLF   > YES > DECREASING

NOT WAVY WORDS:
  WATCH, EARTH, NINON, FOO, BAR, WAVE, SELECTION,
  YES, NO, DEFINITION, WATER, WINE, CODE, AAAHHHH, I, MM, ABCA

Kurallar:

  • En kısa kod kazanır.

İsteğe Bağlı Görev:

Bir liste olarak , bir İngilizce sözlükte olabildiğince çok Dalgalı Kelime ve en uzununu bulun . Örneğin, İngilizce kelimelerin tam listesine buradan referans alabilirsiniz .


Resimleri nasıl yaptın?
Oliver Ni

@Oliver Illustrator ile iş için var, ancak Gimp veya Inkskape veya diğerleri ile benzer sonuçlar elde etmek mümkündür.
Mario

NOve FOOkurallarınıza göre geçerli girdiler değil.
PurkkaKoodari

1
@ Pietu1998 Gerçi onlar doğrusu NOT WAVY WORDS, bu doğru ..
Kade

1
@xnor # 5 tüm giriş kelimelerinin açıklandığı gibi olduğunu, doğrulamaya gerek olmadığını varsayabilirsiniz. # 7 Bu, dalga şekli oluşturmak için gereken minimum harf sayısıdır. Geri kalanı için, çıktıya istediğiniz gibi karar verirsiniz.
Mario

Yanıtlar:


6

05AB1E , 11 9 bayt (Adnan'a teşekkürler)

Dg2›iÇü‹Ù

Çevrimiçi deneyin!

Dalgalı Kılıflar:

0 - Azalan Dalgalı

1 - Artan Dalgalı

Dalgalı Olmayan Kılıflar:

[0,1] - Dalgalı değil, başlangıçta azalıyor, ancak daha sonra paterni kıran bir artış / eşitlik var.

[1,0] - Dalgalı değil, başlangıçta artıyor, ancak daha sonra paterni bozan bir düşüş / eşitlik var

Giriş Dizesi - Uzunluk nedeniyle ilk etapta dalgalı olmak mümkün değildir.

Açıklama:

Dg2›iÇü‹Ù   # Full program

D           # Push 2 copies of input.
 g2›i       # If length is greater than 2. 
     Ç      # Push ASCII values for all characters in the string.
      ü     # Push pairwise array.
       ‹    # Vectorize 1 if negative difference, 0 if positive difference.
        Ù   # Uniquify using right most unique values first.
            # Else just print the string back, letting them know it's not valid input.

1
@JonathanAllan Dangit ... Sadece yorumları ve değişiklikleri gördüm ... The input words will contain at least 3 distinct characters3 karakterden daha azını ele almak zorunda olmadığımı kastediyorum. Değişiklikler üzerinde çalışmak biraz zaman alabilir; 05AB1E'de yapabildiğim ilk cevabım bu.
Sihirli Ahtapot Urn

1
@JonathanAllan Sabit :)! Ama şimdi beni dövüyorsun;).
Sihirli Ahtapot Urn

1
Çok hoş! Bir ipucu, :) ile ü‹aynıdırü-0‹
Adnan

Hehehe ... Dostum, sadece piton öğrenmem ve 05AB1E'yi genişletmeye yardım etmem gerekebilir. Bu dil etkileyici. Bahşiş için teşekkürler!
Sihirli Ahtapot Urn

5

Jöle , 10 bayt

OIṠḟ0µL’aQ

TryItOnline! veya tüm test senaryolarını çalıştırın

İade:
[1]artan dalgalı için
[-1]dalgalı azalan için
başka aksi bir şey ( [], [0], [-1,1], veya [1,-1])

(Gereksiz olarak beyan: her biri için tek bir değer için OIṠḟ0µL’aQS(11 bayt) döndürür 1, -1ve 0sırasıyla).

Nasıl?

OIṠḟ0µL’aQ - Main link: s
O          - cast to ordinals
 I         - incremental differences
  Ṡ        - sign (-1 for decreasing, 0 for no change, 1 for increasing)
   ḟ0      - filter out zeros
     µ     - monadic chain separation
      L    - length
       ’   - decremented
        a  - and
         Q - unique items

Her iki durum için de 3 farklı olası çıkışa izin veriliyor mu?
xnor

Farklı oldukları sürece evet demek için "nasıl temsil edeceğinize siz karar verdiniz" dedim. Ancak kural # 5 ile ilgili sorunuz bunu (ve muhtemelen diğer tüm girişleri) geçersiz kılabilir.
Jonathan Allan

Gerekirse buna bir çözüm eklendi.
Jonathan Allan

Sadece listeyi toplayamaz mısın?
xnor

Oh, evet, elbette> _ <teşekkürler.
Jonathan Allan

3

Python 2, 54 bayt

lambda s:[2<len(set(s))<s[::b]==sorted(s)for b in-1,1]

Girişi karakter listesi olarak alır. Çıktılar:

[False, True] for ascending
[True, False] for descending
[False, False] for neither

Sıralanan giriş dizesinin orijinal veya tersine eşit olup olmadığını kontrol eder. Bunu 1 ve -1 adım boyutları ile dilimleyerek yapar. Aynı zamanda, kelimenin en az 2 ayrı harfi olup olmadığını kontrol ederiz.

"Hatalı çıkış" her iki durumda da bir çıktı kullanılamıyorsa, 51 bayta düşebiliriz:

lambda s:[s,s[::-(len(set(s))>2)]].index(sorted(s))

Bir dize olarak belirtilmediğinden karakterlerin bir listesini alabileceğinizden emin olabilirsiniz: meta.codegolf.stackexchange.com/a/2216/8478
Jonathan Allan

3

Python 3, 77 75 bayt

lambda x:(len(set(x))>2)*(list(x)==sorted(x)or(list(x)==sorted(x)[::-1])*2)

Tüm harflerin aynı durumda olduğunu varsayar.

İadeler:

  • 0 dalgalı değilse
  • 1 eğer ileriye dalgalı ise
  • 2 geriye dalgalı ise

@ETHproductions sayesinde gereksiz alanlar kaldırıldı


2
PPCG'ye hoş geldiniz ve güzel ilk cevap! Ancak, dizede en az üç ayrı karakter bulunduğundan da emin olmanız gerekir; değilse, ne olursa olsun dalgalı bir kelime değil.
ETHproductions

Ah doğru. Dalgalı bir kelimenin tanımına daha yakından bakmalıydım. Sabit.
C. Smith

Güzel! Ben bir Python uzman değilim ama bence sen her iki tarafında yer kaldırabilir or.
ETHproductions

Evet, haklısın. İfadeleri parantez içinde çektikten sonra kaldırmayı unuttum. Yakaladığınız için teşekkürler!
C. Smith

3

R, 96 95 bayt

function(x,d=diff(rle(utf8ToInt(x))$v))if(any(d>0)&any(d<0)|sum(1|d)<2)3 else`if`(all(d<1),2,1)

İadeler:

  • 1 dalgalı ve yükseltmek için
  • 2 dalgalı ve azaltmak için
  • 3 dalgalı olmayanlar için

Açıklaması

  • d=diff(rle(utf8ToInt(x))$v): dİlk önce dizeyi ASCIIdeğerlerine dönüştürerek utf8ToIntbir vektör oluşturur. Daha sonra kullanarak çalışma uzunluğu kodlaması gerçekleştirin rle. rle(...)$vdizinin yinelenmeyen değerlerini döndürür (yani tüm çalışmaların daraltılması). Sonunda farkı ele alalım.
  • if(any(d>0)&any(d<0)|sum(1|d)<2)3: Farklardan en az biri pozitif ve en az bir negatifse veya fark dizisi 2elemanlardan daha azsa (3 karakterden az orijinal kelimeye eşdeğer), kelime dalgalı değildir ve geri döner3
  • else``if``(all(d<1),2,1): Tüm farklılıklar negatifse, 2dalgalı ve azalan geri dönüş , dalgalı ve kabarık geri dönüş 1.

R-fiddle'daki tüm test senaryolarını deneyin (test senaryoları için vektörleştirilebilecek şekilde adlandırıldığını unutmayın).


3

JavaScript (ES6), 84 81 bayt

s=>(new Set(t=[...s]).size>2)*(!t.some((c,i)=>c>s[i+1])-!t.some((c,i)=>c<s[i+1]))

Girişin hepsinin aynı durumda olduğunu varsayar. İade 1, dalgalı yetiştirmek için -1dalgalı azaltılmasında, 0veya -0dalgalı değil (her ikisi de falsy vardır). Düzenleme: @RobertHickman sayesinde 3 bayt kaydedildi.


Daha yeni özellikler konusunda uzman değilim, ancak kaldırabilir misiniz new?
Cyoce

@Cyoce Can sıkıcı bir şekilde yeni özellikler kullanmanızı gerektiriyor new.
Neil

@Neil, Sanırım, Set () işlevinin içinde başka bir değişken başlatarak t=[...s]ve sahip olduğunuz bu iki noktada [... s] yerine t kullanarak bir bayt kaydedebilirsiniz .
Robert Hickman

3

Javascript (ES6), 84 80 78 bayt

i=>new Set(s=[...i]).size>2?[i,s.reverse().join``].indexOf(s.sort().join``):-1

Dalgalı artış 0 olduğunda, azalma 1'dir ve -1 dalgalı değildir.

Sayesinde @Neil Bana yardım ettiğin için 2 bayt kaydedin.


1
new Set(s=[...i])size 2 bayt kazandırır. (Bu iterating çalışır i., Bir dizi dönüştürerek dizi yineleme ve bir dizi Katlı içine dönüm, ancak bu tür bir şey sen golf hakkında endişe yok.)
Neil


2

Python 2, 53 52 50 bayt

Tırnak içine alınmış girdiyi bekler, örn. "watch"

İsimsiz lambda olarak:

lambda s:(sum(map(cmp,s[1:],s))+1)/min(len(s)-1,3)

Her harf arasındaki fark işaretini toplar ve tamsayı-böler len-1. Tüm olsaydı 1toplamıdır (artan), len-1görüntüler 1azaltılması için benzer -1ve karıştırılmaktadır 1, -1toplamından daha küçük olan len-1bu görüntüler, böylece 0.

Değiştirme -1 bayt cmp,s[1:],s[:-1])içincmp,s[1:],s)+1


Döndürür 1için"NO"
Jonathan Allan

@JonathanAllan LMNOPyani O N'nin peşinde. Bu da demek oluyor ki bu 1 demek
Karl Napf

Evet, ancak 3 karakterden az olan herhangi bir kelime (yinelenen harfleri kaldırdıktan sonra) dalgalı değil (dalgalı olmayan test durumlarında "HAYIR" olarak tanımlanmıştır).
Jonathan Allan


2

Ruby, 54 bayt

->w{c=w.chars.uniq;c==(s=c.sort)?2:(c==s.reverse)?1:0}

0Sözcük dalgalı 1değilse, geriye doğru dalgalıysa ve 2ileri doğru dalgalıysa döndürür .


2

Groovy - 56 bayt

{D = o [0]; c = [0] * 3; it.each {a-> c [(a <=> d)] = 1; d = a} c [1 ..- 1]}

[1,0]Dalgalı yükseltme, dalgalı [0,1]azaltma, [0,0]tek karakter girişi veya [1,1]dalgalı olmayan çıkışlar .

NOT: Girdinin bir String veya char [] olduğunu ve tüm harflerin aynı durumda olduğunu varsayar.


2

PHP, 96 Bayt

for(;($t=$argv[1])[++$i];)$s+=$r[]=$t[$i-1]<=>$t[$i];echo(max($r)-min($r)<2)*(0<=>$s)*(1<$s*$s);

veya 98 Bayt

$s=str_split($t=$argv[1]);sort($s);echo(-($t==strrev($j=join($s)))|$t==$j)*!!count_chars($t,3)[2];

0 dalgalı değil 1 yükseliyor -1 azalıyor


-yerine 2*(azaltmak için -1: -1 bayt). *(!!...)parantez gerektirmez. (-2)
Titus

$s*$s>1yerine abs($s)>1(-2)
Titus

@Titus Done Thank You
Jörg Hülsermann

2

PHP, 100 bayt

$n=$m=$l=str_split($argv[1]);sort($n);rsort($m);echo(($n==$l)-($m==$l))*(count(array_unique($l))>2);

İadeler:

  • -1 dalgalı, azalan.
  • 0 dalgalı değil.
  • 1 dalgalı, yükseltmek için.

!!array_unique($s)[2]yerinecount(array_unique($l))>2
Jörg Hülsermann

Aslında, bununla ilgili sorun array_unique anahtarları önleyecektir. Böylece aaabc gibi bir girdi array_unique kullanılırken yanlış 0 çıktısı verir.
chocochaos

1

C, 164 bayt

main(){char s[99];scanf("%s",s);char *c=&s;int p=*c;while(*c^0){if(p>*c){if(c-&s[0]>1)return 0;while(*c^0){if(p<*c)return 0;p=*c;c++;}return 2;}p=*c;c++;}return 1;}

Wawy değilse 0, wawy ve 1 ise 1, azalıyorsa 2 döndürür.


1

Raket 321 bayt

(let*((ld(λ(sl)(for/list((i(sub1(length sl))))(-(list-ref sl(add1 i))(list-ref sl i)))))(l(ld(remove-duplicates(map
(λ(x)(char->integer x))(string->list s)))))(am andmap)(N"Not WAVY")(d displayln))(cond[(<(length l)2)(d N)][(am(λ(x)(>= x 0))l)
(d"YES; RAISING")][(am(λ(x)(<= x 0))l)(d"YES; DECREASING")][else(d N)])))

Ungolfed:

(define (f s)
  (let*  ((ld (lambda(sl)          ; sub-fn to get differences in list elements
                (for/list ((i (sub1(length sl))))
                  (- (list-ref sl (add1 i))
                     (list-ref sl i) ) )))
          (l (ld
              (remove-duplicates
               (map
                (lambda(x)
                  (char->integer x))
                (string->list s)))))
          (am andmap)
          (N "Not WAVY")
          (d displayln))
    (cond
      [(< (length l) 2)(d N)]
      [(am (lambda(x) (>= x 0)) l) (d "YES; RAISING")]
      [(am (lambda(x) (<= x 0)) l) (d "YES; DECREASING")]
      [else (d N)]
      )))

Test yapmak:

(f "ADEPT"); > YES > RAISING
(f "BEGIN"); > YES > RAISING
(f "BILL"); > YES > RAISING
(f "BOSS"); > YES > RAISING
(f "BOOST"); > YES > RAISING
(f "CHIMP"); > YES > RAISING
(f "KNOW"); > YES > RAISING
(f "SPONGE"); > YES > DECREASING
(f "SPOON"); > YES > DECREASING
(f "TROLL"); > YES > DECREASING
(f "WOLF"); > YES > DECREASING

(f "WATCH")
(f "EARTH")
(f "NINON")
(f "FOO")
(f "BAR")
(f "WAVE")
(f "SELECTION")

Çıktı:

YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; DECREASING
YES; DECREASING
YES; DECREASING
YES; DECREASING
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY

1

Java 7, 254 240 bayt

import java.util.*;int c(String s){char[]a=s.toCharArray(),x=a.clone();Arrays.sort(x);return s.replaceAll("(.)\\1{1,}","$1").length()<3?0:Arrays.equals(a,x)|Arrays.equals(x,(new StringBuffer(s).reverse()+"").toCharArray())?a[0]>a[1]?1:2:0;}

Çıkışlar 0girdi dizesi, dalgalı değilse 1bir yetiştirme dalga ise ve 2bu bir azalan dalga buysa.

Test edilmemiş ve test kodu:

Burada deneyin.

import java.util.*;
class M{
  static int c(String s){
    char[] a = s.toCharArray(),
           x = a.clone();
    Arrays.sort(x);
    return s.replaceAll("(.)\\1{1,}", "$1").length() < 3
            ? 0
            : Arrays.equals(a, x) | Arrays.equals(x, (new StringBuffer(s).reverse()+"").toCharArray())
               ? a[0] > a[1]
                  ? 1
                  : 2
               : 0;
  }

  public static void main(String[] a){
    System.out.print(c("ADEPT") + ", ");
    System.out.print(c("BEGIN") + ", ");
    System.out.print(c("BILL") + ", ");
    System.out.print(c("BOSS") + ", ");
    System.out.print(c("BOOST") + ", ");
    System.out.print(c("CHIMP") + ", ");
    System.out.println(c("KNOW"));

    System.out.print(c("SPONGE") + ", ");
    System.out.print(c("SPOON") + ", ");
    System.out.print(c("TROLL") + ", ");
    System.out.println(c("WOLF"));

    System.out.print(c("WATCH") + ", ");
    System.out.print(c("EARTH") + ", ");
    System.out.print(c("NINON") + ", ");
    System.out.print(c("FOO") + ", ");
    System.out.print(c("BAR") + ", ");
    System.out.print(c("WAVE") + ", ");
    System.out.print(c("SELECTION") + ", ");
    System.out.print(c("YES") + ", ");
    System.out.print(c("NO") + ", ");
    System.out.print(c("DEFINITION") + ", ");
    System.out.print(c("WATER") + ", ");
    System.out.print(c("WINE") + ", ");
    System.out.print(c("CODE") + ", ");
    System.out.print(c("AAAHHHH") + ", ");
    System.out.print(c("I") + ", ");
    System.out.print(c("MM") + ", ");
    System.out.println(c("ABCA"));
  }
}

Çıktı:

2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

int c(char[]s){int t=s[0],f=s.length,a=1,b=1,i;for(i=1;i<f;){if(s[i]-s[i-1]>=0)++a;if(s[i]-s[i++-1]<1)++b;}return a==f?1:b==f?-1:0;}(132 bayt)
Numberknot

Dalgalı
yükseliyorsa
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.