Evet mi Hayır mı?


19

Yalnızca evet için y ve hayır için n karakterlerini içeren bir dize [uzunluk 1-20] girdikten sonra , programınız sonucu (y veya n) çıkarmalıdır. Örnek girdi:yynynynny çıkış y olur.

Sonuç, y ve n'leri aşağıdaki şekilde birleştirerek belirlenir:

  • y es ve n o eşittir n o

  • y es ve y es eşittir y es

  • n o ve n o eşittir y es

Dize 2'den fazla karakter içeriyorsa (büyük olasılıkla ...), hesaplama aynı görünecektir. Örnekler:

  • y es ve y es ve n o eşittir n o (çünkü hayır ilk evet ile hayır arasında birleşir. o zaman hayır ve evet kalır ve aynı şey tekrar olur)

  • n o ve n o ve n o eşittir n o (ilk iki hayır evet ile birleşir, o zaman evet ve hayır kalır, hayır ortaya çıkar)

Çıktı ile örnek giriş:

  • yynynynynyyn = n

İpucu: programınızın çalıştığı karakter sırasının umursamadığını unutmayın. (örneğin, girdiyi arkadan veya arkadan okuyabilirsiniz, harfleri karıştırın, sıralayın, her neyse. Doğru çıkış nedir?)

Kazanma kriterleri: Bu , bayt kazanmalarındaki en kısa kod kazanır.


