Мини-гольф на 9 лунок: манипуляция с текстом [закрыто]

26

Мини-гольф на 9 лунок: Описание

  • 9 (в основном довольно простых) кодов игры в гольф различной сложности
  • Штрафы за использование одного и того же языка более одного раза
  • Все проблемы по конкретной теме (эта тема: манипулирование текстом)
  • Ввод и вывод могут быть в любом месте (например, STDIN и STDOUT, чтение из файла / запись в файл, аргумент функции и возвращаемое значение и т. Д.), Но НЕ должны быть жестко закодированы в программе
  • Сильно вдохновлен 9 Hole Challenge и Text Mechanic

Отверстия

  1. Код-гольф сумка

    Возьмите две строки в качестве ввода.
    Выведите количество символов первой строки, игнорируя при этом любой символ во второй строке.
    Пример: f("foobarbaz", "ao")=>5
  2. Предварительный текст для игры в гольф

    Возьмите две строки в качестве ввода.
    Выведите первую строку с каждой строкой с префиксом второй.
    Пример: f("foo\nbar\nbaz", "a")=>"a foo\na bar\na baz"
  3. Война вкладок против пробелов

    Возьмите строку s, число nи логическое значение b(указано, как вы хотите) в качестве ввода.
    Если bэто правда, вывод sс каждой вкладкой, преобразованной в nпробелы.
    В противном случае выведите sвсе nпробелы, преобразованные во вкладки.
    Пример: f("if (x) {\n\tdoStuff();\n}", 4, true)=> "if (x) {\n[sp][sp][sp][sp]doStuff();\n}"( [sp]означает пробел)
  4. Столпы гольфа

    Возьмите строку s, число nи другое число в mкачестве ввода.
    Вывод sв столбцах nстрок по каждому и mсимволов в столбце.
    Также есть отступы одного пробела между столбцами.
    Пример: f("this is some placeholder text, foo bar baz...", 3, 5)=>

    this  aceho  foo 
    is so lder  bar b
    me pl text, az...
    
  5. Дружеские письма

    Возьмите строку sи число в nкачестве ввода.
    Выведите наиболее распространенную группу nбукв в s.
    Если есть связь, выведите любую или все из них.
    Пример: f("abcdeabcfghiabc", 3)=>"abc"
  6. Яичница- болтунья на завтрак

    Возьмите строку в качестве ввода.
    Выведите строку со всеми зашифрованными словами (рандомизированный порядок букв), кроме их первых и последних букв.
    Для простоты предположим, что входными данными будет список слов, разделенных пробелами (то есть in @$&_():;" foo bar, @$&_():;"считается словом).
    Пример: f("this is a sentence that will be scrambled")=>"tihs is a stcneene that wlil be sclamrbed"
  7. ASCIIfy

    Возьмите строку в качестве ввода.
    Если строка содержит только цифры и пробелы, замените числа соответствующими символами ASCII (удалив пробелы).
    Иначе, делайте наоборот (символы в числа).
    Пример: f("ASCIIfy challenge")=> "65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101"
    Пример 2: f("65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101")=>"ASCIIfy challenge"
  8. Мини-мини-уценка трансформации

    Возьмите строку в качестве ввода.
    Выведите строку, преобразованную с помощью мини-уценки, как это используется в комментариях к Stack Exchange.
    Это даже мини-эр версии: вам нужно только обрабатывать **bold**, *italics*и `code`.
    Вам не нужно обрабатывать неправильное вложение, как **foo *bar** baz*. Также предположим, что когда вы видите разделитель ( *или `), это всегда будет означать форматирование (то есть te**st**ing=> te<b>st</b>ingи foo* bar *baz=> foo<i> bar </i>baz).
    Пример: f("**foo** *bar **baz*** `qux`")=>"<b>foo</b> <i>bar <b>baz</b></i> <code>qux</code>"
  9. Только лучшие персонажи

    Возьмите строку s, число nи строку в rкачестве ввода.
    Выведите nth-й символ каждого слова в s. (0-индексированный, слова разделены пробелом).
    Если длина слова меньше чем n, используйте rвместо этого слова.
    Пример: f("this is a test sentence foo bar baz", 2, "-")=>"i--snorz"

счет

Ваша оценка является суммой количества символов ваших программ. Для каждого повторного языка умножьте на 110%. Например, если у вас есть три решения Ruby, а общее количество символов всех ваших решений равно 1000, ваш счет равен 1000 * 1.1 * 1.1 = 1210. Если у вас есть нецелое число, округлите его в меньшую сторону.

Удачи!

Дверная ручка
источник
1
Задача 8 затрагивает один из наименее четко определенных аспектов уценки, и тот, который труднее всего сделать действительно хорошо. Требуется четкое объяснение того, как справляться с неясностями, и хороший набор тестов. Смотрите Emphasis.text из набора mdtest.
Питер Тейлор
@PeterTaylor Ну, _не имеет значения, так как я решил не включать его. Я отредактировал, чтобы уточнить некоторые другие.
Дверная ручка
Как насчет **foo***bar**baz*?
Питер Тейлор
1
Задача 6 идентична этой .
Даниеро
4
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он состоит из нескольких частей с недостаточным взаимодействием между частями
pppery

Ответы:

12

Оценка: 382 * 1,1 2 = 462

Языки, склонные к изменению.

1. APL, 8 4

Спасибо @marinus за 4 бритья.

f←⍴~

Вызывается со строками в качестве левого и правого аргументов, например.

      'foobarbaz' f 'ao'
5

2. Рубин, 35 31

Спасибо @DoorknobofSnow за то, что вы сбрили 4 символа.

f=->s,r{s.gsub(/(?<=^)/,r+' ')}

3. Питон, 48

f=lambda s,n,b:s.replace(*['\t',' '*n][::2*b-1])

4. GolfScript, 20

{@//zip{' '*}%n*}:f;

Предполагается, что аргументы находятся в стеке. Тест онлайн

5. J, 50

f=:({~[:(i.>./)+/"1@=@(}.~0-1{$))@|:@([$~],1+[:$[)

Вызывается со строкой в ​​качестве левого аргумента и числом в качестве правого, например.

   'abcdeabcfghiabc' f 3
abc

6. Руби, 61

f=->s{s.gsub(/(?<!^| )[^ ]+(?!$| )/){[*$&.chars].shuffle*''}}

7. GolfScript, 39 35 34

{[.10,' '*-{{}/]' '*}{~]''+}if}:f;

Опять же, предполагается, что аргумент находится в стеке. Тест онлайн

8. Perl, 98

sub f{$_=@_[0];s!\*\*(.+?)\*\*!<b>$1</b>!g;s!\*(.+?)\*!<i>$1</i>!g;s!`(.+?)`!<code>$1</code>!g;$_}

9. Хаскелл, 36

f s n r=[(x++cycle r)!!n|x<-words s]
летучесть
источник
Большой! Вы можете сохранить некоторые символы на Ruby, используя proc ( f=->s,r{...}) вместо функции. Я отказываюсь поднять голос до тех пор, пока оно не будет завершено, хотя: P
дверная ручка
@ DoorknobofSnow ах, спасибо. Не очень опытный с Руби :)
Волатильность
Ура, ты первый, кто закончит :-D +1
дверная ручка
У меня складывается впечатление, что все функции должны возвращать строку, поэтому для числа 4 я думаю, что вам придется использовать еще один символ.
Питер Тейлор
@PeterTaylor исправлено :)
Волатильность
4

Питон - 697 × 1,1 9 ≈ 1644

Ну и дела, я уверен, что люблю лямбды.

Примечание : 3 и 5 были бесстыдно скопированы из ответа Волатильности , так как я не мог найти лучшую альтернативу. Кроме того, это было сделано просто для удовольствия .

f=lambda a,b:sum([x not in b for x in a])        # 1, 41 chars
f=lambda a,b:b+' '+a.replace('\n','\n'+b+' ')    # 2, 43 chars
f=lambda s,n,b:s.replace(*['\t',' '*n][::b*2-1]) # 3, 47 chars
f=lambda s,n,m:'\n'.join([' '.join([s[x:x+m]for x in range(y*m,len(s),m*n)])for y in range(n)])
                                                 # 4, 94 chars
f=lambda s,n:max([s[x:x+n]for x in range(len(s)+1-n)],key=s.count)
                                                 # 5, 66 chars
import random;f=lambda s:' '.join([''.join(sorted(y,key=lambda*x:random.random()))for y in s.split()])
                                                 # 6, 102 chars
f=lambda s:s.replace(' ','').isdigit()and ''.join(map(chr,map(int,s.split())))or ' '.join(map(str,map(ord,s)))
                                                 # 7, 110 chars
import re;f=lambda s:re.sub('`(.*?)`','<code>\\1</code>',re.sub(r'\*(.*?)\*','<i>\\1</i>',re.sub(r'\*\*(.*?)\*\*','<b>\\1</b>',s)))
                                                 # 8, 128 chars
f=lambda s,n,r:''.join([len(x)>n and x[n]or r for x in s.split()])
                                                 # 9, 66 chars

РЕДАКТИРОВАТЬ : Спасибо волатильности за советы.

Oberon
источник
Вы можете использовать выражения генератора для большинства из них, что сэкономит вам кучу символов. Кроме того, для 1. нет необходимости использовать int, так как логические значения являются их подклассом, а для 7. all([...])может быть сокращено доx.replace(' ','').isdigit()
Volatility
Второй ответ не будет префикс первой строки a.
Даньеро
1

Оценка 513 * 1,1 5 = 826 

Взял довольно-таки избиение тем же языковым штрафом. Решил большинство из них в Ruby, чтобы закончить их как можно быстрее. Может изменить некоторые языки позже. Добавлен небольшой обзор / объяснение каждого ответа.

1: Python (46)

f=lambda a,b:len([x for x in a if not x in b])

Во-первых, более короткий ответ в Ruby 2.0 (30), который дает больший штраф и более высокий общий балл:

p (gets.chars-gets.chars).size

2: Ruby 1,9+ (37)

Возвращает каждую строку с sпрефиксом t:

f=->s,t{s.split(?\n).map{|x|t+x}*?\n}

3: Ruby 1,9+ (48)

Возвращает sс заменой табуляции nпробелами или наоборот, в зависимости от b:

f=->s,n,b{r=[" "*n,?\t];b||r.reverse!;s.gsub *r}

4: Ruby 1,9+ (95)

Кто-нибудь застрелит меня.

f=->s,n,m{[*s.chars.each_slice(m).map{|w|w*''}.each_slice(s.size/m/n)].transpose.map{|w|w*' '}}

5: Ruby 1,9+ (58)

Возвращает наиболее распространенный набор nсимволов в s:

f=->s,n{(a=s.chars.each_slice(n)).max_by{|v|a.count v}*''}

6: J (47)

Как-то скремблирует текст; Бесстыдно похищенный дословно от Маринуса :

''[1!:2&4('\w(\w+)\w';,1)({~?~@#)rxapply 1!:1[3

7: Рубин (57 + 1)

Печатает ввод ASCIIfied или de-ASCIIfied. Беги с -pпереключателем.

~/\d/?gsub(/\d+\s*/){$&.to_i.chr}:gsub(/./){"#{$&.ord} "}

8: Сед (87)

Печатает ввод, преобразованный из (мини) уценки в HTML:

s:\*\*([^*]+)\*\*:<b>\1</b>:g;
s:\*([^*]+)\*:<i>\1</i>:g;
s:`([^`]+)`:<code>\1</code>:g

9 Рубин 1.9+ (37)

Возвращает строку символов nth каждого первого слова в s, или r:

f=->s,n,r{s.split.map{|w|w[n]||r}*''}
daniero
источник
Не ваш 8 выход <b>test** **test2</b>для **test** **test2**?
Дверная ручка
@DoorknobofSnow, да, будет;) Исправлено (у sed нет жадного повторения).
Даньеро
Что это даст **foo *bar* baz**?
Волатильность
@ Volatility Ой. Я не прочитал вопрос правильно, думал, что не будет никакого вложения, но он сказал, что недопустимого вложения. Я не уверен, что я буду пытаться исправить это прямо сейчас.
Даньеро
Для 1-го рубинового кода -оператор работает с перечислителем?
Шива
1

Работа в процессе

1. Ява - 66

int f(String s,String b){for(char c:b)s=s.replace(b,"");return s;}

2. Ява - 64

String f(String i,String r){return i.replaceAll("(?m)^",r+" ");}

3. Питон - 58

def f(s,n,b):t=" "*n;a=t,'\t';print s.replace(a[b],a[b^1])

4. Питон - 84

def f(s,n,m):
 a=['']*n;c=0
 while s:a[c%n]+=s[:m]+" ";s=s[m:];c+=1
 for i in a:print i

5.

6.

7. Befunge 98 - 9

&,5j3.~@#

8.

9.

Джастин
источник
На первом отверстии должно быть for(char c:b.toCharArray())и replace(c+"","");и return s.length();(или что-то в этом роде), чтобы оно заработало.
Боббел