กำลังหาใช่หรือไม่?


19

หลังจากป้อนสตริง [ความยาว 1-20] มีเพียงตัวอักษรyสำหรับใช่และnสำหรับไม่ใช่โปรแกรมของคุณควรแสดงผลลัพธ์ (y หรือ n) อินพุตตัวอย่าง: yynynynnyจะส่งออก y

ผลลัพธ์ถูกกำหนดโดยการรวมค่า y และ n ด้วยวิธีต่อไปนี้:

  • y es และn o เท่ากับn o

  • y es และy es เท่ากับy es

  • n o และn o เท่ากับy es

หากสตริงมีอักขระมากกว่า 2 ตัว (น่าจะเป็น ... ) การคำนวณจะมีลักษณะเหมือนกัน ตัวอย่าง:

  • y es และy es และn o เท่ากับn o (เพราะไม่มีการรวมกับครั้งแรกใช่เป็นไม่จากนั้นไม่มีและใช่เหลือและสิ่งเดียวกันเกิดขึ้นอีกครั้ง)

  • n o และn o และn o เท่ากับn o (สองรายการแรกไม่มีการรวมเป็นใช่จากนั้นมีใช่และไม่เหลือซึ่งปรากฏเป็นไม่)

ตัวอย่างอินพุตพร้อมเอาต์พุต:

  • yynynynynyyn = n

เคล็ดลับ: โปรดทราบว่าลำดับของตัวอักษรที่โปรแกรมของคุณใช้งานไม่ได้สนใจ (ตัวอย่างเช่นคุณสามารถอ่านอินพุตจากด้านหลังหรือจากด้านหลังผสมตัวอักษรเรียงลำดับอะไรก็ได้สิ่งที่นับเป็น ouptput ที่ถูกต้อง) ขอให้สนุก!

เกณฑ์การชนะ: นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ


3
ขอแสดงความยินดีกับความท้าทายแรกด้วยสเปคที่ชัดเจน! (แม้ว่าจะเป็นเรื่องน่าเสียดายที่สมาชิกบางคนในชุมชนไม่ชอบความท้าทายที่ "น่าสนใจ" .... )
user202729

3
คล้ายกันมาก
user202729

7
เราสามารถส่งออกเป็นคู่สำรองได้หรือไม่? กล่าวว่า1สำหรับyและสำหรับ0 n
Oliver

5
เราสามารถรับข้อมูลเป็นรายการอักขระได้["y", "n", "n"]
ไหม

3
เนื่องจากความซ้ำซ้อนของความท้าทายนี้มีการลดระดับลงอย่างมากฉันไม่คิดว่ามันจะเป็นประโยชน์อย่างมากหากปิดสิ่งนี้ซ้ำ หากมีสิ่งใดความท้าทายที่เก่ากว่าควรซ้ำกับสิ่งนี้เนื่องจากมีนโยบายที่จะเปิดการท้าทายที่ดีกว่าฉันได้เปิดการท้าทายนี้อีกครั้ง
DJMcMayhem

คำตอบ:


9

ถ่าน 6 ไบต์

§yn№Sn

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

1
อธิบายวิธีการใช้งานได้ไหม
Malady

@ Malal Link คือการใช้รหัสรุ่น verbose
อดัม

1
@ Adámที่จริงฉันมักจะเพิ่มหนึ่ง แต่ฉันเพิ่งรีบออกไปในช่วงพักการทำงานและลืมที่จะแก้ไขหนึ่งใน
Neil

14

อ็อกเท29 29ไบต์

ขอบคุณ@RickHithcock ที่ชี้ให้เห็นข้อผิดพลาดตอนนี้แก้ไข นอกจากนี้ 2 ไบต์ยังต้องขอบคุณ@StewieGriffin!

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

ลองออนไลน์!

คำอธิบาย

จุดรหัส ASCII ของ'y'แปลกและที่'n'แม้แต่ รหัส

  1. เพิ่ม1ให้กับอักขระแต่ละตัวในสตริงอินพุตเพื่อสร้าง'y'คู่และ'n'คี่
  2. คำนวณผลรวม
  3. ลดผลการค้นหา1ถึงแม้ว่าจะเป็น2คี่
  4. ดัชนี (1-based) 'yn'ลงในสตริง