3
Açık şartname ile ilk meydan okuma için tebrikler! (bazı topluluk üyelerinin "çok önemsiz" zorlukları
sevmemesi


7
Alternatif bir çift çıkarabilir miyiz? Say 1için y, ve 0için n.
Oliver

5
Girişi bir karakter listesi olarak alabilir miyiz?["y", "n", "n"]
Okx

3
Bu zorluğun kopyası aşırı derecede aşağı düştüğünden, bunu bir kopya olarak kapatmanın çok yararlı olduğunu düşünmüyorum. Herhangi bir şey varsa, daha büyük meydan okumayı açık bırakma politikası olduğu için eski meydan okuma bunun bir kopyası olmalıdır. Bu meydan okumayı tekrar
açtım

Yanıtlar:


9

Kömür , 6 bayt

§yn№Sn

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

    S   Input string
   № n  Count number of `n`s
§yn     Circularly index into string `yn`
        Implicitly print appropriate character

1
Nasıl çalıştığını açıklayın lütfen?
Malady

@Malandy Link kodun ayrıntılı versiyonudur.
Adám

1
@ Adám Aslında genellikle bir tane ekliyorum, ancak bunu bir iş molasında kestim ve bir tanesini düzenlemeyi unuttum.
Neil

14

Oktav , 29 27 bayt

@RickHithcock'a bir hatayı işaret ettiği için teşekkürler , şimdi düzeltildi. Ayrıca, @StewieGriffin sayesinde 2 bayt kapalı !

@(s)'yn'(mod(sum(s+1),2)+1)

Çevrimiçi deneyin!

açıklama

ASCII kod noktası 'y'tek ve 'n'çift. Kod

  1. çift ​​ve tek 1yapmak için giriş dizesindeki her karaktere ekler ;'y''n'
  2. toplamı hesaplar;
  3. sonucu 1, 2tek , çift ​​ise;
  4. (1 tabanlı) dizeye ekler 'yn'.

Muhtemelen bariz bir şeyi kaçırıyorum, ancak bu -4 bayt için birkaç sınırlı test durumunda aynı şekilde çalışıyor gibi görünüyor . Muhtemelen çok yanlış çünkü Octave bilmiyorum!
Dom Hastings

2
@DomHastings OP'de verilen yynynynny başarısız, y döndürmeli, ancak n döndürüyor
Skidsdev 23:18



7

Jöle , 7 bayt

ċ”nị⁾ny

Çevrimiçi deneyin!

C arasında taşmayan sayısı “n , i dize içine nDex ⁾ny . (modulo 2 ile)


ċḢịɗ⁾ny

Çevrimiçi deneyin!

{ ċ unt kadar sayıda take ead alın, sonra string ndex} dizesine ⁾ny .


OCSị⁾ny

Çevrimiçi deneyin!

Yukarıdaki Octave cevabına benzer. Hesaplama O Rd değeri alır (her Ord değeri için omplement x hesaplamak 1-x ,) S sonra, um Ben bir nDex dizisi içine ⁾ny .


Beni şaşırtan sahte çözümümdü!
Jonathan Allan

7

APL (Dyalog Unicode) , 15 bayt

'ny'[1+=/'y'=⍞]

Çevrimiçi deneyin!

Not: TIO varsayılanı olarak ayarlanmıştır ⎕IO = 1. Birlikte çalıştırılırsa ⎕IO←0,

APL (Dyalog Unicode) , 13 bayt

'ny'[=/'y'=⍞]

Çevrimiçi deneyin!

Bu XNOR işlevidir (özellikle eski BASIC'lerde bazen EQV olarak adlandırılır.

Ayrışma / Analiz:

               - Accept string input  
         'y'=   - Compare it to the letter `y`. This "converts" the input 
                  string into a vector of 1s and 0s where the 1s correspond 
                  to 'y' and the 0s to 'n'.  
       =/       - XNOR/EQV/equality reduction - converts the vector into a 
                  single boolean value by evaluating e.g., 1 xnor 0 xnor 0 
                  xnor 1 ...  
     1+         - adds one for subscripting in IO = 1 environment. In 
                  IO = 0, should be omitted (save 2 bytes)  
    [         ] - subscript indicator - the expression, which should be 
                  either a 1 or 2 (0 or 1 in `⎕IO = 0`), is now going to be 
                  interpreted as a subscript of...  
'ny'            - The string of possible results - a 0/1 is 'n', a 1/2 is 'y'

XOR 0'ları yok sayar ve 1'lerde ters çevirir, XNOR ise 1'leri yok sayar ve 0'larda ters çevirir, “başlangıçta” XOR gibi 0 yerine 1 olur.
FrownyFrog

@FrownyFrog - Sanırım ona bu şekilde bakabilirsin ... ya da her iki giriş değerinin aynı olup olmadığını görmek için bir kontrol olarak bakabilirsin.
Jeff Zeitlin

6

Pyth, 9 bayt

@"yn"l@\n

Burada deneyin

açıklama

@"yn"l@\n
     l@\nQ   Get the length of the intersection of the (implicit) input and "n".
@"yn"        Modular index into "yn".

6

dc , 39

?dsiZdsl[[]r1-d0<m]dsmxklixzll-2%B*C1+P

Giriş dizesi STDIN'den okunur ve formda olmalıdır [yynynynynyyn].

dc, dize kullanımı ile bilinmemektedir, ancak burada işe yarayacak kadar elimizde. Buradaki yaklaşım, ns'yi saymak ve yhatta veya ntekse çıktı almaktır. Bu, giriş dizesini makro olarak yürüterek yapılır. dcçıkış olacak 'y' (0171) unimplementedherkes için hatalar ys ve dizeleri pop ve tüm bunları yazdırmaya çalışırsanız ns. Bu yüzden önce []yığın üzerinde bol miktarda (toplam giriş dizesi uzunluğu) açacağımızdan emin oluruz . Sonra girdi dizesini yürütüyoruz ve yığınta kaç tane []kaldığını görüyoruz . Orijinal dize uzunluğu, (-ve) toplam ns sayısını vermek için bundan çıkarılır . Gerisi mod 2 yapmak için aritmetiktir ve çıktı ASCII yveya n.

?dsi                                    # Read input string, duplicate, store in register i
    Zdsl                                # Get input length, duplicate, store in register l
        [         ]                     # define macro to:
         []                             #   push empty string
           r                            #   swap empty string and remaining length 
            1-                          #   subtract 1 from length
              d0                        #   duplicate and compare with 0
                <m                      #   if >0 recursively call this macro again
                   dsmx                 # duplicate macro, store in register m and execute
                       k                # discard left-over 0
                        lix             # load input string and execute as macro
                           z            # get stack length
                            ll-         # load string length and subract
                               2%       # mod 2 (result is -ve because difference is -ve)
                                 B*     # multiply by 11 ('y' - 'n')
                                   C1+  # add 121 ('y')
                                      P # print result as ASCII char

Çevrimiçi deneyin!


6

Japt , 8 bayt

"yn"gUèn

Çevrimiçi deneyin!

Açıklama:

"yn"gUèn
"yn"       String literal - "yn"
    g      Return the char at index:   
      è      Number of matches where:
       n       "n" is found in
     U         Input

Japt dizin kaydırmayı kullanır, bu nedenle Uèndöndürürse 2, ykarakteri alırken geri döner "yn".


Sahip olduğumla aynı.
Shaggy




5

J , 10 9 bayt

{&'ny'@=/

Çevrimiçi deneyin!


1
Çok akıllı azaltma kullanımı!
Adám

Gerçekten güzel çözüm (ler)!
Galen Ivanov

Lütfen / her iki çözümün de ayrıştırılmasını sağlar mısınız (APL çözümümde yaptığım gibi)? (Bu arada, APL çözümünü, algoritma aynı olsa bile, J çözümünden ayrı bir çözüm olarak göndermelisiniz.)
Jeff Zeitlin

{&'ny'@=/bir bayt kaydeder.
algorithmmshark

@algorithmshark ohhh teşekkürler!
FrownyFrog

3

R , 4644 bayt

"if"(sum(1+utf8ToInt(scan(,"")))%%2,"n","y")

Çevrimiçi deneyin!

Giuseppe ve ngm sayesinde 2 bayt düştü. Luis Mendo'nun Octave cevabının limanı.


Octave cevabından ilham almak en kolayı; Octave, dizelerin kod noktalarına daha kolay dönüştürülmesi avantajına sahipken, yaklaşımı birkaç bayt aşağıya taşıyabileceğinizi düşünüyorum.
Giuseppe

sum(utf8ToInt(scan(,""))%%2)%%2bir bayt kaydeder.
ngm

@gius @Giuseppe ne yazık ki nilk önce + 1 eklemek zorunda bile ..
JayCe

3

Japt, 9 bayt

Oliver beni en kısa çözüme yendi, bu yüzden sadece bir bayt daha uzun olan bir çift var.

B*aUèÍu¹d

Dene

#ndB*UèÍv

Dene


açıklamalar

              :Implicit input of string U
B             :11
 *            :Mutiplied by
  a           :  The absolute difference of 11 and
   UèÍ        :    The count of "n" in U
      u       :    Mod 2
       ¹d     :Get the character at that codepoint
              :Implicit input of string U
#n            :110
   B*         :Add 11 multiplied by
        v     :  The parity of
     UèÍ      :    The count of "n" in U
  d           :Get the character at that codepoint

3

/// , 24 bayt

/ny/n//nn/y//yy/y//yn/n/<input>

Çevrimiçi deneyin!

Bence bu mümkün olan en kısa /// programıdır, çünkü bir karakter değiştirme yapmak ya işe yaramaz (yerine bir şey eklerseniz) ya da çıktı olmasını engeller (hiçbir şey eklemezseniz). Ancak, program iki karakter durumu ile ilgilenmesi gerektiğinden, bu en az düzeyde olmalıdır.

İlk önce ybir n. Daha sonra LTR ikamesinden faydalanarak çiftleri ns ile ydeğiştirir. Bu aşamada yen çok bir tane takip eder n; ys'yi tekilleştiriyoruz ve nsonuncuyu paspaslamak için bir kullanımı varsa y.


3

MATL , 8 bayt

Qs'ny'w)

Çevrimiçi deneyin!

Luis Mendo sayesinde 2 bayt tasarruf etti! Daha önce endeksi aralığa almak için açık modül komutunu kullandım 1,2.

açıklama

Bu, MATL'nin modüler indekslemeye sahip olduğu gerçeğini kullanır; bu, dizenin 1., 3., 5. ... öğelerinin nyaynı ( n) olduğu anlamına gelir . Dize ( y) öğesinin 2., 4., 6. ... ögeleri de öyle .

Q          % Grab input implicitly, and increment each ASCII-value by 1
           % This makes 'n' odd, and 'y' even
 s         % Take the sum of all elements
  'ny'     % Push the string `ny`
      w    % Swap the stack to facilitate the indexing
       )   % Take the n'th element of 'yn' and output it.

1
'yn'3)verir y...? Şimdi bu akıllı tasarım Luis =) İpuçları için teşekkürler! :)
Stewie Griffin






