Ворог ненависті / любові


30

Опис виклику

У цій проблемі, ми розглядаємо тільки loveі hateяк почуття. Якщо ми хочемо висловити почуття висловлення порядку N, ми чергуємо між цими двома (починаючи з 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
@Wthethellllisthat Так, саме так. (Ласкаво просимо до PPCG! :))
Мартін Ендер

@Whothehellisthat: Так. Ви можете приймати дані через stdin, хоча часто визначати метод (функцію) коротше, як ви бачите у поданих нижче публікаціях.
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 байт

Дякуємо @Leaky Nun за збереження 11 байт та додавання 4 байтів!
Дякуємо @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 char.
YSC

6

Javascript (ES6), 75 73 70 байт

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

Збережено 2 байти завдяки Нілу.
Збережено 3 байти завдяки Whothehellisthat

Тест

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 - Дякую! Я пропустив це.
Арнольд

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.");};

Програма тестування без вогків

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

Я просто забув.
Shaun Wild

Приємно, ти мене до цього побив. +1 І, мабуть, коротше, ніж моя відповідь. PS: Я б назвав це як "Java 8", а не просто "Java". Однак не обов'язково, а лише особисті переваги від мене, оскільки я зазвичай пишу свої відповіді на Java 7 (і оскільки Java 9 входить).
Kevin Cruijssen

@KevinCruijssen Ти мені щоразу кажеш про це;) добре
Shaun Wild

@SeanBean Ну, зазвичай у мене вже є моя відповідь на Java 7, і ви публікуєте більш коротку відповідь, яка може потім більшу частину часу грати ще більше. ; P (Цього разу я не можу знайти нічого, щоб скоротити його. Але, можливо, хтось інший може це зробити.)
Кевін Кройсейсен,

5

Математика, 63 байти

"I love"["I hate"][[#~Mod~2]]&~Array~#~Riffle~" that "<>" it."&

1
Я люблю видобуток голови там, дуже розумний.
Сіммонс

@ASimmons Це насправді досить стара хитрість (яку я навіть сам не придумав), але я точно не можу використовувати її досить часто. ;)
Мартін Ендер

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.'

Мені потрібно пояснення цьому.
Стівен Х.


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
Billywob

2

Сітківка , 42 38 байт

Дякуємо Leaky Nun за те, що допомагає мені гольф!

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

Введення приймається одинарним.

Спробуйте в Інтернеті!

Пояснення

11
1I love n

Замініть кожну пару 1s на 1I love n.

1
I hate n

Замініть решту 1s на I hate n.

n$
it.
n
that 

Замініть nкінець рядка на it.та кожну іншу п на that .


Можна зберегти ще чотири, скинувши l: retina.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}

Збережено 5 байт завдяки Leaky Nun.

СТАРИЙ 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}
Leaky Nun


1

PowerShell v2 +, 64 байти

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

Досить прямо. Петлі від 1входу до $args[0]кожної ітерації, розміщеної 'I love'або 'I hate'на трубопроводі, спираючись на псевдотермінал для модуля-2 (тобто він чергується вперед і назад, починаючи з 'I hate'). Ці рядки укладені в круглих дужках і -joinЕди з ' that 'до smush їх разом, а потім конкатенації ' 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.";

На жаль, я не зміг розробити спосіб уникнути повторення "того, що я", або принаймні ніякого способу зробити це менш ніж у 7 байт.

редагувати: збережено 2 байти завдяки @ Jörg Hülsermann


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, це занадто
затуманено

$@- це просто скаляр (я міг би використовувати $xабо будь-який інший скаляр), ++є оператором приросту і &1приблизно такий же, як %2. Так це в основному те саме, що $x++%2.
Дада

Отже, ви використовуєте @для імені скалярної змінної; & 1 для "та" останнього біта, щоб перевірити, чи він рівний (а не зворотний зв'язок, як я думав). Ок зрозумів зараз, спасибі.
Ал.Г.

Приємне рішення. Ви можете набрати ще кілька байтів, використовуючи $|-- замість цього перемикач$@++%2
Ton 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вбудованої, а потім ітерацію через нього один за іншим, перший Висновок , hateякщо значення змінної ітерації, i, не ділиться на , 2і в loveіншому випадку. У цій же ітерації він вибирає вихід, thatякщо iне дорівнює вхідному значенню, it.інакше.

Спробуйте в Інтернеті! (Ідеон)


Краще помістіть заміни команд безпосередньо в printfрядок і не використовуйте специфікаторів формату. Безглуздо порівнювати чи i%2більше 0. Я сторнування команди в списку, ви можете використовувати менше , ніж порівняння замість i==$1: 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/!/

-3 байти завдяки m-chrzan

Введіть в одинаковому ряду з наступним новим рядком.

Спробуйте в Інтернеті!


Ви можете додати /T/that /в початок і замінити всі екземпляри that з T.
m-chrzan

0

R, 92 90 байт

R адаптація відповіді пітона @Leaky Nun. Робота зі струнами в 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.'

Програма поміщає число в рядок в групах з трьох: 2, 0, 3; Потім 2, 1, 3; Потім 2, 0, 3; ... стільки разів, скільки вхід n. Після цього фінал 3перетворюється в a 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

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


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

Луа, 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). І буде виглядати приємніше, якби ви об'єднали "це". до кінця, оскільки print()виводить його параметри, розділені на вкладку.
манатура

1
';' між io.read () та print не є зайвим, а arg [2] є дійсним методом введення для скриптів lua, що є першим аргументом командного рядка.
Атако


0

постійного струму, 75 байт

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

Ми дійсно просто друкуємо тут один шматок струни, і не залишаємо сміття на стопі. Це чудово, нам не потрібно витрачати жодних байт, які займаються реєстром для нашого лічильника.

?                              #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."))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.