Умножьте строку на число!

34

Недавно была проблема с умножением строк. Он показал нам, как мы можем умножать не только числа, но и строки. Однако мы все еще не можем правильно умножить число на строку. Была одна попытка сделать это, но это, очевидно, неправильно. Нам нужно это исправить!

Твое задание:

Напишите функцию или программу, которая умножает два ввода: строку и целое число. Чтобы (правильно) умножить строку на целое число, вы разбиваете строку на символы, повторяете каждый символ число раз, равное целому числу, а затем склеиваете символы обратно вместе. Если целое число отрицательное, мы используем его абсолютное значение на первом шаге, а затем переворачиваем строку. Если вход равен 0, ничего не выводить (все, что умножено на 0, равно нулю).

Входные данные:

Строка, состоящая исключительно из печатных символов и символов новой строки ASCII и целого числа (возможно, отрицательного).

Выход:

Строка, умноженная на целое число.

Примеры:

Hello World!, 3            --> HHHeeellllllooo   WWWooorrrlllddd!!!
foo, 12                    --> ffffffffffffoooooooooooooooooooooooo
String, -3                 --> gggnnniiirrrtttSSS
This is a fun challenge, 0 --> 
Hello
World!, 2                  --> HHeelllloo

                               WWoorrlldd!!

Подсчет очков:

Это , выигрывает самый низкий счет байтов!

Грифон - Восстановить Монику
источник
4
Можем ли мы предположить, что строка доступна для печати только в ASCII, плюс переводы строки?
mbomb007
Можем ли мы вывести список строк?
полностью человек
Частичное решение в сетчатке. Работает только для положительных значений целого числа. Я, вероятно, не найду время, чтобы закончить это, если кто-то хочет. tio.run/##K0otycxL/P8/…
mbomb007
@ mbomb007, да, извините, что так долго об этом.
Грифон - Восстановить Монику
@totallyhuman, нет, вы не можете.
Грифон - Восстановить Монику

Ответы:

31

Желе , 6 5 4 байта

²Ɠxm

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

Как это работает

²Ɠxm  Main link. Argument: n (integer)

²     Yield n².
 Ɠ    Read and eval one line of input. This yields a string s.
  x   Repeat the characters of s in-place, each one n² times.
   m  Takes each |n|-th character of the result, starting with the first if n > 0, 
      the last if n < 0.
Деннис
источник
1
Хорошо, теперь я действительно впечатлен. Я бы с удовольствием объяснил это чудо в миниатюре.
Грифон - Восстановить Монику
Конечно. Как только я сделал тестовый набор и закончил игру в гольф.
Деннис
4
Хорошо, если вы можете сделать это немного меньше, я перестану пытаться составить вопрос, который займет у вас> 10 байт.
Грифон - Восстановить Монику
13
ОК, вот и все. Я учу желе. Я тоже хочу уметь творить магию.
Грифон - Восстановить Монику
2
Мы все знаем, как дискуссия о цепях желе заканчивается беспорядком ...
Эрик Outgolfer
9

JavaScript (ES6), 63 байта

Принимает ввод в синтаксисе карри (s)(n).

s=>n=>[...s].reduce((s,c)=>n<0?c.repeat(-n)+s:s+c.repeat(n),'')

Контрольные примеры

Arnauld
источник
3
+1 за reduce!
Нил
9

Python 3 , 44 байта

f=lambda s,n:s and s[0]*n+f(s[1:],n)+s[0]*-n

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

Деннис
источник
Базовый случай, кажется, игнорирует последний символ.
xnor
Не совсем уверен, почему я это сделал ... Спасибо!
Деннис
1
41 байт . но idk, если вызов функции как f(n,*s)считается действительным
Фелипе Нарди Батиста
6

05AB1E , 10 байтов

S²Ä×J²0‹iR

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

S          # Split the string into characters
 ²Ä×       # Repeat each character abs(integer) times
    J      # Join into a string
     ²0‹i  # If the integer is less than 0...
         R #   Reverse the string
Райли
источник
TFW вы потратили 30 минут, пытаясь придумать что-то, чтобы доказать @Riley, что ²0‹iэто не лучший маршрут, и придумали буквально 0 альтернатив.
Волшебная Осьминог Урна
@MagicOctopusUrn Я использовал что-то, как ²0‹iраньше, и я всегда думаю, что должно быть что-то лучше.
Райли
Я думаю, что я пытался найти альтернативу около 10 раз сейчас ... тратить впустую 3 часа моей жизни ._. Ä.D)øJ¹0‹iRэто лучшее, что я могу сделать, не копируя тебя, я думаю, что твоя оптимизирована.
Волшебная Осьминог Урна
Если вам не безразлично, Эминга использовала è здесь , хотя я не могу найти способ применить это в этом сценарии. Сохранит максимум 1 байт, если что.
Волшебная Осьминог Урна
SÂΛ@²Ä×J, с помощью Îнажатия 0 и ввода работает, если вы измените порядок. Сохраняет 1 байт! (Также заменил if, поэтому его не нужно закрывать)
kalsowerus
5

