Multipliziere eine Zeichenkette mit einer Zahl!


34

Vor einiger Zeit gab es eine Herausforderung , Strings zu multiplizieren. Es hat uns gezeigt, wie wir nicht nur Zahlen, sondern auch Zeichenketten multiplizieren können. Wir können eine Zahl jedoch immer noch nicht richtig mit einer Zeichenfolge multiplizieren. Es hat einen Versuch gegeben , aber das ist offensichtlich falsch. Wir müssen das beheben!

Deine Aufgabe:

Schreiben Sie eine Funktion oder ein Programm, das zwei Eingaben multipliziert, eine Zeichenfolge und eine Ganzzahl. Um eine Zeichenfolge mit einer Ganzzahl (richtig) zu multiplizieren, teilen Sie die Zeichenfolge in Zeichen auf, wiederholen jedes Zeichen so oft wie die Ganzzahl und kleben die Zeichen dann wieder zusammen. Wenn die Ganzzahl negativ ist, verwenden wir im ersten Schritt ihren absoluten Wert und kehren dann die Zeichenfolge um. Wenn der Eingang 0 ist, wird nichts ausgegeben (alles, was mit 0 multipliziert wird, ist nichts).

Eingang:

Eine Zeichenfolge, die ausschließlich aus druckbaren ASCII-Zeichen und Zeilenumbrüchen sowie einer Ganzzahl (möglicherweise negativ) besteht.

Ausgabe:

Die Zeichenfolge multipliziert mit der Ganzzahl.

Beispiele:

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

                               WWoorrlldd!!

Wertung:

Dies ist , die niedrigste Anzahl an Bytes gewinnt!


4
Können wir davon ausgehen, dass die Zeichenfolge nur in ASCII gedruckt werden kann, plus Zeilenumbrüche?
mbomb007

Können wir eine Liste von Zeichenketten ausgeben?
Totalhuman

Teillösung in Retina. Funktioniert nur für positive Werte der ganzen Zahl. Ich werde mir wahrscheinlich keine Zeit nehmen, um es zu beenden, wenn jemand möchte. tio.run/##K0otycxL/P8/…
mbomb007

@ mbomb007, ja, tut mir leid, dass ich so lange dafür gebraucht habe.
Gryphon - Wiedereinsetzung von Monica

@totallyhuman, nein, darfst du nicht.
Gryphon - Wiedereinsetzung von Monica

Antworten:


31

Jelly , 6 5 4 Bytes

²Ɠxm

Probieren Sie es online!

Wie es funktioniert

²Ɠ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
OK, jetzt bin ich wirklich beeindruckt. Ich würde eine Erklärung dieses besonderen Wunders in Miniatur lieben.
Gryphon - Reinstate Monica

Sicher. Sobald ich eine Testsuite gemacht habe und mit dem Golfen fertig bin.
Dennis

4
OK, wenn Sie das etwas kleiner machen können, gebe ich den Versuch auf, eine Frage zu stellen, die mehr als 10 Bytes benötigt.
Gryphon - Reinstate Monica

13
Gut das war's. Ich lerne Jelly. Ich möchte auch zaubern können.
Gryphon - Reinstate Monica

2
Wir alle wissen, wie eine Diskussion über Jelly Chains zu einem Durcheinander wird ...
Erik the Outgolfer

9

JavaScript (ES6), 63 Byte

Übernimmt Eingaben in der Currying-Syntax (s)(n).

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

Testfälle


3
+1 für reduce!
Neil



6

05AB1E , 10 Bytes

S²Ä×J²0‹iR

Probieren Sie es online!

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 Sie verbringen 30 Minuten damit, sich etwas auszudenken, um @Riley zu beweisen, dass ²0‹inicht die beste Route ist, und sich buchstäblich 0 Alternativen auszudenken .
Magic Octopus Urn

