うん、でもいや


46

私の同僚は最近、次のJavaScriptを冗談として送ってきました。

let butScript = (nrOfButs) => {
    for(var i = 0; i < nrOfButs; i++){
        if(i % 3 == 0){
            console.log("Yeah")
        }
        if(i % 2 == 0){
            console.log("But")
        }
        if(i % 3 == 1){
            console.log("No")
        }
    }
}

コードは勤務時間中に作成されたため、明らかに会社のリソースの膨大な無駄でした。将来同様の事態を防ぐために、労働時間の無駄を最小限に抑える必要があります。そして、短いプログラムを書く方が速いというのは一般的な知識なので、このコードをできるだけ短くする必要があります!

入力

単一の非負整数。誤った入力を処理してはなりません。

出力

プログラムは、上記のスクリプトと同じ出力を生成する必要があります。行ごとに1つの単語を出力する必要があり、単語の数は元のスクリプトと一致する必要があります。

非改行の空白文字は各行の最後に(ただし、先頭にではなく)含めることができます。これらは非表示であるためです。出力の最後に、改行文字を1つ追加できます。

Input: 0
Output:


Input: 1
Output:
Yeah
But

Input: 2
Output:
Yeah
But
No

Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah

3
行のリストを返すことはできますか?
ジョーキング

10
そのような面白いチャップで働くのは楽しいはずです!:sもう少し深刻な注意事項:nrOfButs変数の名前はかなり貧弱で、誤解を招く可能性があります。とにかく素晴らしくシンプルな挑戦。
アーナルド

10
最後の行が「あなたが言ったことを神は信じられない!」である場合、ボーナスを得るでしょうか?
Ciaran_McCarthy

3
@EriktheOutgolferはif条件が満たされた場合、現在のループを継続します。
dzaima

4
これまでで最もオーストラリアのコードゴルフ?それは「ナ」でなければなりません除いて
NACHT -復活モニカ

回答:


48

Excel、78バイト

セルA1の入力、およびセルのワードラップ書式設定がオンになっていると仮定します。Alt + Enterを使用して、文字列内に改行を追加し、空白に注意してください。REPT機能の制限により、最大3570の入力のみを処理します(ただし、セルをそれほど高くすることはできません)。

