Десятичное умножение строк


14

Учитывая 2 входа, строку и десятичное число, выведите строку, умноженную на это число.

Подвох в том, что число может быть числом с плавающей точкой или целым числом.

Вы должны вывести время строки floor(n)и затем первые floor((n-floor(n))*len(string))буквы снова.

Другие заметки:

  • Ввод не всегда будет с плавающей точкой, это может быть int. Так что 1,5, 1 и 1,0 все возможно. Это всегда будет в базе 10, хотя, и если вы хотите исключение, пожалуйста, прокомментируйте.
  • Строка ввода может содержать пробелы, кавычки и другие символы. Никаких символов новой строки или контрольных символов.
  • Встроенные модули для прямого повторения строк 'a'*5не допускаются , даже умножение строк, например, Python . Однако добавление строки разрешено.

Тестовые случаи:

Запятая и пробел разделяют входы.

test case, 1 -> test case

case, 2.5 -> casecaseca

(will add more later), 0.3333 -> (will(space)

cats >= dogs, 0.5 -> cats >

Заключительное примечание:

Я вижу много ответов, в которых используются встроенные функции умножения или повторения строк. Это не разрешено @ Ответ VTC в это действует , хотя, потому что он не умножать строку, только вход с плавающей точкой. Таким образом, окончательное правило таково: если оно непосредственно умножает строку, вы не можете это сделать.


Формулировка изменялась неоднократно (я не видел первую ревизию). Я предлагаю удалить directповторение строки (что это значит?). Но в целом вы правы
edc65


@ Sp3000 да, я знаю. Я думаю, что разница достаточно значительна.
Rɪᴋᴇʀ

«Никаких встроенных модулей для прямого повторения строк, даже умножение строк, например, python 'a' * 5, не допускается». Вы не объясняете разницу между ними. Они звучат одинаково для меня.
msh210

@ edc65 В Perl вы можете сделать повторение списка, а затем объединить элементы этого списка, который не является прямым повторением строки. В Perl 5: join "", ("case") x 2против "case" x 2, в Perl 6 [~] "case" xx 2против того же самого"case" x 2
Брэд Гилберт b2gills

Ответы:


4

Желе, 5 байт

×L}Rị

Не использует встроенное повторение. Попробуйте онлайн!

Как это устроено

×L}Rị  Main link. Left input: n (multiplier). Right input: S (string)

 L}    Yield the length of S.
×      Multiply it with n.
   R   Range; turn n×len(S) into [1, ... floor(n×len(S))].
    ị  Retrieve the elements of S at those indices.
       Indices are 1-based and modular in Jelly, so this begins with the first and
       jump back after reaching the last.

7

Ява 7, 89

void g(char[]a,float b){for(int i=0,l=a.length;i<(int)(l*b);)System.out.print(a[i++%l]);}

принимает char [] и float и выводит в STDOUT. базовый цикл


3
Хороший гольф, даже для Java. : P
Rɪᴋᴇʀ

это было предложено и на моем другом ответе, но я не думаю, что сделаю это. это не кажется мне правильным.
Марки Марков

Эх, достаточно честно. Это признается здесь, но хорошо. : D
Эддисон Крамп

Я рекомендую объявить ваш язык как Java 7. Тогда никто не может сказать вам использовать лямбды.
feersum

6

Pyth, 9 8

s@Lz*lzQ

1 байт благодаря Pietu1998

Это берет floor(n * len(string))буквы из строки, используя циклическое индексирование. Я считаю, что это всегда эквивалентно данной формуле.

Тестирование


1
Нет, плз, не забирай это у меня так скоро. xD
Эддисон Крамп

@VoteToClose Я вообще не читал ваш ответ, разведчики чести: PI даже не осознавал, что повторение строк запрещено, это было просто короче того, что я придумал таким образом ...
FryAmTheEggman

1
Тебе даже не нужно второе s. rangeэто смешно
PurkkaKoodari

1
НОО! плачет в углу Ах, да ладно.
Эддисон Крамп

6

JavaScript (ES6), 50 байт

Отредактируйте еще 2 байта, чтобы включить определение функции f. 1 байт меньше, используя подсказку @manatwork. Примечание: используя ~у нас больше итераций, чем необходимо, но это код гольф и даже 1 байт

f=(s,n,l=s.length*n)=>~n?f(s+s,n-1,l):s.slice(0,l)

ТЕСТОВОЕ ЗАДАНИЕ

f=(s,n,l=s.length*n)=>~n?f(s+s,n-1,l):s.slice(0,l)

//TEST
console.log=x=>O.textContent+=x+'\n'
;[
 ['test case', 1, 'test case'],
 ['case', 3.5, 'casecasecaseca'],
 ['(will add more later)', 0.3333, '(will '],
 ['cats >= dogs', 0.5, 'cats >']]
