Bir dizeyi bir sayı ile çarpın!


34

Orada bir meydan okuma bir süre önce yukarı dizeleri çarparak yaklaşık. Bize sadece sayıları değil aynı zamanda dizeleri nasıl çarpabileceğimizi gösterdi. Ancak, hala bir sayıyı bir dizge ile doğru şekilde çarpamıyoruz. Bunu yapmak için bir girişimde bulunuldu , ancak bu açıkça yanlıştır. Bunu düzeltmemiz gerek!

Senin görevin:

Bir dize ve bir tam sayı olan iki girişi çarpan bir fonksiyon veya program yazın. Bir dizgiyi bir tamsayıyla (uygun şekilde) çarpmak için, dizgiyi karakterlere böler, her karakteri tam sayıya eşit sayıda tekrarlar ve sonra karakterleri tekrar birbirine yapıştırırsınız. Tamsayı negatifse, mutlak değerini ilk adımda kullanırız ve sonra dizgiyi tersine çeviririz. Girdi 0 ise, hiçbir şey çıkmaz (0 ile çarpılan herhangi bir şey hiçbir şeye eşittir).

Giriş:

Yalnızca yazdırılabilir ASCII karakterleri ve yeni satırlardan oluşan bir dize ve bir tamsayı (olası negatif).

Çıktı:

Dize tamsayı ile çarpılır.

Örnekler:

Hello World!, 3            --> HHHeeellllllooo   WWWooorrrlllddd!!!
foo, 12                    --> ffffffffffffoooooooooooooooooooooooo
String, -3                 --> gggnnniiirrrtttSSS
This is a fun challenge, 0 --> 
Hello
World!, 2                  --> HHeelllloo

                               WWoorrlldd!!

puanlama:

Bu , en düşük bayt sayısı kazanıyor!


4
Dizenin yalnızca ASCII yazdırılabilir, artı yeni satırlar olduğunu varsayabilir miyiz?
mbomb007

Dizelerin bir listesini çıkarabilir miyiz?
totallyhuman

Retina'da kısmi çözüm. Sadece tamsayının pozitif değerleri için çalışır. Muhtemelen biri isterse bitirmek için zaman kazanmayacağım. tio.run/##K0otycxL/P8/…
mbomb007

@ mbomb007, evet, bunun için çok zaman ayırdığım için üzgünüm.
Gryphon - Monica

@tallyhuman, hayır, olmayabilir.
Gryphon - Monica,

Yanıtlar:


31

Jöle , 6 5 4 bayt

²Ɠxm

Çevrimiçi deneyin!

Nasıl çalışır

²Ɠxm  Main link. Argument: n (integer)

²     Yield n².
 Ɠ    Read and eval one line of input. This yields a string s.
  x   Repeat the characters of s in-place, each one n² times.
   m  Takes each |n|-th character of the result, starting with the first if n > 0, 
      the last if n < 0.

1
Tamam, şimdi gerçekten etkilendim. Minyatürdeki bu özel harikanın bir açıklamasını çok isterim.
Gryphon - Reinstate Monica

Emin. Bir test odası hazırladım ve golf oynadım.
Dennis,

4
Tamam, eğer bunu daha küçük yapabilirseniz, sizi> 10 byte götürecek bir soru sormaya çalışmaktan vazgeçeceğim.
Gryphon - Reinstate Monica

13
Tamam işte bu. Jelly'i öğreniyorum. Ben de sihir yapabilmek istiyorum.
Gryphon - Reinstate Monica

2
Biz Jelly zincirleri hakkında tartışma dağınıklık olmak biter nasıl tüm bilmek ...
Erik Outgolfer

9

JavaScript (ES6), 63 bayt

Körleme sözdiziminde girdi alır (s)(n).

s=>n=>[...s].reduce((s,c)=>n<0?c.repeat(-n)+s:s+c.repeat(n),'')

Test durumları


3
İçin +1 reduce!
Neil,



6

05AB1E , 10 bayt

S²Ä×J²0‹iR

Çevrimiçi deneyin!

S          # Split the string into characters
 ²Ä×       # Repeat each character abs(integer) times
    J      # Join into a string
     ²0‹i  # If the integer is less than 0...
         R #   Reverse the string

TFW, @Riley'ye ²0‹ien iyi rota olmadığını kanıtlayacak ve kelimenin tam anlamıyla 0 alternatif bulmaya çalıştığı bir şeyler bulmaya çalışırken 30 dakikanızı harcarsınız .
Magic Octopus Urn

