Benci / suka teka-teki

30

Deskripsi tantangan

Dalam tantangan ini, kami hanya mempertimbangkan lovedan hatesebagai perasaan. Jika kami ingin mengungkapkan perasaan keteraturan N, kami bergantian di antara keduanya (dimulai dengan 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.

Pola mengikuti untuk setiap bilangan bulat positif N. Diberikan N, keluaran ekspresi perasaan sesuai pesanan N.

Catatan

  • Pemberhentian penuh ( .) pada akhir ekspresi adalah wajib,
  • Trailing dan spasi putih terkemuka (termasuk baris baru) diizinkan,
  • Output untuk non-positif atau non-integer Ntidak terdefinisi,
  • Ini adalah tantangan , jadi buat kode Anda sesingkat mungkin!
shooqie
sumber
Terkait .
Leaky Nun
1
Cukup bingung. Jadi apakah orderinput, dan expressionoutput?
Whothehellisthat
2
@Whothehellisthat Ya, tepatnya. (Selamat datang di PPCG! :))
Martin Ender
@Whothehellisthat: Ya. Anda dapat mengambil input melalui stdin, meskipun seringkali lebih pendek untuk mendefinisikan metode (fungsi), seperti yang Anda lihat dalam kiriman di bawah ini.
shooqie
1
Aku benci kalau aku suka pertanyaan ini dan jawabannya!
Arkiliknam

Jawaban:

21

Python, 54 byte

lambda n:("I hate that I love that "*n)[:12*n-5]+"it."
Biarawati Bocor
sumber
Porting ke Haskell: f n=take(12*n-5)(cycle"I hate that I love that ")++"it."(56 byte)
xnor
15

CJam , 36 byte

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

Cobalah online!

Penjelasan

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."
Martin Ender
sumber
7

C, 83 76 75 74 byte

Terima kasih kepada @Leaky Nun karena menyimpan 11 byte dan menambahkan 4 byte!
Terima kasih kepada @YSC untuk menghemat satu byte!

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

Cobalah di Ideone

betseg
sumber
1
i=0;while(n--)-> for(i=0;n--;)menghemat 1 char.
YSC
6

Javascript (ES6), 75 73 70 byte

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

Disimpan 2 byte berkat Neil
Disimpan 3 byte berkat Whothehellisthat

Uji

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))

Arnauld
sumber
Hemat 3 byte: ['I hate','I love'][i&1]->i&1?'I love':'I hate'
Whothehellisthat
@Whothehellisthat - Terima kasih! Saya merindukan yang itu.
Arnauld
5

Java 8, 91 byte

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

Program Tes Tidak Berkumpul

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);
}
Shaun Wild
sumber
Mengapa tidak menghapus spasi putih? c=i->for(...)
shooqie
Saya hanya lupa.
Shaun Wild
Bagus, Anda telah mengalahkan saya untuk itu. +1 Dan mungkin lebih pendek dari jawaban saya. PS: Saya akan mengindikasikan ini sebagai 'Java 8' bukan hanya 'Java'. Namun tidak wajib, hanya preferensi pribadi dari saya karena saya biasanya menulis jawaban saya di Java 7 (dan karena Java 9 masuk).
Kevin Cruijssen
@KevinCruijssen Anda ceritakan ini setiap kali;) baik
Shaun Wild
@SeanBean Yah, biasanya saya sudah memiliki jawaban Java 7 saya, dan Anda memposting jawaban yang lebih pendek, yang kemudian dapat sebagian besar waktu golf bahkan lebih. ; P (Kali ini saya tidak dapat menemukan apa pun untuk membuatnya lebih pendek. Tetapi mungkin orang lain dapat melakukannya.)
Kevin Cruijssen
5

Mathematica, 63 byte