=LEFT(REPT("Yeah
But
No      
But     
Yeah    
But
No           
",595),A1*9)

空白のピリオドを使用した再印刷

=LEFT(REPT("Yeah
But
No......
But.....
Yeah....
But
No...........
",595),A1*9)

仕組み:パターンは6つの数字ごとに繰り返されます。

0 = Yeah and But      Yeah + linefeed + But + linefeed
1 = No                No + 6 whitespace + line feed
2 = But               But + 5 whitespace + linefeed
3 = Yeah              Yeah + 4 whitespace + linefeed
4 = But and No        But + linefeed + No + 3 whitespace
5 = Blank             8 whitespace + linefeed

これらはそれぞれ9文字で表現できるため、文字列は54文字(9 * 6)で構成され、Excelが許容する限りの大きさで繰り返されます。次に、左の9 *(入力の数)文字を出力として受け取ります。

「but and no」の改行は空白の後に配置され、#6、#12などのYeahが右ではなく左にフォーマットされ、6行ごとに空白の改行が追加されないようにします。そのアイテムの。

出力


1
これを確認する方法はありませんが、あなたの説明はそれが正しいように見えます。サンプルの入力/出力ペアを追加できますか?より馬鹿げた言語の1つですが、それでもすばらしい答えです。
maxb

16
@maxbそれが他の言語を破っているとき、それほどばかげたことはできません。
キータ

1
素晴らしい説明と非常にクールなテクニック。LibreOffice Calcでも機能しますが、フォーマットを少し試す必要があるかもしれません。+1
エルペドロ

20

JavaScript(ES6)、59 57バイト

f=n=>n?f(n-1)+[s=n&1?`But
`:'',`Yeah
`+s,s+`No
`][n%3]:''

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

どうやって?

からではなくからなる再帰関数を使用します。1 0 n 1n10n1

その結果、テストは参照コードと比較してオフになります。1

  • もし、出力"うん"n1(mod3)
  • もし、出力"しかし"n1(mod2)
  • もし、出力"いいえ"n2(mod3)

これにより、より単純なケースをルックアップ配列の最初のエントリとしてできます。ここで、を定義することができます:変数または空の文字列。sn0(mod3)s"But\n"

他の2つのエントリは"Yeah\n" + ss + "No\n"それぞれおよびとして定義されます。

注:からに反復することで、最初のエントリでを定義することもできますが、2つの余分な括弧が必要になります0 sn10s

コメント済み

f = n =>            // n = input
  n ?               // if n is not equal to 0:
    f(n - 1) +      //   prepend the result of a recursive call with n - 1
    [               //   define our lookup array:
      s = n & 1 ?   //     1st entry: if n is odd:
        `But\n`     //       set s to "But"
      :             //     else:
        '',         //       set s to an empty string
      `Yeah\n` + s, //     2nd entry: "Yeah" followed by s
      s + `No\n`    //     3rd entry: s followed by "No"
    ][n % 3]        //   append the correct entry for this iteration
  :                 // else:
    ''              //   return an empty string and stop recursion

16

LOLCODE、257バイト

HAI 1.2
I HAS A B
GIMMEH B
B IS NOW A NUMBR
I HAS A C ITZ 0
IM IN YR L UPPIN YR C TIL BOTH SAEM B AN C
I HAS A D ITZ MOD OF C AN 3
D
WTF?
OMG 0
VISIBLE "Yeah"
OIC
MOD OF C AN 2
WTF?
OMG 0
VISIBLE "But"
OIC
D
WTF?
OMG 1
VISIBLE "No"
OIC
IM OUTTA YR L
KTHXBYE

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


2
D:それは(!私は、コードにこれを嫌います)素晴らしいが、テストケースに10第2回「いいえ」と3「しかし、」反転します...だからうん、ないに見える
seadoggie01

2
おっと、最適化できると思いました。これはトリッキーなパターンです。今すぐ修正しました。
-JosiahRyanW

1
読み方が大好き
LocustHorde

4
VISIBLE "But"ズボンのプログラムの不足を参照してください?
JDL

12

空白315の 304 300 277 276バイト

-11バイト(使用されるラベルの量を8から7に減らす)と-24バイト(プログラムの一般的なフローを変更し、プロセスで使用されるラベルの量を7から5に減らす)の@JoKingに感謝します。

[S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_integer][N
S S N
_Create_Label_LOOP][S S S N
_Push_0][T  T   T   _Retrieve][N
T   S S N
_If_negative_jump_to_Label_PRINT][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][S S S T    S N
_Push_2][T  S S T   _Subtract][N
T   T   T   N
_If_negative_jump_to_Label_SKIP_NO][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N][N
S S T   N
_Create_Label_SKIP_NO][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  S N
_Push_2][T  S T T   _Modulo][N
T   S S S N
_If_0_jump_to_Label_SKIP_BUT][S S T T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   S S N
_Push_12_t][S S S T T   S T N
_Push_13_u][S S T   T   S S T   T   S N
_Push_-38_B][N
S S S S N
_Create_Label_RETURN_FROM_BUT][S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   T   T   _Retrieve][S S S T  N
_Push_1][T  S S T   _Subtract][T    T   S _Store][T T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][N
T   S S T   N
_If_0_jump_to_Label_YEAH][N
S N
N
_Jump_to_Label_LOOP][N
S S S T N
_Create_Label_YEAH][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S N
_Push_0_h][S S T    T   T   T   N
_Push_-7_a][S S T   T   T   N
_Push_-3_e][S S T   T   T   T   T   N
_Push_-15_Y][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    T   S T S S S N
_Push_104][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。

空白はこの挑戦のために右の言語...では空白は間違いなく両方のループではなく、if文はラベルで作られたラベルにジャンプし、それらがあれば、例のif-elseifを-他の例が、複数ではないので、されている、それは私を意味しますifごとにジャンプする必要があるため、かなり長くすると、チェックを少し修正して印刷をスキップする必要があります(@JoKingに感謝)。

擬似コードの説明:

Read STDIN as integer, and store it in the heap
Start LOOP:
  Integer i = retrieve integer from heap
  If(i is negative):
    Call function PRINT
  If(i modulo-3 is NOT 2):
    Jump to Label SKIP_NO
  Push "\noN" to the stack
  Label: SKIP_NO
  If(i modulo-2 is 0):
    Jump to Label SKIP_BUT
  Push "\ntuB" to the stack
  Label: SKIP_BUT
  i = i - 1
  Replace i in the heap with this updated value
  If(i modulo-3 is 0):
    Call function YEAH
  Go to next iteration of LOOP

function YEAH:
  Push "\nhaeY" to the stack
  Go to next iteration of LOOP

function PRINT:
  Print top of the stack as character to STDOUT
  Go to next iteration of LOOP (which will enter the if and then
                                comes back to this PRINT again)

追加の説明:

一般に、入力から0までループし、改行を押して単語を反転します(つまり、「はい」、「しかし」の代わりに「\ noN」、「\ ntuB」、「\ nhaeY」の順に並べます。 「、「いいえ\ n」)。そして、入力が0にループダウンし、すべての文字がスタック上にあると、それらの文字を逆順に印刷します(したがって、正しい出力順序)。

ただし、さらに詳しく:範囲内の単語を出力する必要(input, 0]がありますが、[input, 0)代わりに範囲内でループします。このため、if(i%3 == 2)「\ noN」のチェックを使用できます(実際にif(i%3 != 2)は「\ noN」のプッシュをスキップします)。またif(i%2 != 1)、「\ ntuB」のチェックを使用します(または実際if(i%2 == 0)に「\ ntuB」のプッシュをスキップします) )。これら2つのチェックの後でのみ、反復iを1 減らします。そしてif(i%3 == 0)、チャレンジの説明のJSサンプルコードと同様に、チェックを行って「\ nhaeY」をプッシュします。ラベルに移動してif-checksでラベルから戻る代わりに、if-notチェックでスキップすると23バイト節約されました。

また、空白文字値に(つまり、そのUnicode値としてスタックに格納されている10新ラインについて、65「A」のために、97「」、などのため)。スタックをループして文字を印刷する必要があるため、ホワイトスペースのヒント使用して、文字として印刷する前に、数値に定数を追加してバイトカウントを下げることもできます。
この104場合、この定数はこのJavaプログラムで生成されたもので以前に別のWhitespaceの答えをゴルフに使用したこともあります。それがコードのこの部分の理由でもあります:

[S S T  T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N]

-94改行、7「o」、および-26「N」の値があります。一定の追加ため、104正しくごUnicode値を与えるだろう10111と、78それぞれこれらの文字のために。


1
私は間違いなくホワイトスペースの答えを期待していなかった。よくやった!
maxb

@maxbありがとう!残念ながら、8つのラベルが必要なため、予想よりもかなり長くなります。しかし、すでに機能していることを嬉しく思います。:)
ケビンクルーイッセン

条件が偽の場合、次のifステートメントにスキップしてラベルを半分にできませんでしたか?例if i modulo-3 != 1 jump to next if else push NO
ジョーキング

1
@JoKingあ、ちょっと待って、あなたの擬似コードの一部を誤解した。が真になるi前に取得しないことに関する私の最初の問題if(i is 0) call PRINTですが、もう1つは、iそれを減算してプリントをスキップする前にチェックすることです。かなり賢い。引き続き実装します。
ケビンクルイッセン

1
さて、ループの先頭にジャンプすると、ifステートメントが再び実行され、印刷機能に直接ジャンプします。多分これはあなたが空のラベルにループラベルを変更する場合は、バイトが保存されます
ジョー・キング


11

Perl 6の63の 50バイト

{<<"Yeah But"No But Yeah"But No">>[^$_ X%6].words}

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

数字を受け取って行のリストを返す匿名コードブロック

説明:

{                                                }   # Anonymous code block
 <<"Yeah But"No But Yeah"But No">>  # Create the list of strings:
                                     # Yeah But
                                     # No
                                     # But
                                     # Yeah
                                     # But No
                                  [       ]  # Index into this list
                                   ^$_  # The range from 0 to n-1
                                       X%6  # All modulo 6
                                           .words  # Convert the list to a string 
                                                   # Which joins by spaces
                                                   # And split by whitespace


8

05AB1E(レガシー)27 25 24バイト

Kevin Cruijssenのおかげで1バイト節約されました

F”¥æ€³€¸”#N3ÖNÈN3%‚‚˜Ï`»

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

説明

F                          # for N in [0 ... input] do:
 ”¥æ€³€¸”#                 # push ['Yeah', 'But', 'No']
          N3Ö              # push N % 3 == 0
             NÈ            # push N % 2 == 0
               N3%         # push N % 3
                  ‚‚˜      # add the 3 numbers to a list
                     Ï     # keep only the strings whose corresponding value  
                           # in the int list is true (1)
                      `»   # push strings separately to stack and join stack on newlines

ダン、あなたはそれに私を打ち負かした..答えを投稿しようとしていた。ユアーズのニースの使用が..私からそう+1、とにかく短い×、そのことについて考えていませんでした!
ケビンクルーイッセン

うわー、これについての説明が欲しいです。私の個人的なベストはCJamで44バイトでした。
maxb

@maxb:もちろん説明を追加します。私はもう少し先にゴルフできるかどうかを確認しています;)
エミグナ

あなたは削除することができΘ、今あなたが使用しなくなっていること×から、Ïだけを見ていき1秒だけなので、それは無視2(および0その過程を)。
ケビンクルーッセン

@KevinCruijssen:ありがとう!私がそれを見逃した方法がわからない:P
エミグナ


6

パイソン297の 95 92 90 83 81バイト

lambda n:[w for i in range(n)for w in'Yeah','But','No'if('N'in w)==i%(3-(w<'N'))]

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

-2バイト、ovsのおかげ


Pythonの392の 90 85 83バイト

lambda n:[w for i in range(n)for w in['Yeah','But','No']if('N'in w)==i%(3-(w<'N'))]

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

-4バイト、ovsのおかげ

-4バイト、Jo Kingのおかげ


86バイト、2つを組み合わせて行のリストとして返す
ジョーキング

@JoKingありがとう、書いたときに印刷する代わりに戻ることができることを知りませんでした。
TFeld

82バイトlen(w)<3-> 'N'in w81バイトlen(w)%2->(w<'N')
ovs


6

Groovy(関数)、79バイト

最初に回答を送信してから、適切な回答を構成するものについて、ここでいくつかの歴史的な議論を検討しました。Javaのメソッド(戻り値の型とパラメーターの宣言を含む)のみを提供することは一般的に受け入れられているように見えるため、ここでは、メソッドの戻り値を返す短いGroovyメソッドを示します。を使用defすると、戻り値の型が推測されます。

def a(int n){n?a(--n)+(n%3?'':'Yeah\n')+(n%2?'':'But\n')+(n%3==1?'No\n':''):''}

0からn-1までループする以下の元の回答とは異なり、この回答は自身をnから1に呼び出しますが、再帰呼び出しの残りの行の入力を減らします。

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

Groovy(プログラム)、87バイト

Groovyスクリプトは特定の一般的なインポートを必要としないため、これは、System.out.前に宣言する必要なく、JavaのSTDOUTへの答えを出力するプログラムになりprintます。また、このようにtoLong()入力引数を合理的に簡潔に解析できる一般的なユーティリティメソッドも提供します。

基本的にはJava 10の答えですが、Groovyの短いループ構文と真実のステートメントを評価する機能を活用しています。

args[0].toLong().times{print((it%3?'':'Yeah\n')+(it%2?'':'But\n')+(it%3==1?'No\n':''))}

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


PPCGへようこそ!素晴らしい最初の答え!自分でGroovyをコーディングしたことはありませんが、TIOでコードを実行することをお勧めしますか?そうすれば、他の人がそれを検証し、すべての人が楽しむことができます。
maxb

1
@maxbありがとう!1つ追加しました:)
archangel.mjj

最初の回答は素晴らしく、PPCGへようこそ。
エルペドロ

5

Retina 0.8.2、45バイト

.+
$*
1
$`Yeah¶$`But¶$`11No¶
+`11B
B
111

A`1

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

.+
$*

入力を単項に変換します。

1
$`Yeah¶$`But¶$`11No¶

各integerに対して0...n-1、各単語i 1の前にsが付いた3行のテキストを生成します。ただし、を除きNo、これには2つの余分な1sがあり、(i+2)%3==0どちらがに相当するかを計算しi%3==1ます。

+`11B
B

1sの前にBsのペアを削除します。

111

1他のすべての場所で3つのグループのsを削除します。

A`1

がまだあるすべての行を削除します1


ああ、今私は11No¶計算するのを見ている(i+2)%3==0ので(3つすべてがifチェックです==0)、それはとても明白に見えますが、私はそれを自分で考えたことがなかったので、実際には非常に独創的です。私からの+1、いい答え!
ケビンクルーイッセン

5

Javaの10、100の 99バイト

n->{for(int i=0;i<n;)System.out.print((i%3<1?"Yeah\n":"")+(i%2<1?"But\n":"")+(++i%3>1?"No\n":""));}

@OlivierGrégoireのおかげで-1バイト。

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

説明:

n->{                   // Method with integer parameter and no return-type
  for(int i=0;i<n;)    //  Loop `i` in the range [0, `n`)
    System.out.print(  //   Print to STDOUT:
      (i%3<1?          //    If `i` is divisible by 3:
        "Yeah\n"       //     Print "Yeah" with newline
      :"")+(i%2<1?     //    If `i` is even:
        "But\n"        //     Print "But" with newline
      :"")+(++i%3>1?   //    If `i` modulo-3 is 1:
        "No\n"         //     Print "No" with newline
      :                //    If none of the above three if's applied to the current `i`:
       ""));}          //     Print nothing for the current `i`

1
++i%3>1おそらくあなたにバイトを保存します
オリヴィエ・グレゴワール

@OlivierGrégoireああ、もちろん。ありがとう!
ケビンクルーッセン

5

Powershell、75 74 72 67 66バイト

-1バイト、TessellatingHecklerに感謝

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

テストスクリプトと説明:

$f = {

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

# 1. repeat the string $n times
# 2. split by space
# 3. get elements from 1 to $n
# some elements are multiline strings, some elements are $null:
# ($null,"Yeah`nBut","But","No","But","Yeah","But`nNo",$null,...)
# 4. remove $null elements from result array

}

# Output results
@(
    0,1,2,10
) | % {
    &$f $_
    "======"
}

# Advanced test
@(
    ,(0,'')
    ,(1,'Yeah But')
    ,(2,'Yeah But No')
    ,(3,'Yeah But No But')
    ,(4,'Yeah But No But Yeah')
    ,(5,'Yeah But No But Yeah But No')
    ,(6,'Yeah But No But Yeah But No')
    ,(7,'Yeah But No But Yeah But No Yeah But')
    ,(8,'Yeah But No But Yeah But No Yeah But No')
    ,(9,'Yeah But No But Yeah But No Yeah But No But')
    ,(10,'Yeah But No But Yeah But No Yeah But No But Yeah')
    ,(20,'Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No')
) | % {
    $n,$e = $_
    $r = &$f $n
    $r = $r-split"`n"       # simplify test string
    "$($e-eq$r): $n : $r"
}

出力:

======
Yeah
But
======
Yeah
But
No
======
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
======
True: 0 :
True: 1 : Yeah But
True: 2 : Yeah But No
True: 3 : Yeah But No But
True: 4 : Yeah But No But Yeah
True: 5 : Yeah But No But Yeah But No
True: 6 : Yeah But No But Yeah But No
True: 7 : Yeah But No But Yeah But No Yeah But
True: 8 : Yeah But No But Yeah But No Yeah But No
True: 9 : Yeah But No But Yeah But No Yeah But No But
True: 10 : Yeah But No But Yeah But No Yeah But No But Yeah
True: 20 : Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No

簡単なスクリプト、72バイト:

$args|?{$_}|%{0..--$_|%{@('Yeah')[$_%3]
@('But')[$_%2]
@{1='No'}[$_%3]}}

1
素晴らしい答えです!オンライン通訳が含まれていないため、回答に出力を追加することは可能でしょうか?
maxb

答えscriptblockは返されません======Yeah,But,No文字列のみを生成します。テストスクリプトには、結果のみを読みやすくするための区切り記号が表示されます。
奇抜な

そのハッシュテーブルの使い方は賢いです。それを覚えておく必要があります。
AdmBorkBork


1
@mazzy私はあなたを定式ことができますが、まだ(2 \ nは実際の改行とを交換する)67を打つことができない(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
TessellatingHeckler

4

Haskell、71バイト

f n=[1..n]>>=(3?1)"Yeah"<>(2?1)"But"<>(3?2)"No"
(a?b)c n=[c|n`mod`a==b]

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

説明

かなり単純で、残りの[1..n]代わりに2バイトを節約し[0..n-1]、残りを調整しました:演算子(?)テストは4つの引数を取り、結果が正しい場合は空のリストまたは指定された文字列をシングルトンとして返します。

の4番目の引数をカリー化することにより、各関数の結果を連結(?)するために利用できます(<>)

(3?1)"Yeah" <> (2?1)"But" <> (3?2)"No"  \i-> (3?1)"Yeah" i ++ (2?1)"But" i ++ (3?2)"No" i

4

C#(Visual C#Interactive Compiler)105 99 94 96 89バイト

i=>{for(int x=0;x<i;)Write((x%3<1?"Yeah\n":"")+(x%2<1?"But\n":"")+(x++%3==1?"No\n":""));}

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


4
このような補間を削除すると、7バイト節約されます。
エミグナ

@Emignaヒントをありがとう、答えを変更しました
-auhmaan

1
x++%3==1?することができます++x%3>1?。他の誰かがちょうど私のJavaの答えのためにそれをひっくり返したが、同じはあなたのC#の答えにも当てはまる。:)
ケビンクルーイッセン

4

ピップ37 35 33バイト

"But 
Yeah
No
"<>5@:^[t2io02x]@<a

But。の後のスペースに注意してください。)入力をコマンドライン引数として受け取ります。オンラインでお試しください!

説明

この説明は以前のバージョンに関するものです。変更ログについては以下を参照してください

Jo KingのPerl 6回答に触発されました。このリストを作成します。

[
 "Yeah
 But
 ";
 "No
 ";
 "But
 ";
 "Yeah
 ";
 "But
 No
 ";
 ""
]

a巡回インデックスを使用して、その最初の要素を出力します。

[t2io02x]R,3["But""Yeah""No"].n@<:a
                                     i is 0; o is 1; t is 10; x is ""; n is newline;
                                     a is 1st cmdline arg (implicit)
[       ]                            Construct this list of scalars:
 t                                    10
  2                                   2
   i                                  0
    o                                 1
     02                               02
       x                              <empty string>
         R                           Treating each of these as a string, we're going to
                                     replace:
          ,3                          0, 1, and 2 (respectively)
                                     with the corresponding values from this list:
            ["But""Yeah""No"].n       These strings, each with a newline appended
                                     We now have constructed the list shown above
                               @<:a  Take the first a elements from this list, with
                                     cyclical indexing (the : is for parsing reasons)
                                     Concatenate them together and print (implicit)

更新: 0/1/2を文字列に変更するためにreplaceを使用する必要がないことに気付きました。これらの番号を使用して、リストに直接インデックスを付けることができます。これを行うには、複数桁の数字が数字のリストに分割されていることを確認する必要があります(そうでない場合は、インデックス1と0ではなくインデックス10を選択します)。幸いなことに、Pipのインデックスとして任意にネストされたリストを使用すると、期待どおりに機能し、結果の(ネストされた)リストが得られます。3を入力すると、次のデータの進行が得られ_ます(ここで改行を表します)。

"But _Yeah_No_"<>5                       ["But _"; "Yeah_"; "No_"]
                     [t2io02x]           [10; 2; 0; 1; 02; ""]
                              @<a        [10; 2; 0]
                    ^                    [[1; 0]; [2]; [0]]
                  @:                     [["Yeah_"; "But _"]; ["No_"]; ["But _"]]

前と同様に、最終結果は連結されて自動印刷されます。



4

C(gcc)77 71 74 72 69バイト

ここにはすでにより良いCの答えがありますが、これは再帰的であり、まっすぐになるまで時間がかかりましたので、投稿しています。

@ceilingcatと@JonathanFrechの両方のおかげで、最低69バイト

(n-i + 1の代わりにn-〜-iを使用するとは思わない)

i;f(n){i=n&&n-i>=~n/6&&f(n,i++,puts(i%7%4?i%7%2?"But":"No":"Yeah"));}

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


@JonathanFrechニースですが、ゼロまたは5では機能しません
cleblanc

@cleblancああ、ごめんなさい。気づかなかった...少なくとも削除するjと、2バイト節約できました。
ジョナサンフレッチ

1
70バイト -@ceilingcatの1つの保存されたバイトを組み込みます。
ジョナサンフレッチ

1
n-~-i相当しn-i+1ない- i<n+1...ので、実際には任意のバイトを保存しない-
ジョナサンFRECH

3

ルビー、69 72 74 バイト

->y{puts *(1..y).map{|i|[i%3==1&&:Yeah,i%2>0&&:But,i%3>1&&:No]-[!0]}}

非常に簡単な答えで、今より短い再帰的なメソッドをチェックしています。

@BWOのおかげで2バイト保存されました:)

文字列の代わりにシンボルを使用してさらに3バイトを保存しました


3

Python 3、93バイト

[print("Yeah\n"*(i%3<1)+"But\n"*(i%2<1)+"No\n"*(i%3==1),end="")for i in range(int(input()))]

これは必ずしも最善の解決策ではありませんが、それは私の考えです。

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


1
リスト内包表記で使用できる式が既にあるが、リスト内包表記がその式の副作用を誘発するためにのみ存在する場合、プレーンforループはより少ないバイトを必要とします。
ジョナサンフレッチ

3

R、65バイト

cat(c("yeah","but","no")[c(3,1:3,2,1,2)][1:scan()%%7+1],sep="\n")

わずかに欠陥のあるプログラムをレプリケートしているという事実のために(それは4つおきの「しかし」を逃します—それは使用されるべきでした) %4 == 1条件で%4 == 3はなく%3)に、cベース7 への厄介な呼び出しを使用して作業する必要があります。それでも、LOLCODEよりも短い...

