Entuzjastycznie rusyfikuj ciąg


57

Wielu z was mogło w pewnym momencie wchodzić w interakcje z ludźmi z Rosji w Internecie, a pewna ich część zauważyła nieco dziwną metodę wyrażania siebie.

na przykład удали игру нуб)))

tam, gdzie )))zostały dodane w celu podkreślenia poprzedniego oświadczenia, pracowałem nad teorią, że stosunek )„s” do reszty ciągu jest wprost proporcjonalny do wielkości domniemanego nacisku, jednak często trudno mi obliczyć stosunek w locie, ponieważ próbuję również poradzić sobie z mnóstwem nadużyć, dlatego chciałbym, aby możliwie najkrótszy kod pomógł mi obliczyć, jaki powinien być wynikowy łańcuch, dla wartości entuzjazmu od 0 do 500%, biorąc pod uwagę oryginał , nie entuzjastyczny ciąg znaków, to bardzo pomoże moim badaniom, ponieważ nie będę musiał pisać nieporęcznych skryptów za każdym razem, gdy chcę przetestować moją hipotezę.

Wyzwanie:

napisz pełny program lub funkcję, która, pod warunkiem dwóch argumentów, ciągu o nieznanej długości i liczby, w formacie liczb całkowitych (od 0 do 500) lub w formacie dziesiętnym (od 0 do 5, z 2 punktami dokładności) będzie

  • powrót / wyświetlić oryginalny łańcuch, przyrostek liczby )„s
  • liczba zostanie obliczona jako stosunek liczby wejściowej do długości łańcucha.
  • więc jeśli podano liczbę 200 lub 2,00, 200% ciągu musi być przyrostek jako )„s”
  • liczba nawiasów zaokrąglonych do miejsc dziesiętnych nie ma znaczenia.
  • Skrypt jest wymagany do obsługi znaków ASCII do wydruku.
  • musi obsługiwać tylko jeden wybrany format liczb wejściowych.

Przykłady:

"codegolf" 125      = codegolf))))))))))
"codegolf" 75       = codegolf))))))
"noob team omg" 0.5 = noob team omg))))))
"hi!" 4.99          = hi!)))))))))))))))

Przykładowy kod (PowerShell) (z wprowadzeniem dziesiętnym):

Function Get-RussianString ([string]$InputStr,[decimal]$Ratio){
    $StrLen = $InputStr.Length
    $SuffixCount = $StrLen * $Ratio
    $Suffix = [string]::New(")",$SuffixCount)
    return $InputStr + $Suffix
}

Get-RussianString "codegolf" 0.5
codegolf))))

To jest więc wygrywa najkrótszy kod!


2
Jestem zdezorientowany, czy Rosjanie naprawdę używają )nacisku jak !? Czy to jakiś problem z kodowaniem?
Captain Man,

2
@CaptainMan Wierzę, że to bardziej jak buźki niż !s, ale piszą je tak, jak są, nie jest to zbyt powszechne, ale jest dość kultowe.
colsw

30
@CaptainMan No )to zmniejszona liczba emotikonów :). O ile mi wiadomo, używa się go bardzo często wśród młodych ludzi.
talex

4
)to nie nacisk, to po prostu buźka. O ile mi wiadomo, trudniej jest pisać w :rosyjskim układzie klawiatury, dlatego uśmiechają się bez oczu.
Džuris

18
@Juris tak trudno jest pisać :na rosyjskim układzie (ЙЦУКЕН), jak ^na QWERTY. Ale rzeczywiście )jest to zmniejszona wersja :). O wiele łatwiej jest nacisnąć i przytrzymać Shift-0 niż wielokrotnie zmieniać klawisze.
Ruslan

Odpowiedzi:


16

Galaretka , 7 bajtów

ȮL×Ċ”)x

Wypróbuj online!

Używa formatu dziesiętnego.

W jaki sposób?

ȮL×Ċ”)x - Main link: string, decimal
Ȯ       - print string
 L      - length(string)
  ×     - multiply by the decimal
   Ċ    - ceiling (since rounding method is flexible)
    ”)  - a ')' character
      x - repeated that many times
        - implicit print

@ConnorLSW Właśnie zauważyłem, że to wypisze wymagany ciąg jako pełny program, ale że specyfikacja mówi „return” - czy to jest OK?
Jonathan Allan


nie martw się - to moje pierwsze wyzwanie, więc brakuje mi kilku rzeczy, zaktualizowałem to w pytaniu, aby było bardziej jasne - dziękuję za pytanie.
colsw


16

Common Lisp, 59 52 50