MATL , 9 байт

y|Y"w0<?P

Входные данные: число, затем строка.

Строки с символами новой строки вводятся с помощью полукокса 10следующим образом : ['first line' 10 'second line'].

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Рассмотрим входы -3и 'String'.

y      % Implicitly take two inputs. Duplicate from below
       % STACK: -3, 'String', -3
|      % Absolute value
       % STACK: -3, 'String', 3
Y"     % Run-length decoding
       % STACK: -3, 'SSStttrrriiinnnggg'
w      % Swap
       % STACK: 'SSStttrrriiinnnggg', -3
0<     % Less than 0?
       % STACK: 'SSStttrrriiinnnggg', 1
?      % If so
  P    %   Flip
       %   STACK: 'gggnnniiirrrtttSSS'
       % End (implicit). Display (implicit)
Луис Мендо
источник
5

Haskell , 41 36 байт

f n|n<0=reverse.f(-n)|1<3=(<*[1..n])

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

Пример использования: f (-3) "abc"доходность"cccbbbaaa" .

Редактировать: -5 байт благодаря xnor!

Laikoni
источник
1
Там (<*[1..n])для ((<$[1..n])=<<).
xnor
@xnor Спасибо! Это хорошо знать.
Лайкони
5

V , 29, 23, 18 , 17 байтов

æ_ñÀuñÓ./&ò
ÀäëÍî

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

HexDump:

00000000: e65f f1c0 75f1 d32e 2f26 f20a c0e4 ebcd  ._..u.../&......
00000010: ee                                       .

Спасибо @ nmjcman101 за сохранение 6 байтов, что побудило меня сохранить еще 5!

Первоначальная редакция была довольно ужасной, но теперь я действительно горжусь этим ответом, потому что он обрабатывает отрицательные числа на удивление хорошо. (V не имеет никакой числовой поддержки и отрицательных чисел)

Объяснение:

æ_          " Reverse the input
  ñ  ñ      " In a macro:
   À        "   Run the arg input. If it's positive it'll give a count. If it's negative
            "   running the '-' will cause V to go up a line which will fail since we're
            "   on the first line, which will break out of this macro
    u       "   (if arg is positive) Undo the last command (un-reverse the line)
      Ó./&ò " Put every character on it's own line

На данный момент буфер выглядит так:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Важно не завершающий символ новой строки, а то, чтобы на нем был курсор.

À           " Run arg again. If it's negative, we will move up a line, and then give the 
            " absolute value of the count. If it's positive (or 0) it'll just give the
            " count directly (staying on the last line)
 ä          " Duplicate... (count times)
  ë         "   This column. 
   Íî       " Remove all newlines.
DJMcMayhem
источник
Несколько байтов для тебя. Попробуйте онлайн! Я всегда ненавижу "Отрицательные числа означают что-то еще!" крайний случай тоже. Это тот случай, когда ваши 0особые случаи в V оказались очень полезными.
nmjcman101
Извините за отрицательные цифры спец. Тем не менее, многие ответы сумели включить это в свой основной ответ. Впечатляет на этом V один, хотя.
Грифон - Восстановить Монику
@ nmjcman101 Ого, это так очевидно, я не знаю, как я об этом не подумала. Спасибо!
DJMcMayhem
@ Грифон О, я знаю. Задача хороша, мне просто не нравится мой собственный язык за то, что он настолько плох в том, что он должен делать хорошо. : P
DJMcMayhem
5

R 83 78 76 байт

function(s,i)cat('if'(i<0,rev,`(`)(rep(el(strsplit(s,'')),e=abs(i))),sep='')

Анонимная функция.

Фредерик спас 3 байта, Джузеппе спас 2 4.

Объяснение:

     el(strsplit(s,''))                      # split string into list characters
 rep(                  ,e=abs(i)))           # repeat each character abs(i) times


    'if'(i<0,rev,   ){...}                 # if i>0, reverse character list
                 `(`                       # otherwise leave it alone: `(` is the identity function
cat(                      ,sep='')         # print the result

