Визначення Так чи Ні?


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

Якщо рядок містить більше двох символів (ймовірно ...), обчислення виглядатиме так само. Приклади:

  • y es і y es і n o дорівнює n o (тому що no зливається з першим так, щоб ні. тоді не залишається і так, і знову відбувається те саме)

  • n o і n o і n o дорівнює n o (перші два ні зливаються з так, тоді є "так" і "немає", які з'являються ні "

Приклад введення з виходом:

  • yynynynynyyn = n

Порада: майте на увазі, що порядок функцій, які працює у вашій програмі, не має значення. (наприклад, ви можете читати вхід ззаду або ззаду, змішувати літери, сортувати їх, що завгодно. Важливим є правильний вихід)!

Критерії виграшу: це , тому найкоротший код виграє в байтах


3
Вітаємо з першим викликом із чіткою специфікацією! (хоча прикро, що деякі члени спільноти не люблять "надто тривіальні" виклики ....)
user202729


7
Чи можемо ми вивести альтернативну пару? Скажімо , 1для yі 0для n.
Олівер

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
Поясніть, як це працює, будь ласка?
Маладі

@Malandy Посилання на багатослівну версію коду.
Адам

1
@ Adám Насправді я зазвичай додаю його, однак я щойно перервав це на перерві у роботі і забув його редагувати.
Ніл,

14

Октава , 29 27 байт

Завдяки @RickHithcock за вказівку на помилку, яку тепер виправлено. Також 2 байти вимкнено завдяки @StewieGriffin!

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

Спробуйте в Інтернеті!

Пояснення

Точка коду ASCII 'y'нечетна, а точка 'n'парного. Кодекс

  1. додає 1до кожного знака у рядку введення, щоб зробити 'y'парним і 'n'непарним;
  2. обчислює суму;
  3. зменшує результат до 1парного, 2непарного;
  4. індекси (на основі 1) у рядок 'yn'.

Я, мабуть, пропускаю щось очевидне, але це, здається, функціонує однаково в кількох обмежених тестових випадках на -4 байти. Це, мабуть, дико неправильно, тому що я не знаю Октава!
Дом Гастінгс

2
@DomHastings Невдача для yynynynny, подана в ОП, повинна повернутися 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-тільки Це не вдасться для рядків, які не містять принаймні однієї n.
Арнольд

О, це було б. На жаль, _ _
лише 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

Спробуйте в Інтернеті!

ċ unnt число ”n , de ndex у рядок ⁾ny . (з модулем 2)


ċḢịɗ⁾ny

Спробуйте в Інтернеті!

{ ċ unnt number of, візьміть Ḣ ead , а потім ndex в} рядок ⁾ny .


OCSị⁾ny

Спробуйте в Інтернеті!

Подібно до відповіді Октави вище. Розрахувати O - е значення, візьміть C omplement (для кожного значення ORD х обчислити 1-х ), ˙s мкм, а потім я NDEX в рядок ⁾ny .


Це моє хибне рішення бентежило мене!
Джонатан Аллан

7

APL (Dyalog Unicode) , 15 байт

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

Спробуйте в Інтернеті!

Примітка: за замовчуванням TIO до ⎕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 і перевертає на 1s, XNOR ігнорує 1s і перевертає на 0s, "спочатку" знаходиться на 1 замість 0, як XOR.
FrownyFrog

@FrownyFrog - Я думаю, ви могли би так поглянути на нього ... або ви можете розглянути на це як на перевірку, щоб побачити, чи обидва його вхідні значення однакові.
Джефф Зейтлін

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

постійний струм , 39

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

Вхідний рядок зчитується з STDIN і повинен бути у формі [yynynynynyyn].

DC не відомий своєю обробкою струнами, але у нас тут достатньо, щоб це працювало. Підхід тут полягає у підрахунку ns та виведенні, yякщо парне чи nнепарне. Це робиться шляхом виконання вхідного рядка як макросу. dcвидасть 'y' (0171) unimplementedпомилки для всіх ys та спробує вивести рядки та надрукувати їх для всіх ns. Отже, спочатку ми переконаймося, що []у стеку є достатня кількість (загальна довжина вхідних рядків) порожніх рядків . Потім виконуємо вхідний рядок і дивимося, скільки []залишилося в стеку. Початкова довжина рядка віднімається від цього, щоб отримати (-ve) загальну кількість ns. Решта арифметично робити мод 2 і мати вихідний результат як ASCII yабо 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

Спробуйте в Інтернеті!


6

Japt , 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".


Ідентично тому, що я мав.
Кудлатий




5

J , 10 9 байт

{&'ny'@=/

Спробуйте в Інтернеті!


1
Дуже розумне використання скорочень!
Адам

Дійсно приємне рішення (и)!
Гален Іванов

Надайте, будь ласка, декомпозицію / обох рішень (як я це зробив зі своїм рішенням APL)? (До речі, ви дійсно повинні розміщувати рішення APL як окреме рішення від рішення J, навіть якщо алгоритм той самий.)
Джефф Зейтлін

{&'ny'@=/зберігає байт.
алгоритм

@algorithmshark о, о, дякую!
FrownyFrog

3

R , 46 44 байти

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

Спробуйте в Інтернеті!

Вниз на 2 байти завдяки Джузеппе та НГМ. Відповідь Порта Октави Луїса Мендо.


Найпростіше надихнутися відповіддю Октави; в той час як Octave має перевагу в тому, що рядки перетворюються на кодові точки легше, я думаю, ви можете перенести підхід туди на пару байт вниз.
Джузеппе

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>

Спробуйте в Інтернеті!

Я вважаю, що це найкоротша можлива програма ///, оскільки заміна одного символу або є марною (якщо ви вставите щось на її місце), або запобігає її виведенню (якщо ви нічого не вставляєте). Однак, оскільки програма повинна мати справу з двома випадками характеру, це повинно бути мінімальним.

Спочатку видаляється все ys праворуч від an n. Потім замінює подвійний ns на ys, скориставшись заміною LTR. На цьому етапі існує багато yс, за якими слідує не більше одного n; ми дедублюємо ys і, якщо є його nвикористання, для миття останнього yвгору.


3

MATL , 8 байт

Qs'ny'w)

Спробуйте в Інтернеті!

Збережено 2 байти завдяки Луїсу Мендо! Раніше я використовував команду явного модуля, щоб отримати індекс у діапазон 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...? Тепер це розумний дизайн Луїс =) Дякую за поради! :)
Стюі Гріффін






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
}

