Multiplicación decimal de cadenas

14

Dadas 2 entradas, una cadena y un número decimal, genera la cadena multiplicada por ese número.

El problema es que el número puede ser flotante o entero.

Debería mostrar el floor(n)tiempo de cadena y luego las primeras floor((n-floor(n))*len(string))letras nuevamente.

Otras notas:

  • La entrada no siempre será flotante, puede ser un int. Entonces 1.5, 1 y 1.0 son todos posibles. Sin embargo, siempre estará en la base 10, y si desea una excepción, por favor comente.
  • La entrada de cadena puede contener espacios en blanco, comillas y otros caracteres. Sin embargo, no hay líneas nuevas ni caracteres de control.
  • No hay incorporados para la repetición directa de cadenas, incluso 'a'*5se permite la multiplicación de cadenas como la pitón . Sin embargo, se permite la adición de cadenas .

Casos de prueba:

La coma y el espacio separan las entradas.

test case, 1 -> test case

case, 2.5 -> casecaseca

(will add more later), 0.3333 -> (will(space)

cats >= dogs, 0.5 -> cats >

Nota final:

Estoy viendo muchas respuestas que usan funciones de multiplicación o repetición de cadenas incorporadas. Esto no esta permitido. Sin embargo, la respuesta de @ VTC es válida, ya que no multiplica la cadena, solo la entrada flotante. Entonces, la regla definitiva es: si multiplica directamente la cadena, no puede hacerlo.

Rɪᴋᴇʀ
fuente
La redacción se modificó repetidamente (no vi la primera revisión). Sugiero eliminar la directsecuencia de repetición (¿qué significa esto?). Pero en general, tienes razón
edc65
@ Sp3000 sí, lo sé. Creo que la diferencia es lo suficientemente significativa.
Rɪᴋᴇʀ
"No se permiten funciones integradas para la repetición directa de cadenas, incluso se permite la multiplicación de cadenas como la pitón 'a' * 5". No explicas la diferencia entre estos. A mí me suenan igual.
msh210
@ edc65 En Perl puede hacer la repetición de la lista y luego concatenar los elementos de esa lista, que no es la repetición directa de cadenas. En Perl 5: join "", ("case") x 2vs "case" x 2, en Perl 6 [~] "case" xx 2vs lo mismo"case" x 2
Brad Gilbert b2gills

Respuestas:

4

Jalea, 5 bytes

×L}Rị

No utiliza una repetición incorporada. Pruébalo en línea!

Cómo funciona

×L}Rị  Main link. Left input: n (multiplier). Right input: S (string)

 L}    Yield the length of S.
×      Multiply it with n.
   R   Range; turn n×len(S) into [1, ... floor(n×len(S))].
    ị  Retrieve the elements of S at those indices.
       Indices are 1-based and modular in Jelly, so this begins with the first and
       jump back after reaching the last.
Dennis
fuente
7

Java 7, 89

void g(char[]a,float b){for(int i=0,l=a.length;i<(int)(l*b);)System.out.print(a[i++%l]);}

toma char [] y float y sale a STDOUT. bucle básico.

Marky Markov
fuente
3
Buen golf, incluso para Java. : P
Rɪᴋᴇʀ
esto también se sugirió en mi otra respuesta, pero no creo que lo haga. No me parece correcto.
Marky Markov
Eh, bastante justo. Aquí se reconoce, pero está bien. : D
Addison Crump
Recomiendo declarar su lenguaje como Java 7. Entonces nadie puede decirle que use lambdas.
Feersum
6

Pyth 9 9 8

s@Lz*lzQ

Guardado 1 byte gracias a Pietu1998

Esto toma floor(n * len(string))letras de la cadena, usando indexación cíclica. Creo que esto siempre es equivalente a la fórmula dada.

Banco de pruebas