ฉันอาจจะขาดอะไรบางอย่างที่เห็นได้ชัด แต่ดูเหมือนว่าจะทำงานในลักษณะเดียวกันในกรณีทดสอบที่ จำกัด ไม่กี่ไบต์สำหรับ -4 ไบต์ มันอาจผิดอย่างรุนแรงเพราะฉันไม่รู้จักอ็อกเทฟ!
Dom Hastings

2
@DomHastings ล้มเหลวสำหรับ yynynynny ที่ให้ไว้ใน OP ควรส่งคืน y แต่ส่งคืน n
Skidsdev

9

JavaScript (ES6), 28 ไบต์

รับอินพุตเป็นสตริง

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

ลองออนไลน์!


JavaScript (ES6), 30 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ

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

ลองออนไลน์!


31:: s=>'yn'[s.match(/n/g).length&1]P
ASCII- เท่านั้น

@ ASCII-only สิ่งนี้อาจล้มเหลวในสตริงที่ไม่มีอย่างน้อยหนึ่งnรายการ
Arnauld

โอ้มันจะ โอ๊ะโอ> _>
ASCII- เท่านั้น

8

Haskell , 33 28 ไบต์

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

ดัชนีจำนวนของ n ลงในรายการอนันต์ "ynynynyn ... " วิธีการก่อนหน้า (33 ไบต์) คือคู่การพับของอิลิเมนต์ที่แตกต่างกันไปที่ n มิฉะนั้น y:

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

ลองออนไลน์!


1
วิธีการก่อนหน้าของคุณสามารถทำได้ใน 30 ไบต์ ลองออนไลน์!
ข้าวสาลีตัวช่วยสร้าง

7

เยลลี่ขนาด 7 ไบต์

ċ”nị⁾ny

ลองออนไลน์!

ount ountจำนวนของ” n , ị ndexลงในสตริงใด ๆ (กับ modulo 2)


ċḢịɗ⁾ny

ลองออนไลน์!

{ Cจำนวน ount ของใช้hอี๊ดแล้วฉัน nDex เข้า} สตริง⁾ny


OCSị⁾ny

ลองออนไลน์!

คล้ายกับคำตอบระดับแปดเสียงด้านบน คำนวณOค่าถใช้C omplement (สำหรับแต่ละค่าอ๊อดxคำนวณ1-x ), Sหนอแล้วฉัน nDex เป็นสตริง⁾ny


มันเป็นโซลูชันปลอมของฉันทำให้ฉันสับสน!
Jonathan Allan

7

APL (Dyalog Unicode)ขนาด 15 ไบต์

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

ลองออนไลน์!

⎕IO = 1ค่าเริ่มต้นติ้วไปที่: หมายเหตุ ถ้าทำงานด้วย⎕IO←0,

APL (Dyalog Unicode)ขนาด 13 ไบต์

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

ลองออนไลน์!

