Dizelerin Ondalık Çarpımı


14

Bir dize ve bir ondalık sayı olmak üzere 2 giriş verildiğinde, dizenin bu sayıyla çarpımı elde edilir.

Yakalama, sayının bir kayan nokta veya bir tam sayı olabileceğidir.

Dize floor(n)zamanını ve ardından ilk floor((n-floor(n))*len(string))harfleri yeniden çıkarmalısınız .

Diğer notlar:

  • Giriş her zaman bir kayan nokta olmayacak, bir int olabilir. Böylece 1.5, 1 ve 1.0 mümkündür. Yine de her zaman taban 10'da olacak ve bir istisna istiyorsanız lütfen yorum yapın.
  • Dize girdisi boşluk, tırnak işaretleri ve diğer karakterleri içerebilir. Hiçbir satırsonu ya da kontrol karakterleri.
  • Doğrudan dize yinelemesi için yerleşik yapı yoktur, hatta python gibi dize çoğaltmasına 'a'*5izin verilir. Ancak dize eklenmesine izin verilir.

Test senaryoları:

Virgül ve boşluk girişleri ayırır.

test case, 1 -> test case

case, 2.5 -> casecaseca

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

cats >= dogs, 0.5 -> cats >

Son Not:

Yerleşik dize çarpma veya tekrarlama işlevlerini kullanan cevapların bir sürü görüyorum. Bu edilir değil izin verdi. VTC cevabı @ olduğunu o çarpın dize, sadece şamandıra girişi değil, çünkü geçerli olsa. Dolayısıyla, kesin kural şudur: Dizeyi doğrudan çarparsa, yapamazsınız.


İfadeler tekrar tekrar değiştirildi (ilk revizyonu görmedim). directDize yinelenen kaldırmayı öneririm (bu ne anlama geliyor?). Ama sonuçta haklısın
edc65


@ Sp3000 evet, biliyorum. Farkın yeterince önemli olduğunu düşünüyorum.
Rɪᴋᴇʀ

"Doğrudan dize yineleme için yerleşik yok, hatta 'a' * 5 python gibi dize çarpımına izin verilir." Bunlar arasındaki farkı açıklamıyorsunuz. Bana da aynı geliyorlar.
msh210

@ edc65 Perl'de liste tekrarı yapabilir ve o listenin doğrudan dize tekrarı olmayan öğelerini birleştirebilirsiniz. Perl 5'te: join "", ("case") x 2vs "case" x 2, Perl 6'da [~] "case" xx 2vs aynı"case" x 2
Brad Gilbert b2gills

Yanıtlar:


4

Jöle, 5 bayt

×L}Rị

Dahili bir tekrarlama kullanmaz. Çevrimiçi deneyin!

Nasıl çalışı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 [] ve float alır ve çıktıları STDOUT'a alır. temel döngü.


3
Java için bile iyi golf. : P
Rɪᴋᴇʀ

Bu benim diğer cevabımda da önerildi, ama bunu yapacağımı sanmıyorum. bana doğru gelmiyor.
Marky Markov

Eh, yeterince adil. Burada tanınıyor, ama tamam. : D
Addison Crump

Dilinizi Java 7 olarak bildirmenizi tavsiye ederim. O zaman kimse size lambdas kullanmanızı söyleyemez.
feersum

6

Pyth, 9 8

s@Lz*lzQ

Pietu1998 sayesinde 1 bayt kaydedildi

Bu, floor(n * len(string))döngüsel indeksleme kullanarak dizeden harfleri alır . Bunun her zaman verilen formüle eşdeğer olduğuna inanıyorum.

Test odası


1
Hayır plz bunu yakında benden almaz. xD
Addison Crump

@VoteToClose Cevabınızı hiç okumadım, izciler onur: PI, dize tekrarlarının izin verilmediğini bile fark etmedi, bu benim bu şekilde bulduğumdan daha kısaydı ...
FryAmTheEggman

1
İkincisine bile ihtiyacınız yok s. rangeböyle komik.
PurkkaKoodari

1
NOO! bir köşede ağlıyor Ah, oh iyi.
Addison Crump

6

JavaScript (ES6), 50 bayt

Düzenleme 2 fonksiyonun tanımı dahil etmek daha bayt f. @Manatwork'ün ucunu kullanarak 1 bayt daha az. Not: kullanarak ~gerekenden daha fazla yineleme var, ancak bu kod golf ve hatta 1 bayt sayımı

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

ÖLÇEK

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>


Tamam teşekkürler. Şimdiye kadar cevapların çoğunda sorun yoktu ve düzeltilmesi gerçekten çok kolay. Düzelttiğiniz için teşekkürler.
Rɪᴋᴇʀ

Küçük yazım hatası: n>0kodda n>1ve test durumunda.
manatwork

@manatwork teşekkürler. Her iki şekilde de çalışması gerekir
edc65

Ah. Aslında. Ama o zaman neden sadece ~n? (Gerçekten sadece bir soru. Sadece verilen test vakalarını denedim.)
manatwork

3
@ edc65 Çözümünüzde nerede ftanımlanıyor? Kayıp değil misin f=?
andlrc

4

Vitsy, 9 bayt

Sözcüğü bağımsız değişken olarak ve sayının STDIN ile çarpımını bekler.

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.

Çevrimiçi deneyin!


