나를 사랑하고 나를 사랑하지 않아


45

나를 사랑해, 나를 사랑하지 않아

이 간단한 어린이 게임은 오래되었지만 여전히 인기가 있습니다. 우리는 지금 21 세기에 살고 있기 때문에 디지털화합시다!

사양

임의의 시드를 생성 할 수없는 언어를 사용하지 않는 한 프로그램은 입력을받지 않아야합니다.이 경우 시드를 입력으로 사용할 수 있습니다. 당신의 임무는 게임에서와 같이 무작위로 총 3 ~ 20 줄을 포함하는 프로그램을 작성하는 것입니다 : "Loves me ..."와 "Loves me not ..." 독서).

그러나 몇 가지 제한 사항이 있습니다. 각 줄 뒤에 줄 바꿈이 와야합니다. 첫 번째 줄은 "Loves me ..."여야합니다. 마지막 줄 ( "Loves me"또는 "Loves me not")은 각각 느낌표 또는 단일 점으로 끝나야합니다. 마지막 줄 다음 에 "Loves me!"여부에 따라 새 줄에 heart ( <3) 또는 실의 ( ) 를 출력해야합니다 </3. 또는 "사랑하지 않습니다." 마지막 문장이었습니다.

후행 공백이 허용됩니다.

출력 예

산출:

나를 사랑합니다 ...
나를 사랑하지 않습니다 ...
나를 사랑합니다 ...
나를 사랑하지 않습니다 ...
나를 사랑합니다!
<3

다른 결과물 :

나를 사랑합니다 ...
나를 사랑하지 않습니다 ...
나를 사랑합니다 ...
나를 사랑하지 않습니다.
</ 3

이것은 이므로 가장 짧은 항목이 이깁니다!

또한, 나의 첫 번째 도전 :) 행운을 빌어 요!


라인 수의 분포에 대한 제한이 있습니까? 즉, 균일하게 랜덤해야합니까, 아니면 3에서 20 사이의 모든 길이가 양의 확률을 갖기에 충분합니까?
Zgarb

나는 이것에 대해 생각하지 않았지만 어떤 분포도 괜찮다고 말하고 싶습니다 . 따라서 균일하게 무작위 일 필요는 없습니다 .
MatthewRock

3 ~ 20 ( [3, 20)) 또는 3 ~ 20 ( )을 포함 [3, 20]합니까?
orlp

1
@MatthewRock 우리가 사용하고자하는 언어가 임의로 임의의 숫자를 시드 할 수 없다면? 사용자가 무작위 시드를 제공 할 수 있습니까?
mınxomaτ

3
@minxomat 어쨌든 게임 일뿐입니다. 계속해서 규칙을 변경했습니다.
MatthewRock

답변:


23

Pyth, 54 53 51 50 48 바이트

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3

%2tWZ"<</33하트 프린팅을 위해 절약하십시오. 1. 이것이 최선의 방법이라고 확신하지 않습니다.
FryAmTheEggman

@FryAmTheEggman 두 개를 절약했습니다.
orlp

마지막 두 문자열을 병합 하면 다른 문자열이 절약되지만 다시로 전환해야했습니다 %.
FryAmTheEggman

@".!"Z%hZ"</32 바이트 절약
Jakube

며칠 동안 참가한 적이 없으므로이 답변을 수락합니다. 축하합니다!
MatthewRock

23

CJam, 53 50 49 바이트

1 바이트를 절약 해 준 Dennis에게 감사합니다.