((3,1,2,3,2,1,2)または同様の順列がlhデータセットのどこかに表示されることを期待していましたが、そのようには見えません)


3

sed -E179 150バイト

/^0/!s:$:g:
:l;y:abcdefg:bcdefga:
/[ae]/iYeah
/[bdf]/iBut
/[cg]/iNo
s:.$:-&:;:s;s:0-:-9:;ts;h
y:123456789:012345678:;G
s:.*(.)-.*\n(.*).-:\2\1:;tl;c\ 

最も難しいのは、リストを作成するのではなく、実際に10進数を解析することでした。

末尾の改行が不要な場合は、2バイトを保存できます:c\ d

依然として最適化が必要です。

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

説明

/^0/!                            | if the input number doesn`t begin with a '0'…
     s:$:g:                      | …then append a 'g' to it and proceed
                                 |
:l;                              | loop label 'l':
   y:abcdefg:bcdefga:            | shift all occurences of [abcdef] 1 letter forward, and all 'g'-s to 'a'-s
                                 |
/[ae]/                           | if there`s an 'a' or 'e' in the input…
      iYeah                      | …output 'Yeah'
                                 |
/[bdf]/                          | if there`s a 'b' or 'd' or 'f' in the input…
       iBut                      | …output 'But'
                                 |
/[cg]/                           | if there`s a 'c' or 'g' in the input…
      iNo                        | …output 'No' 
                                 |
