Enigma de odio / amor

30

Descripción del desafío

En este desafío, solo consideramos lovey hatecomo sentimientos. Si queremos pronunciar una expresión de orden de sentimientoN , alternamos entre estos dos (comenzando por 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.

El patrón sigue para cada entero positivo N. Dado N, da salida a la expresión de sentimiento correspondiente del orden N.

Notas

  • El punto ( .) al final de la expresión es obligatorio,
  • Se permiten espacios en blanco al inicio y al final (incluidas las nuevas líneas),
  • La salida para un no positivo o no entero Nno está definida,
  • Este es un desafío de , ¡así que haga su código lo más corto posible!
shooqie
fuente
Relacionados .
Leaky Nun
1
Muy confundido Entonces, ¿es orderla entrada y expressionla salida?
Whothehellisthat
2
@Whothehellisthat Sí, exactamente. (¡Bienvenido a PPCG! :))
Martin Ender
@Whothehellisthat: Sí. Puede recibir información a través de stdin, aunque a menudo es más corto definir un método (función), como puede ver en las presentaciones a continuación.
shooqie
1
¡Odio amar esta pregunta y sus respuestas!
Arkiliknam

Respuestas:

21

Python, 54 bytes

lambda n:("I hate that I love that "*n)[:12*n-5]+"it."
Monja permeable
fuente
Portado a Haskell: f n=take(12*n-5)(cycle"I hate that I love that ")++"it."(56 bytes)
xnor
15

CJam , 36 bytes

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

Pruébalo en línea!

Explicación

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

C, 83 76 75 74 bytes

¡Gracias a @Leaky Nun por guardar 11 bytes y agregar 4 bytes!
¡Gracias a @YSC por guardar un byte!

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

Pruébalo en Ideone

Betseg
fuente
1
i=0;while(n--)-> for(i=0;n--;)ahorra 1 char.
YSC
6

Javascript (ES6), 75 73 70 bytes

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

Guardado 2 bytes gracias a Neil
Guardado 3 bytes gracias a Whothehellisthat

Prueba

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
fuente
Ahorre 3 bytes: ['I hate','I love'][i&1]->i&1?'I love':'I hate'
Whothehellisthat
@Whothehellisthat - ¡Gracias! Me perdí esa.
Arnauld
5

Java 8, 91 bytes

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

Programa de prueba sin golf

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
fuente
¿Por qué no eliminar el espacio en blanco? c=i->for(...)
shooqie
Simplemente lo olvidé.
Shaun Wild
Bien, me has superado. +1 Y probablemente más corto de lo que sería mi respuesta. PD: indicaría esto como 'Java 8' en lugar de solo 'Java'. Sin embargo, no es obligatorio, solo mi preferencia personal, ya que generalmente escribo mis respuestas en Java 7 (y dado que Java 9 es entrante).
Kevin Cruijssen
@KevinCruijssen Me dices esto todo el tiempo;) bien
Shaun Wild
@SeanBean Bueno, por lo general ya tengo mi respuesta Java 7, y publicas una respuesta más corta, que luego se puede jugar aún más. ; P (Sin embargo, esta vez no puedo encontrar nada que lo haga más corto. Pero quizás alguien más pueda hacerlo.)
Kevin Cruijssen
5

Mathematica, 63 bytes

