Определение да или нет?


19

После ввода строки [длина 1-20], содержащей только символы y для yes и n для no, ваша программа должна вывести результат (y или n). Пример ввода: yynynynnyбудет выводить у.

Результат определяется путем объединения значений y и n следующим образом:

  • у эс и п о равных п О

  • у эс и у эс равен Y эс

  • n o и n o равно y es

Если строка содержит более 2 символов (вероятно ...), вычисления будут выглядеть одинаково. Примеры:

  • у эс и у эс и п о равных п о (потому что не сливается с первым да на нет. то не нет да и осталось и то же самое происходит и снова)

  • 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 Link -
Адам

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, данный в 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.
Арнаулд

О, это было бы. Упс> _>
только для 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

Попробуйте онлайн!

Ĉ р а ф количество «п , я NDEX в строки ⁾ny . (по модулю 2)


ċḢịɗ⁾ny

Попробуйте онлайн!

{ Ĉ р а ф числа, возьмите H 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, особенно в старых бейсиках).

Разложение / Анализ:

               - 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 с и переключается на 1 с, XNOR игнорирует 1 с и переключается на 0 с, «изначально» на 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при получении char от "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; В то время как у Octave есть преимущество в том, что строки легче преобразовывать в свои кодовые точки, я думаю, что вы можете перенести подход туда на пару байтов вниз.
Джузеппе

sum(utf8ToInt(scan(,""))%%2)%%2сохраняет один байт.
НГМ

@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. Затем заменяет двойной ns на ys, используя замену LTR. На этом этапе существует множество ys, за которыми следует не более одного 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
}

Вам не нужны круглые скобки в ваших троичных if-символах (-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 влево, проверьте правдивость
    • если правдивый 'nпуш символ в ТОС
    • если фальси |!'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 байт

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, но вместо того, чтобы вести подсчет, я просто переключаюсь между начальным состоянием и его инверсией на 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;}
потолок кошка

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.