¡Multiplica una cuerda por un número!

34

Hubo un desafío hace un tiempo sobre la multiplicación de cadenas. Nos mostró cómo podemos multiplicar no solo números, sino también cadenas. Sin embargo, todavía no podemos multiplicar un número por una cadena correctamente. Ha habido un intento de hacerlo, pero esto obviamente está mal. ¡Necesitamos arreglar eso!

Tu tarea:

Escriba una función o programa que multiplique dos entradas, una cadena y un número entero. Para (correctamente) multiplicar una cadena por un entero, divida la cadena en caracteres, repita cada carácter varias veces igual al entero y luego vuelva a unir los caracteres. Si el número entero es negativo, usamos su valor absoluto en el primer paso y luego invertimos la cadena. Si la entrada es 0, no genera nada (cualquier cosa multiplicada por 0 es igual a nada)

Entrada:

Una cadena que consiste únicamente en caracteres ASCII imprimibles y líneas nuevas, y un número entero (posiblemente negativo).

Salida:

La cadena multiplicada por el entero.

Ejemplos:

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

                               WWoorrlldd!!

Tanteo:

Este es el , ¡el conteo de bytes más bajo gana!

Gryphon - Restablece a Monica
fuente
44
¿Podemos suponer que la cadena es imprimible solo para ASCII, más líneas nuevas?
mbomb007
¿Podemos generar una lista de cadenas?
totalmente humano
Solución parcial en retina. Solo funciona para valores positivos del entero. Probablemente no tenga tiempo para terminarlo si alguien quiere. tio.run/##K0otycxL/P8/…
mbomb007
@ mbomb007, sí, perdón por tomar tanto tiempo en eso.
Gryphon - Restablece a Mónica el
@totallyhuman, no, no puedes.
Gryphon - Restablece a Mónica el

Respuestas:

31

Gelatina , 6 5 4 bytes

²Ɠxm

Pruébalo en línea!

Cómo funciona

²Ɠ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.
Dennis
fuente
1
Bien, ahora estoy realmente impresionado. Me encantaría una explicación de esta maravilla particular en miniatura.
Gryphon - Restablece a Mónica el
Seguro. Tan pronto como hice una suite de prueba y terminé de jugar golf.
Dennis
44
OK, si puedes hacer esto más pequeño, voy a dejar de intentar hacer una pregunta que te llevará> 10 bytes.
Gryphon - Restablece a Mónica el
13
Vale eso es todo. Estoy aprendiendo jalea. Quiero poder hacer magia también.
Gryphon - Restablece a Mónica el
2
Todos sabemos cómo una discusión sobre las cadenas de gelatina termina siendo un desastre ...
Erik the Outgolfer
9

JavaScript (ES6), 63 bytes

Toma entrada en la sintaxis de curry (s)(n).

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

Casos de prueba

Arnauld
fuente
3
+1 para reduce!
Neil
9

Python 3 , 44 bytes

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

Pruébalo en línea!

Dennis
fuente
El caso base parece ignorar el último personaje.
xnor
No estoy seguro de por qué hice eso ... ¡Gracias!
Dennis
1
41 bytes . pero idk si una llamada a función f(n,*s)se considera válida
Felipe Nardi Batista
9

Python 2 , 59 57 50 46 bytes

-2 bytes gracias a Anders Kaseorg. -4 bytes gracias a Dennis.

lambda s,n:''.join(i*n**2for i in s)[::n or 1]

Pruébalo en línea!

totalmente humano
fuente
6

05AB1E , 10 bytes

S²Ä×J²0‹iR

Pruébalo en línea!

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
Riley
fuente
TFW pasas 30 minutos tratando de encontrar algo para demostrarle a @Riley que ²0‹ino es la mejor ruta y, literalmente, tienes 0 alternativas.
Magic Octopus Urn
@MagicOctopusUrn He usado algo como ²0‹iantes y siempre pienso que tiene que haber algo mejor.
Riley
Creo que he tratado de encontrar una alternativa alrededor de 10 veces ahora ... desperdiciando 3 horas acumulativas de mi vida ._. Ä.D)øJ¹0‹iRes lo mejor que puedo hacer sin copiarte, creo que el tuyo está optimizado.
Magic Octopus Urn
Si te importa, Emigna lo usó è aquí , aunque no puedo encontrar una manera de aplicarlo en este escenario. Ahorraría un máximo de 1 byte, si eso.
Magic Octopus Urn
SÂΛ@²Ä×J, usar Îpara presionar 0 y la entrada funciona si cambia el orden. ¡Ahorra 1 byte! (También reemplazó el if, por lo que no necesita cerrarse)
kalsowerus
5

MATL , 9 bytes

y|Y"w0<?P

Las entradas son: número, luego cadena.

Cuerdas con saltos de línea son de entrada utilizando carbón 10como sigue: ['first line' 10 'second line'].

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