FryAmTheEggman
fuente
1
No, por favor, no me quites esto tan pronto. xD
Addison Crump
@VoteToClose En realidad no leí tu respuesta en absoluto, honor de los exploradores: PI ni siquiera se dio cuenta de que las repeticiones de cuerdas no estaban permitidas, esto fue más corto de lo que se me ocurrió de esa manera ...
FryAmTheEggman
1
Ni siquiera necesitas el segundo s. rangeEs gracioso así.
PurkkaKoodari
1
NOO! llora en un rincón Ah, oh bueno.
Addison Crump
6

JavaScript (ES6), 50 bytes

Edite 2 bytes más para incluir la definición de la función f. 1 byte menos con la punta de @manatwork. Nota: usando ~tenemos más iteraciones de las necesarias, pero esto es código de golf e incluso recuentos de 1 byte

f=(s,n,l=s.length*n)=>~n?f(s+s,n-1,l):s.slice(0,l)

PRUEBA

f=(s,n,l=s.length*n)=>~n?f(s+s,n-1,l):s.slice(0,l)

//TEST
console.log=x=>O.textContent+=x+'\n'
;[
 ['test case', 1, 'test case'],
 ['case', 3.5, 'casecasecaseca'],
 ['(will add more later)', 0.3333, '(will '],
 ['cats >= dogs', 0.5, 'cats >']]
.forEach(t=>{
  var s=t[0],n=t[1],x=t[2],r=f(s,n);
  console.log("«"+s+"» "+n+' => «'+r+'» '+(x==r?'OK':'FAIL expected '+x));
 })
<pre id=O></pre>

edc65
fuente
Bien gracias. Hasta ahora, la mayoría de las respuestas no han tenido ningún problema, y ​​es realmente fácil de solucionar. Gracias por corregirlo.
Rɪᴋᴇʀ
Pequeño error tipográfico: n>0en el código vs. n>1en el caso de prueba.
manatwork
@manatwork gracias. Debería funcionar de cualquier manera
edc65
Oh. En efecto. Pero entonces, ¿por qué no solo ~n? (Realmente solo una pregunta. Intenté solo los casos de prueba dados)
Manatwork
3
@ edc65 ¿Dónde se fdefine en su solución? ¿No te estás perdiendo f=?
andlrc
4

Vitsy, 9 bytes

Espera que la palabra sea un argumento y que el número se multiplique por STDIN.

