Pomnóż ciąg przez liczbę!


34

Było to wyzwanie się jakiś czas temu o pomnożenie sznurki. Pokazało nam, jak możemy pomnożyć nie tylko liczby, ale także łańcuchy. Jednak nadal nie możemy poprawnie pomnożyć liczby przez ciąg. Nastąpił jedna próba , aby to zrobić, ale jest to oczywiście błędne. Musimy to naprawić!

Twoje zadanie:

Napisz funkcję lub program, który zwielokrotnia dwa wejścia, ciąg znaków i liczbę całkowitą. Aby (poprawnie) pomnożyć ciąg przez liczbę całkowitą, należy podzielić ciąg na znaki, powtórzyć każdy znak kilka razy równy liczbie całkowitej, a następnie ponownie skleić znaki. Jeśli liczba całkowita jest ujemna, używamy jej wartości bezwzględnej w pierwszym kroku, a następnie odwracamy ciąg. Jeśli wartością wejściową jest 0, nic nie wypisuje (cokolwiek pomnożone przez 0 nic nie znaczy).

Wkład:

Ciąg, który składa się wyłącznie z drukowalnych znaków ASCII i znaków nowej linii oraz liczby całkowitej (możliwej ujemnej).

Wydajność:

Ciąg pomnożony przez liczbę całkowitą.

Przykłady:

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

                               WWoorrlldd!!

Punktacja:

To jest , wygrywa najmniej bajtów!


4
Czy możemy założyć, że ciąg jest drukowalny tylko ASCII plus znaki nowej linii?
— mbomb007,

Czy możemy wypisać listę ciągów?
— całkowicie ludzki,

Częściowe rozwiązanie w siatkówce. Działa tylko dla dodatnich wartości liczb całkowitych. Prawdopodobnie nie zdążę go ukończyć, jeśli ktoś będzie chciał. tio.run/##K0otycxL/P8/…
— mbomb007 11.07.17

@ mbomb007, tak, przepraszam za tyle czasu na to.
— Gryphon - Przywróć Monikę

@ totalniehuman, nie możesz nie.
— Gryphon - Przywróć Monikę

Odpowiedzi:


31

Galaretka , 6 5 4 bajtów

²Ɠxm

Wypróbuj online!

Jak to działa

²Ɠ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
OK, teraz jestem pod wrażeniem. Chciałbym wyjaśnić ten szczególny cud w miniaturze.
— Gryphon - Przywróć Monikę

Pewnie. Jak tylko zrobiłem zestaw testowy i skończyłem grać w golfa.
— Dennis

4
OK, jeśli możesz to zmniejszyć, przestanę próbować zadać pytanie, które zajmie ci> 10 bajtów.
— Gryphon - Przywróć Monikę

13
Ok, to wszystko. Uczę się galaretki. Chcę też być w stanie robić magię.
— Gryphon - Przywróć Monikę

2
Wszyscy wiemy, jak dyskusja na temat łańcuchów
— galaretek

9

JavaScript (ES6), 63 bajty

Pobiera dane wejściowe w składni curry (s)(n).

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

Przypadki testowe


3
+1 za reduce!
— Neil,



6

05AB1E , 10 bajtów

S²Ä×J²0‹iR

Wypróbuj online!

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 spędzasz 30 minut próbując wymyślić coś, co udowodni @Riley, że ²0‹ito nie jest najlepsza droga i wymyślić dosłownie 0 alternatyw.
— Magic Octopus Urn

@MagicOctopusUrn Użyłem czegoś takiego jak ²0‹iwcześniej i zawsze myślę, że musi być coś lepszego.
— Riley,

Myślę, że próbowałem znaleźć alternatywę około 10 razy teraz ... marnując łącznie 3 godziny mojego życia. Ä.D)øJ¹0‹iRto najlepsze, co mogę zrobić bez kopiowania ciebie. Myślę, że twój jest zoptymalizowany.
— Magiczna Urna Ośmiornicy

Jeśli zależy Ci, Emigna stosowane è tutaj , choć nie mogę znaleźć sposób, aby zastosować go w tym scenariuszu. Jeśli tak, zaoszczędziłby maksymalnie 1 bajt.
— Magic Octopus Urn

SÂΛ@²Ä×J, za pomocą Î przycisku push 0, a wejście działa, jeśli zmienisz kolejność. Oszczędza 1 bajt! (Zastąpiłem także if, więc nie trzeba go zamykać)
— kalsowerus,

5

MATL , 9 bajtów

y|Y"w0<?P

Dane wejściowe to: liczba, a następnie ciąg.

Struny z nowej linii są wprowadzane przy użyciu char 10w następujący sposób: ['first line' 10 'second line'].

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważ dane wejściowe -3i'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

