¡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!


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.

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


3
+1 para reduce!
Neil



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

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)


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.

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!!

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


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


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

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

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


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

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

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

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

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


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!


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
}

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!


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!


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!


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

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]



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;

}


Esto no parece funcionar para n negativo.
Gastropner
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.