2

Java (OpenJDK 8) , 143 bayt

a->{char[] u=a.toCharArray();if(u.length==1)return u[0];else{char b=(u[0]==u[1])?'y':'n',i=2;for(;i<u.length;b=(b==u[i++])?'y':'n');return b;}}

Çevrimiçi deneyin!

Ve girdiyi liste olarak alırsak:

Java (OpenJDK 8) , 118 bayt

u->{if(u.length==1)return u[0];else{char b=(u[0]==u[1])?'y':'n',i=2;for(;i<u.length;b=(b==u[i++])?'y':'n');return b;}}

Çevrimiçi deneyin!

Açıklama:

(dize olarak giriş)

char[] u=a.toCharArray();  //turn string into char array
if(u.length==1){    
    return u[0];      //if single letter, return it
}else{
    char b=(u[0]==u[1])?'y':'n';     //first two XNOR
    for(char i=2;i<u.length;b=(b==u[i++])?'y':'n');   //XNOR each remaining character
return b;    //return final result
}

Üçlü ifslarınızda (-4 bayt) parantez gerekmez, char[]u(-1 bayt) boşluğu kaldırabilirsiniz ; ve if(u.length==1)olabilmektedir if(u.length<2)(-1 bayt). Muhtemelen golf için daha fazlası var, ama şu anda gerçekten zamanım yok. :)
Kevin Cruijssen


