Multiplicação decimal de cadeias

14

Dadas 2 entradas, uma sequência e um número decimal, produza a sequência multiplicada por esse número.

O problema é que o número pode ser um número flutuante ou um número inteiro.

Você deve imprimir a floor(n)hora da sequência e, em seguida, as primeiras floor((n-floor(n))*len(string))letras novamente.

Outras notas:

  • A entrada nem sempre será um flutuador, pode ser um int. Portanto, 1,5, 1 e 1,0 são possíveis. Ele sempre estará na base 10 e, se desejar uma exceção, por favor, comente.
  • A entrada da string pode conter espaços em branco, aspas e outros caracteres. Não há novas linhas ou caracteres de controle.
  • Não 'a'*5são permitidos embutidos para repetição direta de cadeias, mesmo a multiplicação de cadeias como o python . No entanto, a adição de string é permitida.

Casos de teste:

A vírgula e o espaço separam as 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:

Estou vendo muitas respostas que usam funções internas de multiplicação ou repetição de string. Isso não é permitido. A resposta do @ VTC é válida, porque não multiplica a string, apenas a entrada flutuante. Portanto, a regra definitiva é: se ela multiplica diretamente a string, você não pode fazê-lo.

Rɪᴋᴇʀ
fonte
A redação foi modificada repetidamente (não vi a primeira revisão). Sugiro remover a directrepetição de string (o que isso significa?). Mas
apesar de
@ Sp3000 sim, eu sei. Eu acho que a diferença é significativa o suficiente.
Rɪᴋᴇʀ
"Não são permitidos embutidos para repetição direta de cadeias, mesmo a multiplicação de cadeias como o python 'a' * 5." Você não explica a diferença entre estes. Eles soam o mesmo para mim.
Msh210
@ edc65 No Perl, você pode repetir a lista e concatenar os elementos dessa lista, o que não é a repetição direta de strings. No Perl 5: join "", ("case") x 2vs "case" x 2, no Perl 6 [~] "case" xx 2vs o mesmo"case" x 2
Brad Gilbert b2gills

Respostas:

4

Gelatina, 5 bytes

×L}Rị

Não usa uma repetição embutida. Experimente online!

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

pega char [] e flutua e sai para STDOUT. loop básico.

Marky Markov
fonte
3
Bom golfe, mesmo para java. : P
Rɪᴋᴇʀ
isso foi sugerido na minha outra resposta também, mas não acho que farei isso. não me parece correto.
Marky Markov
É justo. É reconhecido aqui, mas tudo bem. : D
Addison Crump
Eu recomendo declarar sua linguagem como Java 7. Então ninguém pode dizer para você usar lambdas.
feersum 8/16
6

Pyth, 9 8

s@Lz*lzQ

Guardado 1 byte graças a Pietu1998

Isso recebe floor(n * len(string))letras da string, usando indexação cíclica. Eu acredito que isso é sempre equivalente à fórmula dada.

Suíte de teste

FryAmTheEggman
fonte
1
Não plz não tire isso de mim tão cedo. xD
Addison Crump
@VoteToClose eu realmente não li a sua resposta em tudo, escuteiros honra: PI nem sequer percebem que repetições cordas foram rejeitaram, esta foi apenas mais curto que o que eu vim com essa maneira ...
FryAmTheEggman
1
Você nem precisa do segundo s. rangeé engraçado assim.
PurkkaKoodari
1
NOO! chora em um canto Ah, oh bem.
Addison Crump
6

JavaScript (ES6), 50 bytes

Edite mais 2 bytes para incluir a definição de função f. 1 byte a menos usando a dica de @manatwork. Nota: usando ~, temos mais iterações do que o necessário, mas isso é código de golfe e até 1 byte conta

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

TESTE

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
fonte
Ok obrigado. Até agora, a maioria das respostas não teve nenhum problema e é realmente fácil de corrigir. Obrigado por corrigi-lo.
Rɪᴋᴇʀ
Minúsculo erro de digitação: n>0no código vs. n>1no caso de teste.
manatwork
@manatwork thanks. Ele deve funcionar de qualquer maneira
edc65
Oh De fato. Mas então por que não apenas ~n? (Realmente apenas uma questão julgaram somente os casos de teste dadas..)
manatwork
3
@ edc65 Onde está fdefinido na sua solução? Você não está faltando f=?
8136 Andlrc
4

Vitsy, 9 bytes

Espera a palavra como argumento e o número a ser multiplicado 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.

Experimente online!

