はいまたはいいえの決定?


19

唯一の文字を含む、[長さ1-20]の文字列を入力した後、Yはい用および場合場合はnプログラムは結果(yまたはn)を出力します。入力例:yynynynnyyを出力します。

結果は、次の方法でyとnを組み合わせて決定されます。

  • y esおよびn oはn o と等しい

  • y esおよびy esはy esに等しい

  • n oおよびn oはy esに等しい

文字列に3つ以上の文字が含まれている場合(おそらく...)、計算は同じになります。例:

  • y esおよびy esおよびn oは等しい N O(noに第イエスとはマージはしないとイエスが残っていないと同じことが再び発生しているため)

  • n oおよびn oおよびn oはnと等しい O(YESに最初の二つなしのマージは、noに現れないイエスとノー左があります)

出力付きの入力例:

  • yynynynynyyn = n

ヒント:プログラムが機能する文字の順序は重要ではないことに注意してください。(たとえば、後ろから、または後ろから、入力を読むことができます。文字を混ぜて、ソートします。何が正しい出力であるかが重要です)、楽しんでください!

受賞基準:これはであるため、バイト単位の最短コードが優先されます。


3
明確な仕様による最初の挑戦おめでとうございます!(残念ながら、一部のコミュニティメンバーは「些細な」チャレンジを好まないことがあります。...)
user202729


7
別のペアを出力できますか?言う1のためにy、と0のためにn
オリバー

5
我々は、すなわち文字のリストとして入力を取ることができます["y", "n", "n"]
Okx

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実際、私は通常1つを追加しますが、休憩中にこれを打ち切り、編集するのを忘れていました。-
ニール

14

オクターブ29 27バイト

間違いを指摘してくれた@RickHithcockに感謝します。また、@ StewieGriffinのおかげで2バイトも節約できます!

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

オンラインでお試しください!

説明

のASCIIコードポイント'y'は奇数であり、'n'偶数です。コード

  1. 1入力文字列の各文字に追加して'y'均等にし、'n'偶数奇数にします。
  2. 合計を計算します。
  3. 結果が1偶数の場合、2偶数の場合、奇数のます。
  4. 文字列へのインデックス(1ベース)'yn'

私はおそらく明らかな何かを見逃していますが、これは -4バイトのいくつかの限られたテストケース同じように機能するようです。Octaveがわからないので、おそらく大間違いです!
ドムヘイスティングス

2
@DomHastingsはOPで指定された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-onlyこれは、少なくとも1つを含まない文字列では失敗しますn
アーナウルド

ああ、そうだ。エラー> _>
ASCIIのみ

8

Haskell33 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

オンラインでお試しください!

Cのount数n「はの文字列にNDEX ⁾ny。(モジュロ2を使用)


ċḢịɗ⁾ny

オンラインでお試しください!

{ C取るのount数Hが、その後、EAD I列にNDEXを} ⁾ny


OCSị⁾ny

オンラインでお試しください!

上記のオクターブの答えに似ています。計算O RD値取るCの(各ORD値についてomplementをX計算1-X Sその後、UM I NDEX列に⁾ny


それは私を混乱させる私の偽の解決策でした!
ジョナサンアラン

7

APL(Dyalog Unicode)、15バイト

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

オンラインでお試しください!

注:TIOのデフォルトは⎕IO = 1です。で実行する場合⎕IO←0

APL(Dyalog Unicode)、13バイト

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

オンラインでお試しください!

これはXNOR関数です(特に古いBASICでは、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を反転します。「最初」はXORのように0ではなく1になります。
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

dc、39

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

入力文字列はSTDINから読み取られ、形式である必要があります[yynynynynyyn]

dcは文字列処理で知られていませんが、これを機能させるのに十分なものがここにあります。ここでのアプローチは、ns をカウントし、y偶数またはn奇数の場合に出力することです。これは、入力文字列をマクロとして実行することにより行われます。 dc'y' (0171) unimplemented、すべてのys についてエラーを出力し、文字列をポップして、すべてのns について印刷しようとします。そのため、まず[]、スタック上にポップするための空の文字列(入力文字列の合計の長さ)が十分にあることを確認します。次に、入力文字列を実行[]し、スタックに残っているものを確認します。元の文字列の長さがこれから差し引かれて、(-ve)の合計数が与えられnます。残りはmod 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が返される場合2yから文字を取得するときに返され"yn"ます。


私が持っていたものと同一。
シャギー




5

J10 9バイト

{&'ny'@=/

オンラインでお試しください!


1
削減の非常に巧妙な使用法!
アダム

本当にいい解決策です!
ガレンイワノフ

APLソリューションで行ったように、両方のソリューションを分解してください。(ちなみに、アルゴリズムが同じであっても、実際にはAソリューションをJソリューションとは別のソリューションとして投稿する必要があります。)
ジェフ

{&'ny'@=/バイトを保存します。
algorithmshark

@algorithmsharkああありがとう!
FrownyFrog

3

R46 44バイト

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

オンラインでお試しください!

Giuseppeとngmのおかげで2バイト減少。ルイス・メンドによるオクターブの答え。


Octaveの答えに触発されるのが最も簡単です。Octaveには、文字列をコードポイントに簡単に変換できるという利点がありますが、そこに数バイトのアプローチを移植できると思います。
ジュゼッペ

sum(utf8ToInt(scan(,""))%%2)%%21バイト節約します。
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>

オンラインでお試しください!

これは可能な限り最短の///プログラムであると思います。1文字の置換を行うことは役に立たない(その場所に何かを挿入する場合)か、出力にならない(何も挿入しない場合)ためです。ただし、プログラムは2つの文字のケースを処理する必要があるため、これは最小限でなければなりません。

最初にのすべてyのを削除しますn。その後、LTR置換を利用して、double nysに置き換えます。この段階では、多くyのが続き、多くても1つ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...?これが賢い設計です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バイト)に括弧は必要ありませんchar[]u。(-1バイト)のスペースを削除できます。そして、if(u.length==1)することができif(u.length<2)(-1バイト)。たぶんゴルフにはもっとありますが、今は本当に時間がありません。:)
ケビンクルーッセン


2

キュビックス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!

オンラインでお試しください!

基本的nに、入力内のすべてに対して0を反転し、適切な測定のためにもう一度y1そしての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')

入力文字列を分割した後の単純なreduce関数。


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保存し、別のバイトを保存します。
ニール

提案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.