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


26

Міні-гольф з 9 отворами: Опис

  • 9 (здебільшого досить легких) викликів для гольфу з кодом різної складності
  • Штраф за використання однієї і тієї ж мови не один раз
  • Усі виклики щодо певної теми (ця тема: Маніпуляція текстом)
  • Введення та вихід можуть бути де завгодно розумними (наприклад, STDIN та STDOUT, читання з / запису у файл, аргумент функції та значення повернення тощо), але НЕ повинні бути жорстко кодовані в програмі
  • Сильно натхненний 9 викликом отворів та механікою тексту

Отвори

  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. Яєчня яйця листи на сніданок

    Візьміть рядок як вхідний.
    Виведіть рядок з усіма його скремблированими (порядок букв рандомізованим), за винятком їх першої та останньої літери.
    Для простоти припустімо, що вхідним записом буде список "word" s, пробіл розділений (тобто в @$&_():;" foo bar, @$&_():;"вважається "word.")
    Приклад: 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як вхідні дані.
    Виведіть перший nсимвол кожного слова в 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 ідентичний цьому .
daniero

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. Перл, 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
Doorknob

У мене складається враження, що всі функції повинні повертати рядок, тому для числа 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

EDIT : Завдяки нестабільності за поради.


Ви можете використовувати генераторні вирази для більшості з них, що заощадить вам купу символів. Також для 1. використовувати не потрібно int, оскільки булеви є їх підкласом, а для 7. all([...])можна скоротити доx.replace(' ','').isdigit()
Волатильність

Друга відповідь не буде префіксом першого рядка a.
daniero

1

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

Побої сприйняли одномовним покаранням. Більшість із них вирішила в Рубі просто, щоб закінчити їх якнайшвидше. Можна пізніше змінити деякі мови. Додано невеликий резюме / пояснення до кожної відповіді.

1: Пітон (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)

Текст якось розбирає; Безсоромно вкрадений дослівно в marinus :

''[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: Sed (87)

Друкує вхід, перетворений з (міні) розмітки в HTML:

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

9 Ruby 1.9+ (37)

Повертає рядок nth символів кожного першого слова в s, або r:

f=->s,n,r{s.split.map{|w|w[n]||r}*''}

Чи не буде чи ваш 8 вихід <b>test** **test2</b>для **test** **test2**?
Дверна ручка

@DoorknobofSnow так, це б;) Виправлено (sed не має не жадібного повторення).
daniero

Що б це дало **foo *bar* baz**?
Нестабільність

@ Нестабільність На жаль. Я не прочитав це питання належним чином, подумав, що не буде гніздування, але він сказав, що не існує недійсного введення. Я не впевнений, що зараз я потурбую це виправити.
daniero

Для першого -оператора коду рубіну працює з перерахувачем?
Сіва

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();(або що - то в цьому роді) , щоб отримати його роботу.
боббел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.