Addison Crump
fonte
Fiel à sua palavra, você respondeu rapidamente .
Rɪᴋᴇʀ
@RikerW Martin me entregou o FGIT.
Addison Crump
Por que você Grab all string argument input.e então Parse STDIN.novamente?
Rɪᴋᴇʀ
@RikerW Os argumentos duplos são analisados ​​automaticamente, empurrando-os para a pilha imediatamente. Manipulação que leva mais bytes do que vale a pena.
Addison Crump #
Oh está bem. Isso faz mais sentido agora.
Rɪᴋᴇʀ
3

CJam, 10 bytes

l_,l~*,\f=

A cadeia é fornecida na primeira linha de STDIN, a bóia na segunda.

Teste aqui.

Explicação

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
fonte
3

Python 2, 71 bytes

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

Experimente aqui!

Cria uma lambda sem nome que pega a string como primeiro argumento e o float como segundo. Retorna a sequência repetida.

Isso pode ser 46 se os builtins de repetição de string forem permitidos :(

Denker
fonte
1
Muito triste. Regras de multiplicação de string. +1 A + para efurtado.
Addison Crump
3

Ruby, 49 48 caracteres

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

Exemplo de execução:

2.1.5 :001 > ->s,n{(0...(n*l=s.size).to_i).map{|i|s[i%l]}*''}['case', 2.5]
 => "casecaseca" 
homem a trabalhar
fonte
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

O Perl 6 possui um operador de repetição de string x e um operador de repetição de lista xx.

Como as regras não permitem a repetição de strings, repetimos como se fosse uma lista de elementos únicos. Em seguida, a lista é concatenada e uma substring é retornada.

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
fonte
substr ([~] $^a xx$^b+1),0,$a.comb*$b}salva dois caracteres
raiph
2

osascript, 173 bytes

Oh meus dias, isso é pior do que eu pensava.

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

Retorna o valor da string, outra resposta usando indexação cíclica. Espera entrada como "string" "repetitions".

Addison Crump
fonte
Oh my days, this is worse than I thought.Tão verdadeiro, tão verdadeiro.
Rɪᴋᴇʀ
Existe um comando var múltiplo definido ao mesmo tempo? ie set x,y to a's items?
Rɪᴋᴇʀ
@RikerW Acho que não. Se houver, estou seriamente perdendo.
Addison Crump
2

Haskell, 44 bytes

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

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

Como funciona: cconcatena infinitas cópias da stringx . Ele se comporta como o embutido cycle. sum[1|a<-s]é uma função de comprimento personalizado que funciona com o sistema de tipo estrito de Haskell, pois retorna a Double(o interno lengthretorna um Intque não pode ser multiplicado n). #pega floor (n * length(s))caracteres da sequência ciclada s.

nimi
fonte
2

PHP 5, 96 87

9 bytes salvos graças a @manatwork

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

Resposta em loop bastante direta.

Ungolfed

<?
$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
fonte
Não tenho certeza de quando a supressão de erros deve ajudar, pois para mim parece funcionar sem @:<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork
Eu estava recebendo um aviso no caso 2, que causou a saída incorreta da saída, que foi quando adicionei a supressão. (executando no modo CLI)
Samsquanch 8/16
“PHP 5.3 ou posterior, o valor padrão é E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED." - error_reportingPortanto, preferimos basear nossas soluções na configuração padrão e não nos preocupar com avisos e outros bons hábitos. Por exemplo, ignorando a inicialização de $ze $i.
Manatwork
Oh fixe. Obrigado pela informação!
Samsquanch 8/16
2

R, 59 bytes

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

Como uma função sem nome. Isso usa charToRaw para dividir a sequência em um vetor de matérias-primas. Isso é preenchido em uma matriz de comprimento * l, convertida novamente em char e output.
Eu ia usar strsplit, mas acabou sendo mais longo.

Teste

> 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
fonte
2

Perl, 51 + 3 = 54 bytes

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

Exige: -n, -le -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 >

Explicação:

$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
fonte
1

c (macro de pré-processador), 71

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

Não é muito complicado aqui. Só precisa ter certeza de que l*mestá convertido em um intantes de comparar comj .

Experimente online.

Trauma Digital
fonte
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;

Sem golfe

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;

Eu segui o caminho recursivo, com a seleção de inicialização cuidando da parte decimal.

Guardado 2 bytes graças a @MickyT

Jeto
fonte
Você pode salvar um par removendo espaços após o) na cláusula WITH e na seleção final.
MickyT
Outra poupança seria substituir FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))comMOD(:2,1)*LENGTH(:1)
MickyT
E um último :), você pode usar em LPADvez deSUBSTR
MickyT 8/16/16
1

Sério, 24 bytes

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

Experimente online!

Explicação:

,╗,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
fonte
1

Pitão, 9 bytes

V*Elzp@zN

Basicamente, apenas fazendo

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