嫌い/愛の難問


30

チャレンジの説明

この課題では、我々は唯一の考慮lovehate感情など。秩序の感情表現を発したい場合はN、次の2つを交互に使用します(で始まりますhate)。

order | expression

1       I hate it.
2       I hate that I love it.
3       I hate that I love that I hate it.
4       I hate that I love that I hate that I love it.

パターンは、すべての正の整数に対して続きますN。与えられたN、秩序の対応感表現を出力してくださいN

ノート

  • .式の最後の完全停止()は必須です。
  • 末尾および先頭の空白(改行を含む)は許可されますが、
  • 非正または非整数の出力Nは未定義であり、
  • これは課題なので、コードをできるだけ短くしてください。


1
かなり混乱しています。そうでorder入力、およびexpression出力は?
誰が

2
@Whothehellisthatはい、正確に。(PPCGへようこそ!:))
マーティンエンダー

@Whothehellisthat:はい。あなたは標準入力から入力を受け取ることができますが、メソッド(関数)を定義する方が短いことがよくあります。これは、以下のサブミッションで見ることができます。
shooqie

1
私はこの質問とその答えが大好きだと嫌いです!
Arkiliknam

回答:



15

CJam、36バイト

ri{"hatlov"3/='IS@"e that "}/2<"it."

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

説明

ri            e# Read input and convert to integer N.
{             e# For each i from 0 to N-1...
  "hatlov"3/  e#   Push ["hat" "lov"].
  =           e#   Use i as a cyclic index into this array to alternate between
              e#   "hat" and "lov".
  'IS         e#   Push character 'I' and a space.
  @           e#   Pull "hat" or "lov" on top of it.
  "e that "   e#   Push "e that "
}/
2<            e#   Truncate the last "e that " to just "e ".
"it."         e#   Push "it."

7

C、83 76 75 74バイト

11バイトを保存し、4バイトを追加してくれた@Leaky Nunに感謝します!
バイトを保存してくれた@YSCに感謝します!

i;f(n){for(i=0;n--;)printf("I %se %s",i++%2?"lov":"hat",n?"that ":"it.");}

Ideoneでお試しください


1
i=0;while(n--)-> for(i=0;n--;)1文字節約します。
YSC

6

Javascript(ES6)、75 73 70バイト

n=>[...Array(n)].map((_,i)=>i&1?'I love':'I hate').join` that `+' it.'

Neilのおかげで2バイト
節約Whothehellisthatのおかげで3バイト節約

テスト

let f =
n=>[...Array(n)].map((_,i)=>i&1?'I love':'I hate').join` that `+' it.'

console.log(f(1))
console.log(f(2))
console.log(f(3))
console.log(f(4))


3バイトを節約:['I hate','I love'][i&1]->i&1?'I love':'I hate'
Whothehellisthat

@Whothehellisthat-ありがとう!私はそれを見逃しました。
アーナルド

5

Java 8、91バイト

i->{for(int j=0;j++<i;)System.out.printf("I %se %s",j%2>0?"hat":"lov",j<i?"that ":"it.");};

Ungolfedテストプログラム

public static void main(String[] args) {
    Consumer<Integer> c = i -> {
        for (int j = 0; j++ < i;) {
            System.out.printf("I %se %s", j % 2 > 0 ? "hat" : "lov", j < i ? "that " : "it.");
        }
    };

    c.accept(1);
    c.accept(2);
    c.accept(3);
}

空白を削除してみませんか?c=i->for(...)
shooqie

私は単に忘れていました。
ショーンワイルド

いいですね、あなたは私に打ち負かされました。+1そしておそらく私の答えよりも短いでしょう。PS:私はこれを単に「Java」ではなく「Java 8」として示します。必須ではありませんが、私は通常Java 7で回答を書くので(そしてJava 9が登場するので)私からの個人的な好みだけです。
ケビンCruijssen

@KevinCruijssen毎回これを教えてください;)罰金
ショーンワイルド

@SeanBeanまあ、通常、私はすでにJava 7の答えを持っています。そして、あなたはより短い答えを投稿します。; P(今回は短くすることはできません。しかし、おそらく他の誰かがそうすることができます。)
ケビンクルーイッセン


5

ゼリー、25バイト

“ṅɠT5“£ẏkg⁷»ṁj“¥ıQ»ṙ1“it.

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

説明

                             Input: n, a number.
“ṅɠT5“£ẏkg⁷»                 Compressed string array [' I hate', ' I love']
            ṁ                Cycle for n repetitions.
             j“¥ıQ»          Join by compressed string ' that'.
                   ṙ1        Rotate left once: move the initial space to the end.
                     “it.    Implicitly print the result, then print 'it.'