Sözüne sadık kalarak hızlı cevap verdin .
Rɪᴋᴇʀ

@RikerW Martin dışarı FGITBen beni.
Addison Crump

Neden Grab all string argument input.ve sonra Parse STDIN.tekrar yapıyorsun ?
Rɪᴋᴇʀ

@RikerW Çiftler olan bağımsız değişkenler otomatik olarak ayrıştırılır ve derhal yığına itilir. Değer verilenden daha fazla bayt sürer.
Addison Crump

Tamam. Bu şimdi daha mantıklı.
Rɪᴋᴇʀ

3

CJam, 10 bayt

l_,l~*,\f=

Dize, STDIN'in ilk satırında, ikincisinde yüzer olarak sağlanır.

Burada test edin.

açıklama

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 bayt

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

Burada deneyin!

Dizeyi ilk argüman olarak ve kayan noktayı ikinci olarak alan adsız bir lambda oluşturur. Tekrarlanan dizeyi döndürür.

Dize yineleme yerleşiklerine izin verilirse bu 46 olabilir :(


1
Çok üzücü. Böyle dize çarpma kuralları. Efekt için +1 A +.
Addison Crump

3

Ruby, 49 48 karakter

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

Örnek çalışma:

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 bayt

{([~] $^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, hem bir dizi tekrarlama operatörüne hem de xbir liste tekrarlama operatörüne sahiptir xx.

Kurallar dize yinelemesine izin vermediğinden, bunu tek bir öğe listesi gibi tekrarlıyoruz. Daha sonra liste bir araya getirilir ve bir alt dizesi döndürülür.

Kullanımı:

# 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}iki karakter kaydeder
raiph

2

osascript, 173 bayt

Oh günlerim, bu düşündüğümden daha kötü.

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

Döngüsel indekslemeyi kullanarak başka bir cevap olan dizenin değerini döndürür. Girişi bekler "string" "repetitions".


Oh my days, this is worse than I thought.Çok doğru, çok doğru.
Rɪᴋᴇʀ

Bir kerede birden fazla var komutu var mı? yani set x,y to a's items?
Rɪᴋᴇʀ

@RikerW Ben öyle düşünmüyorum. Varsa, ciddi şekilde kaçırıyorum.
Addison Crump

2

Haskell, 44 bayt

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

Kullanım örneği: "(will add more later)" # 0.3333-> "(will ".

Nasıl çalışır: cdizenin sonsuz kopyalarını birleştirir x. Yerleşik gibi davranır cycle. sum[1|a<-s]Haskell'in katı tip sistemiyle birlikte çalıştığı özel bir uzunluk işlevidir Double(yerleşik lengthgetiriler bir Intile çarpılamaz n). #alır floor (n * length(s))devirli dizeden karakterleri s.


2

PHP 5, 96 87

@Manatwork sayesinde 9 byte tasarruf edildi

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

Oldukça düz ileri döngü cevap.

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

Ne zaman bu hata bastırma yardım gerekir emin değilim, benim için @de olmadan çalışıyor gibi görünüyor :<?for($i=$z=0;$i++<floor(strlen($a=$argv[1])*$argv[2]);$z++)echo$a[$z]?:$a[$z=0];
manatwork

Ben davayı ekledi zaman çıktı yanlış render neden dava # 2 hakkında bir uyarı alıyordu. (CLI modunda çalışıyor)
Samsquanch

“PHP 5.3 veya üzeri, varsayılan değer E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED.” - error_reportingBu nedenle, çözümlerimizi varsayılan yapılandırmaya dayandırmayı ve bildirimleri ve diğer iyi alışkanlıkları önemsememeyi tercih ediyoruz. Örneğin $zve $i.
manatwork

Vaay havalı. Bilgi için teşekkürler!
Samsquanch

2

R, 59 bayt

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

Adsız bir işlev olarak. Bu, dizeyi bir satır vektörüne bölmek için charToRaw kullanır. Bu karakter char ve çıktıya dönüştürülmüş bir uzunluk l * içine doldurulur.
Ben strsplit kullanacaktım, ama daha uzun oldu.

Ölçek

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

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

Gerektirir: -n, -lve -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 >

Açıklama:

$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 (önişlemci makrosu), 71

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

Burada çok zor değil. Sadece karşılaştırmadan önce l*mbir atılır olduğundan emin olun .intj

Çevrimiçi deneyin.


1

Oracle SQL 11.2, 154 152 bayt

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;

Özyinelemeli yoldan gittim, başlatma seçimi ondalık bölüme dikkat ederek.

@MickyT sayesinde 2 bayt kaydedildi


WITH yantümcesinde ve son seçimden sonra boşlukları kaldırarak bir çift kaydedebilirsiniz.
MickyT

Başka tasarruf değiştirmek şeklinde olur FLOOR(FLOOR((:2-FLOOR(:2))*LENGTH(:1)))ileMOD(:2,1)*LENGTH(:1)
MickyT

Ve sonuncusu :), LPADyerine kullanabilirsinizSUBSTR
MickyT

1

Ciddi, 24 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

V*Elzp@zN

Temel olarak sadece

             z = input()
V*Elz        for N in range(evaluatedInput()*len(z)):    # flooring is automatic
     p@zN        print(z[N], end="")                     # modular indexing
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.