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


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),'')

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


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

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.

Несколько байтов для тебя. Попробуйте онлайн! Я всегда ненавижу "Отрицательные числа означают что-то еще!" крайний случай тоже. Это тот случай, когда ваши 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!!

2
Отлично сработано ! Вы можете сэкономить несколько байтов, написав rep(foo,,,3)или rep(foo,e=3)(той же длины) ;-)
— Frédéric

@ Фредерик, ты меня побил, я собирался сказать то же самое!
— Джузеппе

1
да нет проблем! По сути, я хотел избавиться от брекетов, поэтому мне нужно было избавиться от них a=. Следовательно, я использовал значение aв качестве аргумента для обратной функции, если i<0, имея условный возврат функции (именно поэтому мне понадобились обратные кавычки). Но мне нужно было также применить функцию тождества для i>=0случая, поэтому я использовал, (что достаточно близко. (это на самом деле функция. R странно.
— Джузеппе

1
Кстати, R документы для Парен говорят, что (семантически эквивалентны идентичностиfunction(x)x
— Джузеппе




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

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
{}

Вы можете использовать мой 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

C89 байт

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

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


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

Попытайся!


Вы можете сохранить два байта с помощью этой логики аннулирования
— 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

1

Mathematica, 89 байт

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


вход

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



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.
— Гастропнер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.