これについて説明が必要です。
スティーブンH.

4

05AB1E34 32 27バイト

Adnanのおかげで5バイト節約されました。

“I«¢€Š I„΀Š “×¹12*5-£…it.«

説明

“I«¢€Š I„΀Š “               # "I hate that I love that "
              ×              # repeat input nr of times
               ¹12*5-£       # take the first input*12-5 chars of string above
                      …it.«  # append "it."
                             # implicitly display

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


4

R、79バイト

n=scan();for(i in n:1)cat(if((i+n)%%2)"I love"else"I hate",if(i>1)"that "else"it.")

幸いなことに、Rのデフォルトの区切り文字catはスペースです。

(元の73バイトバージョンから編集したもので、問題はまったく解決しませんでした。)


ニートの使用forループと%%。+1
ビリーウォブ

2

網膜42 38バイト

ゴルフを手伝ってくれたLeaky Nunに感謝します!

11
1I love n
1
I hate n
n$
it.
n
that 

入力は単項で取得されます。

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

説明

11
1I love n

すべてのペアに置き換え1て秒1I love n

1
I hate n

残り1のをに置き換えI hate nます。

n$
it.
n
that 

n行の最後のをで置き換え、it.他のすべてのnをで置き換えthat ます。


あなたはドロップすることで、より多くの4を保存することができますlretina.tryitonline.net/...
マーティン・エンダー

@MartinEnder:私はあなたにその編集を忍び込ませたと思う:P
Business Cat

1
タイムスタンプは、あなたが9秒遅れていたと言います。:P
マーティンエンダー

1

Javascript(ES5)、99 94バイト

function(c){for(d="",b=0;b<c;++b)d+=(b%2?"I love ":"I hate ")+(b==c-1?"it.":"that ");return d}

Leaky Nunのおかげで5バイト節約されました。

OLD 99バイトソリューション:

function(c){for(d="",b=0;b<c;++b)d+=(0==b%2?"I hate":"I love")+" "+(b==c-1?"it.":"that ");return d}

別の98バイトソリューション:

function(d){for(c=[],b=0;b<d;++b)c.push(["love","hate"][b%2]);return"I "+c.join(" that I ")+" it"}

縮小前の私のコード:

function a(n){
  var hate="I hate",love="I love",it="it ",that="that ",out="";
  for(var i=0;i<n;++i){out+=(i%2==0?hate:love)+" "+(i==n-1?it+".":that)}return out;
}

1
function(c){for(d="",b=0;b<c;++b)d+=(b%2?"I love ":"I hate ")+(b==c-1?"it.":"that ");return d}
リーキー修道女

1

Haskell、70バイト

g 1="I hate";g n=g(n-1)++" that "++cycle["I love",g 1]!!n
(++" it.").g

1

PowerShell v2 +、64バイト

((1..$args[0]|%{('I love','I hate')[$_%2]})-join' that ')+' it.'

むしろ簡単です。modulo-2の擬似3進法に基づいて、パイプライン上またはパイプライン上に配置される各反復で1、入力から入力までループし$args[0]ます(つまり、で始まる前後に交互に切り替わります)。これらの文字列は、括弧の中にカプセル化していると編それらを一緒にがどんなし、その後、文字列連結終わり。'I love''I hate''I hate'-join' that '' it.'

テストケース

PS C:\Tools\Scripts\golfing> 1..5|%{.\hate-love-conundrum.ps1 $_}
I hate it.
I hate that I love it.
I hate that I love that I hate it.
I hate that I love that I hate that I love it.
I hate that I love that I hate that I love that I hate it.

1

php、64 62バイト

<?=str_pad("",$argv[1]*12-5,"I hate that I love that ")."it.";

残念ながら、「that I」の繰り返しを回避する方法を見つけることができませんでした。または、少なくとも7バイト未満でそれを行う方法がありませんでした。

編集:@JörgHülsermannのおかげで2バイト節約


1

Perl、62 54 50バイト

$_="I xe tx "x$_;s/tx $/it./;s/x/++$.%4?hat:lov/ge

@Ton Hospelのクレジット)

デモ:http : //ideone.com/zrM27p

以前のソリューション:

$_="I xe that "x$_;s/x/$@++&1?lov:hat/ge;s/\w+.$/it./

@Dadaへのクレジット)

で実行 perl -pE '$_="I xe that "x$_;s/x/$@++&1?lov:hat/ge;s/\w+.$/it./'

最初の解決策(これだけが私のものでした)