Вам не потрібні круглі дужки у ваших потрійних ifs (-4 байти), ви можете видалити пробіл у char[]u(-1 байт); і if(u.length==1)може бути if(u.length<2)(-1 байт). На гольф, мабуть, більше, але зараз у мене дійсно немає часу. :)
Кевін Круїссен


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 вліво, перевірити на truthy
    • якщо правдивий 'nпоштовх символів n до TOS
    • якщо фальси |!'yвіддзеркалюють, тестуйте та натискайте символ y на TOS
  • v'.;wперенаправлення навколо куба, натискання та виймання a. персонаж і переміщення прямо назад у цикл


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 байт

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

Проста функція зменшення після розбиття вхідного рядка.


1
Ласкаво просимо до PPCG! Ваш код передбачає, що введення знаходиться в змінній s, що тут не є дійсним методом введення . Натомість ви можете зробити свою відповідь лямбда-функцією, беручи вхід як аргумент, попередньо s=>відповівши на 42 байти.
дзайма

гольф пропозицію: замінити s.split('')з [...s]на 37 байт:s=>[...s].reduce((x,y)=>x==y?'y':'n')
dzaima

2

C (gcc) , 52 50 байт

Дякуємо @Neil за пропозиції.

Я запозичив рішення підрахунку ns, але замість того, щоб вести підрахунок, я просто переходжу між початковим станом та його зворотним на an n.

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

Спробуйте в Інтернеті!


*a&1?0:23зберігає байт і return iзберігає інший.
Ніл

Запропонуватиi;f(char*a){for(i=*a;*++a;i^=*a&1?:23);a=i;}
roofcat

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.