Menentukan Ya atau Tidak?


19

Setelah memasukkan string [panjang 1-20], hanya berisi karakter y untuk ya dan n untuk tidak, program Anda harus menampilkan hasilnya (y atau n). Contoh input: yynynynnyakan menampilkan y.

Hasilnya ditentukan dengan menggabungkan y dan n dengan cara berikut:

  • y es dan n o sama dengan n o

  • y es dan y es sama dengan y es

  • n o dan n o sama y es

Jika string berisi lebih dari 2 karakter (kemungkinan ...), perhitungannya akan terlihat sama. Contoh:

  • y es dan y es dan n o sama dengan n o (karena tidak ada yang menyatu dengan ya pertama untuk tidak. maka tidak ada dan ya tersisa dan hal yang sama terjadi lagi)

  • n o dan n o dan n o sama dengan n o (dua tidak yang pertama bergabung dengan ya, maka ada ya dan tidak ada kiri, yang muncul menjadi tidak)

Contoh input dengan output:

  • yynynynynyyn = n

Kiat: ingatlah bahwa urutan karakter program Anda tidak berfungsi. (misalnya Anda dapat membaca input dari belakang, atau dari belakang, mencampur surat-surat, mengurutkannya, apa pun. Yang penting adalah ouptput yang benar) bersenang-senang!

Kriteria kemenangan: ini adalah , jadi kode terpendek dalam byte menang.


3
Selamat atas tantangan pertama dengan spesifikasi jelas! (walaupun sangat disayangkan bahwa beberapa anggota masyarakat tidak menyukai tantangan "terlalu sepele" ....)
user202729


7
Bisakah kita menghasilkan pasangan alternatif? Katakan 1untuk y, dan 0untuk n.
Oliver

5
Bisakah kita mengambil input sebagai daftar karakter yaitu["y", "n", "n"]
Okx

3
Karena duplikat dari tantangan ini banyak diturunkan, saya tidak berpikir itu sangat membantu untuk menutup ini sebagai duplikat. Jika ada, tantangan yang lebih lama harus merupakan duplikat dari tantangan ini karena kebijakan untuk membiarkan tantangan yang lebih baik tetap terbuka. Saya telah membuka kembali tantangan ini
DJMcMayhem

Jawaban:


9

Arang , 6 byte

§yn№Sn

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

1
Tolong jelaskan cara kerjanya?
Malady

@Malandy Link adalah untuk
Adám

1
@ Adám Sebenarnya saya biasanya menambahkan satu, namun saya baru saja menghancurkannya dalam waktu istirahat dan lupa mengeditnya.
Neil

14

Oktaf , 29 27 byte

Terima kasih kepada @RickHithcock karena telah menunjukkan kesalahan, sekarang diperbaiki. Juga, 2 byte off berkat @StewieGriffin!

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

Cobalah online!

Penjelasan

Titik kode ASCII 'y'aneh, dan 'n'bahkan genap. Kode

  1. menambah 1setiap karakter dalam string input untuk membuat 'y'genap dan 'n'ganjil;
  2. menghitung jumlahnya;
  3. mengurangi hasilnya menjadi 1jika genap, 2jika ganjil;
  4. indeks (berbasis 1) ke dalam string 'yn'.

Saya mungkin kehilangan sesuatu yang jelas, tetapi ini tampaknya berfungsi dengan cara yang sama dalam beberapa kasus uji terbatas untuk -4 byte. Mungkin salah besar karena saya tidak tahu Oktaf!
Dom Hastings

2
@DomHastings Gagal untuk yynynynny yang diberikan di OP, harus mengembalikan y, tetapi mengembalikan n
Skidsdev

9

JavaScript (ES6), 28 byte

Mengambil input sebagai string.

s=>'ny'[s.split`n`.length&1]

Cobalah online!


JavaScript (ES6), 30 byte

Mengambil input sebagai array karakter.

y=>'yn'[n=1,~~eval(y.join`^`)]

Cobalah online!


31:: s=>'yn'[s.match(/n/g).length&1]P
ASCII-satunya

@ Khusus ASCII Ini akan gagal pada string yang tidak mengandung setidaknya satu n.
Arnauld

Oh, tentu saja. Ups> _>
ASCII-satunya

8

Haskell , 33 28 byte

f a=cycle"yn"!!sum[1|'n'<-a]

Mengindeks jumlah n ke dalam daftar tak terbatas "ynynynyn…". Pendekatan sebelumnya (33 byte) adalah melipat pasangan elemen yang berbeda ke n, jika tidak y:

f=foldl1(\a b->last$'y':['n'|a/=b])