"I love"["I hate"][[#~Mod~2]]&~Array~#~Riffle~" that "<>" it."&
Martin Ender
fuente
1
Me encanta la extracción de cabeza allí, realmente inteligente.
Un Simmons
@ASimmons En realidad es un truco bastante antiguo (que ni siquiera se me ocurrió), pero definitivamente no lo uso con la frecuencia suficiente. ;)
Martin Ender
5

Jalea , 25 bytes

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

Pruébalo en línea!

Explicación

                             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
fuente
Necesito una explicación para esto.
Steven H.
4

05AB1E , 34 32 27 bytes

Guardado 5 bytes gracias a Adnan .

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

Explicación

“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

Pruébalo en línea!

Emigna
fuente
4

R, 79 bytes

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

Afortunadamente en R, el separador predeterminado para cates un espacio.

(Editado de la versión original de 73 bytes que no resolvió el problema).

JDL
fuente
Uso ordenado del forbucle y %%. +1
Billywob
2

Retina , 42 38 bytes

¡Gracias a Leaky Nun por ayudarme a jugar golf!

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

La entrada se toma en unario.

Pruébalo en línea!

Explicación

11
1I love n

Reemplace cada par de 1s con 1I love n.

1
I hate n

Reemplace los 1s restantes con I hate n.

n$
it.
n
that 

Reemplace el nal final de la línea con it.y cada dos n con that .

Gato de negocios
fuente
Puede guardar cuatro más si cae l: retina.tryitonline.net/…
Martin Ender
@MartinEnder: Creo que te ninja para esa edición: P
Business Cat
1
Las marcas de tiempo dicen que llegaste 9 segundos tarde. : P
Martin Ender
1

Javascript (ES5), 99 94 bytes

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

Guardado 5 bytes gracias a Leaky Nun.

VIEJA solución de 99 bytes:

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

Otra solución de 98 bytes:

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

Mi código antes de la minificación:

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
fuente
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 bytes

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

PowerShell v2 +, 64 bytes

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

Más bien sencillo. Bucles desde 1hasta la entrada $args[0], cada iteración colocando 'I love'o'I hate' en la tubería, en base a un pseudoternario para módulo 2 (es decir, alterna de un lado a otro, comenzando con 'I hate'). Esas cadenas se encapsulan en parens y -joined con ' that 'al SMUSH juntos, entonces la concatenación de cadenas ' it.'en el extremo.

Casos de prueba

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
fuente
1

php, 64 62 bytes

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

Desafortunadamente, no pude encontrar una manera de evitar repetir el "que yo", o al menos no hay forma de hacerlo en menos de 7 bytes.

editar: guardado 2 bytes gracias a @ Jörg Hülsermann

usuario59178
fuente
1

Perl, 62 54 50 bytes

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

(crédito a @Ton Hospel )

Demostración: http://ideone.com/zrM27p

Soluciones anteriores:

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

(crédito a @Dada )

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

Primera solución (solo esto fue mío)

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

En partes:

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

Demostración: http://ideone.com/mosnVz

Al.G.
fuente
Hola y bienvenidos a PPCG. Buena respuesta. Aquí es una solución más corta, aunque (54 bytes): perl -pE '$_="I xe that "x$_;s/x/$@++&1?lov:hat/ge;s/\w+.$/it./'.
Dada
¿Qué significa esta parte $@++&1? Porque @+perldoc dice "mantiene los desplazamientos de los extremos de las últimas submezclas exitosas en el ámbito dinámico actualmente activo", lo que no tiene mucho sentido para mí. Según tengo entendido, usa esta matriz en contexto escalar ($ @ + - ¿la está desreferenciando?) Para obtener el número de elementos y luego agrega (+) la cadena coincidente (& 1). No no no Sabía que no debería haber publicado en PPCG está demasiado ofuscado: D
Al.G.
$@es solo un escalar (podría haber usado $xo cualquier otro escalar), ++es el operador de incremento y &1es más o menos lo mismo que %2. Entonces es básicamente lo mismo que $x++%2.
Dada
Entonces está usando el @nombre de la variable escalar; & 1 para "y" ing el último bit para verificar si es par (y no una referencia inversa como pensé). Ok entendido ahora, gracias.
Al.G.
Buena solución Puede obtener algunos bytes más si lo usa $|-- como $@++%2
alternador en
1

Bash + coreutils, 106 bytes:

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

Simplemente crea una secuencia que comienza en 1e incluye el entero de entrada usando el seqincorporado, y luego lo itera uno por uno, primero generando hatesi el valor de la variable de iteración i, no es divisible por 2y de lo lovecontrario. En la misma iteración, elige la salida thatsi ino es igual al valor de entrada, y de lo it.contrario.

¡Pruébelo en línea! (Ideone)

R. Kap
fuente
Mejor coloque las sustituciones de comandos directamente en printfla cadena y no use especificadores de formato. No tiene sentido comparar si i%2es mayor que 0. Te invierto los comandos en la lista, puede utilizar menos de la comparación en lugar de i==$1: for i in `seq $1`;{ printf "I `((i%2))&&echo hat||echo lov`e `((i<$1))&&echo that||echo it.` ";}. Por cierto, generalmente etiquetamos soluciones como Bash + coreutils, debido al uso de seq.
manatwork
1

///, 60 57 bytes

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

-3 bytes gracias a m-chrzan

Entrada en unario con nueva línea final.

Pruébalo en línea!

acrolito
fuente
Puede agregar /T/that /al principio y reemplazar todas las instancias de that con T.
m-chrzan
0

R, 92 90 bytes

Una adaptación R de la respuesta de Python de @Leaky Nun. Trabajar con cadenas en R es tedioso como siempre.

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

Sin embargo, esto probablemente podría jugarse más.

Editar: guardado 2 bytes cambiando:

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

Billywob
fuente
Funciona mejor en bucle en su lugar; vea mi solución alternativa de R.
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.");}

No vi la solución anterior al liberar Helium Nuclei, que es mejor.

cleblanc
fuente
0

MATL , 37 bytes

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

Pruébalo en línea!

Explicación

El código se basa en la siguiente asignación de números a cadenas:

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

El programa empuja números a la cadena en grupos de tres: 2, 0, 3; entonces 2, 1, 3; entonces 2, 0, 3; ... tantas veces como la entrada n. Después de eso, el final 3se transforma en a 4, la asignación se aplica para transformar los números en cadenas, y las cadenas se unen utilizando el espacio como separador.

:                         % 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
fuente
0

JavaScript (ES6), 68 bytes

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

usuario81655
fuente
0

C #, 85 83 bytes

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

Construye recursivamente la cadena, utilizando un parámetro opcional para realizar un seguimiento de qué odio / amor y cuántos agregar.

-2 bytes de este consejo para verificar la paridad / impar de un número.

Sin solución de parámetro opcional, 87 86 84 bytes

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

Éste hace lo mismo, excepto que determina qué odio / amor agregar en función de si el parámetro es positivo o negativo. Cada iteración el parámetro se acerca a cero, signo alterno.

Leche
fuente
0

Jue 100 bytes

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

Toma la entrada como unario. (Una cadena de n #s)

MegaTom
fuente
0

Pyke, 36 bytes

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

Pruébalo aquí!

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

También 36 bytes

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

Pruébalo aquí! (El enlace usa en Xlugar de I, esto debería funcionar para la misma cantidad de bytes sin conexión donde literalmente puede usar esos bytes. En línea \rse reemplaza automáticamente con \n)

Azul
fuente
0

> <> (Pez), 82 Bytes

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

Dudo que sea muy eficiente, pero parece funcionar más o menos. La entrada se realiza a través de la pila inicial, lo que hace que la puntuación sea de 85 Bytes si incluye el tamaño del -vargumento requerido para hacerlo.

Pruébalo en línea!

Callum Kerr
fuente
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
fuente
1
En lugar de los métodos estáticos mejores métodos de instancia uso: ('I hate that I love that '):rep(n):sub(1,n*12-5). Y se vería mejor si concatena "eso". hasta el final, porque print()genera sus parámetros separados por tabulación.
manatwork
1
Los ';' entre io.read () e print no es necesario, y arg [2] es un método de entrada válido para los scripts lua, que es el primer argumento de línea de comando.
ATaco
0

/// , 68 bytes

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

Entrada en unario: agregue más 1 s en la última sección.

Pruébalo en línea!

m-chrzan
fuente
0

dc, 75 bytes

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

Realmente solo estamos imprimiendo un trozo de cadena a la vez aquí, y no dejando basura en la pila. Esto es genial, no necesitamos desperdiciar ningún byte relacionado con un registro para nuestro contador.

?                              #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
fuente
0

Julia, 91 bytes

Pensé agregar una solución de 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
fuente