V , 29, 23, 18 , 17 bajtów

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

Wypróbuj online!

Hexdump:

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

Dzięki @ nmjcman101 za zapisanie 6 bajtów, co zachęciło mnie do zapisania kolejnych 5!

Oryginalna wersja była dość okropna, ale teraz jestem naprawdę dumny z tej odpowiedzi, ponieważ zaskakująco dobrze radzi sobie z liczbami ujemnymi. (V prawie nie obsługuje liczb i nie obsługuje liczb ujemnych)

Wyjaśnienie:

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

W tym momencie bufor wygląda następująco:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Ważne jest, aby nie wstawiać nowej linii i aby znajdował się na niej kursor.

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

Kilka bajtów dla Ciebie Wypróbuj online! Zawsze nienawidzę „Liczb ujemnych oznacza coś innego!” skrzynia krawędzi też. Jest to przypadek, w którym twoje 0specjalne przypadki w V są bardzo przydatne.
— nmjcman101

Przepraszamy za specjalne liczby ujemne. Wiele odpowiedzi udało się jednak włączyć do głównej odpowiedzi. Imponujące w tym V.
— Gryphon - Przywróć Monikę

@ nmjcman101 O rany, to takie oczywiste, że nie wiem, jak o tym nie pomyślałem. Dziękuję Ci!
— DJMcMayhem

@Gryphon Oh wiem. Wyzwanie jest w porządku, po prostu nie lubię własnego języka za to, że jestem taki zły w tym, w czym powinien być dobry. : P
— DJMcMayhem

5

R, 83 78 76 bajtów

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

Funkcja anonimowa.

Frederic zapisał 3 bajty, Giuseppe zapisał 2 4.

Wyjaśnienie:

     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

Testy:

> 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
Dobra robota ! Możesz zaoszczędzić kilka bajtów, pisząc rep(foo,,,3)lub rep(foo,e=3)(tej samej długości) ;-)
— Frédéric

@ Frédéric, pobiłeś mnie, chciałem powiedzieć to samo!
— Giuseppe,

1
tak, nie ma problemu! Zasadniczo chciałem pozbyć się aparatu ortodontycznego, więc musiałem się go pozbyć a=. Dlatego użyłem wartości ajako argumentu do funkcji odwrotnej, jeśli i<0poprzez warunkowe zwrócenie funkcji (dlatego potrzebowałem cudzysłowów). Ale musiałem również zastosować funkcję tożsamości dla i>=0sprawy, więc użyłem tego, (co jest wystarczająco blisko. (jest w rzeczywistości funkcją. R jest dziwny.
— Giuseppe,

1
tak przy okazji, dokumenty R dla Parena mówią, że (jest to semantycznie równoważne z tożsamościąfunction(x)x
— Giuseppe


4

05AB1E , 10 bajtów

0‹FR}ʒ¹Ä×?

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Wypróbuj online!

Właśnie tutaj, aby dać DJMcMayhem trochę konkurencji. ;)

Wyjaśnienie

Oto zmodyfikowana wersja wyjaśnień DJMcMayhem

#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 bajtów

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

Wypróbuj online!

Wyjaśnienie

        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-@>]przez 13 bajtów
— mile

Bardzo ładne @miles!
— Tikkanz

Nie ma problemu. Nie musisz także liczyć nawiasów używanych do wywoływania czasownika.
— mile

1
Również 13 bajtów:#~ ::(|.@#~|)
— FrownyFrog,

3

Dyalog APL, 15 bajtów

{⌽⍣(⍵<0)⊢⍺/⍨|⍵}

Ciąg jako lewy argument, liczba jako prawy argument.

Wypróbuj online!

W jaki sposób?

⍺/⍨ - powtórz ciąg

|⍵ - abs (liczba) razy

⌽⍣ - odwrócić, jeśli

(⍵<0) - liczba jest poniżej 0


Umm, byłoby miło, gdyby TIO jak zadziałało?
— Gryphon - Przywróć Monikę

@Gryphon i oto bajt ...
— Uriel

Tak, właśnie zdałem sobie z tego sprawę i pisałem mój komentarz, aby ci powiedzieć.
— Gryphon - Przywróć Monikę

3

MATLAB, 37 bajtów

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

Definiuje i anonimową funkcję z danymi wejściowymi s: ciąg i n: liczba.

Przykładowe przebiegi:

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

Wybór wymiaru do przewrócenia był o wiele lepszy niż bałagan, który napisałem 😛 +1. i zawsze zapominam, że repelemistnieje.
— Stewie Griffin,