"I love"["I hate"][[#~Mod~2]]&~Array~#~Riffle~" that "<>" it."&
Martin Ender
sumber
1
Saya suka ekstraksi kepala di sana, sangat pintar.
A Simmons
@ ASimmons Sebenarnya ini adalah trik yang cukup lama (yang bahkan saya sendiri tidak memunculkannya), tetapi saya pasti tidak cukup sering menggunakannya. ;)
Martin Ender
5

Jelly , 25 byte

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

Cobalah online!

Penjelasan

                             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.'
Lynn
sumber
Saya perlu penjelasan untuk ini.
Steven H.
4

05AB1E , 34 32 27 byte

Disimpan 5 byte berkat Adnan .

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

Penjelasan

“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

Cobalah online!

Emigna
sumber
4

R, 79 byte

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

Untungnya di R, pemisah default catadalah spasi.

(Diedit dari versi 73 byte asli yang tidak cukup menyelesaikan masalah.)

JDL
sumber
Penggunaan forloop yang rapi dan %%. +1
Billywob
2

Retina , 42 38 byte

Terima kasih kepada Leaky Nun karena membantu saya bermain golf!

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

Input diambil secara unary.

Cobalah online!

Penjelasan

11
1I love n

Ganti setiap pasangan 1dengan 1I love n.

1
I hate n

Ganti sisanya 1dengan I hate n.

n$
it.
n
that 

Ganti ndi akhir baris dengan it.dan setiap n dengan lainnya that .

Kucing Bisnis
sumber
Anda dapat menyimpan empat lagi dengan menjatuhkan l: retina.tryitonline.net/...
Martin Ender
@ MartinEnder: Saya pikir saya ninja 's Anda untuk suntingan itu: P
Business Cat
1
Cap waktu mengatakan Anda terlambat 9 detik. : P
Martin Ender
1

Javascript (ES5), 99 94 byte

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

Disimpan 5 byte berkat Leaky Nun.

Solusi 99 byte LAMA:

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

Solusi 98 byte lainnya:

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

Kode saya sebelum minifikasi:

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;
}
Paul Schmitz
sumber
1
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
1

Haskell, 70 byte

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

PowerShell v2 +, 64 byte

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

Agak langsung. Loop dari 1hingga input $args[0], setiap iterasi menempatkan salah satu 'I love'atau 'I hate'pada pipa, berdasarkan pseudo-ternary untuk modulo-2 (yaitu, bergantian bolak-balik, dimulai dengan 'I hate'). Mereka string dikemas dalam parens dan -joined dengan ' that 'untuk Smush mereka bersama-sama, maka penggabungan string ' it.'di akhir.

Uji Kasus

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.
AdmBorkBork
sumber
1

php, 64 62 byte

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

Sayangnya saya tidak dapat menemukan cara untuk menghindari pengulangan "yang saya", atau setidaknya tidak ada cara untuk melakukannya dalam waktu kurang dari 7 byte.

sunting: disimpan 2 byte berkat @ Jörg Hülsermann

pengguna59178
sumber
1

Perl, 62 54 50 byte

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

(kredit ke @Ton Hospel )

Demo: http://ideone.com/zrM27p

Solusi sebelumnya:

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

(kredit ke @Dada )

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

Solusi pertama (hanya ini milik saya)

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

Di bagian:

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

Demo: http://ideone.com/mosnVz

Al.G.
sumber
Hai dan selamat datang di PPCG. Jawaban bagus. Berikut ini adalah solusi yang lebih pendek meskipun (54 bytes): perl -pE '$_="I xe that "x$_;s/x/$@++&1?lov:hat/ge;s/\w+.$/it./'.
Dada
Apa arti bagian ini $@++&1? Untuk @+perldoc mengatakan "memegang offset dari ujung kiriman sukses terakhir dalam lingkup dinamis aktif saat ini" yang tidak masuk akal bagi saya. Seperti yang saya pahami, Anda menggunakan array ini dalam konteks skalar ($ @ + - apakah Anda mendefinisikannya?) Untuk mendapatkan jumlah elemen dan kemudian menambahkan (+) string yang cocok (& 1). Tidak, tidak, tidak, saya tahu saya seharusnya tidak memposting ke PPCG itu terlalu membingungkan: D
Al.G.
$@hanyalah skalar (saya bisa menggunakan $xskalar lain), ++adalah operator kenaikan, dan &1kira - kira sama dengan %2. Jadi pada dasarnya sama dengan $x++%2.
Dada
Jadi Anda menggunakan @untuk nama variabel skalar; & 1 untuk "dan" bit terakhir untuk memeriksa apakah itu genap (dan bukan referensi balik seperti yang saya kira). Ok mengerti sekarang, terima kasih.
Al.G.
Solusi bagus Anda bisa mendapatkan beberapa byte lagi dengan menggunakan $|-- sebagai ganti sebagai ganti$@++%2
Ton Hospel
1

Bash + coreutils, 106 byte:

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

Cukup membuat urutan mulai dari 1hingga dan termasuk bilangan bulat input menggunakan seqbuilt-in, dan kemudian iterasi melalui itu satu per satu, keluaran pertama hatejika nilai variabel iterasi i,, tidak dapat dibagi oleh 2dan lovesebaliknya. Dalam iterasi yang sama, ia kemudian memilih output thatjika itidak sama dengan nilai input, dan it.sebaliknya.

Cobalah secara Online! (Ideone)

