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.


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.

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.


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


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>


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!


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.

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


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" 

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

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


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.


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

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

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

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.


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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.