.forEach(t=>{
  var s=t[0],n=t[1],x=t[2],r=f(s,n);
  console.log("«"+s+"» "+n+' => «'+r+'» '+(x==r?'OK':'FAIL expected '+x));
 })
<pre id=O></pre>


Хорошо спасибо. До сих пор у большинства ответов не было проблем, и это действительно легко исправить. Спасибо за исправление.
Rɪᴋᴇʀ

Крошечная опечатка: n>0в коде и n>1в тестовом примере.
manatwork

@ Manatwork спасибо. Это должно работать в любом случае
edc65

Ой. В самом деле. Но тогда почему не просто ~n? (На самом деле просто вопрос. Пробовал только данные тесты.)
manatwork

3
@ edc65 Где fопределено в вашем решении? Вы не пропали f=?
andlrc

4

Витси, 9 байт

Ожидает слово в качестве аргумента, а число умножается на STDIN.

zlW*\[DO{]
z          Grab all string argument input.
 l         Get the length of the stack.
  W        Parse STDIN.
   *       Multiply the top two items (length of string and the number of repetitions)
    \[   ] Do the stuff in the loop.
      DO{  Output one char at a time, making sure to duplicate first.

Попробуйте онлайн!


Верный своему слову, вы ответили быстро .
Rɪᴋᴇʀ

@RikerW Мартин вышел из FGITW'd меня.
Эддисон Крамп

Почему ты Grab all string argument input.и то Parse STDIN.опять?
Rɪᴋᴇʀ

@RikerW Аргументы, которые являются двойными, автоматически анализируются, немедленно помещая их в стек. Обработка, которая занимает больше байтов, чем стоит.
Эддисон Крамп

Ох, ну ладно. Это имеет больше смысла сейчас.
Rɪᴋᴇʀ

3

CJam, 10 байтов

l_,l~*,\f=

Строка указана в первой строке STDIN, а плавающая во второй.

Проверьте это здесь.

объяснение

l    e# Read string.
_,   e# Duplicate and get its length.
l~   e# Read second line and evaluate.
*    e# Multiply them. If the result, N, was floored it would give us the number of
     e# characters in the required output.
,    e# Get range [0 1 ... ⌊N⌋-1].
\f=  e# For each character in that range, fetch the corresponding character from the
     e# string using cyclic indexing.

3

Python 2, 71 байт

lambda s,x:"".join(s for i in range(int(x)))+s[:int(len(s)*(x-int(x)))]

Попробуй это здесь!

Создает безымянную лямбду, которая принимает строку в качестве первого аргумента и число с плавающей запятой в качестве второго. Возвращает повторенную строку.

Это может быть 46, если разрешены встроенные повторения строк :(


1
Очень грустно. Такие правила умножения строк. +1 А + за эффект.
Эддисон Крамп

3

Рубин, 49 48 символов

->s,n{(0...(n*l=s.size).to_i).map{|i|s[i%l]}*''}

Образец прогона:

2.1.5 :001 > ->s,n{(0...(n*l=s.size).to_i).map{|i|s[i%l]}*''}['case', 2.5]
 => "casecaseca" 

3

Perl 6 ,  46 41   39 байт

{([~] $^a xx$^b)~$a.substr(0,$a.chars*($b%1))}    # 46 bytes
{substr ([~] $^a xx$^b+1),0,$a.chars*$^b}         # 41 bytes
{substr ([~] $^a xx$^b+1),0,$a.comb*$b}           # 39 bytes

В Perl 6 есть как оператор повторения строк, так xи оператор повторения списка xx.

Так как правила запрещают повторение строк, мы повторяем это, как если бы это был список из одного элемента. Затем список объединяется вместе и возвращается его подстрока.

Использование:

# give it a lexical name
my &code = {substr ([~] $^a xx$^b+1),0,$a.chars*$^b}
#          {substr ($^a x$^b+1),0,$a.chars*$^b}

say code('test case', 1).perl;                  # "test case"
say code('case', 2.5).perl;                     # "casecaseca"
say code('(will add more later)', 0.3333).perl; # "(will "
say code('cats >= dogs', 0.5).perl;             # "cats >"

substr ([~] $^a xx$^b+1),0,$a.comb*$b}сохраняет два
символа

2

osascript, 173 байта

О, мои дни, это хуже, чем я думал.

on run a
set x to a's item 1's characters
set y to a's item 2
set o to""
set i to 1
set z to x's items's number
repeat y*z
set o to o&x's item i
set i to i mod z+1
end
o
end

Возвращает значение строки, другой ответ с использованием циклического индексирования. Ожидает ввода как "string" "repetitions".


Oh my days, this is worse than I thought.Так верно, так верно.
Rɪᴋᴇʀ

Есть ли команда для нескольких переменных одновременно? то есть set x,y to a's items?
Rɪᴋᴇʀ

@RikerW Я так не думаю. Если есть, я серьезно пропускаю.
Эддисон Крамп

2

Haskell, 44 байта

c x=x++c x
s#n=take(floor$n*sum[1|a<-s])$c s

Пример использования: "(will add more later)" # 0.3333-> "(will ".

Как это работает: cобъединяет бесконечные копии строки x. Он ведет себя как встроенный cycle. sum[1|a<-s]является пользовательской функцией длины, которая работает со строгой системой типов Haskell, поскольку она возвращает a Double(встроенная функция возвращает a, lengthна Intкоторый невозможно умножить n). #берет floor (n * length(s))символы из циклической строки s.


2

PHP 5, 96 87

9 байтов сохранено благодаря @manatwork

<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0‌​];

Довольно прямой ответ зацикливания.

Ungolfed

<?
$a=$argv[1];
$z=0;
for($i=0; $i < floor(strlen($a)*$argv[2]); $i++) {
    // if the string offset is not set
    // then reset $z back to 0 so we can
    // echo the beginning of ths string again
    @$a[$z] ?: $z=0;
    echo $a[$z];
    $z++;
}

Не уверен, когда это подавление ошибок поможет, для меня, кажется, работает без @:<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork

Я получил уведомление о случае № 2, из-за которого выходные данные отображались некорректно, то есть когда я добавил их в подавление. (работает в режиме CLI)
Samsquanch

«PHP 5.3 или более поздняя версия, значением по умолчанию является E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED». - error_reportingПоэтому мы предпочитаем основывать наши решения на конфигурации по умолчанию, а не заботиться о уведомлениях и других полезных привычках. Например, игнорирование инициализации $zи $i.
manatwork

О, круто. Спасибо за информацию!
Samsquanch

2

R, 59 байт

function(s,l)cat(rawToChar(array(charToRaw(s),nchar(s)*l)))

Как неназванная функция. Это использует charToRaw для разделения строки на вектор необработанных. Он заполняется в массив длиной * l, преобразуется обратно в char и выводится.
Я собирался использовать strsplit, но в итоге он стал длиннее.

Тестовое задание

> f=
+ function(s,l)cat(rawToChar(array(charToRaw(s),nchar(s)*l)))
> f('test case', 1) # -> test case
test case
> f('case', 2.5) # -> casecaseca
casecaseca
> f('(will add more later)', 0.3333) # -> (will(space)
(will 
> f('cats >= dogs', 0.5) # -> cats >
cats >
> 

2

Perl, 51 + 3 = 54 байта

$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]

Требуется: -n, -lи -M5.010| -E:

 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'test case\n1'
 test case
 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'case\n2.5'
 casecaseca
 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'(will add more later)\n0.3333'
 (will 
 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'cats >= dogs\n0.5'
 cats >

Объяснение:

$l=<>*y///c;              # Calculate output length (eg. 2.5 * input length)
for$i(1..$l){push@a,/./g} # Push a lot of chars from input into @a
say@a[0..$l-1]            # Slice @a according to output length


1

Oracle SQL 11.2, 154 152 байта

WITH v(s,i)AS(SELECT SUBSTR(:1,1,FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))),1 FROM DUAL UNION ALL SELECT :1||s,i+1 FROM v WHERE i<=:2)SELECT MAX(s)FROM v;