@StewieGriffin Cóż, możesz to również uwzględnić w swojej odpowiedzi :-) (już +1). Myślę, że na razie nie ma go repelemw Octave
— Luis Mendo,

3

Brain-Flak (Haskell) , 202 192 bajty

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

Wypróbuj online!

Jest to prawdopodobnie najgorszy możliwy język, ale można to zrobić. Dzięki @Wheatwizard za udostępnienie interpretera Haskell, który umożliwia mieszane formaty wejściowe. Bez niego byłoby to około 150 bajtów dłużej.

Wyjaśnienie:

#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
{}

Możesz użyć mojego 52 bajtowego abs do zapisania 2 bajtów, możesz także użyć 50 bajtów -abów, które ci dałem i zwiększać zamiast zmniejszać, aby zapisać 6 bajtów.
— Wheat Wizard


3

Java (OpenJDK 8) , 99 98 89 87 85 bajtów

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

Wypróbuj online!

  • -2 bajty dzięki @Xanderhall
  • -2 bajty dzięki @Nevay

Pomysły, które nie działają (znacznie dłużej): odwróć ciąg wcześniej, użyj strumienia,
— Olivier Grégoire

1
Zaoszczędź 2 bajty zs[(n<0?-l-~i:i)/n]
— Xanderhall

@Xanderhall Thanks! Tak długo tego szukałem, a moje oczy krwawiły. Wiedziałem, że to możliwe, po prostu popsułem wszystko podczas jego wdrażania.
— Olivier Grégoire,

1
@ user902383 Tak, jest to obowiązkowe . Gdyby były opcjonalne, wiele rzeczy byłoby nieczytelnych. Ponadto moja funkcja nie jest „pojedynczą instrukcją”, ale pętlą for, która obejmuje kilka instrukcji.
— Olivier Grégoire,

1
Możesz zapisać 1 bajt, zwiększając iwarunek 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]);}. Kolejny bajt można zapisać, iterując od -l do 0 zamiast ( 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

Węgiel drzewny , 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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 bajtów

®pVaìr!+sVg

Wypróbuj online!

Wyjaśnienie

Domniemane wprowadzanie ciągu Ui liczby całkowitej V.

®pVaÃ

Map ( ®) każda litera U(niejawnie) do siebie powtórzona ( p) abs(V)( Va) razy.

¬r

Zamień ciąg znaków na tablicę znaków ( ¬) i zmniejsz ( r), które za pomocą ...

!+sVg

"!+".slice(sign(V))- zmniejsza się to za pomocą +→ a + blub !+→ b + a.
Dzięki @Arnauld za pomysł ograniczenia wstecz!


Wydaje mi się, że £gY*Vg)pVapowinno to doprowadzić do krótszego rozwiązania, ale mój mózg wyłączył się na wakacje, więc nie mogę tego zrozumieć. Możesz jednak być w stanie coś z tym zrobić.
— Shaggy

2

WendyScript , 46 bajtów

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

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

Wypróbuj online!

Objaśnienie (nie golf):

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 bajtów

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

Widziałem wersję Bena Perlina i zastanawiałem się, czy nie możesz być jeszcze krótszy, a także mieć pełny program; z pewnością atoi()i putchar()czy nie są drogie pod względem bajtów? Wygląda na to, że miałem rację!


2

Pyth, 13 11 bajtów

*sm*.aQdz._

Spróbuj!

-2 bajty dzięki @jacoblaw

wyjaśnienie

*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 

stare podejście, 13 bajtów

_W<Q0sm*.aQdz

Spróbuj!


możesz zaoszczędzić dwa bajty dzięki tej logice odwracania
— Jakub

2

Python 3 , 68 bajtów

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

Wypróbuj online!


Witam i witam na stronie! Niestety, ta odpowiedź jest obecnie nieprawidłowa, ponieważ nie obsługuje liczb ujemnych . Wyzwanie mówi:If the integer is negative, we use its absolute value in the first step, and then reverse the string.
— DJMcMayhem

Dzięki za naprawę! BTW, możesz usunąć dwa bajty, usuwając spacje po nawiasie)
— DJMcMayhem

Edytowane, dzięki za wkład
— Kavi

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

1

QBIC , 32 bajty

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

Wyjaśnienie

            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 bajtów

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


wkład

[„Hello World!”, 3]



1

C, 109 bajtów

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

Zaczynając od deklaracji funkcji, która pobiera liczbę całkowitą i ciąg znaków i generuje ciąg znaków (wydaje się, że pamięć nie jest wstępnie przydzielona i musi zostać utworzona), wydaje się, że bezpośrednie podejście jest krótsze niż wszelkie próby bycia tasakiem, które próbowałem .

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;

}


Wydaje się, że to nie działa na negatywne n.
— gastropner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.