Phép nhân thập phân của chuỗi


14

Cho 2 đầu vào, một chuỗi và một số thập phân, đầu ra chuỗi nhân với số đó.

Điều hấp dẫn là số có thể là số float hoặc số nguyên.

Bạn nên xuất floor(n)thời gian chuỗi và sau đó các floor((n-floor(n))*len(string))chữ cái đầu tiên một lần nữa.

Ghi chú khác:

  • Đầu vào sẽ không phải luôn luôn là một float, nó có thể là một int. Vì vậy, 1,5, 1 và 1.0 đều có thể. Nó sẽ luôn ở trong căn cứ 10, và nếu bạn muốn có một ngoại lệ, vui lòng bình luận.
  • Đầu vào chuỗi có thể chứa khoảng trắng, dấu ngoặc kép và các ký tự khác. Không có dòng mới hoặc kiểm soát ký tự mặc dù.
  • Không được tích hợp để lặp lại chuỗi trực tiếp, thậm chí nhân chuỗi như python 'a'*5được cho phép. Tuy nhiên, bổ sung chuỗi được cho phép.

Các trường hợp thử nghiệm:

Dấu phẩy & không gian tách biệt các đầu vào.

test case, 1 -> test case

case, 2.5 -> casecaseca

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

cats >= dogs, 0.5 -> cats >

Lưu ý cuối cùng:

Tôi đang thấy rất nhiều câu trả lời sử dụng các hàm nhân hoặc lặp chuỗi dựng sẵn. Điều này không được phép. Câu trả lời của @ VTC hợp lệ, bởi vì nó không nhân chuỗi, chỉ có đầu vào float. Vì vậy, quy tắc dứt khoát là: Nếu nó trực tiếp nhân chuỗi, bạn không thể thực hiện được.


Từ ngữ đã được sửa đổi nhiều lần (tôi không thấy bản sửa đổi đầu tiên). Tôi đề nghị loại bỏ directlặp lại chuỗi (điều này có nghĩa là gì?). Nhưng tất cả trong tất cả các bạn đều đúng
edc65


@ Sp3000 vâng, tôi biết. Tôi nghĩ rằng sự khác biệt là đủ đáng kể.
Rɪᴋᴇʀ 8/2/2016

"Không được tích hợp để lặp lại chuỗi trực tiếp, thậm chí nhân chuỗi như python 'a' * 5 được cho phép." Bạn không giải thích sự khác biệt giữa những điều này. Họ âm thanh giống tôi.
msh210

@ edc65 Trong Perl, bạn có thể thực hiện lặp lại danh sách sau đó nối các phần tử của danh sách đó, không lặp lại chuỗi trực tiếp. Trong Perl 5: join "", ("case") x 2vs "case" x 2, trong Perl 6 [~] "case" xx 2vs the same"case" x 2
Brad Gilbert b2gills 8/2/2016

Câu trả lời:


4

Thạch, 5 byte

×L}Rị

Không sử dụng sự lặp lại tích hợp sẵn. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

mất char [] và float và xuất ra STDOUT. vòng lặp cơ bản.


3
Chơi golf tốt, ngay cả đối với java. : P
Rɪᴋᴇʀ 8/2/2016

điều này cũng được đề xuất cho câu trả lời khác của tôi, nhưng tôi không nghĩ mình sẽ làm điều này. nó có vẻ không đúng với tôi
Marky Markov

Ơ, đủ công bằng. Nó được công nhận ở đây, nhưng không sao. : D
Addison Crump

Tôi khuyên bạn nên khai báo ngôn ngữ của bạn là Java 7. Sau đó, không ai có thể bảo bạn sử dụng lambdas.
frageum

6

Bình thường 9 số 8

s@Lz*lzQ

Đã lưu 1 byte nhờ vào Pietu1998

Điều này lấy floor(n * len(string))các chữ cái từ chuỗi, sử dụng lập chỉ mục theo chu kỳ. Tôi tin rằng điều này luôn tương đương với công thức nhất định.

Phòng thử nghiệm


1
Không, xin đừng lấy cái này từ tôi sớm. xD
Addison Crump

@VoteToClose Tôi thực sự không đọc câu trả lời của bạn, vinh dự của các trinh sát: PI thậm chí không nhận ra rằng việc lặp lại chuỗi không được phép, điều này chỉ ngắn hơn những gì tôi nghĩ ra theo cách đó ...
FryAmTheEggman

1
Bạn thậm chí không cần thứ hai s. rangebuồn cười như thế
PurkkaKoodari 8/2/2016

1
KHÔNG! khóc ở một góc Ah, oh tốt.
Addison Crump

6

JavaScript (ES6), 50 byte

Chỉnh sửa thêm 2 byte để bao gồm định nghĩa của hàm f. Ít hơn 1 byte bằng cách sử dụng mẹo của @manatwork. Lưu ý: sử dụng ~chúng tôi có nhiều lần lặp hơn mức cần thiết, nhưng đây là mã golf và thậm chí là 1 byte

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

KIỂM TRA

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>


Được rồi, cảm ơn. Cho đến nay hầu hết các câu trả lời đều không có vấn đề gì, và nó thực sự dễ sửa. Cảm ơn đã sửa nó.
Rɪᴋᴇʀ 8/2/2016

Lỗi đánh máy nhỏ: n>0trong mã so với n>1trong trường hợp thử nghiệm.
manatwork 8/2/2016

@manatwork cảm ơn. Nó nên hoạt động theo bất kỳ cách nào
edc65

Oh. Thật. Nhưng tại sao không chỉ ~n? (Thực sự chỉ là một câu hỏi. Chỉ thử các trường hợp thử nghiệm đã cho.)
manatwork 8/2/2016

