여러 번 Quine


16

당신의 임무는 다음과 같은 프로그램을 만드는 것입니다.

  1. 당신은 숫자를해야합니다. (정, 부, 분수 입력 가능)
  2. 음수이면 퀴인을 뒤집습니다. 그 숫자를 부정하십시오 (긍정적이 되십시오)
  3. 그런 다음 <입력 숫자의 정수 부분> 번 반복하고 소스 프로그램에서 먼저 <floor (입력 숫자의 소수 부분 * 길이)>를 인쇄합니다. 정수인 경우 분수 부분은 0입니다.

프로그램이 회문이 아닌 경우 -10 % 보너스.

프로그램이 "ABCDEFG"인 경우

1.

5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG

설명

ABCDEFG 5 회

2.

-2
GFEDCBAGFEDCBA

설명

GFEDCBA (ABCDEFG 역전) 2 회

삼.

7.5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABC

설명

ABCDEFG 7 번 뒤에 ABC (ABCDEFG의 첫 3 (floor (0.5 * 7) = floor (3.5) = 3))

4.

-0.3
GF

설명

GFEDCBA (ABCDEFG 역순) 0 번 다음에 GF (GFEDCBA의 첫 2 (floor (0.3 * 7) = floor (2.1) = 2) 문자) (ABCDEFG 역순))

5.

0
<empty>

설명:

여기서 <empty>는 프로그램이 출력되지 않음을 의미합니다. 빈 문자열로 정의 된 것은 ABCDEFG 0 번입니다.


지침을 명확하게 설명해 주시겠습니까?
LegionMammal978


@ LegionMammal978 나는 실제로 표현하는 것이 좋지 않지만 더 명확하게하기를 바랍니다.
Akangka

2
@ mbomb007 문자열을 직접 구문 분석 -하고 .수동으로 처리 할 수 ​​있다고 생각합니다 (분수를 양의 정수로 나타냄). 또는 다음 도전에 관심을 돌릴 수 있습니다. ;) (모든 언어가 모든 문제에 참여할 수있는 것은 아니지만 문제가 의도적으로 임의의 개별 언어를 배제하지 않는 한 완전히 괜찮습니다. 모든 오디오 / 이미지 처리 또는 파일 시스템 문제를 생각하십시오.)
Martin Ender

1
그것은 프로그램에 10 %의 보너스를 제공하는 것이 더 논리적 느꼈을 것 입니다 회문
Bassdrop Cumberwubwubwub

답변:


8

CJam, 28 26 바이트 * 0.9 = 23.4

2 바이트를 절약 한 Sp3000에 감사합니다.

{`"_~"+rd_z26*,\g1|@%f=}_~

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

설명

{`"_~"+ e# Generalised quine framework. Leaves the source code on the stack.
  rd    e# Read input and parse as double.
  _z    e# Copy and get absolute value.
  26*   e# Multiply by 26, the length of the quine to get length N of the output.
  ,     e# Get a range [0 1 ... floor(N-1)].
  \g    e# Swap with other copy and computer signum to determine direction of string.
  1|    e# This might be zero though, so take bitwise OR with 1 to avoid an error.
  @%    e# Pull up source string. Reverse it if the signum was -1 (no-op otherwise).
  f=    e# The range we pushed earlier corresponds to the (cyclic) indices of the source
        e# which make up the desired result, so we map each index to the corresponding
        e# character to get the final result.
}_~

5

Vitsy, 34 * 0.9 = 30.6 바이트

내 코드의 결함을 지적한 @ Sp3000에 감사드립니다!

우. 물리 선생님이 저에게 이것을 도와 줄 힘 기능이 있다고 상기시켜주었습니다. 그림을 이동.