s:.$:-&:;                        | insert '-' before the last character
         :s;                     | loop label 's':
            s:0-:-9:;            | transform the next consecutive '0' in the end of the number to '9', if any
                     ts;         | loop to 's' if more consecutive zeroes are available
                        h        | copy the result to the temporary buffer
                                 |
y:123456789:012345678:;          | decrement all digits except '0' (N.B.: digits, not numbers)
                       G         | append the temporary buffer to the result
                                 |
s:.*(.)-.*\n(.*).-:\2\1:;        | cut and replace the digit left to the last consecutive 0 in the original
                                 | number pasted from the temporary buffer, then discard all other digits decremented
                         tl;     | …then loop to 'l' if the number is ≥0
                            c\   | insert a carriage return and exit

説明してください。
ユーザー285259

1
@ user285259完了。
hidefromkgb


2

F#、108106バイト

let v p=seq{for i=1 to p do
 if i%3=1 then yield"Yeah"
 if i%2=1 then yield"But"
 if i%3=2 then yield"No"}

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

からi=0 to p-1に変更しi=1 to p、モジュロを調整する-2バイト。それとは別に、かなり簡単です。


1
TIOリンクで何らかのビルドエラーが発生しました。テストコードの構文エラーでしょうか。
maxb

ありがとう。元のソリューションはコンソールに直接印刷されましたが、シーケンスを返そうとすると、約2バイト短くなりました。そのため、TIOのコードを変更しましたが、フッターの更新を忘れていましvた。これは、関数がすべてを出力することを期待していました。
Ciaran_McCarthy