Un-golfed

WITH v(s,i) AS
(
  SELECT SUBSTR(:1,1,FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))),1 FROM DUAL 
  UNION ALL 
  SELECT :1||s,i+1 FROM v WHERE i<=:2
)
SELECT MAX(s) FROM v;

Я пошел рекурсивным путем, с инициализацией выбора, заботящейся о десятичной части.

Сохранено 2 байта благодаря @MickyT


Вы можете сохранить пару, удалив пробелы после) в предложении WITH и окончательном выборе.
MickyT

Еще одна экономия будет заменить FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))сMOD(:2,1)*LENGTH(:1)
MickyT

И еще один последний :), вы можете использовать, LPADа неSUBSTR
MickyT

1

Серьезно, 24 байта

,╗,mi@≈╜n╜l(*≈r`╜E`MΣ)kΣ

Попробуйте онлайн!

Объяснение:

,╗,mi@≈╜n╜l(*≈r`╜E`MΣ)kΣ
,╗                        get first input (string) and push it to register 0
  ,mi@≈                   get input 2 (x), push frac(x) (f), int(x) (n)
       ╜n                 push n copies of the string
         ╜l(*≈            push length of string, multiply by f, floor (substring length) (z)
              r`╜E`MΣ     push s[:z]
                     )kΣ  move fractional part of string to bottom, concat entire stack

1

Pyth, 9 байт

V*Elzp@zN

В основном просто делаю

             z = input()
V*Elz        for N in range(evaluatedInput()*len(z)):    # flooring is automatic
     p@zN        print(z[N], end="")                     # modular indexing
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.