'r (; Vd3 * V2 ^ 12 / ^ DvV / 1 + (rvl1-* \ [DO {]
'문자열로 녹음 시작-모든 것을 잡고 문자열로 스택에 푸시합니다.
 r 스택 순서를 반대로 바꿉니다.
  (; 맨 위 항목이 0이면 프로그램을 종료하십시오.
    V 입력을 최종 전역 변수로 가져옵니다.
     d3 * 문자 '를 스택에 밀어 넣습니다.
        V2 ^ 12 / ^ 입력 값의 절대 값을 구합니다.
               Dv 임시 변수에 복제하여 저장합니다.
                 V 전역 변수를 스택으로 밉니다.
                  / 상단 두 항목을 나눕니다. 입력의 극성에 따라 -1 또는 1을 얻습니다.
                   1 + (-1이면 다음 명령을 수행하십시오. 그렇지 않으면 그렇지 않습니다.
                      r 스택 뒤집기
                       v 임시 변수를 스택으로 푸시하십시오.
                        l1- * 스택 길이에 1을 뺀 값을 곱하십시오.
                            \ [] 스택 시간의 괄호 상단 항목에있는 모든 항목을 반복하십시오.
                              DO {항목을 복제하고 스택에서 꺼내서 출력 한 다음 스택에서 한 항목 위로 이동합니다.

2

Perl, 104 바이트-10 % = 93.6

perl -i-0.3 -e '$_=q{$_="\$_=q{$_};eval";$_=reverse if$^I<0;$n=abs$^I;print+($_ x$n).substr$_,0,y///c*($n-int$n)};eval'

-i회문이 아닌 경우 -10 % 인 경우 102 바이트 + 2 바이트 입력은 인수로 전달됩니다 -i(예 : -0.3위).

작동 원리

이 솔루션은 다음 quine을 기반으로합니다.

$_=q{print"\$_=q{$_};eval"};eval

이것은 다음과 같이 작동합니다. 먼저 $_문자열로 설정 하십시오.

print"\$_=q{$_};eval"

그런 다음 기본적으로 eval작동하는 $_을 호출하십시오 . print문자열 리터럴 하나의 인수로 호출합니다 .

"\$_=q{$_};eval"

이 문자열은 큰 따옴표로 묶여 있으므로 변수가 보간됩니다. 보간 후 $_문자열 값은 다음과 같습니다.

\$_=q{print"\$_=q{$_};eval"};eval

인쇄되면 다음이 출력됩니다.

$_=q{print"\$_=q{$_};eval"};eval

프로그램 자체의 소스 코드입니다.

이 quine의 좋은 점은 문자열 안에 임의의 코드를 삽입하여 eval'd'로 만들 수 있다는 것 입니다.


전체 솔루션에 대한 분석은 다음과 같습니다.

perl -i-0.3 -e'
    $_=q{                     # string to be eval'd
        $_="\$_=q{$_};eval";  # append beginning and end of quine so the
                              #  entire thing can be reversed if necessary
        $_=reverse if $^I<0;  # reverse if input < 0
        $n=abs $^I;           # set $n to absolute value of input
        print                 # print
            +($_ x $n)        # $_ repeated $n times
            .                 # concatenated with
            substr $_,        # substring of $_
                   0,         # starting at the beginning
                   y///c      # having length x, where x is length of $_
                   *          # multiplied by
                   ($n-int$n) # fractional part of $n
    };
    eval                      # eval $_
'

0

Mathematica, 139-10 % = 125.1 바이트

StringJoin[Table[s = If[#1 > 0, #1 & , StringReverse][ToString[#0, InputForm]], {Abs[Floor[#1]]}], StringTake[s, Floor[Mod[#1, 1]*139]]] & 

후행 공백에 유의하십시오. 공백, 표준 표기법 등은의 결과입니다 ToString[#0, InputForm].


0

하스켈, 158 * 0.9 = 142.2 바이트

c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="

퀴네 기능.

*Main> f (-0.3)
"=s;s wohs++s$i c$elcyc$)851*i sba$roolf(ekat$r

*Main> f 1.1
c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="c i|i<0=reverse

*Main> f 0
              <-- empty

0

파이썬 2, 193 바이트-10 % = 173.7

x=input();y=int(x);_='x=input();y=int(x);_=%r;_=(_%%_)[::y/abs(y)];x,y=abs(x),abs(y);_=_*y+_[:int(y*(x-y)*193)];print _';_=(_%_)[::y/abs(y)];x,y=abs(x),abs(y);_=_*y+_[:int(y*(x-y)*193)];print _

에 오류가 0있지만 STDERR을 무시해도 여전히 빈 출력이 표시됩니다.


지금은 이것이 가장 긴 해결책이지만 더 짧은 해결책을 찾고 가능하면 답장을 시도하십시오.
Erik the Outgolfer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.