@MagicOctopusUrn Ich habe so etwas schon mal benutzt ²0‹iund ich denke immer, dass es etwas Besseres geben muss.
Riley

Ich glaube, ich habe jetzt ungefähr zehn Mal versucht, eine Alternative zu finden ... und insgesamt drei Stunden meines Lebens verschwendet. Ä.D)øJ¹0‹iRist das Beste, was ich tun kann, ohne dich zu kopieren, ich denke, deine ist optimiert.
Magic Octopus Urn

Wenn es dich interessiert, hat Emigna das è hier benutzt , obwohl ich in diesem Szenario keine Möglichkeit finde, es anzuwenden. Würde dann maximal 1 Byte einsparen.
Magic Octopus Urn

SÂΛ@²Ä×JDrücken Sie Î, um 0 zu drücken, und die Eingabe funktioniert, wenn Sie die Reihenfolge ändern. Spart 1 Byte! (Ersetzt auch das if, damit es nicht geschlossen werden muss)
kalsowerus

5

MATL , 9 Bytes

y|Y"w0<?P

Eingaben sind: Zahl, dann Zeichenfolge.

Strings mit Zeilenumbrüche eingegeben werden char 10wie folgt: ['first line' 10 'second line'].

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Betrachten Sie Eingaben -3und '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 Bytes

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

Probieren Sie es online!

Hexdump:

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

Vielen Dank an @ nmjcman101 für das Speichern von 6 Bytes, was mich dazu ermutigte, weitere 5 Bytes zu speichern!

Die ursprüngliche Revision war ziemlich schrecklich, aber jetzt bin ich wirklich stolz auf diese Antwort, weil sie überraschend gut mit negativen Zahlen umgehen kann. (V hat so gut wie keine numerische Unterstützung und keine Unterstützung für negative Zahlen)

Erläuterung:

æ_          " 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

Zu diesem Zeitpunkt sieht der Puffer folgendermaßen aus:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Es ist wichtig, dass die nachgestellte Zeile nicht mit dem Cursor markiert wird.

À           " 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.

Ein paar Bytes für Sie Probieren Sie es online! Ich hasse immer die "Negative Zahlen bedeuten etwas anderes!" Rand Fall auch. Dies ist ein Fall, in dem Ihre 0Sonderfälle in V sehr nützlich waren.
nmjcman101

Tut mir leid wegen der negativen Zahlen. Viele Antworten haben es jedoch geschafft, dies in ihre Hauptantwort aufzunehmen. Beeindruckend auf dieser V ein.
Gryphon - Wiedereinsetzung von Monica

@ nmjcman101 Oh wow, das ist so offensichtlich, ich weiß nicht, wie ich nicht daran gedacht habe. Vielen Dank!
DJMcMayhem

@Gryphon Oh ich weiß. Die Herausforderung ist in Ordnung, ich mag meine eigene Sprache einfach nicht, weil sie so schlecht ist in dem, was sie gut sein soll. : P
DJMcMayhem

5

R 83 78 76 Bytes

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

Anonyme Funktion.

Frederic sparte 3 Bytes, Giuseppe 2 4.

Erläuterung:

     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

Tests:

> 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
Gut gemacht ! Sie könnten ein paar Bytes speichern, indem Sie schreiben rep(foo,,,3)oder rep(foo,e=3)(gleiche Länge) ;-)
Frédéric

@ Frédéric du hast mich geschlagen, ich wollte dasselbe sagen!
Giuseppe