3
@ edc65 Trường hợp được fxác định trong giải pháp của bạn là gì? Bạn không mất tích f=à?
andlrc

4

Vitsy, 9 byte

Yêu cầu từ này làm đối số và số sẽ nhân với thông qua 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.

Hãy thử trực tuyến!


Đúng như lời bạn nói, bạn đã trả lời nhanh .
Rɪᴋᴇʀ 8/2/2016

@RikerW Martin ra FGITW'd tôi.
Addison Crump

Tại sao bạn Grab all string argument input.và sau đó Parse STDIN.một lần nữa?
Rɪᴋᴇʀ 8/2/2016

@RikerW Các đối số được nhân đôi sẽ được tự động phân tích cú pháp, đẩy chúng vào ngăn xếp ngay lập tức. Xử lý cần nhiều byte hơn giá trị của nó.
Addison Crump

Ờ được rồi. Điều đó có ý nghĩa hơn bây giờ.
Rɪᴋᴇʀ 8/2/2016

3

CJam, 10 byte

l_,l~*,\f=

Chuỗi được cung cấp trên dòng đầu tiên của STDIN, float trên dòng thứ hai.

Kiểm tra nó ở đây.

Giải trình

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

Hãy thử nó ở đây!

Tạo một lambda không tên, lấy chuỗi làm đối số đầu tiên và float là thứ hai. Trả về chuỗi lặp lại.

Điều này có thể là 46 nếu các nội dung lặp lại chuỗi được cho phép :(


1
Buồn lắm. Quy tắc nhân chuỗi như vậy. +1 A + cho hiệu ứng.
Addison Crump

3

Ruby, 49 48 ký tự

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

Chạy mẫu:

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 có cả toán tử lặp chuỗi xvà toán tử lặp lại danh sách xx.

Vì các quy tắc không cho phép lặp lại chuỗi, chúng tôi lặp lại nó như thể nó là một danh sách thành phần duy nhất thay thế. Sau đó, danh sách được nối với nhau và một chuỗi con của nó được trả về.

Sử dụng:

# 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}lưu hai ký tự
raiph

2

osascript, 173 byte

Ôi những ngày của tôi, điều này tồi tệ hơn tôi nghĩ.

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

Trả về giá trị của chuỗi, một câu trả lời khác sử dụng lập chỉ mục theo chu kỳ. Mong đợi đầu vào là "string" "repetitions".


Oh my days, this is worse than I thought.Thật vậy, rất đúng.
Rɪᴋᴇʀ 8/2/2016

Có nhiều var được đặt cùng một lúc không? tức là set x,y to a's items?
Rɪᴋᴇʀ 8/2/2016

@RikerW Tôi không nghĩ vậy. Nếu có, tôi thực sự đang bỏ lỡ.
Addison Crump

2

Haskell, 44 byte

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

Ví dụ sử dụng: "(will add more later)" # 0.3333-> "(will ".

Cách thức hoạt động: cnối các bản sao vô hạn của chuỗi x. Nó hoạt động như tích hợp cycle. sum[1|a<-s]là một hàm độ dài tùy chỉnh hoạt động với hệ thống loại nghiêm ngặt của Haskell khi nó trả về một Double(hàm lengthtrả về tích hợp Intmà không thể nhân với n). #lấy các floor (n * length(s))ký tự từ chuỗi chu kỳ s.


2

PHP 5, 96 87

9 byte được lưu nhờ @manatwork

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

Khá thẳng về phía trước câu trả lời lặp.

Ung dung

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

Không chắc chắn khi nào nên khắc phục lỗi đó, đối với tôi dường như làm việc mà không @quá:<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork 8/2/2016

Tôi đã nhận được một thông báo về trường hợp # 2 khiến đầu ra hiển thị không chính xác, đó là khi tôi thêm vào phần triệt tiêu. (chạy ở chế độ CLI)
Samsquanch 8/2/2016

Sau đó, PHP PHP 5.3 trở lên, giá trị mặc định là E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED error_reporting. Ví dụ bỏ qua việc khởi tạo $z$i.
manatwork 8/2/2016

Ồ tuyệt. Cảm ơn bạn về thông tin!
Samsquanch

2

R, 59 byte

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

Là một chức năng không tên. Điều này sử dụng charToRaw để phân tách chuỗi thành một vectơ thô. Điều này được điền vào một mảng có chiều dài * l, được chuyển đổi trở lại thành char và đầu ra.
Tôi sẽ sử dụng strsplit, nhưng cuối cùng nó dài hơn.

Kiểm tra

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

Yêu cầu: -n, -l-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 >

Giải trình:

$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

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;

Không chơi gôn

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;

Tôi đã đi theo cách đệ quy, với việc khởi tạo chọn chăm sóc phần thập phân.

Đã lưu 2 byte nhờ @MickyT


Bạn có thể lưu một cặp bằng cách xóa khoảng trắng sau dấu) trong mệnh đề CÓ và chọn cuối cùng.
MickyT

Một cách tiết kiệm khác sẽ được thay thế FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))bằngMOD(:2,1)*LENGTH(:1)
MickyT

Và một cái cuối cùng :), bạn có thể sử dụng LPADchứ không phảiSUBSTR
MickyT

1

Nghiêm túc, 24 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Bình thường, 9 byte

V*Elzp@zN

Về cơ bản chỉ làm

             z = input()
V*Elz        for N in range(evaluatedInput()*len(z)):    # flooring is automatic
     p@zN        print(z[N], end="")                     # modular indexing
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.