zlW*\[DO{]
z          Grab all string argument input.
 l         Get the length of the stack.
  W        Parse STDIN.
   *       Multiply the top two items (length of string and the number of repetitions)
    \[   ] Do the stuff in the loop.
      DO{  Output one char at a time, making sure to duplicate first.

Pruébalo en línea!

Addison Crump
fuente
Fiel a tu palabra, respondiste rápido .
Rɪᴋᴇʀ
@RikerW Martin me FGITW'd.
Addison Crump
¿Por qué tú Grab all string argument input.y luego Parse STDIN.otra vez?
Rɪᴋᴇʀ
@RikerW Los argumentos que son dobles se analizan automáticamente, empujándolos a la pila de inmediato. Manejo que toma más bytes de lo que vale.
Addison Crump
Ah, vale. Eso tiene mas sentido ahora.
Rɪᴋᴇʀ
3

CJam, 10 bytes

l_,l~*,\f=

La cadena se suministra en la primera línea de STDIN, el flotante en la segunda.

Pruébalo aquí.

Explicación

l    e# Read string.
_,   e# Duplicate and get its length.
l~   e# Read second line and evaluate.
*    e# Multiply them. If the result, N, was floored it would give us the number of
     e# characters in the required output.
,    e# Get range [0 1 ... ⌊N⌋-1].
\f=  e# For each character in that range, fetch the corresponding character from the
     e# string using cyclic indexing.
Martin Ender
fuente
3

Python 2, 71 bytes

lambda s,x:"".join(s for i in range(int(x)))+s[:int(len(s)*(x-int(x)))]

Pruébalo aquí!

Crea una lambda sin nombre que toma la cadena como primer argumento y el flotante como segundo. Devuelve la cadena repetida.

Esto podría ser 46 si se permitieran las repeticiones de cadenas integradas :(

Denker
fuente
1
Muy triste Tales reglas de multiplicación de cuerdas. +1 A + para efurt.
Addison Crump
3

Ruby, 49 48 caracteres

->s,n{(0...(n*l=s.size).to_i).map{|i|s[i%l]}*''}

Ejecución de muestra:

2.1.5 :001 > ->s,n{(0...(n*l=s.size).to_i).map{|i|s[i%l]}*''}['case', 2.5]
 => "casecaseca" 
hombre trabajando
fuente
3

Perl 6 ,  46 41   39 bytes

{([~] $^a xx$^b)~$a.substr(0,$a.chars*($b%1))}    # 46 bytes
{substr ([~] $^a xx$^b+1),0,$a.chars*$^b}         # 41 bytes
{substr ([~] $^a xx$^b+1),0,$a.comb*$b}           # 39 bytes

Perl 6 tiene un operador de repetición de cadena xy un operador de repetición de lista xx.

Como las reglas no permiten la repetición de cadenas, la repetimos como si fuera una lista de un solo elemento. Luego, la lista se concatena y se devuelve una subcadena.

Uso:

# give it a lexical name
my &code = {substr ([~] $^a xx$^b+1),0,$a.chars*$^b}
#          {substr ($^a x$^b+1),0,$a.chars*$^b}

say code('test case', 1).perl;                  # "test case"
say code('case', 2.5).perl;                     # "casecaseca"
say code('(will add more later)', 0.3333).perl; # "(will "
say code('cats >= dogs', 0.5).perl;             # "cats >"
Brad Gilbert b2gills
fuente
substr ([~] $^a xx$^b+1),0,$a.comb*$b}ahorra dos caracteres
raiph
2

osascript, 173 bytes

Oh, mis días, esto es peor de lo que pensaba.

on run a
set x to a's item 1's characters
set y to a's item 2
set o to""
set i to 1
set z to x's items's number
repeat y*z
set o to o&x's item i
set i to i mod z+1
end
o
end

Devuelve el valor de la cadena, otra respuesta usando indexación cíclica. Espera entrada como "string" "repetitions".

Addison Crump
fuente
Oh my days, this is worse than I thought.Tan cierto, tan cierto.
Rɪᴋᴇʀ
¿Existe un comando var set múltiple a la vez? es decir set x,y to a's items?
Rɪᴋᴇʀ
@RikerW No lo creo. Si es así, me estoy perdiendo mucho.
Addison Crump
2

Haskell, 44 bytes

c x=x++c x
s#n=take(floor$n*sum[1|a<-s])$c s

Ejemplo de uso: "(will add more later)" # 0.3333-> "(will ".

Cómo funciona: cconcatena infinitas copias de la cadena x. Se comporta como el incorporado cycle. sum[1|a<-s]es una función de longitud personalizada que funciona con el sistema de tipo estricto de Haskell, ya que devuelve un Double(el incorporado lengthdevuelve un Intque no se puede multiplicar n). #toma floor (n * length(s))caracteres de la cadena cíclica s.

nimi
fuente
2

PHP 5, 96 87

9 bytes guardados gracias a @manatwork

<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0‌​];

Respuesta en bucle bastante directa.

Sin golf

<?
$a=$argv[1];
$z=0;
for($i=0; $i < floor(strlen($a)*$argv[2]); $i++) {
    // if the string offset is not set
    // then reset $z back to 0 so we can
    // echo the beginning of ths string again
    @$a[$z] ?: $z=0;
    echo $a[$z];
    $z++;
}
Samsquanch
fuente
No estoy seguro de cuándo debería ayudar la supresión de errores, para mí parece funcionar @también:<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork
Estaba recibiendo un aviso en el caso # 2 que causaba que la salida se procesara incorrectamente, que fue cuando agregué la supresión. (corriendo en modo CLI)
Samsquanch
"PHP 5.3 o posterior, el valor predeterminado es E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED". error_reporting Por lo tanto, preferimos basar nuestras soluciones en la configuración predeterminada y no preocuparnos por avisos y otros buenos hábitos. Por ejemplo, ignorando la inicialización de $zy $i.
manatwork
Oh genial Gracias por la info!
Samsquanch
2

R, 59 bytes

function(s,l)cat(rawToChar(array(charToRaw(s),nchar(s)*l)))

Como una función sin nombre. Esto usa charToRaw para dividir la cadena en un vector de raws. Esto se llena en una matriz de longitud * l, convertida de nuevo a char y salida.
Iba a usar strsplit, pero terminó siendo más largo.

Prueba

> f=
+ function(s,l)cat(rawToChar(array(charToRaw(s),nchar(s)*l)))
> f('test case', 1) # -> test case
test case
> f('case', 2.5) # -> casecaseca
casecaseca
> f('(will add more later)', 0.3333) # -> (will(space)
(will 
> f('cats >= dogs', 0.5) # -> cats >
cats >
> 
MickyT
fuente
2

Perl, 51 + 3 = 54 bytes

$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]

Se requiere: -n, -ly -M5.010| -E:

 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'test case\n1'
 test case
 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'case\n2.5'
 casecaseca
 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'(will add more later)\n0.3333'
 (will 
 $ perl -nlE'$l=<>*y///c;for$i(1..$l){push@a,/./g}say@a[0..$l-1]' <<< $'cats >= dogs\n0.5'
 cats >

Explicación:

$l=<>*y///c;              # Calculate output length (eg. 2.5 * input length)
for$i(1..$l){push@a,/./g} # Push a lot of chars from input into @a
say@a[0..$l-1]            # Slice @a according to output length
andlrc
fuente
1

c (macro preprocesador), 71

j,l;
#define f(s,m) l=strlen(s);for(j=0;j<(int)(l*m);)putchar(s[j++%l])

No es muy complicado aquí. Solo necesito asegurarmel*m esté emitido intantes de comparar j.

Pruébalo en línea.

Trauma digital
fuente
1

Oracle SQL 11.2, 154 152 bytes

WITH v(s,i)AS(SELECT SUBSTR(:1,1,FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))),1 FROM DUAL UNION ALL SELECT :1||s,i+1 FROM v WHERE i<=:2)SELECT MAX(s)FROM v;