@ MagicOctopusUrn Daha önce olduğu gibi bir şey kullandım ²0‹ive her zaman daha iyi bir şey olması gerektiğini düşünüyorum.
Riley,

Sanırım şu an yaklaşık 10 kez alternatif bulmaya çalıştım ... hayatımın toplam 3 saatini harcayarak. Ä.D)øJ¹0‹iRSeni kopyalamadan yapabileceğimin en iyisi, seninki senin optimize edilmiş olduğunu düşünüyorum.
Magic Octopus Urn

Eğer umursarsanız, Emigna è burada kullandı , ancak bu senaryoda uygulamanın bir yolunu bulamıyorum. Eğer öyleyse, maksimum 1 byte tasarruf edersiniz.
Magic Octopus Urn

SÂΛ@²Ä×J, Î0 düğmesine basıldığında ve girişi değiştirdiğinizde girdi çalışır. 1 byte kaydeder! (Aynı zamanda yerini aldı, bu yüzden kapatılmasına gerek yok)
kalsowerus

5

MATL , 9 bayt

y|Y"w0<?P

Girişler: sayı, sonra dize.

Yeni satır ile Yaylı kömürü kullanılarak girilmektedir 10aşağıdaki gibi ['first line' 10 'second line'].

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Girdileri düşünün -3ve 'String'.

y      % Implicitly take two inputs. Duplicate from below
       % STACK: -3, 'String', -3
|      % Absolute value
       % STACK: -3, 'String', 3
Y"     % Run-length decoding
       % STACK: -3, 'SSStttrrriiinnnggg'
w      % Swap
       % STACK: 'SSStttrrriiinnnggg', -3
0<     % Less than 0?
       % STACK: 'SSStttrrriiinnnggg', 1
?      % If so
  P    %   Flip
       %   STACK: 'gggnnniiirrrtttSSS'
       % End (implicit). Display (implicit)

5

Haskell , 41 36 bayt

f n|n<0=reverse.f(-n)|1<3=(<*[1..n])

Çevrimiçi deneyin!

Örnek kullanım: f (-3) "abc"verim "cccbbbaaa".

Düzenleme: xnor sayesinde -5 bayt!


1
Orada (<*[1..n])için ((<$[1..n])=<<).
xnor

@xnor Teşekkürler! Bunu bilmek güzel.
Laikoni

5

V , 29, 23, 18 , 17 bayt

æ_ñÀuñÓ./&ò
ÀäëÍî

Çevrimiçi deneyin!

HexDump:

00000000: e65f f1c0 75f1 d32e 2f26 f20a c0e4 ebcd  ._..u.../&......
00000010: ee                                       .

6 byte'ı kaydettiği için @ nmjcman101'e teşekkürler, bu da 5 tane daha kurtarmamı sağladı!

Orijinal revizyon oldukça kötüydü, ama şimdi bu cevabımla gerçekten gurur duyuyorum çünkü negatif rakamları şaşırtıcı derecede iyi kullanıyor. (V, sayısal bir desteğin yanında negatif sayılar için desteğin yanında değildir)

Açıklama:

æ_          " Reverse the input
  ñ  ñ      " In a macro:
   À        "   Run the arg input. If it's positive it'll give a count. If it's negative
            "   running the '-' will cause V to go up a line which will fail since we're
            "   on the first line, which will break out of this macro
    u       "   (if arg is positive) Undo the last command (un-reverse the line)
      Ó./&ò " Put every character on it's own line

Bu noktada, arabellek şuna benzer:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Sondaki yeni satır değil ve imlecin üzerinde olması önemlidir.

À           " Run arg again. If it's negative, we will move up a line, and then give the 
            " absolute value of the count. If it's positive (or 0) it'll just give the
            " count directly (staying on the last line)
 ä          " Duplicate... (count times)
  ë         "   This column. 
   Íî       " Remove all newlines.

Sizin için bir kaç bayt Çevrimiçi deneyin! Her zaman "Olumsuz sayılar başka bir şey ifade ediyor!" kenar da çok. Bu, 0V'deki özel vakalarınızın çok kullanışlı olduğu bir durum .
nmjcman101

Özel negatif sayılar için özür dilerim. Bununla birlikte, birçok cevap bunu ana cevaplarına dahil etmeyi başardı. Bu V etkileyici olsa.
Gryphon - Reinstate Monica

