Восторженно русифицировать строку


57

Многие из вас, возможно, когда-то общались с людьми из России через Интернет, и некоторые из вас, возможно, заметили немного странный способ выражения себя.

например удали игру нуб)))

где )))добавлены акценты для предыдущего утверждения, я работаю над теорией, согласно которой отношение )«s» к остальной части строки прямо пропорционально количеству подразумеваемого акцента, однако мне часто бывает трудно вычислить отношение на лету, так как я также пытаюсь справиться с целым рядом злоупотреблений, поэтому я хотел бы, чтобы кратчайший код помог мне вычислить, какой должна быть полученная строка, для значения энтузиазма от 0 до 500%, учитывая исходный не вызывающая энтузиазма строка, это очень поможет моему исследованию, так как мне не придется печатать громоздкие сценарии каждый раз, когда я хочу проверить свою гипотезу.

Итак, задача:

написать полную программу или функцию, которая при условии двух аргументов, строки неизвестной длины и числа в целочисленном формате (от 0 до 500) или в десятичном формате (от 0 до 5 с 2 точками точности) будет

  • Возвращение / отобразить исходную строку с буквой ряда )«с
  • число будет вычислено как отношение числа ввода к длине строки.
  • поэтому, если было указано число 200 или 2,00, к 200% строки следует добавить суффикс )«s».
  • количество скобок, округленное до десятичного числа, не имеет значения.
  • Сценарий необходим для поддержки печатных символов ASCII.
  • должен поддерживать только один формат ввода номера, на ваш выбор.

Примеры:

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

Пример кода (PowerShell) (с десятичным вводом):

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

Это поэтому выигрывает самый короткий код!


2
Я в замешательстве, русские действительно используют )акцент как !? Это какая-то проблема с кодировкой?
Капитан Мэн

2
@CaptainMan Я полагаю, что это больше похоже на смайлики, чем на !s, но они печатают их как есть, это не очень распространено, но это довольно знаково.
Colsw

30
@CaptainMan Нет )смайликов :). Насколько я знаю, он очень распространен среди молодежи.
Талекс

4
)это не акцент, это просто смайлик. Насколько я знаю, печатать на :русской раскладке сложнее , поэтому улыбаются без глаз.
Джурис

18
@ Юрис, :на русском языке так же сложно писать (ЙЦУКЕН), как ^на QWERTY. Но на самом деле )это сокращенная версия :). Нажимать и удерживать клавишу Shift-0 намного проще, чем многократно чередовать клавиши.
Руслан

Ответы:


16

Желе , 7 байт

ȮL×Ċ”)x

Попробуйте онлайн!

Использует десятичный формат.

Как?

Ȯ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 Я только что заметил, что это напечатает требуемую строку как полную программу, но что спецификация заявляет «возврат» - это нормально?
Джонатан Аллан


не беспокойтесь - это мой первый вызов, поэтому я пропустил несколько вещей, которые я уточнил в вопросе, чтобы быть более понятным - спасибо за вопрос.
Colsw


16

Обыкновенный Лисп, 59 52 50

Скобки? Я нахожусь в.

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

подробности

(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

Строка управления форматом

  • ~a : довольно печатный аргумент (здесь данная строка)
  • ~v@{...~}: блок итерации, ограниченный V итерацией, где V берется в качестве аргумента, а именно (* ...)выражения. Предполагается, что итерация выполняет итерацию по списку, но когда вы добавляете @модификатор, список является оставшимся списком аргументов функции форматирования. В итерированном списке должен быть хотя бы один элемент (в противном случае мы завершаем работу, игнорируя V). Вот почему есть дополнительный аргумент для формата (0).

Поскольку ни один элемент в списке не используется форматом, цикл бесконечен, но, к счастью, он также ограничен символом V, то есть количеством печатаемых скобок.


Edit: спасибо Michael Vehrs за указание на то, что нет необходимости округлять числовой аргумент (вопрос позволяет урезать / округлить, как мы хотим, поэтому здесь работает стандартное поведение).


12
(()) / 10 недостаточно скобок
BgrWorker

Кто считал этот язык хорошей идеей?
downrep_nation

Схема formatпринимает десятичный аргумент для v. Может, Common Lisp тоже?
Майкл Vehrs

@MichaelVehrs Действительно, большое спасибо.
coredump

1
@coredump На самом деле, я должен был сказать "Guile's formataccept ...", поскольку стандартная схема formatне поддерживает ~r; и Guile formatследует примеру Common Lisp.
Майкл Вёрс

9

JavaScript ES6, 38 31 30 байт

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

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

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


1
Хорошо, я думаю, что это самое короткое из возможных. Вы можете сохранить байт с помощью каррирования: s=>n=>s+')'.repeat(s.length*n)(тогда он будет называться как f("hi!")(4.99))
ETHproductions


7

05AB1E , 9 8 байт

g*ï')×¹ì

Попробуйте онлайн!

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

Работает как для целых, так и для десятичных чисел, порядок аргументов: f(String, Double)


-1 в новой версии 05AB1E , где ïнеявно выполняется ×с аргументом float.
Кевин Круйссен

А вот 7-байтовый код, который работает как на устаревшем, так и на современном 05AB1E: sg * F ') « .
Grimmy


7

Pyth, 8 байт

*\)s*lpz

Онлайн тест! Сначала берется коэффициент возбуждения, а затем струна, которая должна вызывать восторг.

Объяснение:

      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 байта

