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.