Moltiplicazione decimale di stringhe


14

Dati 2 input, una stringa e un numero decimale, producono la stringa moltiplicata per quel numero.

Il trucco è che il numero può essere un float o un numero intero.

Dovresti generare l' floor(n)ora della stringa e poi di nuovo le prime floor((n-floor(n))*len(string))lettere.

Altre note:

  • L'input non sarà sempre un float, potrebbe essere un int. Quindi 1.5, 1 e 1.0 sono tutti possibili. Sarà sempre nella base 10 e, se si desidera un'eccezione, si prega di commentare.
  • L'input della stringa può contenere spazi bianchi, virgolette e altri caratteri. Non ci sono newline o caratteri di controllo però.
  • Non 'a'*5sono ammessi built-in per la ripetizione diretta delle stringhe, anche la moltiplicazione di stringhe come il pitone è consentita. Tuttavia è consentita l' aggiunta di stringhe .

Casi test:

La virgola e lo spazio separano gli input.

test case, 1 -> test case

case, 2.5 -> casecaseca

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

cats >= dogs, 0.5 -> cats >

Nota finale:

Sto vedendo molte risposte che utilizzano le funzioni di moltiplicazione o ripetizione di stringhe incorporate. Questo non è permesso La risposta di @ VTC è valida, poiché non moltiplica la stringa, ma solo l'input float. Quindi la regola definitiva è: se moltiplica direttamente la stringa, non puoi farlo.


La formulazione è stata modificata ripetutamente (non ho visto la prima revisione). Suggerisco di rimuovere directla ripetizione della stringa (cosa significa?). Ma tutto sommato hai ragione
edc65


@ Sp3000 sì, lo so. Penso che la differenza sia abbastanza significativa.
Rɪᴋᴇʀ

"Non sono previsti built-in per la ripetizione diretta delle stringhe, anche la moltiplicazione di stringhe come il pitone 'a' * 5 è consentita." Non spieghi la differenza tra questi. Suonano lo stesso per me.
msh210,

@ edc65 In Perl puoi fare la ripetizione della lista, quindi concatenare gli elementi di quella lista, che non è la ripetizione diretta della stringa. In Perl 5: join "", ("case") x 2vs "case" x 2, in Perl 6 [~] "case" xx 2vs lo stesso"case" x 2
Brad Gilbert b2gills

Risposte:


4

Gelatina, 5 byte

×L}Rị

Non utilizza una ripetizione integrata. Provalo online!

Come funziona

×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.

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

prende char [] e float ed esegue l'output su STDOUT. loop di base.


3
Buon golf, anche per Java. : P
Rɪᴋᴇʀ

questo è stato suggerito anche sull'altra mia risposta, ma non credo che lo farò. non mi sembra giusto.
Marky Markov,

Eh, abbastanza giusto. È riconosciuto qui, ma va bene. : D
Addison Crump

Consiglio di dichiarare la tua lingua come Java 7. Quindi nessuno può dirti di usare lambdas.
feersum

6

Pyth, 9 8

s@Lz*lzQ

Salvato 1 byte grazie a Pietu1998

Questo prende le floor(n * len(string))lettere dalla stringa, usando l'indicizzazione ciclica. Credo che questo sia sempre equivalente alla formula data.

Test Suite


1
No, per favore, non togliermelo presto. xD
Addison Crump

@VotoToClose In realtà non ho letto per niente la tua risposta, onore degli scout: PI non si è nemmeno reso conto che le ripetizioni di stringhe non sono state vietate, questo è stato solo più breve di quello che ho
inventato in

1
Non hai nemmeno bisogno del secondo s. rangeè divertente così.
PurkkaKoodari,

1
NOO! piange in un angolo Ah, vabbè.
Addison Crump,

6

JavaScript (ES6), 50 byte

Modifica altri 2 byte per includere la definizione della funzione f. 1 byte in meno usando la punta di @manatwork. Nota: usando ~abbiamo più iterazioni del necessario, ma questo è il codice golf e conta anche 1 byte

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

TEST

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>


Va bene, grazie. Finora la maggior parte delle risposte non ha avuto problemi ed è davvero facile da risolvere. Grazie per averlo corretto.
Rɪᴋᴇʀ

Piccolo errore di battitura: n>0nel codice vs. n>1nel caso di test.
arte

@manatwork grazie. Dovrebbe funzionare in entrambi i modi
edc65,

Oh. Infatti. Ma allora perché non solo ~n? (In realtà solo una questione provato solo i dati casi di test..)
manatwork

3
@ edc65 Dove è fdefinito nella tua soluzione? Non ti manca f=?
Andlrc

4

Vitsy, 9 byte

Si aspetta che la parola sia un argomento e che il numero si moltiplichi tramite 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.

Provalo online!


Fedele alla tua parola, hai risposto velocemente .
Rɪᴋᴇʀ

@RikerW Martin fuori FGITW'd me.
Addison Crump,

