Sân golf mini 9 lỗ: Thao tác văn bản [đã đóng]


26

Sân golf mini 9 lỗ: Mô tả

  • 9 (hầu hết khá dễ) các thử thách chơi gôn với độ khó khác nhau
  • Hình phạt cho việc sử dụng cùng một ngôn ngữ nhiều lần
  • Tất cả các thách thức về một chủ đề cụ thể (chủ đề này: Thao tác văn bản)
  • Đầu vào và đầu ra có thể ở bất cứ đâu hợp lý (ví dụ STDIN và STDOUT, đọc từ / ghi vào tệp, đối số hàm và giá trị trả về, v.v.) nhưng KHÔNG được mã hóa vào chương trình
  • Lấy cảm hứng mạnh mẽ từ Thử thách 9 lỗCơ chế văn bản

Lỗ

  1. Mã túi golf

    Lấy hai chuỗi làm đầu vào.
    Xuất số ký tự của chuỗi thứ nhất, trong khi bỏ qua mọi sự xuất hiện của bất kỳ ký tự nào trong chuỗi thứ hai.
    Ví dụ: f("foobarbaz", "ao")=>5
  2. Một văn bản trước cho golf

    Lấy hai chuỗi làm đầu vào.
    Xuất chuỗi đầu tiên, với mỗi dòng có tiền tố thứ hai.
    Ví dụ: f("foo\nbar\nbaz", "a")=>"a foo\na bar\na baz"
  3. Cuộc chiến giữa các tab và không gian

    Lấy một chuỗi s, một số nvà một boolean b(được chỉ định theo cách bạn muốn) làm đầu vào.
    Nếu blà đúng, đầu ra svới mỗi tab được chuyển đổi thành ndấu cách.
    Khác, xuất ra svới mọi nkhông gian được chuyển đổi thành các tab.
    Ví dụ: f("if (x) {\n\tdoStuff();\n}", 4, true)=> "if (x) {\n[sp][sp][sp][sp]doStuff();\n}"( [sp]có nghĩa là không gian)
  4. Trụ cột của golf

    Lấy một chuỗi s, một số nvà một số khác mlàm đầu vào.
    Đầu ra strong các cột của nmỗi dòng và mký tự trên mỗi cột.
    Cũng có phần đệm của một khoảng trống giữa các cột.
    Ví dụ: f("this is some placeholder text, foo bar baz...", 3, 5)=>

    this  aceho  foo 
    is so lder  bar b
    me pl text, az...
    
  5. Thư thân thiện

    Lấy một chuỗi svà một số nlàm đầu vào.
    Xuất ra nhóm nchữ phổ biến nhất trong s.
    Nếu có sự ràng buộc, hãy xuất bất kỳ hoặc tất cả chúng.
    Ví dụ: f("abcdeabcfghiabc", 3)=>"abc"
  6. Scrambled trứng chữ cho bữa ăn sáng

    Lấy một chuỗi làm đầu vào.
    Xuất chuỗi với tất cả các từ của nó được xáo trộn (thứ tự chữ ngẫu nhiên) ngoại trừ chữ cái đầu tiên và chữ cái cuối cùng của chúng.
    Để đơn giản, giả sử rằng đầu vào sẽ là một danh sách "từ", khoảng cách được phân tách (nghĩa là trong @$&_():;" foo bar, @$&_():;"được coi là "từ.")
    Ví dụ: f("this is a sentence that will be scrambled")=>"tihs is a stcneene that wlil be sclamrbed"
  7. ASCIIfy

    Lấy một chuỗi làm đầu vào.
    Nếu chuỗi chỉ chứa số và khoảng trắng, thì thay thế số bằng ký tự ASCII tương ứng của chúng (xóa khoảng trắng).
    Khác, làm ngược lại (ký tự cho số).
    Ví dụ: f("ASCIIfy challenge")=> "65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101"
    Ví dụ 2: f("65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101")=>"ASCIIfy challenge"
  8. Biến đổi mini-markdown

    Lấy một chuỗi làm đầu vào.
    Xuất chuỗi được chuyển đổi với đánh dấu nhỏ, như được sử dụng trong các nhận xét về Stack Exchange.
    Đây là một thậm chí phiên bản mini-er: bạn chỉ cần để xử lý **bold**, *italics*`code`.
    Bạn không cần xử lý lồng không hợp lệ, như thế nào **foo *bar** baz*. Cũng giả sử rằng khi bạn nhìn thấy một dấu phân cách ( *hoặc `), nó sẽ luôn có nghĩa là định dạng (tức là te**st**ing=> te<b>st</b>ingfoo* bar *baz=> foo<i> bar </i>baz).
    Ví dụ: f("**foo** *bar **baz*** `qux`")=>"<b>foo</b> <i>bar <b>baz</b></i> <code>qux</code>"
  9. Chỉ những nhân vật tốt nhất

    Lấy một chuỗi s, số nvà chuỗi rlàm đầu vào.
    Xuất nký tự thứ của mỗi từ trong s. (0 chỉ mục, các từ được phân tách bằng dấu cách).
    Nếu độ dài của từ nhỏ hơn n, rthay vào đó hãy sử dụng từ đó.
    Ví dụ: f("this is a test sentence foo bar baz", 2, "-")=>"i--snorz"

Chấm điểm

Điểm của bạn là tổng số ký tự của các chương trình của bạn. Đối với mỗi ngôn ngữ lặp lại, nhân với 110%. Ví dụ: nếu bạn có ba giải pháp Ruby và tổng số ký tự của tất cả các giải pháp của bạn là 1000, điểm của bạn là 1000 * 1.1 * 1.1 = 1210. Làm tròn xuống nếu bạn có điểm không nguyên.

Chúc may mắn!


1
Thử thách 8 chạm vào một trong những khía cạnh ít được chỉ định nhất của Markdown và là khía cạnh khó thực hiện nhất. Nó cần một lời giải thích rõ ràng về cách xử lý sự mơ hồ và một bộ kiểm tra tốt. Xem Emphasis.text từ bộ mdtest.
Peter Taylor

@PeterTaylor Vâng, _không vấn đề gì vì tôi đã chỉ định không bao gồm nó. Tôi đã chỉnh sửa để làm rõ một số người khác.
tay nắm cửa

Thế còn **foo***bar**baz* ?
Peter Taylor

1
Thử thách 6 giống hệt với thử thách này .
daniero

4
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì đây là một thách thức đa phần với sự tương tác không đủ giữa các phần
pppery

Câu trả lời:


12

Điểm: 382 * 1.1 2 = 462

Ngôn ngữ dễ bị thay đổi.

1. APL, 8 4

Cảm ơn @marinus đã cạo 4 ký tự.

f←⍴~

Được gọi với các chuỗi như các đối số trái và phải, ví dụ.

      'foobarbaz' f 'ao'
5

2. Ruby, 35 31

Cảm ơn @DoorknobofSnow đã cạo 4 ký tự.

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

3. Con trăn, 48

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

4. GolfScript, 20

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

Giả sử rằng các đối số là trên ngăn xếp. Kiểm tra trực tuyến

5. J, 50

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

Được gọi với chuỗi là đối số bên trái và số là bên phải, ví dụ.

   'abcdeabcfghiabc' f 3
abc

6. Ruby, 61

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

7. GolfScript, 39 35 34

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

Một lần nữa, giả sử đối số là trên ngăn xếp. Kiểm tra trực tuyến

8. Perl, 98

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

9. Haskell, 36

f s n r=[(x++cycle r)!!n|x<-words s]

Tuyệt quá! Bạn có thể lưu một số ký tự trên Ruby bằng cách sử dụng một hàm Proc ( f=->s,r{...}) thay vì hàm. Tôi từ chối upvote cho đến khi nó hoàn thành, mặc dù: P
Doorknob

@DoorknobofSnow ah, cảm ơn. Không thành thạo với Ruby :)
Biến động

Hoan hô, bạn là người đầu tiên kết thúc :-D +1
Doorknob

Tôi có ấn tượng rằng tất cả các hàm được cho là trả về một chuỗi, vì vậy đối với số 4 tôi nghĩ bạn sẽ phải sử dụng thêm một ký tự.
Peter Taylor

@PeterTaylor đã sửa :)
Biến động

4

Con trăn - 697 × 1.1 9 1644

Gee, tôi chắc chắn yêu lambdas.

Lưu ý : 3 và 5 được sao chép một cách đáng xấu hổ từ câu trả lời của Biến động , vì tôi không thể tìm thấy một giải pháp thay thế tốt hơn. Ngoài ra, điều này đã được thực hiện chỉ để cho vui .

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 : Nhờ Biến động cho các mẹo.


Bạn có thể sử dụng các biểu thức trình tạo cho hầu hết chúng, điều này sẽ giúp bạn tiết kiệm được một loạt các ký tự. Ngoài ra, đối với 1. không cần sử dụng int, vì booleans là một lớp con của chúng và cho 7. all([...])có thể rút ngắn thànhx.replace(' ','').isdigit()
Biến động

Câu trả lời thứ hai sẽ không có tiền tố dòng đầu tiên a.
daniero

1

Điểm 513 * 1.1 5 = 826 

Đã bị đánh khá nặng bởi hình phạt cùng ngôn ngữ. Đã giải quyết hầu hết những thứ này trong Ruby chỉ để hoàn thành chúng nhanh nhất có thể. Có thể thay đổi một số ngôn ngữ sau. Thêm một tóm tắt / giải thích nhỏ trên mỗi câu trả lời.

1: Con trăn (46)

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

Đầu tiên, câu trả lời ngắn hơn trong Ruby 2.0 (30) mang lại nhiều hình phạt hơn và tổng điểm cao hơn:

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

2: Ruby 1.9+ (37)

Trả về mỗi dòng stiền tố với t:

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

3: Ruby 1.9+ (48)

Trả về svới các tab được thay thế bằng ndấu cách hoặc ngược lại, tùy thuộc vào b:

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

4: Ruby 1.9+ (95)

Ai đó bắn tôi.

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)

Trả về chuỗi nký tự phổ biến nhất trong s:

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

6: J (47)

Xáo trộn văn bản bằng cách nào đó; Đánh cắp nguyên văn từ bến tàu :

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

7: Ruby (57 + 1)

In đầu vào ASCIIfied hoặc de-ASCIIfied. Chạy với công -ptắc.

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

8: Trầm tích (87)

In đầu vào được chuyển đổi từ đánh dấu (mini) sang HTML:

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

9 Ruby 1.9+ (37)

Trả về một chuỗi các nký tự thứ của mỗi từ đầu tiên trong s, hoặc r:

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

Sẽ không ra 8 của bạn <b>test** **test2</b>cho **test** **test2**?
Doorknob

@DoorknobofSnow đúng vậy;) Đã sửa (sed không có sự lặp lại không tham lam).
daniero

Nó sẽ cho **foo *bar* baz**cái gì?
Biến động

@Volatility Rất tiếc. Tôi đã không đọc câu hỏi đúng cách, nghĩ rằng sẽ không có lồng nhau, nhưng nó nói không có lồng không hợp lệ . Tôi không chắc chắn tôi sẽ sửa chữa nó ngay bây giờ.
daniero

Đối với -toán tử mã ruby ​​thứ 1 làm việc với điều tra viên?
Siva

1

Công việc đang tiến triển

1. Java - 66

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

2. Java - 64

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

3. Con trăn - 58

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

4. Con trăn - 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.~@#

số 8.

9.


Tại lỗ đầu tiên nó phải được for(char c:b.toCharArray())replace(c+"","");return s.length();(hoặc một cái gì đó như thế) để làm cho nó làm việc.
bobbel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.