Xác định Có hay Không?


19

Sau khi nhập một chuỗi [độ dài 1-20], chỉ chứa các ký tự y cho có và n cho không, chương trình của bạn sẽ xuất kết quả (y hoặc n). Ví dụ đầu vào: yynynynnysẽ xuất y.

Kết quả được xác định bằng cách kết hợp y và n theo cách sau:

  • y es và n o bằng n o

  • y es và y es bằng y es

  • n o và n o bằng y es

Nếu chuỗi chứa nhiều hơn 2 ký tự (có thể ...), phép tính sẽ giống nhau. Ví dụ:

  • y es và y es và n o bằng n o (vì không hợp nhất với đầu tiên có thành không. sau đó không còn và có còn lại và điều tương tự lại xảy ra)

  • n o và n o và n o bằng n o (hai số không đầu tiên hợp nhất thành có, sau đó có có và không còn lại, xuất hiện thành không)

Ví dụ đầu vào với đầu ra:

  • yynynynynyyn = n

Mẹo: hãy nhớ rằng thứ tự các ký tự chương trình của bạn không hoạt động. (ví dụ: bạn có thể đọc đầu vào từ phía sau hoặc từ phía sau, trộn các chữ cái, sắp xếp nó, bất cứ thứ gì. Số đếm là ouptput chính xác) hãy vui vẻ!

Tiêu chí chiến thắng: đây là , vì vậy mã ngắn nhất trong byte thắng.


3
Chúc mừng thử thách đầu tiên với thông số kỹ thuật rõ ràng! (mặc dù thật không may khi một số thành viên trong cộng đồng không thích những thử thách "quá tầm thường" ....)
user202729


7
Chúng ta có thể xuất một cặp thay thế không? Nói 1cho y, và 0cho n.
Oliver

5
Chúng ta có thể lấy đầu vào làm danh sách các ký tự hay không["y", "n", "n"]
Okx

3
Vì bản sao của thử thách này đã bị đánh giá thấp, tôi không nghĩ việc đóng nó là một bản sao rất hữu ích. Nếu có bất cứ điều gì, thử thách cũ hơn phải là một bản sao của thử thách này vì chính sách để mở thử thách tốt hơn Tôi đã mở lại thử thách này
DJMcMayhem

Câu trả lời:


9

Than , 6 byte

§yn№Sn

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

1
Giải thích cách nó hoạt động, xin vui lòng?
Malady

@Malandy Liên kết là phiên bản dài dòng của mã.
Adám

1
@ Adám Trên thực tế, tôi thường thêm một cái, tuy nhiên tôi đã bỏ qua phần này trong giờ nghỉ làm việc và quên chỉnh sửa nó.
Neil

14

Octave , 29 27 byte

Cảm ơn @RickHithcock đã chỉ ra một lỗi, giờ đã sửa. Ngoài ra, giảm 2 byte nhờ @StewieGriffin!

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

Hãy thử trực tuyến!

Giải trình

Điểm mã ASCII 'y'là số lẻ và điểm 'n'chẵn. Mật mã

  1. thêm 1vào mỗi char trong chuỗi đầu vào để tạo 'y'chẵn và 'n'lẻ;
  2. tính tổng;
  3. giảm kết quả xuống 1nếu chẵn, 2nếu lẻ;
  4. lập chỉ mục (dựa trên 1) vào chuỗi 'yn'.

Tôi có thể thiếu một cái gì đó rõ ràng, nhưng điều này dường như hoạt động theo cùng một cách trong một vài trường hợp thử nghiệm giới hạn cho -4 byte. Có lẽ nó cực kỳ sai lầm vì tôi không biết Octave!
Dom Hastings

2
@DomHastings Thất bại cho yynynynny được đưa ra trong OP, sẽ trả về y, nhưng trả về n
Skidsdev

9

JavaScript (ES6), 28 byte

Đưa đầu vào dưới dạng một chuỗi.

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

Hãy thử trực tuyến!


JavaScript (ES6), 30 byte

Đưa đầu vào như một mảng các ký tự.

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

Hãy thử trực tuyến!


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

@ ASCII-only Điều này sẽ thất bại trên các chuỗi không chứa ít nhất một chuỗi n.
Arnauld

Ồ, nó sẽ Rất tiếc> _>
ASCII


7

Thạch , 7 byte

ċ”nị⁾ny

Hãy thử trực tuyến!

ount số của n n , ndex vào chuỗi ⁾ny . (với modulo 2)


ċḢịɗ⁾ny

Hãy thử trực tuyến!

{ C số ount của, lấy H ead, sau đó Ndex vào} chuỗi ⁾ny .


OCSị⁾ny

Hãy thử trực tuyến!