2

Cubix , 24 20 bayt

Cubix ile oynadığımdan beri bir süredir ...

i;iwW-?;o@..!'yv.n'|

Çevrimiçi deneyin!

Dizeyi aşan ve karakteri geçerli sonuçla karşılaştıran oldukça naif bir uygulama.

Etkileşimli Demo

Bu küpün üzerine aşağıdaki gibi açılır

    i ;
    i w
W - ? ; o @ . .
! ' y v . n ' |
    . .
    . .
  • W ipi sola kaydır
  • i ilk karakteri al
  • i? EOI (-1) için karakter al ve test et, ayrıca döngünün başlangıcı
    • EOI TOS'u ;o@kaldırırsa, TOS'u karakter olarak çıkar ve çık.
  • başka -W!çıkarma, ip sola kaydır, doğruluk testi
    • eğer doğruluk 'nn karakterini TOS'a
    • eğer falsey |!'yyansıtıyorsa, y karakterini TOS'a test edin ve itin
  • v'.;witerek ve kaldırarak küpün etrafında yeniden yönlendirin. karakteri ve sağ döngü içine geri kaydırma

2

Scala, 50 Bayt

def?(b:String)=b.reduce((r,l)=>if(r==l)'y'else'n')

2

Befunge-98 , 13 bayt

~k!aj@,+n'*b!

Çevrimiçi deneyin!

Temel olarak her bir 0 tersine çevirir ngirişi ve bir kez daha iyi ölçmek için, daha sonra çıktılar yiçin 1ve niçin0

~     Get inputted character
 k!   Invert the current value 110 (n) or 121 (y) + 1 times
   aj Jump past the rest of the code
~     Get input again. If no more input, reverse direction
            ! Invert the value once again
       +n'*b  Convert 0/1 to n/y
     @,       Output letter


2

JavaScript, 39 37 Bayt

s=>[...s].reduce((x,y)=>x==y?'y':'n')

Giriş dizesini böldükten sonra basit azaltma işlevi.


1
PPCG'ye Hoşgeldiniz! Kodunuz giriş değişkeni olduğunu varsayar solduğunu geçerli bir giriş yöntemi değil burada. Bunun yerine s=>cevabınızı 42 bayt için hazırlayarak cevabı girdiyi argüman olarak alan bir lambda işlevi yapabilirsiniz .
dzaima

golf öneri: değiştirmek s.split('')ile [...s]: 37 byte içins=>[...s].reduce((x,y)=>x==y?'y':'n')
dzaima

2

C (gcc) , 52 50 bayt

Öneriler için @Neil'e teşekkürler.

Ben sayma çözümünü ödünç aldım n, ama bir sayım tutmak yerine, sadece başlangıç ​​durumu ve ters bir arasında çevirir n.

i;f(char*a){for(i=*a;*++a;i^=*a&1?0:23);return i;}

Çevrimiçi deneyin!


*a&1?0:23bir bayt ve bir tane daha return ikaydeder.
Neil

Önermeki;f(char*a){for(i=*a;*++a;i^=*a&1?:23);a=i;}
ceilingcat

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.