文字列の10進数の乗算


14

文字列と10進数の2つの入力がある場合、文字列にその数値を掛けて出力します。

キャッチは、数値が浮動小数点数または整数になる可能性があることです。

文字列floor(n)timeを出力してから、最初のfloor((n-floor(n))*len(string))文字を再度出力する必要があります。

その他の注意事項:

  • 入力は常にフロートではなく、intである可能性があります。したがって、1.5、1、および1.0がすべて可能です。ただし、常にベース10になります。例外が必要な場合はコメントしてください。
  • 文字列入力には、空白、引用符、その他の文字が含まれる場合があります。ただし、改行や制御文字はありません。
  • 直接の文字列の繰り返しのためのビルトインはなく、Pythonのような文字列の乗算'a'*5も許可されています。ただし、文字列の追加は許可されています。

テストケース:

入力はコンマとスペースで区切ります。

test case, 1 -> test case

case, 2.5 -> casecaseca

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

cats >= dogs, 0.5 -> cats >

最終ノート:

組み込みの文字列乗算または繰り返し関数を使用する多くの答えがあります。これは許可されていません。ただし、@ VTCの答え有効です。これは、文字列を乗算せず、フロート入力のみを乗算するためです。したがって、最終的なルールは次のとおりです。文字列を直接乗算する場合、実行できません。


言葉遣いは繰り返し修正されました(最初の改訂は見ませんでした)。direct文字列の繰り返しを削除することをお勧めします(これはどういう意味ですか?)。しかし、すべてのすべてのあなたのしている権利
edc65


@ Sp3000ええ、知っています。違いは十分に大きいと思います。
Rɪᴋᴇʀ

「直接文字列を繰り返すための組み込み機能はありません。Python 'a' * 5のような文字列の乗算も許可されています。」これらの違いを説明しません。彼らは私に同じように聞こえます。
msh210

@ edc65 Perlでは、リストの繰り返しを実行してから、そのリストの要素を連結できます。これは、直接の文字列の繰り返しではありません。Perl 5:join "", ("case") x 2vs "case" x 2、Perl 6 [~] "case" xx 2vs vs"case" x 2
Brad Gilbert b2gills

回答:


4

ゼリー、5バイト

×L}Rị

組み込みの繰り返しを使用しません。オンラインでお試しください!

使い方

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

char []とfloatを取り、STDOUTに出力します。基本的なループ。


3
ジャバにとっても良いゴルフ。:P
Rɪᴋᴇʀ

これは他の答えでも提案されましたが、私はこれをするつもりはありません。私には正しくないようです。
マーキーマルコフ

ええ、十分に公平です。ここでは認識されていますが、大丈夫です。:D
アディソンクランプ

あなたの言語をJava 7として宣言することをお勧めします。そうすれば、誰もラムダを使用するように指示できません。
feersum

6

Pyth、 9 8

s@Lz*lzQ

Pietu1998のおかげで1バイト節約

これはfloor(n * len(string))、循環インデックスを使用して、文字列から文字を取得します。これは常に与えられた式と同等だと思います。

テストスイート


1
すぐにこれを私から受け取らないでください。xD
アディソンCrumpの

私は実際にすべてのあなたの答えを読んでいない@VoteToClose、名誉を偵察:PIも、文字列の繰り返しが禁止されたことを実現していない、これは私がそのように思い付いたものだけに短かった...
FryAmTheEggman

1
2番目も必要ありませんsrangeそのように面白いです。
-PurkkaKoodari

1
いや!コーナーで泣くあ、まあ。
アディソンクランプ

6

JavaScript(ES6)、50バイト

functionの定義を含めるには、さらに2バイトを編集しますf。@manatworkのヒントを使用すると1バイト少なくなります。注:使用~すると、必要以上の反復がありますが、これはコードゴルフであり、1バイトカウントですらあります

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

テスト

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>


わかった、ありがとう。これまでのところ、ほとんどの答えには問題がなく、修正は本当に簡単です。修正していただきありがとうございます。
Rɪᴋᴇʀ

小さなタイプミス:n>0コード対n>1テストケース。
マナトワーク

@manatworkありがとう。どちらの方法でも動作するはずです
-edc65

ああ。確かに。しかし、なぜそれだけではありません~nか?(本当に質問。与えられたテストケースのみを試してみました。)
manatwork

3
@ edc65ソリューションのどこでf定義されていますか?あなたは行方不明ではありませんf=か?
andlrc