Cobalah online!


1
Pendekatan Anda sebelumnya dapat dilakukan dalam 30 byte. Cobalah online!
Wheat Wizard

7

Jelly , 7 byte

ċ”nị⁾ny

Cobalah online!

ċ jumlah ount "n , ndex ke dalam string ⁾ny . (dengan modulo 2)


ċḢịɗ⁾ny

Cobalah online!

{ ċ jumlah ount, ambil Ḣ ead , lalu ndex ke} string ⁾ny .


OCSị⁾ny

Cobalah online!

Mirip dengan jawaban Oktaf di atas. Hitung O rd nilai, mengambil C omplement (untuk setiap nilai ord x menghitung 1-x ), S um, maka Aku ndex ke dalam string ⁾ny .


Itu solusi palsu saya membingungkan saya!
Jonathan Allan

7

APL (Dyalog Unicode) , 15 byte

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

Cobalah online!

Catatan: TIO default ke ⎕IO = 1. Jika dijalankan dengan ⎕IO←0,

APL (Dyalog Unicode) , 13 byte

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

Cobalah online!

Ini adalah fungsi XNOR (kadang-kadang disebut EQV, terutama di BASIC lama.

Dekomposisi / Analisis:

               - 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'

Sementara XOR mengabaikan 0s dan membalik pada 1s, XNOR mengabaikan 1s dan membalik pada 0s, "awalnya" berada pada 1 bukannya 0 seperti XOR.
FrownyFrog

@FrownyFrog - Saya kira Anda bisa melihatnya seperti itu ... atau Anda bisa melihatnya sebagai cek untuk melihat apakah kedua nilai inputnya sama.
Jeff Zeitlin

6

Pyth, 9 byte

@"yn"l@\n

Coba di sini

Penjelasan

@"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

String input dibaca dari STDIN dan harus dalam bentuk [yynynynynyyn].

dc tidak dikenal untuk penanganan string-nya, tapi kami hanya punya cukup di sini untuk membuatnya bekerja. Pendekatan di sini adalah untuk menghitung ns, dan output yjika genap atau njika ganjil. Ini dilakukan dengan mengeksekusi string input sebagai makro. dcakan menampilkan 'y' (0171) unimplementedkesalahan untuk semua ydan mencoba untuk memunculkan string dan mencetaknya untuk semua n. Jadi pertama-tama kita memastikan bahwa kita memiliki banyak (total panjang string input) dari string kosong []pada stack untuk pop. Kemudian kita mengeksekusi string input dan melihat berapa banyak []yang tersisa di stack. Panjang string asli dikurangi dari ini untuk memberikan (-ve) jumlah total ns. Sisanya adalah aritmatika untuk melakukan mod 2 dan memiliki output yang keluar seperti ASCII yatau 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

Cobalah online!


6

Japt , 8 byte

"yn"gUèn

Cobalah online!

Penjelasan:

"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 menggunakan pembungkus indeks, jadi jika Uènkembali 2, itu akan kembali yketika mendapatkan char dari "yn".


Identik dengan apa yang saya miliki.
Shaggy

5

Perl 6 , 21 byte

{<y n>[.comb('n')%2]}

Cobalah

Diperluas:

{  # bare block lambda with implicit parameter $_

  # index into the list ('y', 'n')
  <y n>[

    .comb('n') # get every instance of 'n' (implicit method call on $_)
    % 2        # turn it into a count and get the modulus

  ]
}



5

J , 10 9 byte

{&'ny'@=/

Cobalah online!


1
Penggunaan reduksi yang sangat pintar!
Adám

Solusi yang sangat bagus!
Galen Ivanov

Apakah Anda mau memberikan dekomposisi / kedua solusi (seperti yang saya lakukan dengan solusi APL saya)? (Kebetulan, Anda harus benar-benar memposting solusi APL sebagai solusi terpisah dari solusi J, bahkan jika algoritmenya sama.)
Jeff Zeitlin

{&'ny'@=/menghemat satu byte.
algorithmshark

@algorithmshark ohhh terima kasih!
FrownyFrog

3

R , 46 44 byte

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

Cobalah online!

Turun 2 byte berkat Giuseppe dan ngm. Port of the Octave menjawab oleh Luis Mendo.


Paling mudah untuk terinspirasi oleh jawaban Oktaf; sementara Oktaf memiliki keunggulan bahwa string dikonversi ke poin kode mereka lebih mudah, saya pikir Anda dapat port pendekatan di sana selama beberapa byte ke bawah.
Giuseppe

sum(utf8ToInt(scan(,""))%%2)%%2menghemat satu byte.
ngm

@ngm @Giuseppe dengan sedih nbahkan harus menambahkan +1 terlebih dahulu ..
JayCe

3

Japt, 9 byte

Oliver mengalahkan saya ke solusi terpendek jadi di sini ada beberapa yang hanya satu byte lebih lama.

B*aUèÍu¹d

Cobalah

#ndB*UèÍv

Cobalah


Penjelasan

              :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 byte

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

Cobalah online!

Saya percaya ini adalah program /// yang sesingkat mungkin, karena membuat subtitusi satu karakter tidak berguna (jika Anda memasukkan sesuatu di tempatnya) atau mencegahnya menjadi keluaran (jika Anda tidak memasukkan apa pun). Namun, karena program harus menangani dua kasus karakter, ini harus minimal.

Pertama menghapus semua yhak suatu n. Kemudian ganti double ns dengan ys, manfaatkan substitusi LTR. Pada tahap ini ada banyak ydiikuti oleh paling banyak satu n; kami mendupuplikasi ys dan jika adan menggunakannya untuk mengepel yang terakhir y.


3

MATL , 8 byte

Qs'ny'w)

Cobalah online!

Disimpan 2 byte berkat Luis Mendo! Saya sebelumnya menggunakan perintah modulus eksplisit untuk mendapatkan indeks ke dalam kisaran 1,2.

Penjelasan

Ini menggunakan fakta bahwa MATL memiliki pengindeksan modular, yang berarti bahwa elemen ke-1, ke-3, ke-5 dari string nyadalah sama ( n). Begitu juga elemen 2, 4, 6 ... dari string ( y).

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)memberi y...? Nah, itu desain yang pintar Luis =) Terima kasih atas tipsnya! :)
Stewie Griffin