นี่คือฟังก์ชัน XNOR (บางครั้งเรียกว่า EQV โดยเฉพาะใน BASIC แบบเก่า

สลายตัว / วิเคราะห์:

               - 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 เพิกเฉย 0s และพลิกใน 1 วินาที XNOR จะไม่สนใจ 1 วินาทีและพลิกไปที่ 0s“ เริ่มต้น” อยู่ที่ 1 แทนที่จะเป็น 0 เช่น XOR
FrownyFrog

@ FronyFrog - ฉันคิดว่าคุณสามารถดูได้ด้วยวิธีนี้ ... หรือคุณอาจมองว่าเป็นการตรวจสอบเพื่อดูว่าทั้งสองค่าที่ป้อนเข้าเหมือนกันหรือไม่
Jeff Zeitlin

6

Pyth, 9 ไบต์

@"yn"l@\n

ลองที่นี่

คำอธิบาย

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

สายป้อนจะถูกอ่านจาก STDIN [yynynynynyyn]และควรจะอยู่ในรูปแบบ

dc ไม่เป็นที่รู้จักสำหรับการจัดการสตริง แต่เรามีเพียงพอที่จะให้มันทำงานได้ วิธีการที่นี่คือการนับns และเอาท์พุทyถ้าแม้กระทั่งหรือnแปลก สิ่งนี้ทำได้โดยการดำเนินการสตริงการป้อนข้อมูลเป็นแมโคร dcส่งออกจะ'y' (0171) unimplementedมีข้อผิดพลาดทั้งหมดyและพยายามที่จะปรากฏสตริงและพิมพ์พวกเขาสำหรับทุกns ดังนั้นก่อนอื่นเราต้องแน่ใจว่าเรามีสตริงว่าง (ความยาวสตริงทั้งหมด) []บนสแต็กถึงป๊อป จากนั้นเราจะดำเนินการกับสตริงอินพุตและดูจำนวน[]ที่เหลืออยู่ในสแต็ก ความยาวสายเดิมถูกลบออกจากนี้จะให้ (-ve) จำนวนรวมของns ส่วนที่เหลือเป็นทางคณิตศาสตร์ที่จะทำสมัยที่ 2 และมีผลผลิตออกมาทางขวาเป็น ASCII หรือyn

?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

ลองออนไลน์!


6

Japtet , 8 ไบต์

"yn"gUèn

ลองออนไลน์!

คำอธิบาย:

"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 ใช้ดัชนีห่อดังนั้นหากUènผลตอบแทน2ก็จะกลับเมื่อได้รับถ่านจากy"yn"


เหมือนกับสิ่งที่ฉันมี
Shaggy




5

J , 10 9 ไบต์

{&'ny'@=/

ลองออนไลน์!


1
การใช้งานที่ลดลงอย่างชาญฉลาดมาก!
อดัม

ทางออกที่ดีจริงๆ!
Galen Ivanov

คุณช่วยให้การสลายตัวของ / ทั้งสองโซลูชั่น (ฉันทำกับโซลูชั่น APL ของฉัน)? (โดยบังเอิญคุณควรโพสต์โซลูชั่น APL เป็นโซลูชันแยกต่างหากจากโซลูชัน J แม้ว่าอัลกอริทึมจะเหมือนกัน)
Jeff Zeitlin

{&'ny'@=/บันทึกเป็นไบต์
algorithmshark

@algorithmshark ohhh ขอบคุณ!
FrownyFrog

3

R , 46 44 ไบต์

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

ลองออนไลน์!

ลดลง 2 ไบต์ด้วย Giuseppe และ ngm ท่าเรือแห่งคำตอบระดับแปดเสียงโดย Luis Mendo


มันง่ายที่สุดที่จะได้รับแรงบันดาลใจจากคำตอบระดับแปดเสียง ในขณะที่อ็อกเทฟมีข้อได้เปรียบที่สตริงจะถูกแปลงเป็นจุดโค้ดของพวกเขาได้ง่ายขึ้นฉันคิดว่าคุณสามารถเปลี่ยนวิธีการที่นั่นเป็นสองไบต์ลง
Giuseppe

sum(utf8ToInt(scan(,""))%%2)%%2บันทึกหนึ่งไบต์
ngm

@ngm @Giuseppe เศร้าnคือแม้ดังนั้นต้องเพิ่ม + 1 เป็นครั้งแรก ..
Jayce

3

Japt, 9 ไบต์

โอลิเวอร์เอาชนะฉันไปถึงทางออกที่สั้นที่สุดดังนั้นนี่คือคู่ที่ยาวกว่าเพียงหนึ่งไบต์

B*aUèÍu¹d

ลองมัน

#ndB*UèÍv

ลองมัน


คำอธิบาย

              :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 ไบต์

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

ลองออนไลน์!

ฉันเชื่อว่านี่เป็นโปรแกรมที่สั้นที่สุด /// เนื่องจากการทดแทนอักขระหนึ่งตัวนั้นไม่มีประโยชน์ (ถ้าคุณแทรกบางสิ่ง) หรือป้องกันไม่ให้มันเป็นเอาต์พุต (ถ้าคุณแทรกอะไรลงไป) อย่างไรก็ตามเนื่องจากโปรแกรมจะต้องจัดการกับตัวละครทั้งสองกรณีนี้ควรจะน้อยที่สุด

ครั้งแรกที่เอาทุกสิทธิของy nจากนั้นแทนที่ double ns ด้วยys โดยใช้ประโยชน์จากการแทนที่ LTR ในขั้นตอนนี้มีหลายคนyตามมากที่สุดn; เรา deduplicate yและหากมีการnใช้มันเพื่อซับสุดท้ายyขึ้น


3

MATL , 8 ไบต์

Qs'ny'w)

ลองออนไลน์!

บันทึก 2 ไบต์ขอบคุณ Luis Mendo! ก่อนหน้านี้ฉันใช้คำสั่งโมดูลัสอย่างชัดเจนเพื่อดึงดัชนีเข้าสู่ช่วง1,2ก่อนหน้านี้ผมใช้คำสั่งโมดูลัสที่จะได้รับอย่างชัดเจนดัชนีลงในช่วง

คำอธิบาย

สิ่งนี้ใช้ความจริงที่ว่า MATL มีการทำดัชนีแบบแยกส่วนซึ่งหมายความว่าองค์ประกอบที่ 1, 3, 5 ... ของสตริงnyเหมือนกัน ( n) ดังนั้นองค์ประกอบที่ 2, 4, 6 ... ของสตริง ( 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)ให้y... ตอนนี้เป็นการออกแบบที่ฉลาด Luis =) ขอบคุณสำหรับคำแนะนำ! :)
Stewie Griffin






