Помножте рядок на число!


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

9

JavaScript (ES6), 63 байти

Здійснює введення в синтаксис currying (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 альтернатив.
— Magic Octopus Urn

@MagicOctopusUrn Я використовував щось подібне ²0‹iраніше, і завжди думаю, що має бути щось краще.
— Райлі

Я думаю, що я намагався знайти альтернативу близько 10 разів зараз ... витрачаючи кумулятивні 3 години свого життя ._. Ä.D)øJ¹0‹iRце найкраще, що я можу зробити, не копіюючи вас, я думаю, що ваша оптимізована.
— Чарівна восьминога урна

Якщо вам все одно, Емінья використовував è тут , хоча я не можу знайти спосіб застосувати це в цьому сценарії. Збереже максимум 1 байт, якщо це.
— Magic Octopus Urn

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
btw, Документи R для Paren кажуть, що (семантично еквівалентна ідентичності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 байт
— миль

Дуже приємно @miles!
— Тікканз

Без проблем. Вам також не потрібно рахувати дужки, які використовуються для виклику дієслова.
— милі

1
Також 13 байт:#~ ::(|.@#~|)
— FrownyFrog

3

Діалог APL, 15 байт

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

Рядок як аргумент зліва, число як правий аргумент.

Спробуйте в Інтернеті!

Як?

⍺/⍨ - повторити рядок

|⍵ - абс (кількість) разів

⌽⍣ - зворотний, якщо

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


Гм, було б непогано, якби TIO любив працювати?
— Грифон - Відновіть Моніку

@Gryphon і ось іде байт ...
— Уріель

Так, я просто зрозумів це і набирав свій коментар, щоб сказати тобі.
— Грифон - Відновіть Моніку

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

Мозг-Флак (Хаскелл) , 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 байтів, щоб зберегти 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

@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

Ruby , 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Ã

Позначте ( ®) кожну букву U(неявно) собі повтореній ( p) abs(V)( Va) разів.

¬r

Перетворіть рядок у масив символів ( ¬) та зменшіть ( r), що за допомогою ...

!+sVg

"!+".slice(sign(V))- це або зменшується з +→ a + b, або з !+→ b + a.
Дякую @Arnauld за ідею зворотного зменшення!


Я відчуваю, що це £gY*Vg)pVaповинно призвести до коротшого рішення, але мій мозок відключився на свята, тому я не можу це зрозуміти. Ви, можливо, зможете щось з цим зробити.
— Shaggy


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

Математика, 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;}

Починаючи з оголошення функції, яка бере int і рядок і створює рядок (мабуть, мається на увазі, що пам'ять не заздалегідь виділена і її потрібно створити), здається, що прямий підхід коротший, ніж будь-які спроби бути чіткішими, що я намагався .

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.