ควินหลายครั้ง


16

งานของคุณคือสร้างโปรแกรมที่ทำตาม:

  1. คุณควรใช้หมายเลข (ป้อนค่าบวกลบลบเศษส่วนได้)
  2. ถ้ามันเป็นลบคุณย้อนกลับควินิน และปฏิเสธตัวเลขนั้น (กลายเป็นบวก)
  3. จากนั้นคุณทำซ้ำ <จำนวนเต็มส่วนหนึ่งของจำนวนอินพุต> ครั้งแล้วพิมพ์ <floor (ส่วนที่เป็นส่วนหนึ่งของหมายเลขอินพุต * ยาว)> จากโปรแกรมต้นฉบับของคุณ ถ้าเป็นจำนวนเต็มส่วนเศษส่วนจะเป็นศูนย์

โบนัส -10% ถ้าโปรแกรมของคุณไม่ใช่แบบธรรมดา

ตัวอย่าง

หากโปรแกรมของคุณคือ "ABCDEFG" ดังนั้น

1

5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG

คำอธิบาย

ABCDEFG ห้าครั้ง

2

-2
GFEDCBAGFEDCBA

คำอธิบาย

GFEDCBA (กลับ ABCDEFG) 2 ครั้ง

3

7.5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABC

คำอธิบาย

ABCDEFG 7 ครั้งตามด้วย ABC (3 ตัวแรก (ชั้น (0.5 * 7) = ชั้น (3.5) = 3) ตัวอักษรบน ABCDEFG))

4

-0.3
GF

คำอธิบาย

GFEDCBA (กลับ ABCDEFG) 0 ครั้งตามด้วย GF (2 ครั้งแรก (ชั้น (0.3 * 7) = ชั้น (2.1) = 2) ตัวอักษรบน GFEDCBA (กลับ ABCDEFG))

5

0
<empty>

คำอธิบาย:

<empty> ที่นี่หมายความว่าโปรแกรมของคุณจะไม่แสดงผล เป็น ABCDEFG ศูนย์ครั้งที่ถูกกำหนดเป็นสตริงว่าง


คุณช่วยอธิบายเกี่ยวกับคำแนะนำได้มั้ย
LegionMammal978


@ LegionMammal978 จริง ๆ แล้วฉันไม่ดีที่แสดงสิ่งต่าง ๆ แต่ฉันหวังว่ามันจะทำให้ชัดเจนขึ้น
Akangka

2
@ mbomb007 ฉันเดาว่าคุณสามารถแยกสตริงตัวเองและจัดการ-และ.ด้วยตนเอง (คิดเป็นเศษส่วนเป็นจำนวนเต็มบวก) หรือคุณสามารถหันความสนใจไปที่ความท้าทายต่อไป ;) (ไม่ใช่ทุกภาษาสามารถมีส่วนร่วมในทุก ๆ ความท้าทาย แต่ตราบใดที่ความท้าทายนั้นไม่ได้แยกออกจากภาษาใด ๆ โดยพลการก็ถือว่าใช้ได้ดีเพียงแค่คิดถึงการประมวลผลเสียง / ภาพหรือระบบไฟล์ทั้งหมด)
Martin Ender

1
มันจะมีความรู้สึกว่าตรรกะมากขึ้นที่จะให้โบนัส 10% ถึงโปรแกรมที่มี palindromes
Bassdrop Cumberwubwubwub

คำตอบ:


8

CJam, 28 26 ไบต์ * 0.9 = 23.4

ขอบคุณ Sp3000 สำหรับการบันทึก 2 ไบต์

{`"_~"+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 กลับลำดับสแต็ก
  (; ถ้ารายการบนสุดเป็นศูนย์ให้ออกจากโปรแกรม
    V คว้าอินพุตเป็นตัวแปรกลางสุดท้าย
     d3 * ดันอักขระ 'ไปยังสแต็ก
        V2 ^ 12 / ^ รับค่าสัมบูรณ์ของค่าอินพุต
               Dv ทำซ้ำและบันทึกในตัวแปร temp
                 V ดันตัวแปรส่วนกลางไปยังสแต็ก
                  / หารสองรายการแรกสุด - สิ่งนี้จะได้รับ -1 หรือ 1 ขึ้นอยู่กับขั้วของอินพุต
                   1+ (ถ้าเป็น -1 ให้ทำตามคำแนะนำถัดไปมิฉะนั้นอย่าทำ
                      ย้อนกลับกองซ้อน
                       ดันตัวแปรชั่วคราวไปที่สแต็ก
                        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'

102 ไบต์ + 2 ไบต์สำหรับ-i- 10% สำหรับการไม่แสดงอาการผิดปกติ อินพุตถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยัง-i(เช่น-0.3ด้านบน)

มันทำงานอย่างไร

วิธีการแก้ปัญหานี้ขึ้นอยู่กับควินดังต่อไปนี้:

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

วิธีนี้ใช้ได้ผลดังนี้ ก่อนอื่นให้ตั้งค่า$_เป็นสตริง:

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

ถัดไปโทรevalซึ่งทำงานบน$_โดยค่าเริ่มต้น การเรียกนี้printมีหนึ่งอาร์กิวเมนต์ตัวอักษรสตริง:

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

เนื่องจากสตริงนี้เป็นเครื่องหมายคำพูดสองเท่าตัวแปรจึงถูกแก้ไข หลังจากการแก้ไข$_ค่าของสตริงคือ:

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

เมื่อพิมพ์ออกผลลัพธ์นี้:

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

ซึ่งเป็นรหัสที่มาของโปรแกรมเอง

สิ่งที่ดีเกี่ยวกับควินินนี้คือคุณสามารถฝังโค้ดโดยพลการภายในสตริงให้เป็น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

Haskell, 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="

ฟังก์ชั่น quine

*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

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