2

Java (OpenJDK 8) , 143 ไบต์

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

ลองออนไลน์!

และถ้าเรานำเข้าเป็นรายการ:

Java (OpenJDK 8) , 118 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

(อินพุตเป็นสตริง)

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
}

คุณไม่จำเป็นต้องใส่วงเล็บที่ ternary-ifs (-4 bytes) คุณสามารถลบช่องว่างที่char[]u(-1 ไบต์) และif(u.length==1)สามารถเป็นif(u.length<2)(-1 ไบต์) อาจจะมีกอล์ฟมากกว่านี้ แต่ตอนนี้ฉันไม่มีเวลาจริงๆ :)
Kevin Cruijssen


2

Cubix , 24 20 ไบต์

ไม่นานมานี้ตั้งแต่ฉันเล่นกับ Cubix ดังนั้น ...

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

ลองออนไลน์!

การใช้งานที่ไร้เดียงสาอย่างเป็นธรรมที่ทำตามขั้นตอนในสตริงและเปรียบเทียบอักขระกับผลลัพธ์ปัจจุบัน

การสาธิตเชิงโต้ตอบ

สิ่งนี้ไม่ได้ตัดลงบนคิวบ์ดังต่อไปนี้

    i ;
    i w
W - ? ; o @ . .
! ' y v . n ' |
    . .
    . .
  • W เลื่อน ip ไปทางซ้าย
  • i รับตัวละครเริ่มต้น
  • i? รับตัวละครและทดสอบ EOI (-1) เริ่มจากลูป
    • ถ้า EOI ;o@ลบ TOS ออก TOS เป็นตัวละครและออก
  • มิฉะนั้น-W!ลบ, ​​เลื่อน ip เหลือ, ทดสอบความจริง
    • ถ้าความจริง'nผลักดันตัวละคร n ไปที่ TOS
    • ถ้า falsey |!'yสะท้อนให้เห็นถึงการทดสอบและผลักดันตัวละคร y เพื่อ TOS
  • v'.;wเปลี่ยนทิศทางรอบลูกบาศก์ผลักและลบ ตัวละครและขยับกลับเข้าไปในวง


2

Befunge-98 , 13 ไบต์

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

ลองออนไลน์!

โดยทั่วไปจะแปลงค่า 0 สำหรับทุกค่าnในอินพุตและอีกครั้งสำหรับการวัดที่ดีจากนั้นจะแสดงผลลัพธ์yสำหรับ1และnสำหรับ0

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

ฟังก์ชั่นลดแบบง่ายหลังจากแยกสตริงอินพุต


1
ยินดีต้อนรับสู่ PPCG! รหัสของคุณถือว่าการป้อนข้อมูลที่อยู่ในตัวแปรsซึ่งเป็นไม่ได้เป็นวิธีการป้อนข้อมูลที่ถูกต้องที่นี่ คุณอาจให้คำตอบของคุณเป็นฟังก์ชั่นแลมบ์ดาที่รับอินพุตเป็นอาร์กิวเมนต์โดยs=>เตรียมคำตอบของคุณไว้ที่ 42 ไบต์
dzaima

ข้อเสนอแนะการเล่นกอล์ฟ: แทนที่s.split('')ด้วย[...s]สำหรับ 37 ไบต์:s=>[...s].reduce((x,y)=>x==y?'y':'n')
dzaima

2

C (gcc) , 52 50 ไบต์

ขอบคุณ @Neil สำหรับคำแนะนำ

ผมยืมการแก้ปัญหาของการนับns nแต่แทนที่จะรักษานับผมเพียงแค่พลิกระหว่างรัฐเริ่มต้นและผกผันบน

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

ลองออนไลน์!


*a&1?0:23บันทึกไบต์และreturn iบันทึกอื่น
Neil

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.