Анонимная функция, которая принимает строковые aи десятичные числа n, печатает вывод на стандартный вывод.

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

4

Pyth, 9 байт

*s*lpzE")

Принимает две строки ввода: строка и соотношение (десятичное число).

Попробуйте это на pyth.herokuapp.com

объяснение

Aобозначает первый аргумент функции, Bее второй аргумент.

*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 байта

Принимает десятичный ввод.

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


3

CJam , 9 байт

l_,ld*')*

Попробуйте онлайн!

Введите строку в первой строке, коэффициент выделения в диапазоне от 0 до 5 во второй.

объяснение

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 байт

yn*:"41h

Это решение использует десятичную форму второго ввода

Попробуйте онлайн!

объяснение

        % 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

сБ ~ 17 байт

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

Разъяснение:

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

Скобки закрываются автоматически

Вот вывод компилятора, если вам интересно:

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

Эта версия компилятора была написана 27.01.2017 в 23:12, что могло произойти через несколько минут после публикации этого вопроса. Итак, вот версия, которая работает на самой старой версии компилятора, написанной на час раньше: iS$,N?S$;')'*(N*l(S$))(22 байта)


3

PostgreSQL, 102 байта

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

подробности

Использует целочисленный формат ввода.

Это просто добавляет правую строку ввода с паренсом к целевой длине.

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

Вызывается с

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


2

Groovy, 27 байт

Простое решение

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

Тестовая программа:

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

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


2

Clojure, 40 байт

Довольно скучное решение:

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

Просто уменьшает strфункцию в списке закрывающих скобок со строкой в ​​качестве начального параметра.

Смотрите это онлайн: https://ideone.com/5jEgWS

Не очень скучное решение (64 байта):

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

Преобразует входной строки в символ (чтобы избавиться от кавычек) и повторно применяет функцию listна нем генерации бесконечной последовательности , как это: (a (a) ((a)) (((a))) ... ). Принимает nthэлемент преобразует его в строку и заменяет все открывающие скобки ничем.

Смотрите это онлайн: https://ideone.com/C8JmaU


1
#(.replaceAll(str(nth(iterate list %)(*(count %)%2)))"[(\"]""")На 1 байт меньше (yay). Я хотел сделать комп, но не могу получить его ниже 70 байт.
Майкл М

Вы можете изменить , ")"чтобы \)сохранить байты.
clismique

2

SimpleTemplate, 92 байта

Принимает строку в качестве первого параметра и «коэффициент» в качестве второго.
Соотношение между 0 и 5, с двумя десятичными знаками.

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

Как видите, это неоптимально.
Число 2 {echo}может быть уменьшено до 1.
Из-за ошибки в компиляторе этот код не может быть уменьшен намного дальше.


Ungolfed:

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

Если бы не было ошибки, код выглядел бы так: 86 байт:

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

2

C # Интерактивный, 77 67 байт

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

C # интерактив сладок.


1
Если вы используете C # Interactive, который в противном случае должен быть в заголовке, в C # вы должны включить using System;или полностью указать Math. Кроме того, не уверен, что вы можете сделать это в интерактивном режиме, но вы можете скомпилировать в a Func<string, Func<int, string>>для сохранения байтов, т. s=>p=>s+new...
Е.

1
Кроме того, вам, вероятно, не нужен вызов, чтобы Math.Roundпросто приводить к intвызову FloorFloorCeiling
must,

1

SmileBASIC, 29 байт

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

Поскольку 3*4.99= 14.97, только 14или 15будет приемлемым в качестве ответов, 29-байтовая версия должна работать нормально, хотя, извините!
colsw

1

Gol> <> (Golfish), 17 байтов

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

Попробуй это здесь .

Верхняя строка читает символы ( i) до тех пор, пока не найдет новую строку (ASCII 10, a), а затем идет вниз ( v).

Затем мы отбрасываем один символ (перевод строки) ~, нажимаем длину стека ( l), читаем число с плавающей точкой (I , увеличиваем ), умножаем два и многократно ( R) нажимаем символ ")" столько раз. Наконец, переверните stack ( r), выведите его и halt ( H).


1

PHP, 50 байт

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

принимает в качестве аргументов командной строки строку и десятичное число; отрубы прокладки. Беги с -r;

сломать

<?=                     // 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

Рубин, 25 байт

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

Я использую лямбды . Тестовая программа будет выглядеть примерно так:

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

1

Clojure, 68 байт

Анонимная функция, которая принимает десятичный ввод.

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

Буквально первая программа на Лиспе, которую я когда-либо написал! Мне уже весело.


Добро пожаловать в мир Lisp! : P В Clojure вы можете использовать сжатую форму анонимных функций #(...)и избавиться от них print(поскольку возврат функции должен быть приемлемым). Вы можете изменить reduceна applyдля strфункции, и вы можете изменить ")"на \), что делает то же самое. Итак, окончательный код должен быть:#(str %(apply str(repeat(*(count %)%2)\))))) .
clismique

Кроме того, текущее состояние вашего кода не работает, (#(...) "codegolf" 125)необходимо добавить 125 процентов длины «codegolf» вместо 125- кратной длины «codegolf». Таким образом, фиксированная программа будет:, #(str %(apply str(repeat(*(count %)%2 1/100)\))))что составляет 49 байтов.
clismique

1

C ++ 14, 43 байта

Как и неназванная лямбда, изменяющая входные данные, предполагается, что sон похож на std::string(имеет .append(int,char)и предполагает pтип с плавающей запятой:

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

Использование:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.