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.