Sin golf

WITH v(s,i) AS
(
  SELECT SUBSTR(:1,1,FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))),1 FROM DUAL 
  UNION ALL 
  SELECT :1||s,i+1 FROM v WHERE i<=:2
)
SELECT MAX(s) FROM v;

Seguí el camino recursivo, con la selección de inicialización cuidando la parte decimal.

Guardado 2 bytes gracias a @MickyT

Jeto
fuente
Puede guardar un par eliminando espacios después de) en la cláusula WITH y la selección final.
MickyT
Otro ahorro sería sustituir FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))conMOD(:2,1)*LENGTH(:1)
MickyT
Y una última :), puedes usar en LPADlugar deSUBSTR
MickyT
1

En serio, 24 bytes

,╗,mi@≈╜n╜l(*≈r`╜E`MΣ)kΣ

Pruébalo en línea!

Explicación:

,╗,mi@≈╜n╜l(*≈r`╜E`MΣ)kΣ
,╗                        get first input (string) and push it to register 0
  ,mi@≈                   get input 2 (x), push frac(x) (f), int(x) (n)
       ╜n                 push n copies of the string
         ╜l(*≈            push length of string, multiply by f, floor (substring length) (z)
              r`╜E`MΣ     push s[:z]
                     )kΣ  move fractional part of string to bottom, concat entire stack
Mego
fuente
1

Pyth, 9 bytes

V*Elzp@zN

Básicamente solo haciendo

             z = input()
V*Elz        for N in range(evaluatedInput()*len(z)):    # flooring is automatic
     p@zN        print(z[N], end="")                     # modular indexing
busukxuan
fuente