Artan, azalan, hiçbiri veya hepsi?


9

İki girişi, rakamlar içeren boş olmayan bir vektör / listesini alın 1ve 2ve bir dize (hayır, almayabilir 0/1yerine). Dize aşağıdakilerden biri olacaktır (küçük harfle, tam olarak aşağıda yazıldığı gibi):

increasing
decreasing
ones
twos
all
none

Dize ____ ise, ___ dizinlerini döndürürsünüz:

  • increasing... listesinden değişir 1için 2(her 2bir hemen sonra aşağıdaki 1)
  • decreasing... listesinden değişir 2için 1(her 1bir hemen sonra aşağıdaki 2)
  • ones ... tüm rakamların 1
  • twos ... tüm rakamların 2
  • all ... tüm rakamlar
  • none... rakamlardan hiçbiri. 0liste 1 dizinliyse iyi olur. Liste 0 dizinli ise, negatif bir sayı uygundur. Ayrıca boş bir liste veya dize çıktısı alabilirsiniz.

Test senaryoları:

Bunlar 1 endekslidir. 1 dizinli mi yoksa 0 dizinli mi olmasını seçebilirsiniz. Test durumlarında farklı dizeler için aynı vektörler kullanılır.

--------------------------------
Vector:
1 1 2 2 2 1 2 2 1 1 2

String       - Output
increasing   - 3, 7, 11
decreasing   - 6, 9
ones         - 1, 2, 6, 9, 10 
twos         - 3, 4, 5, 7, 8, 11
all          - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
none         - 0 / []

------------------------------------
Vector:
1

String:
ones         - 1
all          - 1
decreasing / increasing / twos / none  - 0 / []

puanlama

Bu olduğu gibi , en az bayt ile cevap kazanır.

Açıklamalar teşvik edilir!


@RobertoGraham evet.
Stewie Griffin

@KevinCruijssen İyi bir tahmin edersiniz :)
Stewie Griffin

Şimdiye kadar cevapların hiçbiri örnekte gösterildiği gibi bir liste çıkarmıyor. (yani, sondaki sınırlayıcı olmadan "," ile birleştirilir). Meydan okuma metni listenin ne kadar esnek olabileceğini söylemediğinden, normalde böyle zorluklar için kabul edilen nedir?
Tahg

Normalde çok esnektir. Rakamların bir listesi olduğu sürece sorun yok.
Stewie Griffin

Yanıtlar:


7

JavaScript (Firefox 30-57), 74 73 bayt

(a,[s],i=0,p)=>[for(e of a)if({i:e>p,d:e<p,o:e<2,t:e>1,a:1}[p=e,i++,s])i]

Dizi comprehensions birleştirerek düzgün bir yoludur mapve filtertek seferde. Düzenleme: @ edc65 sayesinde 1 bayt kaydedildi.


3

Python 2 , 136 131 119 108 97 bayt

  • Beş bayt kurtardı; bir lambdaişlev kullanarak .
  • TFeld sayesinde on iki bayt kaydedildi ; iki koşul golf.
  • Bay Xcoder sayesinde on bir bayt kurtardı ; enumerate()yerine kullanarak range(len()).
  • Bir liste yerine bir sözlük kullanarak ve kullanarak onbir bayt Kaydedilen 0(olduğu gibi -Dizin TFeld cevabı ) ve golf "adinot".find(m[0])için ord(m[0])/3-32.
lambda l,m:[j for j,k in enumerate(l)if[1,j*k<j*l[~-j],0,j*k>j*l[~-j],0,k<2,k>1][ord(m[0])/3-32]]

Çevrimiçi deneyin!


Giriş her zaman olduğu 1ya 2, değiştirebileceğiniz (l[j]>1)*(l[~-j]<2)için (l[j]>l[~-j]) için 119 bayt
TFeld

Ayrıca, 0 dizinli
TFeld

@TFeld Teşekkürler; ama ben 1-kine bağlı kalacağımı düşünüyorum .
Jonathan Frech

108 bayt , kullanarakenumerate()
Bay Xcoder



2

MATL , 32 31 30 29 bayt

dQ~fQGqfOOGofGd1=fQGfO[]Xhjs)

Çıktı 1 tabanlı veya boş.

Çevrimiçi deneyin!

açıklama

Kod, dizi girişi için olası altı çıkışı hesaplar ve ardından dize girişine bağlı olarak uygun çıkışı seçer.

Çıktıyı seçmek için, dize girişinin tüm karakterlerinin ASCII kod noktaları eklenir. Sonuç modülo 9 verir 6, 1, 5, 2, 7, 0sırasıyla için 'increasing', 'decreasing', 'ones', 'twos', 'all', 'none'. Ortaya çıkan tüm sayılar farklı olduğu için bu bir seçim kriteri olarak kullanılabilir.

Toplamda bir modulo 9 işlemi gerçekleştirmek yerine, olası girişlerin listesi 9 girişe (bazıları kukla) genişletilir ve böylece bu listeye indeksleme otomatik olarak modulo 9 yapılır.