Tương tự như câu trả lời Octave ở trên. Tính giá trị O , lấy phép tính C (với mỗi giá trị ord x tính 1-x ), S um, sau đó ndex thành chuỗi ⁾ny .


Đó là giải pháp không có thật của tôi làm tôi bối rối!
Jonathan Allan

7

APL (Dyalog Unicode) , 15 byte

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

Hãy thử trực tuyến!

Lưu ý: TIO mặc định là ⎕IO = 1. Nếu chạy với ⎕IO←0,

APL (Dyalog Unicode) , 13 byte

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

Hãy thử trực tuyến!

Đây là chức năng XNOR (đôi khi được gọi là EQV, đặc biệt là trong các BASIC cũ.

Phân tích / Phân tích:

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

Trong khi XOR bỏ qua 0s và lật trên 1s, thì XNOR bỏ qua 1s và lật trên 0, ban đầu, ngay lập tức là ở mức 1 thay vì 0 như XOR.
FrownyFrog

@FrownyFrog - Tôi cho rằng bạn có thể nhìn nó theo cách đó ... hoặc bạn có thể xem nó như là một kiểm tra để xem liệu cả hai giá trị đầu vào của nó có giống nhau không.
Jeff Zeitlin

6

Bình thường, 9 byte

@"yn"l@\n

Hãy thử nó ở đây

Giải trình

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

6

đc , 39

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

Chuỗi đầu vào được đọc từ STDIN và phải ở dạng [yynynynynyyn].

dc không được biết đến với việc xử lý chuỗi của nó, nhưng chúng ta có đủ ở đây để làm việc này. Cách tiếp cận ở đây là đếm ns và đầu ra ynếu chẵn hoặc nlẻ. Điều này được thực hiện bằng cách thực hiện chuỗi đầu vào dưới dạng macro. dcsẽ xuất 'y' (0171) unimplementedlỗi cho tất cả các ys và cố gắng bật chuỗi và in chúng cho tất cả các ns. Vì vậy, trước tiên, chúng tôi đảm bảo rằng chúng tôi có rất nhiều (tổng chiều dài chuỗi đầu vào) của chuỗi trống []trên ngăn xếp để bật. Sau đó, chúng tôi thực hiện chuỗi đầu vào và xem có bao nhiêu []còn lại trên ngăn xếp. Độ dài chuỗi ban đầu được trừ đi từ này để cho tổng số (-ve) của ns. Phần còn lại là số học để làm mod 2 và có đầu ra xuất hiện đúng như ASCII yhoặc 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

Hãy thử trực tuyến!


6

Japt , 8 byte

"yn"gUèn

Hãy thử trực tuyến!

Giải trình:

"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 sử dụng gói chỉ mục, vì vậy nếu Uèntrả về 2, nó sẽ trả về ykhi lấy char từ đó "yn".


Đồng nhất với những gì tôi đã có.
Xù xì

5

Perl 6 , 21 byte

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

Thử nó

Mở rộng:

{  # 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

Java 8, 35 byte

Một người quyết định cho một ngôn ngữ thông thường! Tôi có thể làm điều đó.

s->s.matches("y*(ny*ny*)*")?'y':'n'

Dùng thử trực tuyến


5

J , 10 9 byte

{&'ny'@=/

Hãy thử trực tuyến!


1
Cách sử dụng rất thông minh của giảm!
Adám

Giải pháp thực sự tốt đẹp!
Galen Ivanov

Bạn có thể cung cấp một phân tách của / cả hai giải pháp (như tôi đã làm với giải pháp APL của mình) không? (Ngẫu nhiên, bạn thực sự nên đăng giải pháp APL dưới dạng một giải pháp riêng biệt khỏi giải pháp J, ngay cả khi thuật toán giống nhau.)
Jeff Zeitlin

{&'ny'@=/tiết kiệm một byte.
thuật toán

@alerskymshark ohhh cảm ơn!
FrownyFrog

3

R , 46 44 byte

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

Hãy thử trực tuyến!

Xuống 2 byte nhờ Giuseppe và ngm. Cảng câu trả lời Octave của Luis Mendo.


Thật dễ dàng để lấy cảm hứng từ câu trả lời Octave; trong khi Octave có lợi thế là các chuỗi được chuyển đổi thành các điểm mã của chúng dễ dàng hơn, tôi nghĩ bạn có thể chuyển cách tiếp cận ở đó cho một vài byte.
Giuseppe

sum(utf8ToInt(scan(,""))%%2)%%2tiết kiệm một byte.
ngm

@ngm @Giuseppe thật đáng buồn nlà thậm chí phải thêm + 1 trước ..
JayCe

3

Japt, 9 byte

Oliver đánh tôi với giải pháp ngắn nhất vì vậy đây là một cặp chỉ dài hơn một byte.

B*aUèÍu¹d

Thử nó

#ndB*UèÍv

Thử nó


Giải thích

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

Hãy thử trực tuyến!

Tôi tin rằng đây là chương trình /// ngắn nhất có thể, vì việc thay thế một ký tự là vô ích (nếu bạn chèn một cái gì đó vào vị trí của nó) hoặc ngăn không cho nó là đầu ra (nếu bạn không chèn gì). Tuy nhiên, vì chương trình phải giải quyết hai trường hợp nhân vật, nên điều này là tối thiểu.

Đầu tiên loại bỏ tất cả ycác quyền của một n. Sau đó thay thế ns kép bằng ys, lợi dụng thay thế LTR. Ở giai đoạn này có nhiều ys theo sau nhiều nhất là một n; chúng tôi lặp lại các ys và nếu có nsử dụng nó để lau lần cuối y.


3

MATL , 8 byte

Qs'ny'w)

Hãy thử trực tuyến!

Đã lưu 2 byte nhờ Luis Mendo! Trước đây tôi đã sử dụng lệnh modulus rõ ràng để đưa chỉ mục vào phạm vi 1,2.

Giải trình

Điều này sử dụng thực tế là MATL có lập chỉ mục mô-đun, có nghĩa là phần tử thứ 1, 3, 5 ... của chuỗi nylà giống nhau ( n). Vì vậy, phần tử thứ 2, 4, 6 ... của chuỗi ( 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)cho y...? Bây giờ đó là thiết kế thông minh Luis =) Cảm ơn vì lời khuyên! :)
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;}}