2
で2バイトを削るi=1 to p(そして当然ながらモジュラスを調整する)。逆の範囲は空です。:)

いいね!それを追加しました。ありがとう!:)
Ciaran_McCarthy


2

VBA(エクセル)、105、101、 99バイト

編集:Keetaから-4バイト!ありがとう!

編集2:Chronocidalから-2バイト!すごい!(テストケースは10でのみ機能することを認識しました。現在修正済みです)

ええ、Excelは今回VBAを破りました。なんでも。(私たちはあなたのために来ています)

d=vbCr:For i=1To[a1]:a=i Mod 3:?IIf(a=1,"Yeah"+d,"")IIf(i/2=i\2,"","But"+d)IIf(a=2,"No"+d,"");:Next

^これはイミディエイトウィンドウに貼り付けられ、デバッグウィンドウに出力されます。

非ゴルフ

d = vbCr
'For 1 to the value in A1 (using 0 gave extra values, and VBA skips the for loop if 0)
For i = 1 To [a1]    'aka: Range("A1").value
    a = i mod 3
    '? is the same as Print (Debug.Print when not in the Immediate Window)
    Print IIf(a = 1, "Yeah" + d, "") _ '<-- Just a line continuation
          'Keeta taught me that the \ operator is division with truncation,
          '     so if they are equal then there is no remainder!
          IIf(i / 2 = i \ 2, "", "But" + d) _
          IIf(a = 2, "No" + d, "");
    'Print usually prints a newline, but it still outputs if the string is blank...
    '   So we append a newline -if true- and use a semi-colon to kill the newline