@ nmjcman101 Oh vay, bu çok açık, nasıl düşünmedim bilmiyorum. Teşekkür ederim!
DJMcMayhem

@Gryphon Oh biliyorum. Mesele gayet iyi, ben sadece iyi olması gereken şeyde o kadar kötü olduğum için kendi dilimi beğenmedim. : P
DJMcMayhem

5

R, 83 78 76 bayt

function(s,i)cat('if'(i<0,rev,`(`)(rep(el(strsplit(s,'')),e=abs(i))),sep='')

Anonim işlev

Frederic 3 bayt, Giuseppe 2 4 kurtardı .

Açıklama:

     el(strsplit(s,''))                      # split string into list characters
 rep(                  ,e=abs(i)))           # repeat each character abs(i) times


    'if'(i<0,rev,   ){...}                 # if i>0, reverse character list
                 `(`                       # otherwise leave it alone: `(` is the identity function
cat(                      ,sep='')         # print the result

Testler:

> f('Hello World!', 3 )
HHHeeellllllooo   WWWooorrrlllddd!!!
> f('foo', 12)
ffffffffffffoooooooooooooooooooooooo
> f('String', -3)
gggnnniiirrrtttSSS
> f('This is a fun challenge', 0)
> f('Hello
+ World!', 2)
HHeelllloo

WWoorrlldd!!

2
Aferin ! Birkaç byte yazarak rep(foo,,,3)ya da rep(foo,e=3)(aynı uzunlukta) ;-)
Frédéric

@ Frédéric beni yendin, ben de aynı şeyi söyleyecektim!
Giuseppe