1
ja, kein Problem! Grundsätzlich wollte ich die Zahnspange loswerden, also musste ich sie loswerden a=. Daher habe ich den Wert von aals Argument für die umgekehrte Funktion verwendet, wenn die Funktion i<0durch die bedingte Rückgabe zurückgegeben wird (weshalb ich die Anführungszeichen benötigte). Aber ich musste auch die Identitätsfunktion für den i>=0Fall anwenden , also habe ich die verwendet, (die nah genug ist. (ist in der Tat eine Funktion. R ist komisch.
Giuseppe

1
Übrigens, die R-Dokumente für Paren sagen, dass dies (semantisch der Identität entsprichtfunction(x)x
Giuseppe


4

05AB1E , 10 Bytes

0‹FR}ʒ¹Ä×?

Probieren Sie es online!

Erläuterung

0‹F         # input_1 < 0 times do:
   R        # reverse input_2
    }       # end loop
     ʒ      # filter
      ¹Ä×   # repeat current char abs(input_1) times
         ?  # print without newline


4

Brain-Flak (BrainHack) , 154 152 Bytes

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

Probieren Sie es online!

Nur hier, um DJMcMayhem Konkurrenz zu machen. ;)

Erläuterung

Hier ist eine modifizierte Version der Erklärung von 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 Bytes

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

Probieren Sie es online!

Erläuterung

        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-@>]für 13 Bytes
Meilen

Sehr schöne @miles!
Tikkanz,

Kein Problem. Sie müssen auch nicht die Klammern zählen, die zum Aufrufen des Verbs verwendet werden.
Meilen

1
Auch 13 Bytes:#~ ::(|.@#~|)
FrownyFrog

3

Dyalog APL, 15 Bytes

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

Zeichenfolge als linkes Argument, Zahl als rechtes Argument.

Probieren Sie es online!

Wie?

⍺/⍨ - Wiederholen Sie die Zeichenfolge

|⍵ - abs (Anzahl) mal

⌽⍣ - umkehren, wenn

(⍵<0) - Die Zahl liegt unter 0


Ähm, wäre es schön, wenn der TIO wie gewirkt hätte?
Gryphon - Reinstate Monica

@Gryphon und hier geht das Byte ...
Uriel

Ja, ich hatte das gerade bemerkt und schrieb meinen Kommentar ab, um es Ihnen zu sagen.
Gryphon - Reinstate Monica

3

MATLAB, 37 Bytes

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

Dies definiert und anonymisiert die Funktion mit den Eingaben s: string und n: number.

Beispiel läuft:

>> @(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

Es war viel besser, die Dimension zu wählen, mit der ich umblättern wollte, als das Durcheinander, das ich geschrieben habe 😛 +1. und ich vergesse immer repelemexistiert.
Stewie Griffin

@StewieGriffin Naja, das kannst du auch in deine Antwort einbauen :-) (+1 schon). Ich denke, es gibt derzeit keine repelemin Octave
Luis Mendo

3

Brain-Flak (Haskell) , 202 192 Bytes

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

Probieren Sie es online!

Dies ist wahrscheinlich die schlechteste Sprache, in der es möglich ist, aber es ist geschafft. Vielen Dank an @Wheatwizard für die Bereitstellung des Haskell-Interpreters, der gemischte Eingabeformate ermöglicht. Dies wäre ungefähr 150 Bytes länger ohne es.

Erläuterung:

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

Sie könnten meine 52-Byte-abs verwenden, um 2 Bytes zu sparen, Sie könnten auch die 50-Byte-abs verwenden, die ich Ihnen gegeben habe, und erhöhen, anstatt zu dekrementieren, um 6 Bytes zu sparen.
Weizen-Assistent


3

Java (OpenJDK 8) , 99 98 89 87 85 Bytes

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]);}

Probieren Sie es online!

  • -2 Bytes dank @Xanderhall
  • -2 Bytes dank @Nevay

Ideen, die nicht funktionieren (viel länger): Drehen Sie die Saite vorher um, verwenden Sie einen Stream,
Olivier Grégoire

1
Speichern Sie 2 Bytes mits[(n<0?-l-~i:i)/n]
Xanderhall

@Xanderhall Danke! Ich habe so lange nach diesem gesucht, dass meine Augen bluten. Ich wusste, dass es möglich ist, ich habe einfach alles durcheinander gebracht, als ich es implementiert habe.
Olivier Grégoire