Next

@Keeta良いアイデア、ない...あなたが私の最初のコードを見れば、私の使用[A1]範囲/セル.VALUEを意味:)私はかかわら説明し、それがより明確にしてきたはずです、申し訳ありません:/
seadoggie01

1
ええ、私はそれを見て、コメントを削除しようとしました。i mod 3 = 0の代わりにi / 3 = i \ 3を使用してください(mod 2 = 0でも同じです)。試したことはありませんが、動作しますか?
キータ

@Keeta私は、それが余りなし除算の値を返しますけれども、私はそうは思わない前に... ...モッズIの反対のようだと思う\演算子を見たことがない
seadoggie01

1つは整数除算で、もう1つは浮動小数点です。7/3 = 2.3333ここで、7 \ 3 = 2(除算の切り捨て)。6/3は2である必要があり、6 \ 3も2である必要があるため、剰余がゼロのときはいつでも動作するはずです(私は思う)。
キータ

1
VBAは関数出力を自動的に連結するため、&それぞれの間にIIf(..)2バイト追加することができます
-Chronocidal

2

ゼリー、22 バイト

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ

行のリストを生成する単項リンク(コメントで許可されているようです)

オンラインでお試しください!(フッターはリンクを使用して呼び出し、Ç改行を使用して結合しYます。これは、Jellyでの暗黙的な印刷が可能な場合はすべてを一緒に破壊するためです)