Zdanie wtrącone? Jestem w.

(lambda(s n)(format()"~a~v@{)~}"s(*(length s)n)0))

Detale

(lambda(s n)               ; two arguments (string and ratio)
  (format ()               ; format as string
          "~a~v@{)~}"      ; control string (see below)
          s                ; first argument (string)
          (* (length s) n) ; second argument (number of parens)
          0))              ; one more element, the value does not matter

Formatuj ciąg kontrolny

  • ~a : ładny argument wydruku (tutaj podany ciąg)
  • ~v@{...~}: blok iteracyjny, ograniczony do iteracji V, gdzie V jest traktowane jako argument, a mianowicie (* ...)wyrażenie. Iteracja ma powtarzać się po liście, ale po dodaniu @modyfikatora lista jest pozostałą listą argumentów funkcji formatującej. Musi istnieć co najmniej jeden element na liście iterowanej (w przeciwnym razie wyjdziemy, pomijając V). Dlatego istnieje dodatkowy argument do sformatowania (0).

Ponieważ format nie wykorzystuje żadnego elementu na liście, pętla jest nieskończona, ale na szczęście jest również ograniczona przez V, czyli liczbę nawiasów do wydrukowania.


Edycja: podziękowania dla Michaela Vehrsa za wskazanie, że nie ma potrzeby zaokrąglania argumentu liczbowego (pytanie pozwala obciąć / zaokrąglić w dowolny sposób, więc domyślne zachowanie działa tutaj).


12
(()) / 10 za mało nawiasów
BgrWorker

Kto pomyślał, że ten język to dobry pomysł?
downrep_nation

Schemat formatprzyjmuje argument dziesiętny do v. Może również Common Lisp?
Michael Vehrs

@MichaelVehrs Rzeczywiście, wielkie dzięki.
coredump

1
@coredump Właściwie powinienem był powiedzieć „Guile formatakceptuje ...”, ponieważ standardowy schemat formatnie obsługuje ~r; a Guile formatpodąża za przykładem Common Lisp.
Michael Vehrs

9

JavaScript ES6, 38 31 30 bajtów

s=>n=>s+')'.repeat(s.length*n)

f=s=>n=>s+')'.repeat(s.length*n)

console.log(f("hi!")(4.99))


1
Fajnie, myślę, że to najkrótszy możliwy. Możesz zaoszczędzić bajt poprzez curry: s=>n=>s+')'.repeat(s.length*n)(to by się wtedy nazywało jak f("hi!")(4.99))
ETHproductions


7

05AB1E , 9 8 bajtów

g*ï')×¹ì

Wypróbuj online!

g*       # Length, multiplied by emphasis.
  ï')×   # Covnerted to an integer, push that many parenthesis.
      ¹ì # Prepend original string.

Działa dla liczb całkowitych i dziesiętnych, porządek argumentów: f(String, Double)


-1 w nowej wersji 05AB1E , gdzie ïodbywa się to domyślnie dla ×argumentu zmiennoprzecinkowego.
Kevin Cruijssen

A oto 7-bajtowy, który działa zarówno na starszym, jak i nowoczesnym 05AB1E: sg * F ') « .
Grimmy


7

Pyth, 8 bajtów

*\)s*lpz

Test online! Najpierw bierze stosunek podniecenia, a następnie ciąg, który ma być zachwycony.

Wyjaśnienie:

      pz  print out the enthused string
     l    ... and get its length
    *...Q multiply that by the ratio
   s      floor to get an integer, let's call this S
 \)       single-character string ")"
* ")" S   multiply that integer by the string, which gives a string of )s of length S.
          implicitly print that string of S )s.


5

R, 62 46 42 bajtów

Anonimowa funkcja, która pobiera ciągi adziesiętne n, wypisuje dane wyjściowe na standardowe wyjście.

pryr::f(cat(a,rep(")",n*nchar(a)),sep=""))

4

Pyth, 9 bajtów

*s*lpzE")

Pobiera dwa wiersze wejścia: ciąg znaków i stosunek (dziesiętny).

Wypróbuj na pyth.herokuapp.com

Wyjaśnienie

Aoznacza pierwszy argument funkcji, Bjej drugi argument.

*s*lpzE")
    pz     # print the input string
   lAA     # take the length of the printed string
      E    # read the next line of input (the emphasis ratio)
  *AAAB    # multiply the length by the ratio
 sAAAAA    # floor the result
*AAAAAA")  # repeat ")" n times
           # implicit print

4

TI-Basic, 33 bajty

Pobiera dane dziesiętne.