тесты:

> f('Hello World!', 3 )
HHHeeellllllooo   WWWooorrrlllddd!!!
> f('foo', 12)
ffffffffffffoooooooooooooooooooooooo
> f('String', -3)
gggnnniiirrrtttSSS
> f('This is a fun challenge', 0)
> f('Hello
+ World!', 2)
HHeelllloo

WWoorrlldd!!
BLT
источник
2
Отлично сработано ! Вы можете сэкономить несколько байтов, написав rep(foo,,,3)или rep(foo,e=3)(той же длины) ;-)
Frédéric
@ Фредерик, ты меня побил, я собирался сказать то же самое!
Джузеппе
1
да нет проблем! По сути, я хотел избавиться от брекетов, поэтому мне нужно было избавиться от них a=. Следовательно, я использовал значение aв качестве аргумента для обратной функции, если i<0, имея условный возврат функции (именно поэтому мне понадобились обратные кавычки). Но мне нужно было также применить функцию тождества для i>=0случая, поэтому я использовал, (что достаточно близко. (это на самом деле функция. R странно.
Джузеппе
1
Кстати, R документы для Парен говорят, что (семантически эквивалентны идентичностиfunction(x)x
Джузеппе
1
76 байтов
Джузеппе
4

PHP> = 7.1, 65 байт

for([,$s,$n]=$argv;$i<strlen($s)*abs($n);)echo$s[$i++/$n-($n<0)];

PHP Sandbox Online

Йорг Хюльсерманн
источник
1
В целочисленном контексте $n<0имеет то же значение, что $n<0?:0и на 3 байта короче :-)
axiac
4

Brain-Flak (BrainHack) , 154 152 байта

([(({})(<()>))]<>)<>{({}()<([{}]()<([{}])>)<>({}<>)<>>)<>}{}<>{}<>({}<([][()]){{}({<({}<(({}<>)<>)>())>[()]}<{}{}>)([][()])}{}{}<>>){{}{({}<>)<>}(<>)}{}

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

Просто здесь, чтобы дать DJMcMayhem некоторую конкуренцию. ;)

объяснение

Вот модифицированная версия объяснения DJMcMayhem

#Compute the sign and negative absolute value 
([(({})<(())>)]<>)<>{({}()<([{}]()<([{}])>)<>({}<>)<>>)<>}{}<>{}<>

#Keep track of the sign
({}<

    #For each char in the input string:
    ([][()])
    {
        {}

        #Push n copies to the alternate stack
        ({<({}<(({}<>)<>)>())>[()]}<{}{}>)

        #Endwhile
        ([][()])
    }{}{}<>

#Push the sign back on
>)

#If so...
{{}

    #Reverse the whole stack
    {({}<>)<>}

    #And toggle over, ending the loop
    (<>)
}

#Pop the counter off
{}
Мастер пшеницы
источник
4

J , 19 15 13 байт

(#~|)A.~0-@>]

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

объяснение

        0-@>]      NB. first or last index depending on sign of right arg
     A.~           NB. get first or last Anagram of left arg
(#~|)              NB. copy left arg, absolute-value-of-right-arg times
Tikkanz
источник
2
(#~|)A.~0-@>]за 13 байт
миль
Очень мило @ миль!
Тикканз
Нет проблем. Вам также не нужно считать скобки, используемые для вызова глагола.
миль
1
Также 13 байтов: #~ ::(|.@#~|)
FrownyFrog
3

Дьялог АПЛ, 15 байт

{⌽⍣(⍵<0)⊢⍺/⍨|⍵}

Строка в качестве левого аргумента, число в качестве правого аргумента.

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

Как?

⍺/⍨ - повторить строку

|⍵ - абс (число) раз

⌽⍣ - отменить, если

(⍵<0) - число ниже 0

Уриэль
источник
Хм, было бы неплохо, если бы TIO вроде работал?
Грифон - Восстановить Монику
@ Грифон, и вот идет байт ...
Уриэль
Да, я только что понял это и печатал свой комментарий, чтобы сказать тебе.
Грифон - Восстановить Монику
3

MATLAB, 37 байт

@(s,n)flip(repelem(s,abs(n)),(n<0)+1)

Это определяет и анонимную функцию с входами s: string и n: number.

Пример работы:

>> @(s,n)flip(repelem(s,abs(n)),(n<0)+1)
ans = 
    @(s,n)flip(repelem(s,abs(n)),(n<0)+1)

>> f = ans;

>> f('String', 3)
ans =
SSStttrrriiinnnggg

>> f('String', -3)
ans =
gggnnniiirrrtttSSS

>> f('String', 0)
ans =
   Empty matrix: 1-by-0
Луис Мендо
источник
Выбор, какой размер выбрать, был намного лучше, чем тот беспорядок, который я написал 😛 +1. и я всегда забываю, repelemсуществует.
Стьюи Гриффин
@ StewieGriffin Ну, вы можете включить это и в свой ответ :-) (+1 уже). Я думаю, что нет repelemв Октаве, а пока
Луис Мендо
3

Brain-Flak (Haskell) , 202 192 байта

(({})<(([({})]<>)){({}()<([{}])<>({}<>)<>>)<>}{}([{}]<><{}>)([][()]){{}({<({}<(({}<>)<>)>[()])>()}<{}{}>)([][()])}{}{}<>>)([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}{({}<>)<>}(<>)}{}

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

Вероятно, это худший из возможных языков, но это сделано. Спасибо @Wheatwizard за предоставление интерпретатора Haskell, который допускает смешанные форматы ввода. Это было бы около 150 байтов больше без него.

Объяснение:

#Keep track of the first input (n)
(({})<

    #Push abs(n) (thanks WheatWizard!)
    (([({})]<>)){({}()<([{}])<>({}<>)<>>)<>}{}([{}]<><{}>)

    #For each char in the input string:
    ([][()])
    {
        {}

        #Push n copies to the alternate stack
        ({<({}<(({}<>)<>)>[()])>()}<{}{}>)

        #Endwhile
        ([][()])
    }{}{}<>

#Push the original n back on
>)

#Push n >= 0
([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

#If so...
{{}

    #Reverse the whole stack
    {({}<>)<>}

    #And toggle over, ending the loop
    (<>)
}

#Pop the counter off
{}
DJMcMayhem
источник
Вы можете использовать мой 52-байтовый abs для сохранения 2 байтов, вы также можете использовать 50-байтовые -abs, которые я вам дал, и увеличивать вместо уменьшения, чтобы сохранить 6 байтов.
Пшеничный волшебник
3

Java (OpenJDK 8) , 99 98 89 87 85 байт

s->n->{for(int i=s.length*(n<0?n:-n),r=n<0?0:~i;i++<0;)System.out.print(s[(i+r)/n]);}

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

  • -2 байта благодаря @Xanderhall
  • -2 байта благодаря @Nevay
Оливье Грегуар
источник
Идеи, которые не работают (намного дольше): переверните строку раньше, используйте поток,
Оливье Грегуар
1
Сохранить 2 байта сs[(n<0?-l-~i:i)/n]
Ксандерхолл
@ Xanderhall Спасибо! Я так долго искал, мои глаза кровоточат. Я знал, что это возможно, я просто все испортил при реализации.
Оливье Грегуар
1
@ user902383 Да, это обязательно . Если бы они были необязательными, многие вещи были бы нечитаемыми. Кроме того, моя функция - это не «один оператор», а цикл for, который включает несколько операторов.
Оливье Грегуар
1
Вы можете сохранить 1 байт, увеличивая iусловие s->n->{for(int l=s.length*(n<0?-n:n),i=0;i++<l;)System.out.print(s[(n<0?i-l:i-1)/n]);}. Другой байт можно сохранить, выполнив итерацию от -l до 0 ( s->n->{for(int i=s.length*(n<0?n:-n),r=n<0?0:~i;i++<0;)System.out.print(s[(i+r)/n]);}).
Невай
2

Рубин , 59 +1 = 60 байт

Использует -nфлаг.

n=eval$_
a=$<.read
a.reverse!if n<0
a.chars{|i|$><<i*n.abs}

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

Павел
источник
1
eval$_короче чем $_.to_iна 1 байт. String#charsМожно также принять блок так же, как String#each_charможно. Наконец, измените ввод перед обработкой каждого символа, чтобы вы могли напечатать его напрямую (переключив свой флаг на -n). Все это объединяется, чтобы стать 55 + 1 = 56 байтов.
Стоимость чернил
2

Древесный уголь , 16 байт

Fθ¿‹η0F±Iη←ιFIηι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Fθ              For each character in the input string
  ¿‹η0          If the input number is less than zero
      F±Iη      Repeat the negation of the input number times
          ←ι    Print the character leftwards (i.e. reversed)
      FIη       Otherwise repeat the input number times
         ι      Print the character
Нил
источник
2

Japt , 12 байт

®pVaìr!+sVg

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

объяснение

Неявный ввод строки Uи целого числа V.

®pVaÃ

Map ( ®) каждая буква U(неявно) для себя повторяется ( p) abs(V)( Va) раз.

¬r

Превратите строку в массив chars ( ¬) и уменьшите ( r), что с ...

!+sVg

"!+".slice(sign(V))- это либо уменьшается с +a + b, либо с !+b + a.
Спасибо @Arnauld за идею сокращения назад!

Джастин Маринер
источник
Я чувствую, что это £gY*Vg)pVaдолжно привести к более короткому решению, но мой мозг отключился к праздникам, поэтому я не могу понять это. Вы можете быть в состоянии сделать что-то с этим, хотя.
Лохматый
2

WendyScript , 46 байт

<<f=>(s,x){<<n=""#i:s#j:0->x?x>0n+=i:n=i+n/>n}

f("Hello World", -2) // returns ddllrrooWW  oolllleeHH

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

Объяснение (Ungolfed):

let f => (s, x) {
  let n = ""
  for i : s
    for j : 0->x
      if x > 0 n += i
      else n = i + n
  ret n
}
Феликс Го
источник
2

C89 байт

main(int c,char**v){for(;*v[1];v[1]++)for(c=atoi(v[2]+(*v[2]=='-'));c--;)putchar(*v[1]);}

Я увидел версию Бена Перлина и подумал: а не можешь ли ты быть еще короче, а также иметь полную программу? конечно, atoi()и putchar()не так ли дорого с точки зрения байтов? Кажется, я был прав!

Andrea
источник
2

Pyth, 13 11 байт

*sm*.aQdz._

Попытайся!

-2 байта благодаря @jacoblaw

объяснение

*sm*.aQdz._   
  m     z     # map onto the input string (lambda var: d)
   *.aQd      # repeat the char d as often as the absolute value of the input number 
 s            # sum the list of strings into a single string
*        ._Q   # Multiply with the sign of the implicit input value: reverse for negative Q 

старый подход, 13 байтов

_W<Q0sm*.aQdz

Попытайся!

KarlKastor
источник
Вы можете сохранить два байта с помощью этой логики аннулирования
jacoblaw
2

Python 3 , 68 байт

h=lambda s,n:h(s[::-1],-n)if n<0 else s[0]*n+h(s[1:],n)if s else s*n

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

Кави
источник
Здравствуйте и добро пожаловать на сайт! К сожалению, этот ответ сейчас недействителен, так как он не поддерживает отрицательные числа . Задача гласит:If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem
Спасибо за исправление! Кстати, вы можете удалить два байта, удалив пробелы после скобок)
DJMcMayhem
Отредактировано, спасибо за вклад
Кави
n<0 else=>n<0else
Zacharý
1

QBIC , 32 байта

g=sgn(c)[_l;||[:*g|?_sA,b*g,1|';

объяснение

            Takes inputs A$ ('Hello'), and c (-3) from the cmd line
g=sgn(c)    Save the sign of c          -1
[_l;||      FOR each char in A$
[:*g|       FOR the number of repetitions wanted    (ie: -3 * -1)
            Note that : reads a number from the cmd line, and c is the first 
            available variable to save it in after a and b got used as FOR counters.
            Also note that a negative value times the sign becomes positive.
?_s         PRINT a substring
  A         of A$
 ,b*g       startng at char n, where n is the first FOR loop counter times the sign
                That means that when c is negative, so is this. A negative starting index
                on Substring instructs QBIC to take from the right.
 ,1|        taking 1 char.
';          This bit injects a literal ; in the output QBasic, to suppress newlines om PRINT
steenbergh
источник
1

Mathematica, 89 байт

(T=Table;t=""<>T[s[[i]]~T~Abs@#2,{i,Length[s=Characters@#]}];If[#2>0,t,StringReverse@t])&


вход

[«Привет, мир!», 3]

J42161217
источник
1

C 109 байтов

char *f(int n, char *s){char *o=calloc(n,strlen(s)+1),*t=o;while(*s){for(int i=n;i--;)*t++=*s;s++;}return o;}

Начиная с объявления функции, которая принимает целое число и строку и создает строку (кажется, подразумевается, что память не выделена заранее и должна быть создана), кажется, что прямой подход короче, чем любые попытки очистить, которые я пытался ,

char *f(int n, char *s){
  char *o=calloc(n, strlen(s)+1),
    *t=o;

  while (*s) {
    for(int i=n; i--; )
      *t++=*s;
    s++;
  }

 return o;

}

Бен Перлин
источник
Кажется, это не работает для отрицательного n.
Гастропнер