Imr3+{"Loves me"X!:X" not"*'.3*N}*&"!."X=N'<'/X*3

여기에서 테스트하십시오.

설명

이 코드는 문자열을 비트 및 조각으로 덤프하여 스택에 덤프하며 프로그램 종료시 자동으로 인쇄됩니다.

Imr3+         e# Generate a random number in [3,20]
{             e# Execute this block that many times.
  "Loves me"  e#   Push "Loves me", we always need that.
  X!:X        e#   Toggle X (initially 1) between 0 and 1 and leave it on the stack.
  " not"*     e#   Repeat " not" that many times, removing it on every other line.
  '.3*N       e#   Push "..." and a newline.
}*
&             e# Set intersection of "..." and newline, turning them into an empty array.
"!."X=        e# Select "!" or "." based on the last value of X.
N'<           e# Push a newline and "<".
'/X*          e# Include "/" or not depending on the last value of X.
3             e# Push a 3.

하나는 CJam이 ^^ 코드 골프 전용으로 개발 된 한 것이다 상상할 수
larkey

11
@larkey 그러나 그것은 ...
MatthewRock

@larkey CJam은 GolfScript에서 파생되었으며 GolfScript (이름에서 알 수 있듯이) 골프 용 으로 설계되었습니다.
Chris Jester-Young

@ ChrisJester-Young 그것은 약간 혀로 혀를
썼다

17

Brainfuck, 2766 바이트 (현재 유효하지 않음)

으니까. 나중에 언 골프 버전을 추가하겠습니다.

암호

>+<+[>[>[-]+<-]>[<+>>+[->,----------[<+>[>>>>>>>>>+<<<<<<<<<-]>>>>>>>>>[>+<<<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]]<]<-]>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>>>[<<<<<<<<<<+>>>>>>>>>>-]>[<<<<<<<<<<+>>>>>>>>>>-]<<<<<<<<+++++++[<+++++++++++>-]<[<<[>>>>>>>>>>+<<<<<<<+<<<-]>>>[<<<+>>>-]<<[>>>>>>>>>+<<<<<<<+>+<<<-]>>>[<<<+>>>-]<[>>>>>>>>+[<<<<<<<+>+>>>>>>-]<<<<<<[>>>>>>+<<<<<<-]+<[>-<[-]]>[>>>>>+<<<<<-]<<-]<-]++++++[>++++++++<-]>-[<<[>>>>>>>>>+<<<<<<<<+<-]>[<+>-]>-]<<<[-]>[-]+++++[<+++++>-]<[>>>>>>>>>>>+[<<<<<<<<<<+>+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]+<[>-<[-]]>[>>>>>>>>+<<<<<<<<-]<<-]++++++[>>>>>>>>>>+++++++++<<<<<<<<<<-]>>>>>>>>>>[<<+<<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]++++++++++++++++++++<<[<<<+>>>-]>>[<<<<<<<<+>+<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>>-<<<[-]]<<<[-]>>>>>>>>[-]<[>+<<<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>>>>[-]+++<<<[<<<<<+>>>>>-]>>>[<<<<<<<<<<<+>+<<+>>>>>>>>>>>>-]<<<<<<<<<<<<[>>>>>>>>>>>>+<<<<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]<[>>>>>>>>-<<<<<<<<[-]]>>>[-]>>>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>-<<<<<<<[-]]>>>>>>>>>[<<<<<<<<<+>+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]<[>>>>>>>[-]-<<<<<<<[-]]>>>>>>>[>>>>>>+<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>+++++++>++++++++++>+++++++++>+++>++++<<<<<-]>-.>+.+++++++.>++.<---.>>-.<<------.>.>>++...[-]<[-]<[-]<[-]<[-]<++++++++++.[-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>->[-]<[>+<-][-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]<<[<<<<<<+>>>>>>-]->>[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>>+<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++[>++++++++++<-]>.---------.[-]<<<-<->>-]>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>+++++++>++++++++++>+++++++++>+++>++++<<<<<-]>-.>+.+++++++.>++.<---.>>-.<<------.>.>.<<+.+.+++++.>>>++...[-]<[-]<[-]<[-]<[-]<++++++++++.[-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>->[-]<[>+<-][-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]<<[<<<<<<+>>>>>>-]->>[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>+<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++[>++++++++++<-]>.-------------.++++.<<<<->>-]<<]

의사 코드

loop
    get a random byte
until random byte is >2 and <21

point to byte
[
    output "Loves me..."
    decrease byte by 1
    if byte is 0
        output "<3"
        exit
    eif
    output "Loves me not..."
    decrease byte by 1
]
output "</3"

견본

실행되면 프로그램은 입력을 기다리는 대화식 세션으로 들어갑니다. 입력은 숫자 여야합니다. 이 숫자는 시드로 사용됩니다.

시드 : 1 (임의의 숫자는 5이며 218,168,042 개의 작업이 필요함)

1              
Loves me...    
Loves me not...
Loves me...    
Loves me not...
Loves me...    
<3             

시드 : 3 (임의의 숫자는 20이며 463,253,048 개의 작업이 수행됨)

3
Loves me...
Loves me not...
(...)
Loves me...
Loves me not...
</3

결과를 계산하는 62,105,900,375반복 이 필요하기 때문에으로 시드하지 않는 것이 좋습니다 . :).

컴파일 / 실행

이를 위해서는 빠른 통역사가 필요합니다. 테스트 한 온라인 통역사는 실행 속도를 처리 할 수 ​​없습니다. ips (초당 반복)는보다 커야 100,000,000합니다. 그래서 다른 해결책을 생각해 냈습니다.

이것은 Brainfuck로 작성된 Brainfuck to C 컴파일러입니다. 온라인 인터프리터를 사용하여 코드를 순수 C로 변환 할 수 있습니다 . brainfuck.tk를 사용하는 것이 좋습니다 . stdin 입력에 내 코드를 붙여 넣고 코드 입력 에이 코드를 붙여 넣으십시오.

+++[>+++++<-]>>+<[>>++++>++>+++++>+++++>+>>+<++[++<]>---]>++++.>>>.+++++.>------.<--.+++++++++.>+.+.<<<<---.[>]<<.<<<.-------.>++++.<+++++.+.>-----.>+.<++++.>>++.>-----.<<<-----.+++++.-------.<--.<<<.>>>.<<+.>------.-..--.+++.-----<++.<--[>+<-]>>>>>--.--.<++++.>>-.<<<.>>>--.>.<<<<-----.>----.++++++++.----<+.+++++++++>>--.+.++<<<<.[>]<.>>,[>>+++[<+++++++>-]<[<[-[-<]]>>[>]<-]<[<+++++>-[<+++>-[<-->-[<+++>-[<++++[>[->>]<[>>]<<-]>[<+++>-[<--->-[<++++>-[<+++[>[-[-[-[->>]]]]<[>>]<<-]>[<+>-[<->-[<++>-[<[-]>-]]]]]]]]]]]]]<[-[-[>+<-]>]<[<<<<.>+++.+.+++.-------.>---.++.<.>-.++<<<<.[>]>>>>>>>>>]<[[<]>++.--[>]>>>>>>>>]<[<<++..-->>>>>>]<[<<..>>>>>]<[<<..-.+>>>>]<[<<++..---.+>>>]<[<<<.>>.>>>>>]<[<<<<-----.+++++>.----.+++.+>---.<<<-.[>]>]<[<<<<.-----.>++++.<++.+++>----.>---.<<<.-[>]]<[<<<<<----.>>.<<.+++++.>>>+.++>.>>]<.>]>,]<<<<<.<+.>++++.<----.>>---.<<<-.>>>+.>.>.[<]>++.[>]<.>[.---->.---,....]

소스를 다운로드하고 컴파일하십시오.

gcc.exe -c main.c -o main.o
gcc.exe main.o -o loveme.exe

온라인으로 C 코드 사본을 온라인으로 실행할 수도 있습니다 . 코딩 접지 .

최적화

아직해야 할 일이 있지만 셀 재사용이 거의 최적입니다.

비고

단어 나 구를 씨앗으로 사용할 수 있습니다.

Programming Puzzles & Code Golf
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
<3

3
브레인 퍽의 PRNG를 작성하는 대담을 가진 +1 ...
AdmBorkBork

@TimmyD BF에서 PRNG를 작성하는 더 좋은 방법이 있지만 대부분은 시간 기반 (프로그램 실행, 특정 시점에서 실행 중지, 메모리 읽기)이지만 사용자 상호 작용과 두 개의 별도 프로그램이 필요합니다. 규칙.
mınxomaτ

3
좋은 의사 코드. 더 많은 사람들이 그렇게해야합니다. 특히 골프 언어의 절반을 모르면 기본적으로 읽을 수 없기 때문입니다.
The_Basset_Hound

3
불행히도 출력이 잘못되었습니다. 마지막으로 "Loves me"는 느낌표 ( "Loves me!")로 끝나야하며 "Loves me not"은 단일 점 ( "Loves me not.")으로 끝나야 합니다.
MatthewRock

1
RNG의 의사 코드를 가질 수 있습니까?
Beta Decay

7

자바 (ES6) 119 104 99 98 바이트

for(i=new Date%18+3,s=i&1?`!
<3`:`.
</3`;i--;)s=`...
Loves me`+(i&1?' not':'')+s
alert(s.slice(4))

좋은 것! 마음을 만들기 위해 그리고 각 줄을 만들 때 문자열 연결을 사용하는 것이 더 짧을 수 있습니다. new Date내 대답에 트릭을 사용하면 될까요?
ETHproductions

@ETHproductions 그 마음을 사용하는 것이 좋으면 하하 (그리고 왜 경고를 사용하지 않았습니까? 어떤 이유로 든 화살표 기능이 더 짧을 것이라고 확신했지만 반환이 필요하지 않다면 .. ). 사실 난 단지) =뿐만 아니라 다른 트릭 지금 (104)에 내려 있어요
Mwr247

