Nefret / aşk bilmecesi


30

Meydan açıklaması

Bu meydan okuma, biz sadece düşünün loveve hateduygular olarak. Eğer bir düzen duygusu ifade etmek istiyorsak N, bu ikisinin arasında başlıyoruz 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.

Her pozitif tamsayı için desen izler N. Verilen N, düzenin ilgili duygu duygusunun çıktısını alın N.

notlar

  • .İfadenin sonunda tam stop ( ) zorunludur,
  • İzleyen ve önde gelen boşluklara (yeni hatlar dahil) izin verilir,
  • Pozitif veya tamsayı olmayan bir değerin çıktısı Ntanımsız,
  • Bu bir mücadelesi, bu yüzden kodunuzu mümkün olduğunca kısa tutun!


1
Oldukça karıştı. Öyleyse ordergiriş ve expressionçıkış nedir?
Ağustos'ta

2
@Hangiçimde Evet, tam olarak. (PPCG'ye hoş geldiniz! :))
Martin Ender

@Whothehellisthat: Evet. Aşağıdaki açıklamalarda görebileceğiniz gibi bir yöntem (işlev) tanımlamak genellikle daha kısa olsa da, stdin aracılığıyla girdi alabilirsiniz.
shooqie

1
Bu soruyu ve cevaplarını sevmekten nefret ediyorum!
Arkiliknam

Yanıtlar:


21

Python, 54 bayt

lambda n:("I hate that I love that "*n)[:12*n-5]+"it."

Haskell'e iletildi: f n=take(12*n-5)(cycle"I hate that I love that ")++"it."(56 bayt)
xnor

15

CJam , 36 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

11 bayt kaydettiğiniz ve 4 bayt eklediğiniz için @ Leaky Nun'a teşekkürler!
Bir bayt tasarrufu için @YSC teşekkürler!

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

Ideone'da dene


1
i=0;while(n--)-> for(i=0;n--;)1 karakter kaydeder.
YSC

6

Javascript (ES6), 75 73 70 bayt

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

Neil ile 2 bayt
kurtarıldı Whothehellisthat ile 3 bayt kurtardı

Ölçek

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 bayttan ['I hate','I love'][i&1]i&1?'I love':'I hate'
tasarruf edin

@Whothehellisthat - Teşekkürler! Onu özledim.
Arnauld,

5

Java 8, 91 bayt

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

Ungolfed Test Programı

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

Neden boşlukları kaldırmıyorsun? c=i->for(...)
shooqie

Ben sadece unuttum.
Shaun Wild

Güzel, beni yendin. +1 Muhtemelen cevabımdan daha kısa. Not: Bunu sadece 'Java' yerine 'Java 8' olarak belirtirim. Ancak zorunlu değil, cevaplarımı genelde Java 7'ye yazdığımdan beri sadece kişisel tercihim (ve Java 9 geldiğinden beri).
Kevin Cruijssen,

@KevinCruijssen Bana bunu her zaman söyle;) iyi
Shaun Wild

@SeanBean Eh, genellikle Java 7'mde zaten bir cevabım var ve daha kısa bir cevap veriyorsunuz. P (Bu sefer daha kısa yapmak için hiçbir şey bulamıyorum. Ama belki başka birileri bunu yapabilir.)
Kevin Cruijssen


5

Jöle , 25 bayt

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

Çevrimiçi deneyin!

açıklama

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

Bunun için bir açıklamaya ihtiyacım var.
Steven H.

4

05AB1E , 34 32 27 bayt

Adnan sayesinde 5 bayt kurtarıldı .

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

açıklama

“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

Çevrimiçi deneyin!


4

R, 79 bayt

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

Neyse ki R'de, varsayılan ayırıcı catbir boşluktur.

(Sorunu tam olarak çözmeyen orijinal 73 byte versiyonunda düzenlendi.)


forDöngünün düzgün kullanımı ve %%. +1
Billywob

2

Retina , 42 38 bayt

Golfe attığım için Leaky Nun'a teşekkürler!

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

Giriş unary olarak alınmıştır.

Çevrimiçi deneyin!

açıklama

11
1I love n

Her 1s çiftini ile değiştirin 1I love n.

1
I hate n

