Golf mini 9-lubang: Manipulasi Teks [ditutup]

26

9-hole mini-golf: Deskripsi

  • 9 (sebagian besar cukup mudah) tantangan kode golf dari berbagai kesulitan
  • Hukuman karena menggunakan bahasa yang sama lebih dari satu kali
  • Semua tantangan tentang tema tertentu (tema ini: Manipulasi Teks)
  • Input dan output dapat di mana saja masuk akal (yaitu STDIN dan STDOUT, membaca dari / menulis ke file, argumen fungsi dan nilai pengembalian, dll.) Tetapi TIDAK boleh di-hardcode ke dalam program
  • Sangat terinspirasi oleh 9 Hole Challenge dan Text Mechanic

Lubang

  1. Tas kode-golf

    Ambil dua string sebagai input.
    Keluarkan jumlah karakter string pertama, sambil mengabaikan kemunculan karakter apa pun di string kedua.
    Contoh: f("foobarbaz", "ao")=>5
  2. Pra-teks untuk bermain golf

    Ambil dua string sebagai input.
    Keluarkan string pertama, dengan setiap baris diawali dengan yang kedua.
    Contoh: f("foo\nbar\nbaz", "a")=>"a foo\na bar\na baz"
  3. Perang tab vs spasi

    Ambil string s, angka n, dan boolean b(ditentukan sesuka Anda) sebagai input.
    Jika bbenar, output sdengan setiap tab dikonversi menjadi nspasi.
    Lain, output sdengan setiap nspasi dikonversi ke tab.
    Contoh: f("if (x) {\n\tdoStuff();\n}", 4, true)=> "if (x) {\n[sp][sp][sp][sp]doStuff();\n}"( [sp]berarti spasi)
  4. Pilar golf

    Ambil string s, angka n, dan nomor lain msebagai input.
    Output sdalam kolom nsetiap baris dan mkarakter per kolom.
    Juga memiliki bantalan satu ruang antara kolom.
    Contoh: f("this is some placeholder text, foo bar baz...", 3, 5)=>

    this  aceho  foo 
    is so lder  bar b
    me pl text, az...
    
  5. Surat ramah

    Ambil string sdan angka nsebagai input.
    Keluarkan grup nhuruf yang paling umum di s.
    Jika ada dasi, hasilkan salah satu atau semuanya.
    Contoh: f("abcdeabcfghiabc", 3)=>"abc"
  6. Telur orak - arik surat untuk sarapan

    Ambil string sebagai input.
    Keluarkan string dengan semua kata-katanya diacak (urutan huruf acak) kecuali huruf pertama dan terakhir.
    Untuk kesederhanaan, asumsikan bahwa input akan menjadi daftar "kata", spasi dipisahkan (yaitu dalam @$&_():;" foo bar, @$&_():;"dianggap sebagai "kata.")
    Contoh: f("this is a sentence that will be scrambled")=>"tihs is a stcneene that wlil be sclamrbed"
  7. ASCIIfy

    Ambil string sebagai input.
    Jika string hanya berisi angka dan spasi, maka ganti angka dengan karakter ASCII masing-masing (menghapus spasi).
    Lain, lakukan sebaliknya (karakter ke angka).
    Contoh: f("ASCIIfy challenge")=> "65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101"
    Contoh 2: f("65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101")=>"ASCIIfy challenge"
  8. Transformasi mini-mini-markdown

    Ambil string sebagai input.
    Keluarkan string yang dikonversi dengan mini-markdown, seperti yang digunakan dalam komentar di Stack Exchange.
    Ini adalah bahkan versi mini-er: Anda hanya perlu untuk menangani **bold**, *italics*dan `code`.
    Anda tidak perlu menangani sarang yang tidak valid, seperti **foo *bar** baz*. Juga asumsikan bahwa ketika Anda melihat pembatas ( *atau `), itu akan selalu berarti memformat (yaitu te**st**ing=> te<b>st</b>ing, dan foo* bar *baz=> foo<i> bar </i>baz).
    Contoh: f("**foo** *bar **baz*** `qux`")=>"<b>foo</b> <i>bar <b>baz</b></i> <code>qux</code>"
  9. Hanya karakter terbaik

    Ambil string s, angka n, dan string rsebagai input.
    Keluarkan nkarakter th dari setiap kata di s. (0-diindeks, kata-kata dipisahkan spasi).
    Jika panjang kata kurang dari n, gunakan runtuk kata itu.
    Contoh: f("this is a test sentence foo bar baz", 2, "-")=>"i--snorz"

Mencetak gol

Skor Anda adalah jumlah jumlah karakter dari program Anda. Untuk setiap bahasa yang diulang, kalikan dengan 110%. Misalnya, jika Anda memiliki tiga solusi Ruby, dan jumlah karakter total dari semua solusi Anda adalah 1000, skor Anda adalah 1000 * 1.1 * 1.1 = 1210. Bulatkan jika Anda memiliki skor non-integer.

Semoga berhasil!

Gagang pintu
sumber
1
Tantangan 8 menyentuh salah satu aspek yang paling tidak ditentukan dengan baik dari Markdown, dan aspek yang paling sulit dilakukan dengan sangat baik. Perlu penjelasan yang jelas tentang bagaimana menangani ambiguitas dan ruang uji yang baik. Lihat Penekanan.teks dari suite mdtest.
Peter Taylor
@ PeterTaylor Yah, _tidak masalah karena saya menentukan untuk tidak memasukkannya. Saya telah mengedit untuk mengklarifikasi beberapa yang lain.
Gagang Pintu
Bagaimana dengan **foo***bar**baz*?
Peter Taylor
1
Tantangan 6 identik dengan yang ini .
daniero
4
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena ini merupakan tantangan multi-bagian dengan interaksi yang tidak memadai antara bagian-bagian
pppery

Jawaban:

12

Nilai: 382 * 1,1 2 = 462

Bahasa cenderung berubah.

1. APL, 8 4

Terima kasih @marinus karena telah memangkas 4 karakter.

f←⍴~

Disebut dengan string sebagai argumen kiri dan kanan, mis.

      'foobarbaz' f 'ao'
5

2. Ruby, 35 31

Terima kasih @DoorknobofSnow untuk mencukur 4 karakter.

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

3. Python, 48

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

4. GolfScript, 20

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

Diasumsikan bahwa argumen ada di tumpukan. Tes online

5. J, 50

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

Dipanggil dengan string sebagai argumen kiri dan angka sebagai kanan, mis.

   'abcdeabcfghiabc' f 3
abc

6. Ruby, 61

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

7. GolfScript, 39 35 34

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

Sekali lagi, anggap argumennya ada di stack. Tes online

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]
Keriangan
sumber
Besar! Anda dapat menyimpan beberapa karakter di Ruby dengan menggunakan proc ( f=->s,r{...}) alih-alih fungsi. Saya menolak untuk memperbaiki suara sampai selesai, meskipun: P
Doorknob
@DoorknobofSekarang ah, terima kasih. Tidak begitu mahir dengan Ruby :)
Volatilitas
Hore, kamu yang pertama selesai :-D +1
Gagang Pintu
Saya mendapat kesan bahwa semua fungsi seharusnya mengembalikan string, jadi untuk nomor 4 saya pikir Anda harus menggunakan satu karakter lebih banyak.
Peter Taylor
@PeterTaylor diperbaiki :)
Volatilitas
4

Python - 697 × 1.1 9 ≈ 1644

Astaga, saya sangat suka lambda.

Catatan : 3 dan 5 disalin tanpa malu-malu dari jawaban Volatility , karena saya tidak dapat menemukan alternatif yang lebih baik. Juga, ini dilakukan hanya untuk bersenang-senang .

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 : Terima kasih kepada Volatility untuk tipsnya

Oberon
sumber
Anda dapat menggunakan ekspresi generator untuk sebagian besar dari mereka, yang akan menghemat banyak karakter. Juga, untuk 1. tidak perlu digunakan int, karena boolean adalah subkelas dari mereka, dan untuk 7. all([...])dapat disingkat menjadix.replace(' ','').isdigit()
Volatilitas
Jawaban kedua tidak akan mengawali baris pertama a.
daniero
1

Nilai 513 * 1,1 5 = 826 

Pemukulan yang cukup dengan hukuman bahasa yang sama. Memecahkan sebagian besar ini di Ruby hanya untuk menyelesaikannya secepat mungkin. Mungkin mengubah beberapa bahasa nanti. Menambahkan rekap kecil / penjelasan pada setiap jawaban.

1: Python (46)

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

Pertama, jawaban yang lebih pendek di Ruby 2.0 (30) yang memberikan penalti lebih banyak dan skor keseluruhan lebih tinggi:

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

2: Ruby 1.9+ (37)

Mengembalikan setiap baris yang sdiawali dengan t:

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

3: Ruby 1.9+ (48)

Kembali s dengan tab yang diganti nspasi atau sebaliknya, tergantung pada b:

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

4: Ruby 1.9+ (95)

Seseorang tembak aku.

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)

Mengembalikan karakter paling umum ndalam s:

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

6: J (47)

Entah bagaimana teksnya; Tanpa malu-malu mencuri kata demi kata dari marinus :

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

7: Ruby (57 +1)

Mencetak input ASCIIfied atau de-ASCIIfied. Jalankan dengan -psakelar.

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

8: Sed (87)

Mencetak input yang dikonversi dari markdown (mini) ke HTML:

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

9 Ruby 1.9+ (37)

Mengembalikan string nkarakter ke - th dari setiap kata pertama di s, atau r:

f=->s,n,r{s.split.map{|w|w[n]||r}*''}
daniero
sumber
Bukankah 8 output Anda <b>test** **test2</b>untuk **test** **test2**?
Gagang Pintu
@DoorknobofSekarang ya itu akan;) Tetap (sed tidak memiliki pengulangan non-serakah).
daniero
Untuk apa itu **foo *bar* baz**?
Volatilitas
@Varilitas Ups. Saya tidak membaca pertanyaan dengan benar, mengira tidak akan ada sarang, tetapi dikatakan tidak ada sarang yang tidak valid . Saya tidak yakin saya akan repot memperbaikinya sekarang.
daniero
Untuk -operator kode ruby ​​pertama bekerja dengan enumerator?
Siva
1

Bekerja dalam proses

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. Python - 58

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

4. Python - 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.

Justin
sumber
Pada lubang pertama seharusnya for(char c:b.toCharArray())dan replace(c+"","");dan return s.length();(atau sesuatu seperti itu) untuk membuatnya bekerja.
bobbel