1
Evet sorun değil! Temel olarak, diş tellerinden kurtulmak istedim, o yüzden kurtulmam gerekiyordu a=. Bu nedenle, koşullu işlevi döndürerek (bu nedenle geri tırnaklara ihtiyacım vardı) aters işlevine argüman değeri kullandım i<0. Ancak, i>=0durum için kimlik işlevini de uygulamam gerekiyordu , bu yüzden (yeterince yakın kullandım . (aslında bir fonksiyondur. R çok garip.
Giuseppe

1
btw, Paren için R doktorları, kimliğe( anlamsal olarak eşdeğer olduğunu söylüyorfunction(x)x
Giuseppe,


4

05AB1E , 10 bayt

0‹FR}ʒ¹Ä×?

Çevrimiçi deneyin!

açıklama

0‹F         # input_1 < 0 times do:
   R        # reverse input_2
    }       # end loop
     ʒ      # filter
      ¹Ä×   # repeat current char abs(input_1) times
         ?  # print without newline


4

Brain-Flak (BrainHack) , 154 152 bayt

([(({})(<()>))]<>)<>{({}()<([{}]()<([{}])>)<>({}<>)<>>)<>}{}<>{}<>({}<([][()]){{}({<({}<(({}<>)<>)>())>[()]}<{}{}>)([][()])}{}{}<>>){{}{({}<>)<>}(<>)}{}

Çevrimiçi deneyin!

Sadece DJMcMayhem'e biraz rekabet vermek için buradayım. ;)

açıklama

İşte DJMcMayhem'in açıklamasının değiştirilmiş bir versiyonu.

#Compute the sign and negative absolute value 
([(({})<(())>)]<>)<>{({}()<([{}]()<([{}])>)<>({}<>)<>>)<>}{}<>{}<>

#Keep track of the sign
({}<

    #For each char in the input string:
    ([][()])
    {
        {}

        #Push n copies to the alternate stack
        ({<({}<(({}<>)<>)>())>[()]}<{}{}>)

        #Endwhile
        ([][()])
    }{}{}<>

#Push the sign back on
>)

#If so...
{{}

    #Reverse the whole stack
    {({}<>)<>}

    #And toggle over, ending the loop
    (<>)
}

#Pop the counter off
{}

4

J , 19 15 13 bayt

(#~|)A.~0-@>]

Çevrimiçi deneyin!

açıklama

        0-@>]      NB. first or last index depending on sign of right arg
     A.~           NB. get first or last Anagram of left arg
(#~|)              NB. copy left arg, absolute-value-of-right-arg times

2
(#~|)A.~0-@>]13 bayt için
mil

Çok güzel miller!
Tikkanz

Sorun değil. Ayrıca fiili çağırmak için kullanılan parantezleri saymanıza gerek yoktur.
mil,

1
Ayrıca 13 byte:#~ ::(|.@#~|)
FrownyFrog


3

MATLAB, 37 bayt

@(s,n)flip(repelem(s,abs(n)),(n<0)+1)

Bu, input'lu anonim fonksiyonu tanımlar ve tanımlar s: string and n: number.

Örnek çalışır:

>> @(s,n)flip(repelem(s,abs(n)),(n<0)+1)
ans = 
    @(s,n)flip(repelem(s,abs(n)),(n<0)+1)

>> f = ans;

>> f('String', 3)
ans =
SSStttrrriiinnnggg

>> f('String', -3)
ans =
gggnnniiirrrtttSSS

>> f('String', 0)
ans =
   Empty matrix: 1-by-0

Hangi boyutun çevrileceğini seçmek, yazdığım karışıklıktan daha iyiydi 😛 +1. ve her zaman repelemvar olduğunu unuturum .
Stewie Griffin,

@StewieGriffin Peki, bunu cevabınıza da dahil edebilirsiniz :-) (zaten +1). Sanırım repelemşimdilik Octave'da yok
Luis Mendo

3

Brain-Flak (Haskell) , 202 192 bayt

(({})<(([({})]<>)){({}()<([{}])<>({}<>)<>>)<>}{}([{}]<><{}>)([][()]){{}({<({}<(({}<>)<>)>[()])>()}<{}{}>)([][()])}{}{}<>>)([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}{({}<>)<>}(<>)}{}

Çevrimiçi deneyin!

Muhtemelen bunu yapmak için mümkün olan en kötü dil, ancak bitti. Karma giriş biçimlerini sağlayan Haskell tercümanını sağlamak için @Wheatwizard sayesinde. Bu onsuz yaklaşık 150 bayt olacaktır.

Açıklama:

#Keep track of the first input (n)
(({})<

    #Push abs(n) (thanks WheatWizard!)
    (([({})]<>)){({}()<([{}])<>({}<>)<>>)<>}{}([{}]<><{}>)

    #For each char in the input string:
    ([][()])
    {
        {}

        #Push n copies to the alternate stack
        ({<({}<(({}<>)<>)>[()])>()}<{}{}>)

        #Endwhile
        ([][()])
    }{}{}<>

#Push the original n back on
>)

#Push n >= 0
([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

#If so...
{{}

    #Reverse the whole stack
    {({}<>)<>}

    #And toggle over, ending the loop
    (<>)
}

#Pop the counter off
{}

2 bayt kurtarmak için 52 baytlık abs'imi kullanabilirsin, sana verdiğim 50 bayt -ab'ı da kullanabilirsin, 6 bayttan tasarruf etmek yerine azalmak yerine artan.
Buğday Sihirbazı,


3

Java (OpenJDK 8) , 99 98 89 87 85 bayt

s->n->{for(int i=s.length*(n<0?n:-n),r=n<0?0:~i;i++<0;)System.out.print(s[(i+r)/n]);}

Çevrimiçi deneyin!

  • @Xanderhall sayesinde -2 bayt
  • @Nevay sayesinde -2 bayt

İşe yaramayan fikirler (daha uzun): daha önce ipi ters çevirin, bir akış kullanın,
Olivier Grégoire

1
2 bayt ile kaydets[(n<0?-l-~i:i)/n]
Xanderhall 12:17

@ Xanderhall Teşekkürler! Uzun zamandır onu arıyorum, gözlerim kanıyor. Bunun mümkün olduğunu biliyordum, uygularken her şeyi mahvettim.
Olivier Grégoire

1
@ user902383 Evet, zorunludur . İsteğe bağlı olsaydı, birçok şey okunamaz olurdu. Ayrıca, benim işlevim "tek bir deyim" değil, birkaç deyimi içeren bir döngü için.
Olivier Grégoire

1
iKoşulu artırarak 1 bayt tasarruf edebilirsiniz s->n->{for(int l=s.length*(n<0?-n:n),i=0;i++<l;)System.out.print(s[(n<0?i-l:i-1)/n]);}. Başka bir bayt bunun yerine -l'den 0'a yinelenerek kaydedilebilir ( s->n->{for(int i=s.length*(n<0?n:-n),r=n<0?0:~i;i++<0;)System.out.print(s[(i+r)/n]);}).
Nevay,



2

Kömür , 16 bayt

Fθ¿‹η0F±Iη←ιFIηι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Fθ              For each character in the input string
  ¿‹η0          If the input number is less than zero
      F±Iη      Repeat the negation of the input number times
          ←ι    Print the character leftwards (i.e. reversed)
      FIη       Otherwise repeat the input number times
         ι      Print the character


2

Japt, 12 bytes

®pVaìr!+sVg

Try it online!

Explanation

Implicit input of string U and integer V.

®pVaÃ

Map (®) each letter of U (implicitly) to itself repeated (p) abs(V) (Va) times.

¬r

Turn the string into an array of chars (¬) and reduce (r) that with...

!+sVg

"!+".slice(sign(V)) - this either reduces with +a + b, or with !+b + a.
Thanks @Arnauld for the backwards-reduce idea!


I feel like £gY*Vg)pVa should lead to a shorter solution but my brain has shut down for the holidays so I can't quite figure it out. You may be able to do something with it, though.
Shaggy

2

WendyScript, 46 bytes

<<f=>(s,x){<<n=""#i:s#j:0->x?x>0n+=i:n=i+n/>n}

f("Hello World", -2) // returns ddllrrooWW  oolllleeHH

Try it online!

Explanation (Ungolfed):

let f => (s, x) {
  let n = ""
  for i : s
    for j : 0->x
      if x > 0 n += i
      else n = i + n
  ret n
}

2

C89 bytes

main(int c,char**v){for(;*v[1];v[1]++)for(c=atoi(v[2]+(*v[2]=='-'));c--;)putchar(*v[1]);}

I saw Ben Perlin's version and wondered if you couldn't be shorter still and also have a full program; surely, atoi() and putchar() aren't that expensive in terms of bytes? Seems I was right!


2

Pyth, 13 11 bytes

*sm*.aQdz._

Try it!

-2 bytes thanks to @jacoblaw

explanation

*sm*.aQdz._   
  m     z     # map onto the input string (lambda var: d)
   *.aQd      # repeat the char d as often as the absolute value of the input number 
 s            # sum the list of strings into a single string
*        ._Q   # Multiply with the sign of the implicit input value: reverse for negative Q 

old approach, 13 bytes

_W<Q0sm*.aQdz

Try it!


you can save two bytes with this reversal logic
jacoblaw

2

Python 3, 68 bytes

h=lambda s,n:h(s[::-1],-n)if n<0 else s[0]*n+h(s[1:],n)if s else s*n

Try it online!


Hello, and welcome to the site! Unfortunately, this answer is invalid right now, since it doesn't support Negative numbers. The challenge says: If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem

Thanks for fixing it! BTW, you could take two bytes off by removing the spaces after parenthesis )
DJMcMayhem

Edited, thanks for the contribution
Kavi

n<0 else => n<0else
Zacharý

1

QBIC, 32 bytes

g=sgn(c)[_l;||[:*g|?_sA,b*g,1|';

Explanation

            Takes inputs A$ ('Hello'), and c (-3) from the cmd line
g=sgn(c)    Save the sign of c          -1
[_l;||      FOR each char in A$
[:*g|       FOR the number of repetitions wanted    (ie: -3 * -1)
            Note that : reads a number from the cmd line, and c is the first 
            available variable to save it in after a and b got used as FOR counters.
            Also note that a negative value times the sign becomes positive.
?_s         PRINT a substring
  A         of A$
 ,b*g       startng at char n, where n is the first FOR loop counter times the sign
                That means that when c is negative, so is this. A negative starting index
                on Substring instructs QBIC to take from the right.
 ,1|        taking 1 char.
';          This bit injects a literal ; in the output QBasic, to suppress newlines om PRINT

1

Mathematica, 89 bytes

(T=Table;t=""<>T[s[[i]]~T~Abs@#2,{i,Length[s=Characters@#]}];If[#2>0,t,StringReverse@t])&


input

["Hello World!", 3]



1

C, 109 bytes

char *f(int n, char *s){char *o=calloc(n,strlen(s)+1),*t=o;while(*s){for(int i=n;i--;)*t++=*s;s++;}return o;}

Starting with a function declaration that takes an int and a string and produces a string (it seems implied that memory is not preallocated and must be created) it seems that the straight-forward approach is shorter than any attempts at being cleaver that I had tried.

char *f(int n, char *s){
  char *o=calloc(n, strlen(s)+1),
    *t=o;

  while (*s) {
    for(int i=n; i--; )
      *t++=*s;
    s++;
  }

 return o;

}


This does not seem to work for negative n.
gastropner
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.