for$x(1..<>){$_.=' I '.($x%2?hat:lov).'e that'}s/\w+$/it./;say

部分的に:

for $x (1..<>) {
   $_ .= ' I '.($x % 2 ? hat : lov).'e that'
}
s/\w+$/it./;
say

デモ:http : //ideone.com/mosnVz


こんにちは、PPCGへようこそ。いい答えだ。ただし、これより短いソリューション(54バイト)は次のとおりperl -pE '$_="I xe that "x$_;s/x/$@++&1?lov:hat/ge;s/\w+.$/it./'です。
ダダ

この部分はどういう意味$@++&1ですか?@+perldoc私にとってはあまり意味がありません「は、現在アクティブな動的スコープで最後に成功したサブマッチの端のオフセットを保持している」と言います。私が理解しているように、この配列をスカラーコンテキストで使用して($ @ +-参照解除していますか?)、要素数を取得し、一致した文字列(&1)を追加(+)します。いいえ、私はPPCGに投稿すべきではないことを知っていました。難解すぎます:D
Al.G.

$@は単なるスカラー(使用することもできますが$x、他のスカラー)で++あり、インクリメント演算子であり、&1とほぼ同じ%2です。したがって、基本的にはと同じ$x++%2です。
ダダ

したがって@、スカラー変数名に使用しています。&1は、最後のビットを「and」して偶数かどうかをチェックします(思ったように後方参照ではありません)。わかりました、ありがとう。
Al.G.

いい解決策。あなたは使用して、より少数のバイトを得ることができます$|-- 代わりに、トグルとして$@++%2
トンHospel

1

Bash + coreutils、106バイト:

for i in `seq $1`;{ printf "I %s %s " `((i%2>0))&&echo hate||echo love` `((i==$1))&&echo it.||echo that`;}

組み込み1を使用して入力整数までのシーケンスを作成し、seqそれを1つずつ繰り返し、最初hateに反復変数の値がでi割り切れない場合に出力2loveます。同じ反復で、入力値と等しくないthat場合iは出力を選択し、そうでない場合は出力を選択しますit.

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


コマンドの置換をprintfの文字列に直接配置し、フォーマット指定子を使用しない方が適切です。i%20より大きいかどうかを比較しても意味がありません。リスト内のコマンドを逆にすると、i==$1:の代わりにless than比較を使用できますfor i in `seq $1`;{ printf "I `((i%2))&&echo hat||echo lov`e `((i<$1))&&echo that||echo it.` ";}。ところで、通常、このようなソリューションにはBash + coreutilsというラベルを付けseqます。
マナトワーク

1

///、60 57バイト

/!/I hate //T/that //
/it.//00/!TI love T//Tit./it.//0/!/

m-chrzanのおかげで-3バイト

末尾に改行を付けて単項で入力します。

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


あなたは追加することができ/T/that /先頭にしてのすべてのインスタンス置き換えるthat としますT
m-chrzan

0

R、 92 90バイト

@Leaky Nunのpython回答のR適応。Rでの文字列の操作は、いつものように退屈です。

n=scan();cat(rep(strsplit("I hate that I love that ","")[[1]],n)[6:(n*12)-5],"it.",sep="")

これはおそらくさらにゴルフすることができます。

編集:変更して2バイトを保存:

[1:((n*12)-5)][6:(n*12)-5]


代わりにループする方が適切です。私の代替Rソリューションをご覧ください。
JDL

0

C、96バイト

c;f(i){printf("I hate");for(;c<i+1/2-1;c++)printf(" that I %s",c&1?"hate":"love");puts(" it.");}

上記のヘリウム原子核のリリースの解決策は見当たりませんでした。


0

MATL、37バイト

:"2@o3]Qv'hate I that it. love'Ybw)Zc

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

説明

コードは、数値から文字列への次のマッピングに基づいています。

0: 'love'
1: 'hate'
2: 'I'
3: 'that'
4: 'it.'

プログラムは、3のグループ内の文字列に番号をプッシュ:203; その後213; その後203; ...入力と同じ回数n。その後、ファイナル3はに変換され4、マッピングが適用されて数値が文字列に変換され、スペースがセパレータとして使用されて文字列が結合されます。

:                         % Input n implicitly. Push range [1 2 ... n]
"                         % For each
  2                       %   Push 2
  @o                      %   Iteration index modulo 2: pushes 0 or 1
  3                       %   Push 3
]                         % End
Q                         % Add 1 to the last 3
v                         % Concatenate stack contents into a numeric column vector
'hate I that it. love'    % Push this string
Yb                        % Split at spaces. Gives a cell array of five strings
w                         % Swap to move numeric vector to top
)                         % Index cell array of strings with that vector. Indexing
                          % is 1-based and modular, so 0 refers to the last string.
                          % This gives a cell array of (repeated) strings