R. Kap
sumber
Lebih baik letakkan pergantian perintah secara langsung di printfstring dan jangan gunakan penentu format. Apakah gunanya untuk membandingkan apakah i%2lebih besar dari 0. Saya Anda membalik perintah dalam daftar, Anda dapat menggunakan kurang dari perbandingan bukannya i==$1: for i in `seq $1`;{ printf "I `((i%2))&&echo hat||echo lov`e `((i<$1))&&echo that||echo it.` ";}. Omong-omong, kami biasanya memberi label solusi seperti Bash + coreutils, karena penggunaan seq.
manatwork
1

///, 60 57 byte

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

-3 byte berkat m-chrzan

Masukan di unary dengan mengikuti baris baru.

Cobalah online!

akrolit
sumber
Anda dapat menambahkan /T/that /ke awal dan mengganti semua contoh that dengan T.
m-chrzan
0

R, 92 90 byte

Adaptasi R dari jawaban python @Leaky Nun. Bekerja dengan string dalam R membosankan seperti biasa.

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

Ini mungkin bisa golf lebih jauh.

Edit: disimpan 2 byte dengan mengubah:

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

Billywob
sumber
Lebih baik untuk mengulang; lihat solusi R alternatif saya.
JDL
0

C, 96 Bytes

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

Saya tidak melihat solusi di atas dari Melepaskan Helium Nuclei yang lebih baik.

Cleblanc
sumber
0

MATL , 37 byte

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

Cobalah online!

Penjelasan

Kode ini didasarkan pada pemetaan berikut dari angka ke string:

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

Program ini mendorong angka ke string dalam kelompok tiga: 2, 0, 3; kemudian 2, 1, 3; kemudian 2, 0, 3; ... sebanyak input n. Setelah itu, final 3ditransformasikan menjadi a 4, pemetaan diterapkan untuk mengubah angka menjadi string, dan string digabungkan menggunakan ruang sebagai pemisah.

:                         % 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
Luis Mendo
sumber
0

JavaScript (ES6), 68 byte

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`);

pengguna81655
sumber
0

C #, 85 83 byte

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

Secara rekursif membuat string, menggunakan parameter opsional untuk melacak kebencian / cinta yang mana dan berapa banyak yang harus ditambahkan.

-2 byte dari tip ini untuk memeriksa kemerataan / keanehan angka.

Tidak ada solusi parameter opsional, 87 86 84 byte

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

Yang ini melakukan hal yang sama kecuali menentukan benci / suka untuk menambahkan berdasarkan apakah parameternya positif atau negatif. Setiap iterasi, parameter mendekati nol, tanda bergantian.

susu
sumber
0

Thue, 100 byte

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

Mengambil input sebagai unary. (String n #s)

MegaTom
sumber
0

Pyke, 36 byte

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

Coba di sini!

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

Juga 36 byte

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

Coba di sini! (Tautan menggunakan Xalih-alih I, ini harus bekerja untuk jumlah byte yang sama secara offline di mana Anda dapat benar-benar menggunakan byte tersebut. Online \rakan secara otomatis diganti dengan \n)

Biru
sumber
0

> <> (Ikan), 82 Bytes

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

Keraguan itu sangat efisien, tetapi tampaknya kurang lebih berhasil. Input adalah melalui tumpukan awal, yang membuat skor 85 Bytes jika Anda memasukkan ukuran -vargumen yang diperlukan untuk melakukannya.

Cobalah online!

Callum Kerr
sumber
0

Lua, 75 Bytes

n=io.read();print(('I hate that I love that '):rep(n):sub(1,n*12-5)..'it.')
Jörg Hülsermann
sumber
1
Alih-alih metode statis metode penggunaan contoh yang lebih baik: ('I hate that I love that '):rep(n):sub(1,n*12-5). Dan akan terlihat lebih bagus jika Anda menggabungkan "itu." sampai akhir, karena print()output parameternya dipisahkan oleh tab.
manatwork
1
';' antara io.read () dan cetak tidak diperlukan, dan arg [2] adalah metode input yang valid untuk skrip lua, yang merupakan argumen baris perintah pertama.
ATaco
0

/// , 68 byte

/@/1\/#love //%/hate//#/that I //%1i/% i//I %1/I % //1@#% //@/I %1it.

Masukan dalam unary - tambahkan lebih banyak 1di bagian terakhir.

Cobalah online!

m-chrzan
sumber
0

dc, 75 byte

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

Kami benar-benar hanya mencetak satu helai tali pada suatu waktu di sini, dan tidak meninggalkan sampah di tumpukan. Ini bagus, kita tidak perlu membuang byte yang berurusan dengan register untuk penghitung kita.

?                              #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.
brhfl
sumber
0

Julia, 91 Bytes

Pikir saya menambahkan solusi julia:

f(N)=string("I hate ",join(["that I love that I hate " for _ in 1:N-1])[1:12*(N-1)],"it."))
nyro_0
sumber