젠장 ... 좋은 일 :) 난 내를 정리 유지하지만, 항상 (104)에서 끝
ETHproductions

나를 위해 돌파구는 뒤로 연결하고 초기화에서 마음을 정의하여 길이 / 반복 변수를 결합하는 것이 었습니다. 나는 약간의 비용을 절약하면서 잠시 동안 그것을 시도했지만, 당신의 심장이 단순화되어 훨씬 더 효율적이었습니다.
Mwr247

분 ...이 노력을 잠깐, 얻을 Loves me not... Loves me... Loves me not! <3하고 Loves me not... Loves me... Loves me not... Loves me. </3. 이 문제를 해결하려면 조건 중 하나를 변경해야한다고 생각합니다. 편집 : 아, 그냥 스위치 ''' not'네 번째 줄입니다.
ETHproductions

6

파이썬, 147

from random import*;t=randint(3,20)
print"\n".join("LLoovveess  mmee  n o t"[i%2::2].strip()+"..."*(i<t-1)for i in range(t))+"!.\n\n<<3/ 3"[t%2::2]

용도 from random import*의 대신 import randomrandint대신은 randrange몇 바이트를 저장합니다. 골프를 치려면 약간의 바이트가 남아있을 것입니다.


3
교대 "LLoovveess mmee n o t"[i%2::2].strip()는 불필요하게 복잡해 보인다. 그냥 할 수 없어 "Loves me"+~i%2*" not"?
xnor

심지어 ["Loves me","Loves me not"][i%2]당신이 지금 문자 낭비하고 있기 때문에 더 최적이며, .strip()공백의 몇. 그러나 그렇습니다, xnor의 코드를 사용하십시오
nitro2k01

6

자바 (ES6) 110 102 바이트

a='';for(i=j=new Date%18+3;i--;)a+='Loves me'+(j-i&1?'':' not')+(i?`...
`:j&1?`!
<3`:`.
</3`);alert(a)

이것은 짧지 만 재미있는 작은 도전이었습니다. 더 짧아 질 수 있습니다. 바이트 절약 요령에 대한 Mwr247에 감사합니다!

repeat(), 105 바이트를 사용하는 대체 버전 :

a='';for(i=j=new Date%18+3;i;)a+='Loves me'+' not'.repeat(j-i--&1)+(i?`...
`:j&1?`!
<3`:`.
</3`);alert(a)

Darn JS 5+ 문자 내장 이름. 오 잘 제안을 환영합니다!


인상적인 응축. 그래도 궁금합니다 18+3|0. 왜 그렇 습니까?
Mwr247

@ Mwr247 아, 그게 내가 사용했을 때 Math.random()입니다. 지금 필요하지 않은 것 같아요.
ETHproductions


5

루비, 91 바이트

(n=3+rand(18)).times{|i|puts"Loves me"+[""," not"][i%2]+(i<n-1?"...":i%2>0?".
</3":"!
<3")}

5

CL의 106 104 바이트

(format t"~{Loves me~[ not~]~#[~:*~[.~%</~;!~%<~]3~:;...~]~%~}"(subseq'#1=(1 0 . #1#)0(+ 3(random 18))))

이것은 올바른 순서를 확인하지 않는 리스프 (예 : cmucl, sbcl, clisp)에서만 작동합니다. ccl은 기본 안전 수준에서 원형을 확인하고 오류를 확인합니다. ecl은 영원히 반복됩니다.

설명:

#1=(1 0 . #1#)함유하는 원 목록을 생성 1하고 0subseq길이가 [3,20]의 목록 (이 같은 유일한 비 휴대용 일부 확인하는 데 사용되는 subseq경우에만 적절한 (즉, 비 원형)리스트에 대한 작업은 표준에서 요구된다).

우리의 형식은 이제 1 0 1 0...길이 목록에서 작동하고 있습니다 [3,20]

format지시문 설명 :

~{ 이 목록을 반복

~[뒤에는 숫자 인수로 ~;끝나는 ~]형식 인수 값에 따라 N 번째 항목이 선택됩니다. 여기서는 a의 첫 번째 항목 ~[이 "사랑하지 않음"사례이고 두 번째 항목은 "사랑함"사례가되도록 사용됩니다. 참고로 그 ~[세퍼레이터 ~:;선택하는 기본적인 경우.

~#[~[인수가 나머지 인수 수임을 제외하고는 작동합니다 . 나머지 인수 0은 우리가 끝났음을 의미하며 기본 경우는 인쇄하는 것입니다....

~:* 인수 목록을 한 위치에 백업하면 올바른 트레일러를 인쇄 할 수 있습니다.


1
이것은 #lisp IRC 채널의 그룹 노력이었습니다. 영리한 반복 형식 문자열과 하위 수식 해킹에 대해 phf에게 감사드립니다.
Jason

4

줄리아, 98 바이트

r=rand(3:20)
for i=1:r println("Loves me"*(i%2>0?" not":"")*(i<r?"...":i%2>0?".\n</3":"!\n<3"))end

언 골프 드 :

# Define a random number 3 ≤ r ≤ 20
r = rand(3:20)

for i = 1:r
    # The loveless lines occur when i is even
    println("Loves me" *
            (i % 2 > 0 ? " not" : "") *
            (i < r ? "..." : i % 2 > 0 ? ".\n</3" : "!\n<3"))
end

4

UNIX 쉘, 193 바이트

t=$(seq 2 19|shuf|head -1)
l=t
p=...
while [ $t -ge 0 ];do
case $l:$t in t:0)p=!;h=\<3;;f:0)p=.;h=\</3;;esac
case $l in t)l=f;n=;; f)l=t;n=\ not;;esac
t=$((t-1))
echo Loves me$n$p
done
echo $h

4

자바 210 209 203 200 177 바이트

  • 반전 i%2==0i%2<1
  • -loop의 트림 { ... }괄호 for, e선언을 루프 로 이동
  • 재정렬 조건부
  • 수정 자 및 불필요한 괄호 제거, 재 작업 된 Random사용량 및 증가i

참고 :이 사이트에서 서식을 지정하기 위해 줄 바꿈이 아래에 추가되며 위의 수는 줄입니다.

class F{public static void main(String[]a){for(int e=3+(int)(Math.random()*18),i=0;++i<=e;)
System.out.println("Loves me"+(i%2>0?i<e?"...":"!\n<3":" not."+(i<e?"..":"\n</3")));}}

언 골프 드 :

class F {
    public static void main(String[] a) {
        for (int e = 3 + (int) (Math.random() * 18), i = 0; ++i <= e; )
            System.out.println("Loves me" + (i % 2 > 0 ? i < e ? "..." : "!\n<3"
                    : " not." + (i < e ? ".." : "\n</3")));
    }
}

1
public을 제거하여 13 바이트를 절약 할 수 있습니다.
Luminous

@Luminous 나는 여전히 하나를 유지해야합니다 main()...
hjk

@TimmyD 두 번째입니다.
RK.

4

C, 123, 121, 109106 자 (108 바이트)

(조금 ♥♥♥ 불륜 ♥♥♥)

O;main(o){for(o=time(O)%18+3;o-O++;printf("Loves me%s%s\n",O&1?"":" not",o-O?"...":O%2?"!\n♥":".\n</3"));}

거기에 또한의 마음에 상처 유니 포인트는 1f494에서,하지만 난 어떤 구현이 글꼴을 찾는데 어려움이 있었다.


쇼 120 자, 122 바이트 ...
AdmBorkBork

1
int를 자동 초기화 O=0하기 때문에 필요하다고 생각하지 않습니다 . C0
FryAmTheEggman

@FryAmTheEggman 잘 찾았습니다! 이전 버전에서는 main(o,O)초기화해야 할 위치에 O가 있었습니다.
Jens

좋아, 내가 좋아하는거야! 난 time임의의 숫자로 사용 생각하지 않았다 ... 영리한!
MatthewRock

@MatthewRock 당신이 그것에 대해 생각하면, 사용하는 다른 모든 프로그램 srand(time(0))은 같은 빈도로 답변을 변경합니다. srand는 완전히 쓸모가 없다 :-)
Jens

4

파이썬 2 161 159 156 144 바이트

from random import*;a=randrange(3,21)
for i in range(a):print'Loves me'+i%2*' not'+('...'if i!=a-1 else'.'if i%2 else'!')
print['<3','</3'][i%2]

난수를 얻기 위해 39 바이트입니다.

그들의 도움에 대해 muddyfish , fryamtheeggmanorlp 에 큰 감사합니다 .

PYG , 109 바이트

a=RR(3,21)
for i in R(a):P('Loves me'+i%2*' not'+('...'if i!=a-1 else'.'if i%2 else'!'))
P(['<3','</3'][i%2])

range 문은 한 줄로 수행 할 수 있습니다. 당신은 또한 할 수 있습니다import random as r
Blue

또한 마지막 인쇄 문의 내용을 위의 줄에 넣을 수도 있습니다.
Blue

나는 변경할 수 있다고 생각 print'</3'if i%2 else'<3'하는 print['<3','</3'][i%2]3 바이트를 저장합니다.
Kade

참으로 가능합니다. 감사!
Celeo

감사! 흥미롭게도, import random as r;a=r.randrange(3,21)import random;a=random.randrange(3,21)같은 길이이다.
Celeo

3

PowerShell을 121 119 111 바이트

$i=2..19|Random;1..$i|%{"Loves me$(if(!($_%2)){" not"})..."};"Loves me$(if(!($i%2)){"!`n<"}else{" not.`n</"})3"

편집-실제로 "Loves me"선언하는 대신 명시 적으로 포함 하기 위해 더 짧습니다.$l

for()편집 2-파이프 라이닝을 통해 루프를 골프로 칠 수 있다는 것을 잊었습니다 ... durr ...

너무 초라하지 않습니다. 인라인 코드 실행 블록 $(...)을 사용 하여 for()루핑 할 때 인쇄 된 문자열을 동적으로 조정합니다 . 이것은 몇 바이트를 저장하기 위해 암시 적 Get-앞을 사용하기 때문에 Random특정 PowerShell 버전에서 매우 느리게 작동 할 수 있습니다. 참고

설명을 위해 아래로 확장 :

# Create a collection of (2,3,4,...18,19) and pipe it as input to Get-Random
$i = 2..19 | Get-Random

# Create a collection of (1,2,...$i-1,$i) and pipe it to seed a ForEach-Object loop
1..$i | ForEach-Object {
  if(!($_%2)) {
    # If the input number is even, we're on an even line
    Write-Output "Loves me not..."
  }
  Else {
    # The input number is odd
    Write-Output "Loves me..."
  }
}
If(!($i%2)) {
  # Our random number is odd
  Write-Output "Loves me!"
  Write-Output "<3"
}
Else {
  # Our random number is even
  Write-Output "Loves me not."
  Write-Output "</3"
}

3

C ++, 210 193 184 168 바이트

C ++에서 .. 왜냐면? :)

#include <iostream>
main(){auto&c=std::cout;srand(time(0));int i,j=3+rand()%18;while(i++<j)c<<"Loves me"<<(i%2?"":" not")<<(i==j?"":"...\n");c<<(j%2?"!\n<3":".\n</3");}

라이브: 210 193 184 168

내 변경 사항이 플랫폼에 따라 다르지 않기를 바랍니다.

도움을 주신 Ben Voigt 에게 감사드립니다 . 또한 모든 의견 덕분에 그들은 매우 도움이되었습니다.


Humn .. 그냥 3에서 20까지 깨달았습니다. 나중에 고칠 것입니다. 아마 2 바이트를 더 추가 할 것입니다 ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva

당신은 대체하여 많이 절약 할 수 있습니다 #define c coutusing namespace std;의해auto&c=std::cout;
벤 보이트

int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt

안녕하세요, 버그를 찾았습니다. 마지막 줄은 "Loves me!"가 아니라 "Loves me!"입니다.
MatthewRock

1
괜찮습니다-C와 C ++는 비슷합니다. 그리고 지금이 코드는 자바보다 길다.
MatthewRock

3

그루비, 110 바이트

그루비 사랑의 종류 :

int r=Math.random()*18;print((0..r+2).collect{"Loves me"+" not"*(it%2)}.join('...\n')+['!\n<3','.\n</3'][r%2])

2

파이썬 2, 117 바이트

from random import*
n=randint(3,20)
print"...\n".join("Loves me"+i%2*" not"for i in range(n))+[".\n</3","!\n<3"][n%2]

모든이 있음을 관찰 Loves me( not)?뒤에 ...마지막 하나를 제외하고 줄 바꿈. 그래서 이것은의 직업처럼 보입니다 join.


조금 늦었지만 ".!\n\n<</33"[n%2::2]2 바이트 더 짧습니다.
FryAmTheEggman

@FryAmTheEggman 그래, 나는 그것을 보았지만 Loovjo에서 그것을 훔치지 않기로 결정했다. 그 동안 다른 누군가가 그 솔루션을 정확하게 게시했습니다. [
shrug

나는 다른 사람이 그것을 게시하는 것을 보지 못했지만 내 의견 이 가장 먼저
작성된 것이 확실하므로

2

R, 141 132 128 114 111 109 바이트

암호

k=sample(3:23,1);for(i in 1:k)cat("Loves",c("me not...\n","me...\n","me not.\n</3","me!\n<3")[1+i%%2+2*!i<k])

언 골프

k <- sample(3:23, 1)        # Generates random "k" number from 3 to 23
for(i in 1:k) {             # Loop this block increasing i from 1 until k by 1
  cat                       # Concatenate and paste everything inside this block
  ("Loves",                 # Push "Loves" on every iterations of the loop
      c(                    # Create a vector of strings
        "me not...\n",      # Push string to the index "1" of vector
        "me...\n",          #   to the index "2"
        "me not.\n</3",     #   to the index "3"
        "me!\n<3"           #   to the index "4"
        )[1+i%%2            # Subset the vector by the index (1 or 2)
          +2*!i<k])}        #   if final iteration of loop then index += 2 (3 or 4)

Eric Brooks 코드 에서 영감을 얻었습니다 .

편집 1 : 이제 코드는 Martin
Edit 2에서 지적한대로 마지막 문장 부호를 올바르게 출력 합니다.
편집 3 : 제거 {}및 변경 +(x==k)*2+2*!x<k
편집 4 : 루프 위로하고, 제거 ()에서 (i%%2)+1
편집 5 : 쓴 me4 번과 제거sep=""


1

R, 119 (111) 105 바이트

x<-sample(3:20,1);cat(rep(c("Loves me...\n","Loves me not...\n"),x)[1:x]);cat(ifelse(x%%2==1,"<3","</3"))

편집 1,2 : 두 옵션을 명시 적으로 코딩하면 공간이 절약됩니다.


1
당신은 사용하여 바이트를 저장할 수있는 =과제에 대한보다는 <-다른로하고 x%%2>0대신에 x%%2==1. 또한 이것은 마지막 줄을 올바르게 처리하지 못합니다. 이 있어야 .또는 !오히려보다 .... (질문의 출력 예를 참조하십시오.)
Alex A.

1
@Alex A. 둘 다 필요하지 않습니다 x%%2>0. 그냥x%%2
Flounderer

좋은 지적, 감사합니다. 돌아가서 결말을 고쳐야합니다
Eric Brooks

1

C 226 바이트

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main(){srand(time(NULL));int i=rand()%18+3;int j;for(j=0;j<i;j++)printf("Loves me%s%s\n",(j%2)?" not":"",(j==i-1)?(j%2)?".":"!":"...");printf("<%s3\n",(j%2)?"":"/");}

(포맷 포함)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    int i = rand()%18 + 3;
    int j;
    for (j = 0; j < i; j++)
        printf("Loves me%s%s\n", (j % 2) ? " not" : "", (j==i-1) ? (j % 2) ? "." : "!" : "...");
    printf("<%s3\n", (j%2) ? "" : "/");
    return 0;
}

1
기본 (-5 바이트)에서 반환 유형을 제거하고 기본 유형 (-8 바이트, j의 기본값 0으로 인해 -3 이상)으로 i 및 j를 전역으로 만들려면 NULL (-3) 대신 0을 사용하십시오. 다른 것들-하나의 변수 만 사용하고 루프 카운트를 낮추십시오. 골프를 할 때 수입품 stdio는 일반적으로 필요하지 않습니다.
aragaer

1

파이썬 2, 115 바이트

from random import*
n=randint(2,20)
print'...\n'.join('Loves me'+i%2*' not'for i in range(n))+'.!\n\n<</33'[n%2::2]

1

PHP, 191 187 146 165 바이트

$x=rand(5,22);for($i=2;++$i<=$x;){echo"\nLoves me";if($i%2<1)echo" not";if($i<$x)echo"...";if($i==$x&&$i%2<1){echo".\n</3\n";}elseif($i==$x&&$i%2>0){echo"!\n<3\n";}}

언 골프 드 :

$x=rand(5,22);
for($i=2;++$i<=$x;){
    echo "\nLoves me";
    if($i%2<1) echo " not";
    if($i<$x) echo "...";
    if($i==$x && $i%2<1){
        echo ".\n</3\n";
    }
    elseif($i==$x && $i%2>0){
        echo "!\n<3\n";
    }
}

pyth 및 cjam에 대한 48,49 바이트 ... 와우 :)


변경된 I $ % 2 == 0 i가 2 %를 $ <! 1 (X2) 및 I $ % 2 = 0 달러에 대한 I % 2> 0 (X2)
마렉 Bettman

삼항 연산자를 밝혀이 :) 항상 최고의 답변을하지 않습니다
마렉 Bettman

1

MSL, 178 176 156 154 바이트

편집 1 : 변경 == 0< 1
편집 2 : 제거 불필요한 공백, 감사 알렉사!
편집 3 : 괄호 제거

alias l {
var %n 1
while %n <= $rand(3,20) {
var %m $+(Love me,$iif($calc(%n % 2) < 1,$chr(32) $+ not),...)
echo %m
inc %n
}
echo $iif(n isin %m,</3,<3)
}

1
솔루션은 현재 177이 아니라 176 바이트입니다. 모든 공백이 필요합니까? 그렇지 않은 경우 불필요한 공백을 제거하여 코드를 크게 줄일 수 있습니다.
Alex A.

@AlexA. 내가 왜 177을 썼는지 모르고, 공백이 필요하다는 것을 지적 해 주셔서 감사합니다. 실제로 필요하지 않습니다!
데니

1

펄, 97 바이트

$_='She loves me...
'x(3+rand 18);s/(me.*?)me/$1me not/gs;s/e...
$/e!
<3/;s/t...
$/t.
<\/3/;print

읽을 수있는 버전 :

$_="She loves me...\n"x(3+rand 18);
s/(me.*?)me/$1me not/gs;
s/e...$/e!\n<3/;
s/t...$/t.\n<\/3/;
print

1

Hassium , 265 바이트

func main(){rnd=new Random();times=rnd.next(3,21);println("Loves me...");for(x=0;x<times-1;x++){if(x%2==0)println("Loves me not...");else println("Loves me...");}if((times-1)%2==0){println("Loves me not.");println("</3");}else{println("Loves me!");println("<3");}}

대답은 골프였다.


솔루션은 현재 523이 아닌 458 바이트 입니다. 불필요한 공백을 제거하고 변수 이름을 줄여 점수를 향상시킬 수 있습니다. 예를 들어 다른 Hassium 솔루션 을 참조하십시오 .
Alex A.

1
다른 Hassium 답변에서 언급했듯이 난수 생성기는 극도로 편향 된 것으로 보입니다. 나는 최신 버전으로이 500 번 실행하고 단 두 개를 얻었다 </3.
Dennis

+ Dennis 난수 생성기는 C # 난수 생성기 위에 직접 빌드됩니다. 참조 : github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Jacob Misirian

3
제대로 시드되지 않은 것 같습니다. rnd = new Random();rnd.next(0,2);1000 번 실행 하면 배포가 정상입니다. 그러나 rnd = new Random();한 번과 rnd.next(0,2);1000 번 실행 하면 항상 정확히 533 0초와 467 초가 1됩니다.
Dennis

1

C # (160)

코드는 hjk 의 답변 에서 영감을 얻었으며 신용은 그에게갑니다.

class P{static void Main(){for(int e=3+new Random().Next(0,18),i=0;++i<=e;)Console.WriteLine("Loves me"+(i%2>0?i<e?"...":"!\n<3":" not."+(i<e?"..":"\n</3")));}}

언 골프 드 :

class P
{
    private static void Main()
    {
        for (int e = 3 + new Random().Next(0, 18), i = 0; ++i <= e;)
            Console.WriteLine("Loves me" + (i % 2 > 0 ? i < e ? "..." : "!\n<3" : " not." + (i < e ? ".." : "\n</3")));
    }
}

1

루아, 137132 바이트

아마 훨씬 더 골프를 칠 수 있지만, 지금은 여기 있습니다.

t=math.random(3,20)for i=1,t do io.write(i%2==0 and"Loves me"or"Loves me not")print(i==t and(i%2==0 and"!\n<3"or".\n</3")or"...")end

코드 설명 및 ungolfed :

t=math.random(3,20) --Generates a random number between 1 and 30. We need to assign it to a variable to check if the loop is over later.
for i=1,t do
  io.write(i%2==0 and"Loves me"or"Loves me not") --If i%2 is 0 write without a newline Loves me, if not print Loves me not.
  print(i==t and (i%2==0 and"!\n<3" or ".\n</3") or "...") --If it is not the end of the loop, put ..., else if we ended on an even print ! a newline, and then a heart, but if we ended on an odd put ., a newline and a broken heart :(
end

편집 : 일부 공백이 잘립니다.



1

PowerShell , 85 88 바이트

Veskah 덕분에 +3 바이트 : 좋은 지적입니다.

0..(1..19|Random)|%{($l='Loves me')+' not'*($n=$_%2)+'...'}
$l+('!
<3',' not.
</3')[!$n]

온라인으로 사용해보십시오!


1
이렇게하면 "사양을 읽는 방법에 따라 최소 줄 수 미만인"사랑 해요, 미안 해요 </ 3 "가 생성 될 수 있습니다.
Veskah

실제로 of *3* to 20 lines inclusive. 감사!
mazzy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.