Perkalian String Desimal

14

Diberikan 2 input, string dan angka desimal, output string dikalikan dengan angka itu.

Tangkapannya adalah bahwa bilangan dapat berupa pelampung atau bilangan bulat.

Anda harus menampilkan floor(n)waktu string dan kemudian floor((n-floor(n))*len(string))huruf pertama lagi.

Catatan lain:

  • Input tidak akan selalu berupa float, mungkin berupa int. Jadi 1,5, 1, dan 1.0 semuanya mungkin. Akan selalu ada di basis 10, dan jika Anda ingin pengecualian, silakan komentar.
  • Input string dapat berisi spasi, tanda kutip dan karakter lainnya. Tidak ada baris baru atau karakter kontrol.
  • Tidak ada built-in untuk pengulangan string langsung, bahkan multiplikasi string seperti python 'a'*5diperbolehkan. Namun penambahan string diizinkan.

Kasus uji:

Koma & spasi memisahkan input.

test case, 1 -> test case

case, 2.5 -> casecaseca

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

cats >= dogs, 0.5 -> cats >

Catatan Akhir:

Saya melihat banyak jawaban yang menggunakan fungsi multiplikasi atau pengulangan bawaan. Ini tidak diizinkan @ Jawaban VTC ini adalah meskipun valid, karena tidak multiply string, hanya input float. Jadi aturan definitifnya adalah: Jika secara langsung mengalikan string, Anda tidak bisa melakukannya.

Rɪᴋᴇʀ
sumber
Kata-katanya diubah berulang kali (saya tidak melihat revisi pertama). Saya sarankan untuk menghapus directpengulangan string (apa artinya ini?). Tapi secara keseluruhan Anda benar
edc65
@ Sp3000 ya, saya tahu. Saya pikir perbedaannya cukup signifikan.
R
"Tidak ada built-in untuk pengulangan string langsung, bahkan multiplikasi string seperti python 'a' * 5 diperbolehkan." Anda tidak menjelaskan perbedaannya. Bagi saya itu terdengar sama.
msh210
@ edc65 Dalam Perl Anda dapat melakukan pengulangan daftar kemudian menggabungkan elemen-elemen dari daftar itu, yang bukan pengulangan string langsung. Di Perl 5: join "", ("case") x 2vs "case" x 2, di Perl 6 [~] "case" xx 2vs sama"case" x 2
Brad Gilbert b2gills

Jawaban:

4

Jelly, 5 byte

×L}Rị

Tidak menggunakan pengulangan bawaan. Cobalah online!

Bagaimana itu bekerja

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

mengambil char [] dan float dan output ke STDOUT. perulangan dasar.

Marky Markov
sumber
3
Golf bagus, bahkan untuk java. : P
Rɪᴋᴇʀ
ini disarankan pada jawaban saya yang lain juga, tetapi saya tidak berpikir saya akan melakukan ini. tampaknya tidak benar bagi saya.
Marky Markov
Eh, cukup adil. Diakui di sini, tapi baik-baik saja. : D
Addison Crump
Saya sarankan mendeklarasikan bahasa Anda sebagai Java 7. Maka tidak ada yang bisa memberitahu Anda untuk menggunakan lambdas.
feersum
6

Pyth, 9 8

s@Lz*lzQ

Disimpan 1 byte berkat Pietu1998

Ini mengambil floor(n * len(string))huruf dari string, menggunakan pengindeksan siklus. Saya percaya ini selalu setara dengan formula yang diberikan.

Test Suite

FryAmTheEggman
sumber
1
Tidak, tolong jangan ambil ini dariku secepat ini. xD
Addison Crump
@VoteToClose Saya benar-benar tidak membaca jawaban Anda sama sekali, scouts kehormatan: PI bahkan tidak menyadari bahwa pengulangan string tidak diizinkan, ini hanya lebih pendek dari apa yang saya dapatkan dengan cara itu ...
FryAmTheEggman
1
Anda bahkan tidak membutuhkan yang kedua s. rangelucu seperti itu.
PurkkaKoodari
1
TIDAK! tangis di sudut Ah, oh well.
Addison Crump
6

JavaScript (ES6), 50 byte

Edit 2 byte lagi untuk memasukkan definisi fungsi f. 1 byte lebih sedikit menggunakan ujung @manatwork. Catatan: menggunakan ~kami memiliki lebih banyak iterasi daripada yang diperlukan, tetapi ini adalah kode golf dan bahkan 1 byte dihitung

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

UJI

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
sumber
Oke terima kasih. Sejauh ini sebagian besar jawaban tidak memiliki masalah, dan sangat mudah untuk diperbaiki. Terima kasih telah memperbaikinya.
R
Tiny typo: n>0dalam kode vs. n>1dalam test case.
manatwork
@manatwork terima kasih. Ini seharusnya bekerja dengan baik
edc65
Oh Memang. Tapi mengapa tidak adil ~n? (Benar-benar hanya sebuah pertanyaan. Hanya mencoba test case yang diberikan.)
manatwork
3
@ edc65 Di mana fdidefinisikan dalam solusi Anda? Apakah kamu tidak hilang f=?
andlrc
4

Vitsy, 9 byte

Mengharapkan kata sebagai argumen, dan angka untuk dikalikan melalui 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.