d     % Implicit input: numeric vector. Push vector of consecutive differences.
      % Contains -1, 0 or 1
Q~    % For each entry: add 1, negate. This turns -1 into 1, other values into 0
f     % Push indices of nonzeros
Q     % Add 1 to each entry (compensates the fact that computing consecutive
      % differences removes one entry). This the output for 'decreasing'
Gq    % Push input again. Subtract 1 from the code points
f     % Push indices of nonzeros. This is the output for 'twos'
OO    % Push two zeros. These are used as placeholders
Go    % Push input and compute parity of each entry
f     % Push indices of nonzeros. This is the output for 'ones'
Gd    % Push input and compute consecutive differences
1=    % Test each entry for equality with 1
f     % Push indices of nonzeros 
Q     % Add 1. This is the output for 'increasing'
Gf    % Push indices for all input (nonzero) entries. This is the output for 'all'
O     % Push zeros. Used as placeholder
[]    % Push empty array. This is the output for 'none'
Xh    % Concatenate stack into a cell array
j     % Input a string
s     % Sum of code points
)     % Use as an index into the cell aray. Implicitly display


1

Jöle , 27 bayt

>2\0;
NÇ
Ị
=2

ḟ
⁹Ḣ“hɠ»iµĿT

Çevrimiçi deneyin!

-3 - Jonathan Allan'a teşekkürler .


"Diota" sözlük sözcüğünü kullanarak üç bayt kaydedin - 0 bağlantısının doğru olduğunu unutmayın, ancak tekrar sıralayabilir ve "panzehir" veya başka bir kelime kullanabilir ve test kayışınızın tekrar çalışmasına izin verebilirsiniz.
Jonathan Allan

@JonathanAllan Linkin 0en alttaki link olduğunu düşündüm , ama görünüşe göre Çgarip ama sanki teşekkürler! (ayrıca yeni bir kelime öğrendim: p)
Outgolfer Erik

1

Kabuk , 27 bayt

`fN!+mmëI=2ε¬moΘẊe><€¨Ÿȧö¨←

Çevrimiçi deneyin!

-9 H.PWiz sayesinde .

Bu cevaptan gurur duyuyorum.


Golfed kullanarak çoğunlukla ΘẊ>ve ΘẊ<ve`fN
H.PWiz

@ H.PWiz dürüstçe nasıl görmedim
Outgolfer Erik

-1 bayt Dizinde endekslenen bir liste 0son öğedir.
H.PWiz

@ H.PWiz Ooh Sıkıştırılmış dizenin ¨₆Żσa¨bunun olacağını düşündüm, bu yüzden bu özelliği kullanmadım, teşekkürler. Ve şimdi Jelly ile bağlandığını söyleyebilirim .
Outgolfer Erik

1

Java (OpenJDK 8) , 266 217 213 205 172 171 155 131 bayt

s->a->{int i=0,l=0,c=s.charAt(0)-97;for(int e:a){if(++i>1&(c==8&e>l|c==3&e<l)|c==14&(l=e)<2|c>18&l>1|c<1)System.out.print(i+",");}}

Çevrimiçi deneyin!


Eğer tanımlarsanız ybir şekilde char, golf eşitlik testleri sevebiliyorsun y.equals("a")için y=='a', y==97hatta y<98.
Jonathan Frech

@JonathanFrech Sadece değişiyordu :)
Roberto Graham

TIO en azından beklediğim çıktı değil. Yalnızca örnekle verilse de, liste öğeler arasında boşluk gerektirir ve sondaki virgül kullanılmaz.
Tahg

Yana 19is c'in en yüksek değere, c==19eşittir c>18.
Jonathan Frech

2
131 bayt:s->a->{int i=0,l=0,c=s.charAt(0)-97;for(int e:a){if(++i>1&(c==8&e>l|c==3&e<l)|c==14&(l=e)<2|c>18&l>1|c<1)System.out.print(i+",");}}
Nevay

1

Jq 1,5 , 131 bayt

Dize eşleşmesi dizi sürümümden daha kısa olduğu için xcali'nin yaklaşımına dayanıyor .

def D(s):[.[1]|gsub(" ";"")|match(s;"g").offset+(s|length)];./"
"|{i:D("12"),d:D("21"),o:D("1"),t:D("12"),a:D("."),n:[]}[.[0][0:1]]

Jq'nin -Rsseçeneklerle çağrıldığını ve girişin iki satırda göründüğünü varsayar;

decreasing
1 1 2 2 2 1 2 2 1 1 2

Expanded:

def D(s): [
      .[1]                              # find where s appears
    | gsub(" ";"")                      # in the input and add
    | match(s;"g").offset + (s|length)  # length to get ending index
  ]
;

  ./"\n"                                # split on newline
| {i:D("12"),                           # increasing
   d:D("21"),                           # decreasing
   o:D("1"),                            # ones
   t:D("2"),                            # twos
   a:D("."),                            # all
   n:[]                                 # none
  }[.[0][0:1]]

Çevrimiçi deneyin!



1

J, 73 bayt