Perché tu Grab all string argument input.e poi di Parse STDIN.nuovo?
Rɪᴋᴇʀ

@RikerW Gli argomenti che sono doppi vengono analizzati automaticamente, spingendoli immediatamente nello stack. Gestione che richiede più byte di quanto valga la pena.
Addison Crump,

Oh ok. Adesso ha più senso.
Rɪᴋᴇʀ

3

CJam, 10 byte

l_,l~*,\f=

La stringa viene fornita sulla prima riga di STDIN, il float sulla seconda.

Provalo qui.

Spiegazione

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.

3

Python 2, 71 byte

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

Provalo qui!

Crea un lambda senza nome che accetta la stringa come primo argomento e il float come secondo. Restituisce la stringa ripetuta.

Questo potrebbe essere 46 se fossero consentiti gli incorporamenti di ripetizione delle stringhe :(


1
Molto triste Tali regole di moltiplicazione delle stringhe. +1 A + per effurt.
Addison Crump

3

Rubino, 49 48 caratteri

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

Esecuzione di esempio:

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

3

Perl 6 ,  46 41   39 byte

{([~] $^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 ha sia un operatore di ripetizione stringa xche un operatore di ripetizione elencoxx .

Poiché le regole non consentono la ripetizione di stringhe, la ripetiamo come se fosse invece un singolo elenco di elementi. Quindi l'elenco viene concatenato insieme e viene restituita una sottostringa.

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

substr ([~] $^a xx$^b+1),0,$a.comb*$b}salva due caratteri
raiph,

2

JavaScript, 173 byte

Oh miei giorni, è peggio di quanto pensassi.

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

Restituisce il valore della stringa, un'altra risposta utilizzando l'indicizzazione ciclica. Si aspetta input come "string" "repetitions".


Oh my days, this is worse than I thought.Così vero, così vero.
Rɪᴋᴇʀ

Esiste un var set multiplo in una volta comando? cioè set x,y to a's items?
Rɪᴋᴇʀ

@RikerW Non credo. Se c'è, mi sto davvero perdendo.
Addison Crump

2

Haskell, 44 byte

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

Esempio di utilizzo: "(will add more later)" # 0.3333->"(will " .

Come funziona: cconcatena infinite copie della stringa x. Si comporta come integrato cycle. sum[1|a<-s]è una funzione di lunghezza personalizzata che funziona con il sistema di tipi rigorosi di Haskell in quanto restituisce un Double(il valore predefinito lengthrestituisce un Intche non può essere moltiplicato n). #prende i floor (n * length(s))caratteri dalla stringa ciclica s.


2

PHP 5, 96 87

9 byte salvati grazie a @manatwork

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

Risposta in loop piuttosto semplice.

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

Non so quando la soppressione degli errori possa aiutare, per me sembra funzionare @anche senza :<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork

Stavo ricevendo un avviso sul caso n. 2 che causava il rendering errato dell'output, che è stato quando ho aggiunto la soppressione. (in esecuzione in modalità CLI)
Samsquanch,

"PHP 5.3 o successivo, il valore predefinito è E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED." - error_reportingQuindi preferiamo basare le nostre soluzioni sulla configurazione predefinita e non preoccuparci di avvisi e altre buone abitudini. Ad esempio ignorando l'inizializzazione di $ze $i.
arte

Oh, fico. Grazie per le informazioni!
Samsquanch,

2

R, 59 byte

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

Come una funzione senza nome. Questo utilizza charToRaw per dividere la stringa in un vettore di raw. Questo viene riempito in una matrice di lunghezza * l, convertito nuovamente in carattere e output.
Stavo per usare strsplit, ma alla fine è stato più lungo.

Test

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

2

Perl, 51 + 3 = 54 byte

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

Richiede: -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 >

Spiegazione:

$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

1

c (macro del preprocessore), 71

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

Non molto complicato qui. Ho solo bisogno di assicurarti che l*mvenga trasmesso a un intprima di confrontarloj .

Provalo online.


1

Oracle SQL 11.2, 154 152 byte

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;

Un-golfed

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;

Sono andato in modo ricorsivo, con l'inizializzazione selezionata avendo cura della parte decimale.

Salvato 2 byte grazie a @MickyT


È possibile salvare un paio rimuovendo gli spazi dopo il) nella clausola WITH e la selezione finale.
MickyT

Un altro risparmio sarebbe sostituire FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))conMOD(:2,1)*LENGTH(:1)
MickyT

E un ultimo :), puoi usare LPADpiuttosto cheSUBSTR
MickyT

1

Scherzi a parte, 24 byte

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

Provalo online!

Spiegazione:

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

1

Pyth, 9 byte

V*Elzp@zN

Fondamentalmente solo facendo

             z = input()
V*Elz        for N in range(evaluatedInput()*len(z)):    # flooring is automatic
     p@zN        print(z[N], end="")                     # modular indexing
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.