Kalan 1s ile değiştirin I hate n.

n$
it.
n
that 

Değiştir nile satırın sonunda it.ve her diğer n that .


Bırakarak dört tane daha tasarruf edebilirsiniz l: retina.tryitonline.net/…
Martin Ender

@MartinEnder: Sanırım şu düzenlemeyi yapmak için ninja'd: P
Business Cat

1
Zaman damgaları, 9 saniye geciktiğinizi söylüyor. : P
Martin Ender

1

Javascript (ES5), 99 94 bayt

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 sayesinde 5 byte kurtarıldı.

ESKİ 99 bayt çözüm:

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

Başka 98 byte çözüm:

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

Küçültmeden önceki kodum:

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}
Sızdıran Rahibe,

1

Haskell, 70 bayt

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

1

PowerShell v2 +, 64 bayt

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

Oldukça basit. Her bir yineleme , boru hattına ya da boru hattına, modulo-2 için bir sözde üçlüye dayalı olarak yerleştirilen 1girişe kadar ilmek yapar (yani, baştan başa ileri geri geçiş yapar ). Bu dizeleri Pars kapsüllü ve edilir ile ed sonra, birlikte dize birleştirme bunları Smush için sonunda.$args[0]'I love''I hate''I hate'-join' that '' it.'

Test Kılıfları

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 bayt

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

Ne yazık ki "o ben" i tekrarlamaktan kaçınmanın bir yolunu bulamadım ya da en azından 7 bayttan daha azını yapmanın bir yolunu bulamadım.

düzenleme: 2 bayt kaydedildi @ Jörg Hülsermann


1

Perl, 62 54 50 bayt

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

( @Ton Hospel’a verilen kredi )

Gösteri: http://ideone.com/zrM27p

Önceki çözümler:

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