Considere las entradas -3y '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)
Luis Mendo
fuente
5

Haskell , 41 36 bytes

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

Pruébalo en línea!

Ejemplo de uso: f (-3) "abc"rendimientos "cccbbbaaa".

Editar: -5 bytes gracias a xnor!

Laikoni
fuente
1
Hay (<*[1..n])para ((<$[1..n])=<<).
xnor
@xnor Gracias! Es bueno saberlo.
Laikoni
5

V , 29, 23, 18 , 17 bytes

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

Pruébalo en línea!

Hexdump:

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

¡Gracias a @ nmjcman101 por guardar 6 bytes, lo que me animó a guardar otros 5!

La revisión original fue bastante terrible, pero ahora estoy realmente orgulloso de esta respuesta porque maneja los números negativos sorprendentemente bien. (V casi no tiene soporte numérico ni soporte para números negativos)

Explicación:

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

En este punto, el búfer se ve así:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Es importante no la nueva línea final y que el cursor esté sobre ella.

À           " 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
fuente
Unos pocos bytes para ti ¡ Pruébalo en línea! Siempre odio los "¡Los números negativos significan algo más!" caso de borde también. Este es un caso en el que sus 0casos especiales en V fueron muy útiles.
nmjcman101
Perdón por los números negativos especiales. Sin embargo, muchas respuestas lograron incorporar eso en su respuesta principal. Impresionante en este V uno sin embargo.
Gryphon - Restablece a Mónica
@ nmjcman101 Oh wow, eso es tan obvio, no sé cómo no pensé en eso. ¡Gracias!
DJMcMayhem
@Gryphon Oh, lo sé. El desafío está bien, simplemente no me gusta mi propio idioma por ser tan malo en lo que se supone que es bueno. : P
DJMcMayhem
5

R, 83 78 76 bytes

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

Función anónima.

Frederic salvó 3 bytes, Giuseppe salvó 2 4.

Explicación:

     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

Pruebas:

> 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
fuente
2
Bien hecho ! Puede guardar algunos bytes escribiendo rep(foo,,,3)o rep(foo,e=3)(la misma longitud) ;-)
Frédéric
@ Frédéric me ganaste, ¡iba a decir lo mismo!
Giuseppe
1
¡si no hay problema! Básicamente, quería deshacerme de los aparatos ortopédicos, así que necesitaba deshacerme de ellos a=. Por lo tanto, utilicé el valor de acomo argumento para la función inversa si i<0, al hacer que el condicional devuelva la función (por eso necesitaba las comillas inversas). Pero también necesitaba aplicar la función de identidad para el i>=0caso, así que usé lo (que está lo suficientemente cerca. (De hecho es una función. R es raro
Giuseppe
1
por cierto, los documentos R para Paren dicen que (es semánticamente equivalente a la identidadfunction(x)x
Giuseppe
1
76 bytes
Giuseppe
4

05AB1E , 10 bytes

0‹FR}ʒ¹Ä×?

Pruébalo en línea!

Explicación

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

PHP> = 7.1, 65 bytes

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

PHP Sandbox en línea

Jörg Hülsermann
fuente
1
En el contexto entero, $n<0tiene el mismo valor $n<0?:0pero es 3 bytes más corto :-)
axiac
4

Brain-Flak (BrainHack) , 154 152 bytes

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

Pruébalo en línea!

Solo aquí para darle competencia a DJMcMayhem. ;)

Explicación

Aquí hay una versión modificada de la explicación de 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
{}
Asistente de trigo
fuente
4

J , 19 15 13 bytes

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

Pruébalo en línea!

Explicación

        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
fuente
2
(#~|)A.~0-@>]para 13 bytes
millas
Muy bien @miles!
Tikkanz
No hay problema. Tampoco es necesario contar los paréntesis utilizados para invocar el verbo.
millas
1
También 13 bytes:#~ ::(|.@#~|)
FrownyFrog
3

Dyalog APL, 15 bytes

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

Cadena como argumento izquierdo, número como argumento derecho.

Pruébalo en línea!

¿Cómo?

⍺/⍨ - repite la cuerda

|⍵ - abs (número) veces

⌽⍣ - invertir si

(⍵<0) - el número está por debajo de 0

Uriel
fuente
Umm, ¿sería bueno si el TIO como funcionara?
Gryphon - Restablece a Monica el
@Gryphon y aquí va el byte ...
Uriel
Sí, me di cuenta de eso y estaba escribiendo mi comentario para decírtelo.
Gryphon - Restablece a Mónica el
3

MATLAB, 37 bytes

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

Esto define una función anónima con entradas s: cadena y n: número.

Ejecuciones de ejemplo:

>> @(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
Luis Mendo
fuente
Elegir qué dimensión voltear fue mucho mejor que el desastre que escribí 😛 +1. y siempre olvido que repelemexiste
Stewie Griffin
@StewieGriffin Bueno, también puedes incorporar eso en tu respuesta :-) (+1 ya). Creo que no hay repelemen Octave, por ahora
Luis Mendo
3

Brain-Flak (Haskell) , 202 192 bytes

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

Pruébalo en línea!

Este es probablemente el peor lenguaje posible para hacerlo, pero está hecho. Gracias a @Wheatwizard por proporcionar el intérprete Haskell, que permite formatos de entrada mixtos. Esto sería aproximadamente 150 bytes más sin él.

Explicación:

#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
fuente
Puede usar mis 52 bytes abs para guardar 2 bytes, también puede usar los 50 bytes -abs que le di e incrementar en lugar de disminuir para guardar 6 bytes.
Wheat Wizard
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]);}