g=.[:I.[=0,2-/\]
(_1 g])`(1 g])`(1=])`(2=])`(i.@#@])`_1:@.('idotan'i.{.@[)

Bunun nasıl önemli ölçüde yoğunlaşabileceğini merak ediyorum - inanıyorum (sadece tüm gündem parensleri için 10 karakter!)

  • g- sadece \2 boyutundaki infix çalışmalarının değerlerini karşılaştırmaya yarayan, artan ve azalan yardımcı fiil
  • Gerisi sadece "komut" ilk karakteri kapmak ve Gündem kullanarak ilgili büyük / küçük harf yürütür @.

Çevrimiçi deneyin!


Do 1=]ve 2=]işi olmasın? Ayrıca, gsol argüman olarak bir sayı ve sağ argüman olarak bir liste 2-/\ alıp listeye uygulandığında endeksleri döndürdüğünde , sol argümana eşittir. Bu şekilde geçebilir _1veya 1bir zarf kullanmak yerine azalan ve artan bir şekilde bulabilirsiniz.
cole

@cole İyi yorumlar. Değişiklikleri yaptım ve sonuç çok daha temiz, ancak 73 hala yüksek bir bayt sayısı gibi görünüyor. Yani, J JS'yi buraya bağlıyor .... utanç!
Jonah

0

Java 8, 233 229 216 bayt

l->s->{int i=s.charAt(0)-97,k=0,j=1;for(s=(l+"").replaceAll("[^12]","");s.length()*j>0;System.out.print(j++<0?"":(k+=j)+","),s=s.substring(j))j=i<1?0:s.indexOf(i<4?"21":i<9?"12":i<14?" ":i<15?"1":"2")+(i>2&i<9?1:0);}

Bu String yaklaşımı beklediğimden daha uzun sürdü .. Ama diğer Java 8 cevabıyla çok fazla golf oynadığımı bile düşündüm , yine de göndermeye karar verdim.
Bu yaklaşımla bile kesinlikle golf oynayabilir .. "Hiçbiri" ve "artış / azalma" esas olarak bazı baytlara mal olan bazı geçici çözümlere neden oldu ..

Sonuç 1 dizinlidir.

Açıklama:

Burada deneyin.

l->s->{                          // Method with List and String parameters
  int i=s.charAt(0)-97,          //  First character of the String - 97
                                 //   (i=8; d=3; o=14; t=19; a=0; n=13)
      k=0,                       //  Total counter
      j=1;                       //  Index integer
  for(s=(l+"")                   //  toString of the List,
         .replaceAll("[^12]","");//   and leave only the 1s and 2s 
      s.length()*j>0             //  Loop as long as `j` and the size of the String
                                 //  are both larger than 0
      ;                          //   After every iteration:
      System.out.print(          //    Print:
       j++<0?                    //     If `j` is -1:
        ""                       //      Print nothing
       :                         //     Else:
        (k+=j)+",")              //      Print the current index
      ,s=s.substring(j))         //    And then remove the part of the String we've checked
    j=i<1?                       //   If "all":
                                 //    Change `j` to 0
      :                          //   Else:
       s.indexOf(                //    Replace `j` with the next index of:
        i<1?                     //     If "all":
         s.charAt(0)+""          //      The next character
        :i<4?                    //     Else-if "decreasing":
         "21"                    //      Literal "21"
        :i<9?                    //     Else-if "increasing":
         "12"                    //      Literal "12"
        :i<14?                   //     Else-if "none":
         " "                     //      Literal space (any char that isn't present)
        :i<15?                   //     Else-if "one":
         "1"                     //      Literal "1"
        :                        //     Else(-if "two"):
         "2")                    //      Literal "2"
       +(i>2&i<9?1:0);           //     +1 if it's "increasing"/"decreasing"
                                 //  End of loop (implicit / single-line body)
}                                // End of method

0

Perl 5 , 71 + 2 ( -nl) = 73 bayt

$p=/l/?'.':/t/?2:/^o/?1:/d/?21:/i/?12:0;$_=<>;s/ //g;say pos while/$p/g

Çevrimiçi deneyin!

Gözden geçirilmiş mantık etkili bir şekilde aşağıdaki açıklama ile aynıdır, ancak desen eşleşmeleri kısaltılmıştır.

Önceden:

$p=/all/?'.':/^o/?1:/^t/?2:/^d/?21:/^i/?12:0;$_=<>;s/ //g;say pos while/$p/g

Çevrimiçi deneyin!

Ölçütler eşleşmezse hiçbir şey çıktılamaz.

Açıklaması:

$p=          # set the pattern to seach based on the input string
  /all/?'.'  # any character
 :/^o/?1     # starts with 'o', find ones
 :/^t/?2     # starts with 't', find twos
 :/^d/?21    # starts with 'd', find decreasing
 :/^i/?12    # starts with 'i', find increasing
 :0;         # anything else: create pattern that won't match
$_=<>;s/ //g;# read the digits and remove spaces
say pos while/$p/g # output position(s) of all matches
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.