Hãy thử trực tuyến!

Và nếu chúng ta lấy đầu vào làm danh sách:

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

Hãy thử trực tuyến!

Giải trình:

(nhập dưới dạng chuỗi)

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
}

Bạn không cần dấu ngoặc đơn tại ternary-ifs (-4 byte), bạn có thể xóa khoảng trắng ở char[]u(-1 byte); và if(u.length==1)có thể là if(u.length<2)(-1 byte). Có lẽ có nhiều thứ để chơi gôn hơn, nhưng tôi không thực sự có thời gian ngay bây giờ. :)
Kevin Cruijssen


2

Hình khối , 24 20 byte

Đã được một thời gian kể từ khi tôi chơi với Cubix, vì vậy ...

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

Hãy thử trực tuyến!

Thực hiện khá ngây thơ mà bước qua chuỗi và so sánh nhân vật với kết quả hiện tại.

Demo tương tác

Điều này mở ra cho khối như sau

    i ;
    i w
W - ? ; o @ . .
! ' y v . n ' |
    . .
    . .
  • W thay đổi ip trái
  • i lấy ký tự ban đầu
  • i? nhận ký tự và kiểm tra EOI (-1), cũng bắt đầu vòng lặp
    • nếu EOI ;o@loại bỏ TOS, xuất ra Tosh dưới dạng ký tự và thoát.
  • -W!trừ khác , thay đổi ip trái, kiểm tra cho sự thật
    • nếu sự thật 'nđẩy nhân vật n đến ĐKDV
    • Nếu falsey |!'yphản ánh, kiểm tra và đẩy nhân vật y đến ĐKDV
  • v'.;wchuyển hướng xung quanh khối đẩy và loại bỏ a. nhân vật và dịch chuyển trở lại vào vòng lặp

2

Scala, 50 byte

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

2

Befunge-98 , 13 byte

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

Hãy thử trực tuyến!

Về cơ bản đảo ngược 0 cho mỗi nđầu vào, và một lần nữa cho thước đo tốt, sau đó đầu ra ycho 1ncho0

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

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

Hàm giảm đơn giản sau khi tách chuỗi đầu vào.


1
Chào mừng đến với PPCG! Mã của bạn giả sử đầu vào nằm trong biến s, đây không phải là phương thức nhập hợp lệ ở đây. Thay vào đó, bạn có thể biến câu trả lời của mình thành hàm lambda lấy đầu vào làm đối số bằng cách thêm vào s=>câu trả lời của bạn cho 42 byte.
dzaima

đề xuất chơi gôn: thay thế s.split('')bằng [...s]37 byte:s=>[...s].reduce((x,y)=>x==y?'y':'n')
dzaima

2

C (gcc) , 52 50 byte

Cảm ơn @Neil vì những gợi ý.

Tôi đã mượn giải pháp đếm ns, nhưng thay vì giữ một số đếm, tôi chỉ lật giữa trạng thái ban đầu và nghịch đảo của nó trên một n.

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

Hãy thử trực tuyến!


*a&1?0:23lưu một byte và return ilưu cái khác
Neil

Gợi ýi;f(char*a){for(i=*a;*++a;i^=*a&1?:23);a=i;}
trần mèo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.