Cobalah online!

Addison Crump
sumber
Sesuai dengan kata-kata Anda, Anda menjawab dengan cepat .
R
@RikerW Martin out FGITW'd me.
Addison Crump
Mengapa Anda Grab all string argument input.dan kemudian Parse STDIN.lagi?
R
@RikerW Argumen yang ganda secara otomatis diuraikan, mendorong mereka ke tumpukan segera. Penanganan yang membutuhkan byte lebih dari nilainya.
Addison Crump
Oh baiklah. Itu lebih masuk akal sekarang.
R
3

CJam, 10 byte

l_,l~*,\f=

Tali dipasok pada baris pertama STDIN, float pada baris kedua.

Uji di sini.

Penjelasan

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

Python 2, 71 byte

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

Coba di sini!

Membuat lambda tanpa nama yang menggunakan string sebagai argumen pertama dan float sebagai argumen kedua. Mengembalikan string yang diulang.

Ini bisa menjadi 46 jika builtin pengulangan string diizinkan :(

Denker
sumber
1
Sedih sekali. Aturan multiplikasi string seperti itu. +1 A + untuk upaya.
Addison Crump
3

Ruby, 49 48 karakter

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

Contoh dijalankan:

2.1.5 :001 > ->s,n{(0...(n*l=s.size).to_i).map{|i|s[i%l]}*''}['case', 2.5]
 => "casecaseca" 
manatwork
sumber
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 memiliki operator pengulangan string xdan operator pengulangan daftar xx.

Karena aturan melarang pengulangan string, kami mengulanginya seolah-olah itu adalah daftar elemen tunggal. Kemudian daftar tersebut disatukan, dan substringnya dikembalikan.

Pemakaian:

# 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
sumber
substr ([~] $^a xx$^b+1),0,$a.comb*$b}menghemat dua karakter
raiph
2

naskah, 173 byte

Oh hari-hariku, ini lebih buruk daripada yang aku pikirkan.

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

Mengembalikan nilai string, jawaban lain menggunakan pengindeksan siklus. Diharapkan input sebagai "string" "repetitions".

Addison Crump
sumber
Oh my days, this is worse than I thought.Sangat benar, sangat benar.
R
Apakah ada beberapa var set perintah sekaligus? yaitu set x,y to a's items?
R
@RikerW saya tidak berpikir begitu. Jika ada, saya benar-benar kehilangan.
Addison Crump
2

Haskell, 44 byte

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

Contoh penggunaan: "(will add more later)" # 0.3333-> "(will ".

Cara kerjanya: cmenyatukan salinan string yang tak terbatas x. Berperilaku seperti built-in cycle. sum[1|a<-s]adalah fungsi panjang kustom yang berfungsi dengan sistem tipe Haskell yang ketat karena mengembalikan a Double( lengthpengembalian bawaan Intyang tidak dapat dikalikan dengan n). #mengambil floor (n * length(s))karakter dari string bersepeda s.

nimi
sumber
2

PHP 5, 96 87

9 byte disimpan berkat @manatwork

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

Jawaban perulangan cukup lurus ke depan.

Tidak disatukan

<?
$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
sumber
Tidak yakin kapan harus membantu penindasan kesalahan, bagi saya tampaknya bekerja tanpa @terlalu:<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork
Saya mendapat pemberitahuan pada kasus # 2 yang menyebabkan output untuk membuat salah, yaitu ketika saya menambahkan dalam penindasan. (berjalan dalam mode CLI)
Samsquanch
“PHP 5.3 atau lebih baru, nilai standarnya adalah E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED.” - error_reportingJadi kami lebih memilih untuk mendasarkan solusi kami pada konfigurasi default dan tidak memedulikan pemberitahuan dan kebiasaan baik lainnya. Misalnya mengabaikan inisialisasi $zdan $i.
manatwork
Oh keren. Terimakasih atas infonya!
Samsquanch
2

R, 59 byte

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

Sebagai fungsi yang tidak disebutkan namanya. Ini menggunakan charToRaw untuk membagi string menjadi vektor mentah. Ini diisi ke dalam array dengan panjang * l, dikonversi kembali ke char dan output.
Saya akan menggunakan strsplit, tetapi akhirnya menjadi lebih lama.

Uji

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

Perl, 51 + 3 = 54 byte

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

Membutuhkan: -n, -ldan -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 >

Penjelasan:

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

c (makro praprosesor), 71

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

Tidak terlalu rumit di sini. Hanya perlu memastikan l*mdilemparkan ke intsebelum membandingkan j.

Cobalah online.

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

Tidak bermain 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;

Saya pergi dengan cara rekursif, dengan memilih inisialisasi mengurus bagian desimal.

Disimpan 2 byte berkat @MickyT

Jeto
sumber
Anda dapat menyimpan pasangan dengan menghapus spasi setelah) pada klausa WITH dan pemilihan akhir.
MickyT
Penghematan lain akan diganti FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))denganMOD(:2,1)*LENGTH(:1)
MickyT
Dan yang terakhir :), Anda bisa menggunakan LPADdaripadaSUBSTR
MickyT
1

Serius, 24 byte

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

Cobalah online!

Penjelasan:

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

Pyth, 9 byte

V*Elzp@zN

Pada dasarnya hanya melakukan

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