Zc                        % Join those strings by spaces. Display implicitly

0

JavaScript(ES6)、68バイト

f=(n,i)=>n?(i?' that I ':'I ')+(i&1?'love':'hate')+f(n-1,-~i):' it.'

document.write('<pre>'+[ 1, 2, 3, 4, 10, 100 ].map(c=>c+': '+f(c)).join`\n`);


0

C#、85 83バイト

string f(int n,int m=2)=>"I "+(1>m%2?"hat":"lov")+(m>n?"e it.":"e that "+f(n,m+1));

オプションのパラメーターを使用して文字列を再帰的に作成し、どの憎しみ/愛と追加する数を追跡します。

数値の偶数/奇数をチェックするための、このヒントから-2バイト。

オプションのパラメーターソリューションなし、87 86 84バイト

string h(int n)=>"I "+(0<n?"hat":"lov")+(2>n&-2<n?"e it.":"e that "+h(0<n?~n+2:~n));

これは同じことを行いますが、パラメータが正か負かに基づいて、追加する憎しみ/愛を決定します。パラメーターが反復するたびに、符号が交互にゼロに近づきます。


0

火、100バイト

@::=:::
>##::=>$.
$::=~I hate that I love 
>.#::=>&#
&::=~that 
>#<::=~I hate it.
>.<::=~it.
::=
>@<

入力を単項として受け取ります。(n #の文字列)


0

パイク、36バイト

2/"I hate ""I love "]*"that "J"it."+

ここで試してみてください!

2/                                   -    input/2
                     *               -   ^ * v
  "I hate ""I love "]                -    ["I hate ", "I love "]
                      "that "J       -  "that ".join(^)
                              "it."+ - ^+"it."

また36バイト

12*5+.daෆ   ű   l5d+12"I ":Q*<"it."+

ここで試してみてください!(リンクは、使用するX代わりにIこれはあなたが文字通りそれらのバイトを使用することができます。オンラインバイトオフライン同じ量のために働くべきで\r自動的に置き換えられます\n


0

> <>(魚)、82バイト

' I'oov.2coo<;oooo' it.'<
'ahv'v>'et'
oop26<^ooooo^o' that I '^!?:-1oo
'ol^'^>'ev'

確かに非常に効率的ですが、多かれ少なかれ動作するようです。入力は開始スタックを介して行われ、サイズを含めるとスコアが85バイトになります-v必要な引数ます。

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


0

Lua、75バイト

n=io.read();print(('I hate that I love that '):rep(n):sub(1,n*12-5)..'it.')

1
静的メソッドの代わりに、インスタンスメソッドを使用する方が適切です('I hate that I love that '):rep(n):sub(1,n*12-5)。また、「it」を連結すると見栄えがよくなります。print()タブで区切られたパラメータを出力するため、最後まで。
マナトワーク

1
「;」io.read()とprintの間は不要であり、arg [2]はluaスクリプトの有効な入力メソッドです。これは最初のコマンドライン引数です。
アタコ


0

dc、75バイト

?[1-lbP[I lov]P]sa[e that ]sb[[e it.]Pq]sc[1-[I hat]Pd2%1=ad1>clbPlxx]dsxx

ここでは一度に文字列を1チャンクずつ印刷するだけで、スタックにゴミを残しません。これは素晴らしいことです。カウンタのレジスタを処理するバイトを無駄にする必要はありません。

?                              #Input, works as our decrement counter
[1-lbP[I lov]P]sa              #Macro 'a' decrements our counter, prints string 'b', 
                               #then prints 'I lov'
[e that ]sb                    #String 'b'
[[e it.]Pq]sc                  #Macro 'c' prints the tail end of our message and quits
[1-                            #I'll unfold our main macro here; first step is to 
                               #decrement our counter
   [I hat]P                    #We always start by hating 'it,' no conditional needed
           d2%1=a              #Check the oddness of our counter; execute 'a' if odd
                 d1>c          #Check our counter; If we're done, execute 'c'
                     lbPlxx]   #Otherwise, print 'b' again and start this macro ('x') over
dsxx                           #Stores the above macro as 'x' and runs it.

0

ジュリア、91バイト

私はジュリアソリューションを追加すると思った:

f(N)=string("I hate ",join(["that I love that I hate " for _ in 1:N-1])[1:12*(N-1)],"it."))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.