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


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.