Кілька разів


16

Ваше завдання - зробити програму, яка виконує такі дії:

  1. Вам слід взяти номер. (Позитивний, негативний, можливий дріб)
  2. Якщо воно негативне, ви обернете ангіну. і заперечувати це число (стати позитивним)
  3. Потім ви повторите <цілу частину вхідного числа> рази та друкуєте перше <підлогу (частка частки вхідного номера * довжина)> зі своєї вихідної програми. Якщо це ціле число, то частка дробу дорівнює нулю.

-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 Я насправді погано висловлюю річ, але сподіваюся, це зробить це зрозумілішим.
Акангка

2
@ mbomb007 Я думаю, ви можете самостійно проаналізувати рядок і обробити -і .вручну (представляючи дріб як натуральні числа). Або ви можете звернути свою увагу на наступний виклик. ;) (Не кожна мова може брати участь у кожному виклику, але доки виклик свідомо не виключає довільних окремих мов, це абсолютно добре. Подумайте лише про всі проблеми зі звуком / обробкою зображень чи файловою системою.)
Мартін Ендер

1
Логічніше було б дати 10% бонус програмам, які є паліндромами
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

Віци, 34 * 0,9 = 30,6 байт

Дякуємо @ Sp3000 за вказівку на недолік мого коду!

Ву. Мій вчитель фізики нагадав мені, що я маю владні функції, щоб допомогти мені в цьому. Піди розберися.

'r (; Vd3 * V2 ^ 12 / ^ DvV / 1 + (rvl1 - * \ [DO {]
'Почніть запис як рядок - це захоплює все і штовхає його до стеку як струну.
 r Зверніть порядок стеку.
  (; Якщо верхній елемент дорівнює нулю, вийдіть із програми.
    V Візьміть дані як кінцеву глобальну змінну.
     d3 * Натисніть символ 'до стеку.
        V2 ^ 12 / ^ Отримайте абсолютне значення вхідного значення.
               Дублікат DVD та збереження у змінній temp.
                 V Натисніть глобальну змінну до стеку.
                  / Розділіть два найпопулярніші пункти - для цього вийде -1 або 1 залежно від полярності введення.
                   1+ (якщо це -1, виконайте наступну інструкцію. Інакше не робіть.
                      r Переверніть стек
                       v Натисніть на тимчасову змінну до стеку.
                        l1- * Помножте на довжину стека мінус 1.
                            \ [] Повторіть усе, що в дужках, верхній елемент часів стеку.
                              ДО {Копіюйте елемент, висуньте його із стека та виведіть його, а потім перемістіть один елемент у стеку.

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

який є вихідним кодом самої програми.

Приємна річ у цьому 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

Математика, 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, ви все одно отримуєте порожній вихід.


Наразі це найдовше рішення, але спробуйте знайти коротший і відповідь, якщо зможете.
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.