2

Java (OpenJDK 8) , 143 byte

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;}}

Cobalah online!

Dan jika kita mengambil input sebagai daftar:

Java (OpenJDK 8) , 118 byte

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;}}

Cobalah online!

Penjelasan:

(masukan sebagai string)

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
}

Anda tidak perlu tanda kurung di ternary-ifs Anda (-4 bytes), Anda dapat menghapus spasi di char[]u(-1 byte); dan if(u.length==1)bisa if(u.length<2)(-1 byte). Mungkin ada lebih banyak golf, tetapi saya tidak punya waktu sekarang. :)
Kevin Cruijssen


2

Cubix , 24 20 byte

Sudah lama sejak saya bermain dengan Cubix, jadi ...

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

Cobalah online!

Implementasi yang cukup naif yang melangkah melalui string dan membandingkan karakter dengan hasil saat ini.

Demo Interaktif

Ini membuka ke dalam kubus sebagai berikut

    i ;
    i w
W - ? ; o @ . .
! ' y v . n ' |
    . .
    . .
  • W geser ip ke kiri
  • i dapatkan karakter awal
  • i? dapatkan karakter dan tes untuk EOI (-1), juga mulai dari loop
    • jika EOI ;o@menghapus TOS, keluarkan TOS sebagai karakter dan keluar.
  • lain -W!kurangi, geser ip ke kiri, uji kebenaran
    • jika benar 'ndorong karakter n ke TOS
    • jika falsey |!'ymencerminkan, menguji dan mendorong karakter y ke TOS
  • v'.;wredirect di sekitar kubus mendorong dan menghapus a. karakter dan bergeser kembali ke loop

2

Scala, 50 Bytes

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

2

Befunge-98 , 13 byte

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

Cobalah online!

Pada dasarnya membalikkan 0 untuk setiap ninput, dan sekali lagi untuk ukuran yang baik, kemudian output yuntuk 1dan nuntuk0

~     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 Bytes

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

Sederhanakan fungsi setelah memisahkan string input.


1
Selamat datang di PPCG! Kode Anda mengasumsikan input dalam variabel s, yang bukan metode input yang valid di sini. Sebagai gantinya, Anda dapat membuat jawaban Anda sebagai fungsi lambda yang mengambil input sebagai argumen dengan menambahkan sebelumnyas=> jawaban Anda ke 42 byte.
dzaima

saran bermain golf: ganti s.split('')dengan [...s]untuk 37 byte:s=>[...s].reduce((x,y)=>x==y?'y':'n')
dzaima

2

C (gcc) , 52 50 byte

Terima kasih kepada @Neil untuk sarannya.

Saya meminjam solusi penghitungan n, tetapi alih-alih menghitung, saya hanya beralih antara keadaan awal dan kebalikannya pada n.

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

Cobalah online!


*a&1?0:23menyimpan satu byte dan return imenyimpan yang lain.
Neil

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.