Pruébalo en línea!

  • -2 bytes gracias a @Xanderhall
  • -2 bytes gracias a @Nevay
Olivier Grégoire
fuente
Ideas que no funcionan (mucho más tiempo): invierta la cadena antes, use una secuencia,
Olivier Grégoire
1
Ahorre 2 bytes cons[(n<0?-l-~i:i)/n]
Xanderhall
@ Xanderhall ¡Gracias! Lo he estado buscando durante tanto tiempo que me sangran los ojos. Sabía que era posible, simplemente lo arruiné todo al implementarlo.
Olivier Grégoire
1
@ user902383 Sí, es obligatorio . Si fueran opcionales, muchas cosas serían ilegibles. Además, mi función no es una "declaración única", sino un bucle for, que abarca varias declaraciones.
Olivier Grégoire
1
Puede guardar 1 byte incrementando ila condición 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]);}. Se puede guardar otro byte iterando de -l a 0 en su lugar ( 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]);}).
Nevay
2

Ruby , 59 +1 = 60 bytes

Utiliza -nbandera.

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

Pruébalo en línea!

Pavel
fuente
1
eval$_es más corto que $_.to_ien 1 byte. String#charsTambién puede aceptar un bloque de la misma manera que String#each_charpuede. Finalmente, invierta la entrada antes de procesar cada carácter para que pueda imprimirlo directamente en su lugar (cambiando su bandera a -n). Todo esto se combina para convertirse en 55 + 1 = 56 bytes.
Value Ink
2

Carbón , 16 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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
Neil
fuente
2

Japt , 12 bytes

®pVaìr!+sVg

Pruébalo en línea!

Explicación

Entrada implícita de cadena Uy entero V.

®pVaÃ

Asigne ( ®) cada letra de U(implícitamente) a sí misma repetida ( p) abs(V)( Va) veces.

¬r

Convierta la cadena en una matriz de caracteres ( ¬) y reduzca ( r) eso con ...

!+sVg

"!+".slice(sign(V))- esto se reduce con +a + bo con !+b + a.
¡Gracias @Arnauld por la idea de reducir hacia atrás!

Justin Mariner
fuente
me siento como £gY*Vg)pVa debería conducir a una solución más corta, pero mi cerebro se ha apagado durante las vacaciones, así que no puedo entenderlo. Sin embargo, es posible que pueda hacer algo con él.
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

Pruébalo en línea!

Explicación (sin golf):

let f => (s, x) {
  let n = ""
  for i : s
    for j : 0->x
      if x > 0 n += i
      else n = i + n
  ret n
}
Felix Guo
fuente
2

C89 bytes

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

Vi la versión de Ben Perlin y me pregunté si aún no podía ser más corto y tener un programa completo; seguramente, atoi()yputchar() no son tan caros en términos de bytes? Parece que tenía razón!

Andrea
fuente
2

Pyth, 13 11 bytes

*sm*.aQdz._

¡Intentalo!

-2 bytes gracias a @jacoblaw

explicación

*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 

enfoque antiguo, 13 bytes

_W<Q0sm*.aQdz

¡Intentalo!

KarlKastor
fuente
puedes guardar dos bytes con esta lógica de inversión
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

Pruébalo en línea!

Kavi
fuente
Hola y bienvenidos al sitio! Desafortunadamente, esta respuesta no es válida en este momento, ya que no admite números negativos . El desafío dice:If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem
Gracias por arreglarlo! Por cierto, podría quitar dos bytes quitando los espacios después del paréntesis)
DJMcMayhem
Editado, gracias por la contribución
Kavi
n<0 else=>n<0else
Zacharý
1

QBIC , 32 bytes

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

Explicación

            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
fuente
1

Mathematica, 89 bytes

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


entrada

["Hola mundo!", 3]

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

Comenzando con una declaración de función que toma un int y una cadena y produce una cadena (parece implicado que la memoria no está preasignada y debe crearse) parece que el enfoque directo es más corto que cualquier intento de ser más inteligente que había intentado .

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;

}

Ben Perlin
fuente
Esto no parece funcionar para n negativo.
Gastropner