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.


Bisakah Anda menjelaskan petunjuknya?
— LegionMammal978


@ 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.
}_~

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.

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 $_
'

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


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

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.


Saat ini ini adalah solusi terpanjang, tetapi coba cari yang lebih pendek, dan balas jika Anda bisa.
— Erik the Outgolfer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.