( @Dada'ya kredi olarak verilir )

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

İlk çözüm (sadece bu benim oldu)

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

Parçalar halinde:

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

Gösteri: http://ideone.com/mosnVz


Merhaba ve PPCG'ye hoş geldiniz. Güzel cevap İşte olsa daha kısa çözeltisi (54 bayt): perl -pE '$_="I xe that "x$_;s/x/$@++&1?lov:hat/ge;s/\w+.$/it./'.
Dada

Bu bölüm ne anlama geliyor $@++&1? İçin @+perldoc diyor bana pek mantıklı değil "Şu anda etkin dinamik kapsamında son başarılı submatches uçlarının uzaklıklar tutan". Anladığım kadarıyla, bu diziyi skalar bağlamında ($ @ + - onu yok ediyor musunuz?) Öğelerin sayısını almak ve ardından eşleşen dizeyi (& 1) eklemek için kullanıyorsunuz. Hayır hayır hayır PPCG'ye gönderilmemem gerektiğini biliyordum bu çok
karışık

$@sadece bir skalar ( $xherhangi bir skalar kullanabilirdim), ++artış işlecidir ve &1kabaca aynıdır %2. Yani temelde aynı $x++%2.
Dada,

Yani @skaler değişken ismi için kullanıyorsunuz ; "1" ve "eşit olup olmadığını kontrol etmek için son biti yapmak (ve düşündüğüm gibi bir geri dönüş değil). Tamam şimdi anladım, teşekkürler.
Al.G.

Güzel çözüm. $|-- Geçiş yerine geçiş olarak kullanarak birkaç bayt daha kazanabilirsiniz$@++%2
Ton Hospel 15

1

Bash + coreutils, 106 bayt:

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

Bunun başlayan bir dizi oluşturur 1için kadar kullanılarak tam sayı giriş içeren seqdahili ve daha sonra tek tek bu dolaşır, ilk çıkış olarak hateyineleme değişkeninin değeri, eğer i, bölünemeyen değildir 2ve lovebaşka türlü. Aynı yineleme, daha sonra çıkış seçer thatise igiriş değerine eşit değildir ve it.aksi.

Çevrimiçi Deneyin! (Ideone)


Komut değişimlerini doğrudan printfdizgeye koymak ve format belirteci kullanmamak daha iyi. Olmadığını karşılaştırmak anlamsız mı i%2ben listedeki komutları ters büyüktür 0. den, sen yerine karşılaştırılması daha az kullanabilirsiniz i==$1: for i in `seq $1`;{ printf "I `((i%2))&&echo hat||echo lov`e `((i<$1))&&echo that||echo it.` ";}. Bu arada, genellikle kullanımı gibi Bash + coreutils gibi çözümleri etiketleriz seq.
Manat çalışması

1

///, 60 57 bayt

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

M-chrzan sayesinde -3 bayt

Sonunda yeni satır olan unary girişi.

Çevrimiçi deneyin!


Başına ekleyebilir /T/that /ve that ile tüm örneklerini değiştirebilirsiniz T.
m-chrzan

0

R, 92 90 bayt

@ Leaky Nun'un python cevabının R uyarlaması. R'deki karakterlerle çalışmak her zaman olduğu gibi sıkıcıdır.

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

Bu muhtemelen daha da golf olabilirdi.

Düzenleme: değiştirerek 2 bayt kaydetti:

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


Bunun yerine döngü daha iyi çalışır; alternatif R çözümüme bakın.
JDL,

0

C, 96 Bayt

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

Yukarıdaki çözümü Releasing Helium Nuclei'den daha iyi görmedim.


0

MATL , 37 bayt

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

Çevrimiçi deneyin!

açıklama

Kod, sayılardan dizgilere kadar aşağıdaki eşlemeye dayanır:

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

Program üçlü gruplar halinde dizesine numaralarını iter: 2, 0, 3; Daha sonra 2, 1, 3; Daha sonra 2, 0, 3; ... giriş kadar n. Bundan sonra, son 3bir a'ya dönüştürülür 4, eşleme sayıları dizelere dönüştürmek için uygulanır ve dizeler ayırıcı olarak boşluk kullanılarak birleştirilir.

:                         % 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 bayt

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 bayt

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

Hangi nefreti / sevgiyi ve kaç tane eklemek istediğinizi takip etmek için isteğe bağlı bir parametre kullanarak diziyi tekrar tekrar oluşturur.

Bir sayının düzgünlüğünü / tuhaflığını kontrol etmek için bu ipucundan -2 bayt .

İsteğe bağlı parametre çözümü yok, 87 86 84 bayt

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

Bu, parametrenin pozitif ya da negatif olmasına bağlı olarak hangi nefretin / sevginin ekleneceğini belirlemek dışında aynı şeyi yapar. Her yineleme parametresi sıfıra yaklaşır, alternatif işaret.


0

Salı, 100 bayt

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

Tekli girişi alır. (Bir n #s dizesi )


0

Pyke, 36 bayt

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

Burada dene!

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

Ayrıca 36 byte

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

Burada dene! ( XBunun yerine bağlantı kullanılır I, bu tam olarak bu baytları kullanabileceğiniz çevrimdışı sayıda bayt için çalışmalıdır. Çevrimiçi \rotomatik olarak değiştirilir \n)


0

> <> (Balık), 82 Bayt

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

Şüphe çok verimli, ama az ya da çok iş gibi görünüyor. Giriş, -vbunu yapmak için gereken argümanın boyutunu içeriyorsanız, skoru 85 Bayt yapan başlangıç ​​yığını üzerinden yapılır .

Çevrimiçi deneyin!


0

Lua, 75 Bayt

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

1
Bunun yerine statik yöntemler daha iyi kullanılması Örnek yöntemlerinin: ('I hate that I love that '):rep(n):sub(1,n*12-5). Ve eğer "onu" birleştirirsen daha iyi görünürdü. Sonuna kadar, çünkü print()parametrelerini sekmeyle ayrılmış olarak verir.
Manatwork

1
';' io.read () ile print gerekli değildir ve arg [2] ilk komut satırı argümanı olan lua kodları için geçerli bir giriş yöntemidir.
ATaco


0

dc, 75 bayt

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

Buraya bir seferde sadece bir yığın ip basıyoruz ve yığında çöp bırakmıyoruz. Bu harika, sayacımız için bir sicile kayıtlı herhangi bir bayt harcamamız gerekmiyor.

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

Julia, 91 Bayt

Julia çözümü ekledim sandım:

f(N)=string("I hate ",join(["that I love that I hate " for _ in 1:N-1])[1:12*(N-1)],"it."))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.