どうやって?

2×3=6

最初の6つの値は次のとおりです。

["Yeah", "But"]
["No"]
["But"]
["Yeah"]
["But", "No"]
[]

したがって、結果の行のリストは、これらの値がn連結された長さに繰り返される(または切り捨てられる)必要があります。

ここで、のパワーセット"Yeah", "But", "No"は次のとおりです。

[]
["Yeah"]
["But"]
["No"]
["Yeah", "But"]
["Yeah", "No"]
["But", "No"]
["Yeah", "But", "No"]

したがって、各期間は、次の1の指数セットのパワーセットです"Yeah", "But", "No"

5, 4, 3, 2, 7, 1

コードはこのリストをn作成し、長さを調整し、パワーセットにインデックスを付け、内部リストを削除します(ストリングはJellyのリストであるため、空のストリングも削除します)...

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ - Link: integer, n   e.g. 10
5                      - literal five            5
 R                     - range                   [1,2,3,4,5]
   7                   - literal seven           7
  ż                    - zip together            [[1,7],[2],[3],[4],[5]]
    F                  - flatten                 [1,7,2,3,4,5]
     Ṛ                 - reverse                 [5,4,3,2,7,1]
      ṁ                - mould like (n)          [5,4,3,2,7,1,5,4,3,2]
                    ¤  - nilad followed by link(s) as a nilad:
        “'⁴\ÆẓNƇ»      -   compressed string     "Yeah But No"
                 Ḳ     -   split at spaces       ["Yeah","But","No"]
                  ŒP   -   power-set             [[],["Yeah"],["But"],["No"],["Yeah","But"],["Yeah","No"],["But","No"],["Yeah","But","No"]]
       ị               - index into              [["Yeah","But"],["No"],["But"],["Yeah"],["But","No"],[],["Yeah","But"],["No"],["But"],["Yeah"]]
                     Ẏ - tighten                 ["Yeah","But","No","But","Yeah","But","No","Yeah","But","No","But","Yeah"]

これより短くなるとは思えない。素晴らしい答えと素晴らしい説明、よくやった!
maxb

2

パイソン293の 92 83バイト

lambda i:''.join('Yeah\n'*(x%3<1)+'But\n'*(x%2<1)+'No\n'*(x%3==1)for x in range(i))

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

@Jonathan Frechのおかげで保存された9バイトの大容量


タプルのインデックス付けの代わりに文字列の繰り返しを使用できます- ('','Yeah\n')[x%3<1]はに相当し"Yeah\n"*(x%3<1)ます。
ジョナサンフレッチ

@JonathanFrech-とてもクール!同様の手法は、他のケースにも適用できます。どうもありがとう!
エルペドロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.