1
@ user902383 Ja, es ist obligatorisch . Wenn sie optional wären, wären viele Dinge unlesbar. Außerdem ist meine Funktion keine "einzelne Anweisung", sondern eine for-Schleife, die mehrere Anweisungen umfasst.
Olivier Grégoire

1
Sie können 1 Byte sparen, indem Sie idie Bedingung inkrementieren 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]);}. Ein weiteres Byte kann gespeichert werden, indem stattdessen von -l bis 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]);}) iteriert wird .
Nevay


2

Ruby , 59 +1 = 60 Bytes

Verwendet -nFlagge.

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

Probieren Sie es online!


1
eval$_ist kürzer als $_.to_i1 Byte. String#charsAuf die gleiche Weise String#each_charkann auch ein Block akzeptiert werden . Kehren Sie schließlich die Eingabe um, bevor Sie jedes Zeichen verarbeiten, damit Sie es stattdessen direkt drucken können (indem Sie die Markierung auf setzen -n). All dies ergibt zusammen 55 + 1 = 56 Bytes.
Wert Tinte

2

Kohle , 16 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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 Bytes

®pVaìr!+sVg

Probieren Sie es online!

Erläuterung

Implizite Eingabe von Zeichenfolge Uund Ganzzahl V.

®pVaÃ

Ordne ( ®) jeden Buchstaben U(implizit) sich selbst zu und wiederhole ( p) abs(V)( Va) Male.

¬r

Verwandle den String in ein Array von Zeichen ( ¬) und reduziere ( r) das mit ...

!+sVg

"!+".slice(sign(V))- dies verringert sich entweder mit +a + boder mit !+b + a.
Vielen Dank an @Arnauld für die Rückwärtsreduzierung!


Ich habe das Gefühl, £gY*Vg)pVadass dies zu einer kürzeren Lösung führen sollte, aber mein Gehirn hat sich für die Feiertage abgeschaltet, so dass ich es nicht ganz herausfinden kann. Möglicherweise können Sie jedoch etwas damit anfangen.
Shaggy

2

WendyScript , 46 Bytes

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

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

Probieren Sie es online!

Erklärung (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 Bytes

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

Ich habe Ben Perlins Version gesehen und mich gefragt, ob du nicht noch kürzer sein könntest und auch ein volles Programm hast. Sicher, atoi()und putchar()ist das nicht so teuer in Bezug auf Bytes? Scheint, ich hatte recht!


2

Pyth, 13 11 Bytes

*sm*.aQdz._

Versuch es!

-2 Bytes dank @jacoblaw

Erläuterung

*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 

alter Ansatz, 13 Bytes

_W<Q0sm*.aQdz

Versuch es!


Sie können zwei Bytes mit speichern diese Umkehrlogik
jacoblaw

2

Python 3 , 68 Bytes

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

Probieren Sie es online!


Hallo und willkommen auf der Seite! Leider ist diese Antwort momentan ungültig, da sie keine negativen Zahlen unterstützt . Die Herausforderung lautet:If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem

Danke, dass du das Problem behoben hast! Übrigens könnten Sie zwei Bytes entfernen, indem Sie die Leerzeichen nach der Klammer entfernen)
DJMcMayhem

Bearbeitet, danke für den Beitrag
Kavi

n<0 else=>n<0else
Zacharý

1

QBIC , 32 Bytes

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

Erläuterung

            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 Bytes

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


Eingang

["Hallo Welt!", 3]



1

C 109 Bytes

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

Ausgehend von einer Funktionsdeklaration, die ein int und ein string verwendet und einen string erzeugt (es scheint, dass der Speicher nicht vorbelegt ist und erstellt werden muss), scheint der direkte Ansatz kürzer zu sein als alle Versuche, ein Hackmesser zu sein, die ich versucht habe .

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;

}


Dies scheint nicht für negative n zu funktionieren.
Gastropner
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.