Prompt Str1,A
")
For(I,0,9
Ans+Ans
End
Str1+sub(Ans,1,AI


3

CJam , 9 bajtów

l_,ld*')*

Wypróbuj online!

Łańcuch wejściowy w pierwszym wierszu, współczynnik nacisku w zakresie od 0 do 5 w drugim wierszu.

Wyjaśnienie

l    e# Read input string.
_,   e# Duplicate, get length.
ld   e# Read emphasis ratio.
*    e# Multiply by length.
')*  e# Get that many parentheses.

3

MATL, 11 10 8 bajtów

yn*:"41h

To rozwiązanie wykorzystuje postać dziesiętną drugiego wejścia

Wypróbuj online!

Wyjaśnienie

        % Implicitly grab first input as a string
        % Implicitly grab the second input as a number
y       % Make a copy of the first input
n       % Compute the length of the string
*       % Multiply the decimal by the length to determine the # of )'s (N)
:       % Create the array [1...N]
"       % For each element in this array
  41    % Push 41 to the stack (ACSII for ")")
  h     % Horizontally concatenate this with the current string
        % Implicit end of for loop and display

3

sB ~, 17 bajtów

i\,N?\;')'*(N*l(\

Wyjaśniono:

i\,N    input a string and a number
?\;     print the string
')'*    also print ) multiplied by...
(N*l(\  the number times the string length.

Nawiasy są zamykane automatycznie

Oto dane wyjściowe kompilatora, jeśli jesteś zainteresowany:

 INPUT  S$ ,N? S$ ;")"*(N* LEN(  S$ ))

Ta wersja kompilatora została napisana 27.01.2017 o 11:12, co mogło potrwać kilka minut po opublikowaniu tego pytania. Oto wersja, która działa na najstarszej wersji kompilatora, napisana godzinę wcześniej: iS$,N?S$;')'*(N*l(S$))(22 bajty)


3

PostgreSQL, 102 bajty

create function q(text,int)returns text as $$select rpad($1,(100+$2)*length($1)/100,')')$$language sql

Detale

Używa formatu wejściowego liczby całkowitej.

To po prostu dopasowuje łańcuch wejściowy za pomocą parens do docelowej długości.

create function q(text,int)
returns text as $$
    select rpad($1,             -- Pad the string input
        (100 + $2) *            -- to 100 + int input % ...
        length($1) / 100,       -- ...of the input string
        ')')                    -- with ) characters
$$ language sql

Zadzwoniłem z

select q('codegolf', 125), q('codegolf', 75);
select q('noob team omg', 50), q('hi!', 499);


2

Groovy, 27 bajtów

Proste rozwiązanie

{s,r->s+')'*(s.length()*r)}

Program testowy:

def f = {s,r->s+')'*(s.length()*r)}

println f("hi!", 4.99)
println f("noob team omg", 0.5)


2

Clojure, 40 bajtów

Dość nudne rozwiązanie:

#(reduce str %(repeat(*(count %)%2)")"))

Po prostu redukuje strfunkcję na liście zamykających nawiasów z łańcuchem jako parametrem początkowym.

Zobacz online: https://ideone.com/5jEgWS

Niezbyt nudne rozwiązanie (64 bajty):

#(.replace(str(nth(iterate list(symbol %))(*(count %)%2)))"(""")

Konwertuje ciąg wejściowy do symbolu (aby pozbyć cudzysłowów) i wielokrotnie stosuje funkcję listna nim generować nieskończoną sekwencję takiego: (a (a) ((a)) (((a))) ... ). Bierze nthelement konwertuje go na ciąg znaków i zastępuje wszystkie otwierające nawiasy niczym.

Zobacz online: https://ideone.com/C8JmaU


1
#(.replaceAll(str(nth(iterate list %)(*(count %)%2)))"[(\"]""")1 bajt mniej (yay). Chciałem zrobić komp, ale nie mogę uzyskać go poniżej 70 bajtów.
Michael M

Możesz zmienić ")"na, \)aby zapisać bajt.
clismique

2

SimpleTemplate, 92 bajty

Bierze ciąg jako pierwszy parametr, a „stosunek” jako drugi.
Stosunek wynosi od 0 do 5, z 2 miejscami po przecinku.

{@echoargv.0}{@callstrlen intoL argv.0}{@set*Y argv.1,L}{@callstr_repeat intoO")",Y}{@echoO}

Jak widać, nie jest optymalny.
Tam 2 {echo}można zmniejszyć do 1.
Z powodu błędu w kompilatorze tego kodu nie można znacznie zmniejszyć.


Nie golfowany:

{@echo argv.0}
{@call strlen into length argv.0}
{@set* ratio argv.1, length}
{@call str_repeat into parenthesis ")", ratio}
{@echo parenthesis}

Gdyby nie istniał żaden błąd, kod wyglądałby następująco: 86 bajtów:

{@callstrlen intoL argv.0}{@set*Y argv.1,L}{@callstr_repeat intoO")",Y}{@echoargv.0,O}

2

C # Interactive, 77 67 bajtów

string r(string s,int p)=>s+new string(')',(int)(s.Length*p/100d));

C # Interactive jest słodki.


1
Jeśli używasz C # Interactive, który w przeciwnym razie musi znajdować się w nagłówku, w C # należy dołączyć using System;lub w pełni się zakwalifikować Math. Również nie jestem pewien, czy można to zrobić interaktywnie, ale można skompilować do a, Func<string, Func<int, string>>aby zapisać bajty, tj.s=>p=>s+new...
TheLethalCoder 31.01.17

1
Prawdopodobnie nie potrzebujesz wezwania, aby Math.Roundpo prostu rzucić intFloorFloorCeiling
okiem na

1

SmileBASIC, 29 bajtów

INPUT S$,N?S$;")"*(LEN(S$)*N)

ponieważ 3*4.99= 14.97, tylko 14lub 15byłyby akceptowalne jako odpowiedzi, wersja 29 bajtów powinna jednak działać dobrze, przepraszam!
colsw

1

Gol> <> (Golfish), 17 bajtów

i:a=?v
R*Il~/Hr)`

Wypróbuj tutaj .

Górny wiersz odczytuje znaki ( i), dopóki nie znajdzie nowej linii (ASCII 10, a), a następnie przechodzi w dół ( v).

Następnie odrzucamy jeden znak (nowy wiersz) za pomocą ~, przesuwamy długość stosu ( l), czytamy liczbę zmiennoprzecinkową ( I), mnożymy dwa i wielokrotnie ( R) wciskamy znak „)” tyle razy. Na koniec odwróć stos ( r), wyślij go i zatrzymaj ( H).


1

PHP, 50 bajtów

<?=str_pad($s=$argv[1],strlen($s)*++$argv[2],")");

przyjmuje łańcuch i liczbę dziesiętną jako argumenty wiersza poleceń; tnie wyściółkę. Uruchom z -r;

awaria

<?=                     // print ...
str_pad(                    // pad
    $s=$argv[1],            // string=argument 1
    strlen($s)*++$argv[2],  // to string length*(1+argument 2) 
    ")"                     // using ")" as padding string
);

1

Rubin, 25 bajtów

->(s,n){s+')'*(s.size*n)}

Używam lambda . Program testowy mógłby wyglądać następująco:

f=->(s,n){s+')'*(s.size*n)}
f.("codegolf", 1.5)        # => "codegolf))))))))))))"
f.("hi!", 4.99)            # => "hi!))))))))))))))"

1

Clojure, 68 bajtów

Anonimowa funkcja, która akceptuje wprowadzanie dziesiętne.

(fn [s n] (print (str s (reduce str (repeat (* n (count s)) ")")))))

Dosłownie pierwszy program Lisp, jaki kiedykolwiek napisałem! Już się dobrze bawię.


Witamy w świecie Lisp! : P W Clojure możesz użyć skondensowanej formy anonimowych funkcji #(...)i możesz się ich pozbyć print(ponieważ zwroty funkcji powinny być dopuszczalne). Możesz zmienić reducena applydla strfunkcji i możesz zmienić ")"na \), który robi to samo. Tak więc, ostateczny kod powinien być: #(str %(apply str(repeat(*(count %)%2)\))))).
clismique

Ponadto obecny stan kodu nie działa, (#(...) "codegolf" 125)należy dodać 125 procent długości „codegolf” zamiast 125 razy więcej niż „codegolf”. Tak więc ustalony program to:, #(str %(apply str(repeat(*(count %)%2 1/100)\))))który ma 49 bajtów.
clismique

1

C ++ 14, 43 bajty

Ponieważ nienazwana lambda modyfikuje dane wejściowe, założenie sjest podobne do std::string(ma .append(int,char)i zakłada, pże jest typu zmiennoprzecinkowego:

[](auto&s,auto p){s.append(s.size()*p,41);}

Stosowanie:

#include<string>
#include<iostream>

auto f=
[](auto&s,auto p){s.append(s.size()*p,41);}
;


int main() {
 std::string s = "abcdefghijk";
 f(s,0.75);
 std::cout << s << std::endl;
}

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.