Quine beberapa kali

16

Tugas Anda adalah membuat program yang melakukan hal berikut:

  1. Anda harus mengambil nomor. (Positif, negatif, fraksi adalah input yang memungkinkan)
  2. Jika negatif, Anda membalikkan quine. dan meniadakan angka itu (Menjadi positif)
  3. Kemudian Anda ulangi <integer part dari nomor input> kali dan mencetak <lantai pertama (bagian pecahan dari nomor input * panjang)> dari program sumber Anda. Jika bilangan bulat, maka bagian pecahan adalah nol.

-10% bonus jika program Anda bukan palindrome.

Contoh

Jika program Anda adalah "ABCDEFG", maka

1.

5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG

Penjelasan

ABCDEFG lima kali

2.

-2
GFEDCBAGFEDCBA

Penjelasan

GFEDCBA (ABCDEFG terbalik) 2 kali

3.

7.5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABC

Penjelasan

ABCDEFG 7 kali diikuti oleh huruf ABC (3 pertama (lantai (0,5 * 7) = lantai (3,5) = 3) pada ABCDEFG)

4.

-0.3
GF

Penjelasan

GFEDCBA (ABCDEFG terbalik) 0 kali diikuti oleh GF (2 pertama (lantai (0,3 * 7) = lantai (2.1) = 2) huruf pada GFEDCBA (ABCDEFG terbalik))

5.

0
<empty>

Penjelasan:

<empty> di sini berarti program Anda tidak menghasilkan. ABCDEFG nol kali yang didefinisikan sebagai string kosong.

Akangka
sumber
Bisakah Anda menjelaskan petunjuknya?
LegionMammal978
1
Terkait
Martin Ender 3-15
@ LegionMammal978 Saya sebenarnya buruk dalam mengekspresikan sesuatu, tapi saya harap ini akan membuatnya lebih jelas.
Akangka 3-15
2
@ mbomb007 Saya kira Anda dapat mengurai string sendiri dan menangani -dan .secara manual (mewakili fraksi sebagai bilangan bulat positif). Atau Anda bisa mengalihkan perhatian Anda ke tantangan berikutnya. ;) (Tidak semua bahasa dapat berpartisipasi dalam setiap tantangan, tetapi selama tantangan itu tidak dengan sengaja mengesampingkan bahasa individu yang sewenang-wenang, itu sepenuhnya baik-baik saja. Pikirkan semua pemrosesan audio / gambar atau tantangan sistem file.)
Martin Ender 3-15
1
Akan terasa lebih logis untuk memberikan bonus 10% untuk program yang merupakan palindrom
Bassdrop Cumberwubwubwub

Jawaban:

8

CJam, 28 26 byte * 0,9 = 23,4

Terima kasih kepada Sp3000 untuk menghemat 2 byte.

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

Uji di sini.

Penjelasan

{`"_~"+ 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.
}_~
Martin Ender
sumber
5

Vitsy, 34 * 0,9 = 30,6 Bytes

Terima kasih kepada @ Sp3000 karena menunjukkan kesalahan pada kode saya!

Merayu. Guru Fisika saya mengingatkan saya bahwa saya memiliki fungsi kekuatan untuk membantu saya dalam hal ini. Sosok pergi.

'r (; Vd3 * V2 ^ 12 / ^ DvV / 1 + (rvl1 - * \ [DO {]
'Mulai merekam sebagai string - ini mengambil semuanya dan mendorongnya ke tumpukan sebagai string.
 r Membalik urutan tumpukan.
  (; Jika item teratas adalah nol, keluar dari program.
    V Ambil input sebagai variabel global final.
     d3 * Dorong karakter 'ke tumpukan.
        V2 ^ 12 / ^ Dapatkan nilai absolut dari nilai input.
               Gandakan dan simpan dalam variabel temp.
                 V Dorong variabel global ke tumpukan.
                  / Bagi dua item teratas - ini mendapat -1 atau 1 tergantung pada polaritas input.
                   1+ (Jika -1, lakukan instruksi berikutnya. Jika tidak, jangan.
                      r Membalik tumpukan
                       v Dorong variabel sementara ke tumpukan.
                        l1- * Lipat kalikan dengan panjang tumpukan minus 1.
                            \ [] Ulangi semuanya dalam kurung item teratas dari waktu tumpukan.
                              LAKUKAN {Gandakan sebuah item, keluarkan dari tumpukan dan keluarkan, lalu pindahkan satu item ke dalam tumpukan.
Addison Crump
sumber
2

Perl, 104 byte - 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 byte + 2 byte untuk -i- 10% karena tidak menjadi palindrom. Input diberikan sebagai argumen untuk -i(misalnya di -0.3atas).

Bagaimana itu bekerja

Solusi ini didasarkan pada quine berikut:

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

Ini berfungsi sebagai berikut. Pertama, atur $_ke string:

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

Selanjutnya, panggil eval, yang berfungsi $_secara default. Ini panggilan printdengan satu argumen, string literal:

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

Karena string ini dikutip ganda, variabel diinterpolasi. Setelah interpolasi $_, nilai string adalah:

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

Saat dicetak, ini menghasilkan:

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

yang merupakan kode sumber dari program itu sendiri.

Yang menyenangkan tentang quine ini adalah Anda dapat menanamkan kode arbitrer di dalam string menjadi eval'd.


Berikut ini rincian solusi lengkap:

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 $_
'
IniSuitIsBlackNot
sumber
0

Mathematica, 139 - 10% = 125,1 byte

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

Perhatikan ruang trailing. Spasi putih, notasi standar, dll. Adalah hasil dari ToString[#0, InputForm].

LegionMammal978
sumber
0

Haskell, 158 * 0,9 = 142,2 byte

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

Fungsi 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
nimi
sumber
0

Python 2, 193 byte - 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 _

Kesalahan aktif 0, tetapi, mengabaikan STDERR, Anda masih mendapatkan output kosong.

Erik the Outgolfer
sumber
Saat ini ini adalah solusi terpanjang, tetapi coba cari yang lebih pendek, dan balas jika Anda bisa.
Erik the Outgolfer