4

Vitsy、9バイト

引数としての単語と、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.

オンラインでお試しください!


あなたの言葉に忠実に、あなたは速く答えました。
Rɪᴋᴇʀ

@RikerW MartinがFGITW'dを出してくれました。
アディソンクランプ

なぜあなたの操作を行いGrab all string argument input.、その後し、Parse STDIN.再び?
Rɪᴋᴇʀ

@RikerW double型の引数は自動的に解析され、すぐにスタックにプッシュされます。必要以上に多くのバイトを必要とする処理。
アディソンクランプ

いいよ それは今より理にかなっています。
Rɪᴋᴇʀ

3

CJam、10バイト

l_,l~*,\f=

文字列はSTDINの最初の行で提供され、フロートは2番目の行で提供されます。

ここでテストしてください。

説明

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バイト

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

ここで試してみてください!

文字列を最初の引数として受け取り、フロートを2番目として受け取る名前のないラムダを作成します。繰り返し文字列を返します。

文字列の繰り返しビルトインが許可されている場合、これは46になります:(


1
とても悲しい。このような文字列の乗算規則。effurtに対して+1 A +。
アディソンクランプ

3

ルビー、49 48文字

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

サンプル実行:

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バイト

{([~] $^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には、文字列繰り​​返し演算子xとリスト繰り返し演算子の両方がありますxx

規則では文字列の繰り返しが許可されていないため、代わりに単一の要素リストであるかのように繰り返します。次に、リストが連結され、そのサブストリングが返されます。

使用法:

# 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}2つの文字を保存
レイフ

2

osascript、173バイト

ああ、これは思ったより悪い。

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

文字列の値を返します。これは、循環インデックスを使用した別の回答です。としての入力を期待します"string" "repetitions"


Oh my days, this is worse than I thought.本当に本当です。
Rɪᴋᴇʀ

一度に複数の変数を設定するコマンドはありますか?すなわちset x,y to a's items
Rɪᴋᴇʀ

@RikerWそうは思いません。ある場合、私は真剣に見逃しています。
アディソンクランプ

2

Haskell、44バイト

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

使用例:"(will add more later)" # 0.3333-> "(will "

仕組み:c文字列の無限コピーを連結しますx。組み込みのように動作しcycleます。sum[1|a<-s]は、aを返すようにHaskellの厳密な型システムで機能するカスタムの長さ関数ですDouble(組み込みはを乗算できないをlength返します)。かかる入れ直さ文字列から文字を。Intn#floor (n * length(s))s


2

PHP 5、96 87

@manatworkのおかげで9バイト節約

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

かなり簡単なループ回答。

非ゴルフ

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

そのエラー抑制がいつ役立つのかわからない、私にとっても機能するようです@<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork

ケース#2で通知を受け取っていたため、出力が正しくレンダリングされませんでした。これは、抑制に追加したときです。(CLIモードで実行)
サムスカンチ

「PHP 5.3以降、デフォルト値はE_ALL&〜E_NOTICE&〜E_STRICT&〜E_DEPRECATEDです。」– error_reportingしたがって、デフォルトの設定に基づいてソリューションを作成し、通知やその他の良い習慣を気にしないことを好みます。例えば、初期化を無視する$z$i
マナトワーク

かっこいい、イケてる。情報をありがとう!
サムスカンチ

2

R、59バイト

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

名前のない関数として。これは、charToRawを使用して、文字列をrawのベクトルに分割します。これは長さ* lの配列に入れられ、charに変換されて出力されます。
私はstrsplitを使用するつもりでしたが、結局は長くなりました。

テスト

> 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バイト

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

必要:-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 >

説明:

$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バイト

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;

ゴルフをしていない

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;

私は再帰的な方法で、初期化の選択で小数部分を処理しました。

@MickyTのおかげで2バイト節約


WITH句と最後の選択で)の後にスペースを削除することで、カップルを節約できます。
MickyT

別の節約は、次のものに置き換えるFLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))ことですMOD(:2,1)*LENGTH(:1)
MickyT

最後の1つ:)、LPADSUBSTR
MickyT

1

真剣に、24バイト

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

オンラインでお試しください!

説明:

,╗,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バイト

V*Elzp@zN

基本的にただやっている

             z = input()
V*Elz        for N in range(evaluatedInput()*len(z)):    # flooring is automatic
     p@zN        print(z[N], end="")                     # modular indexing
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.