9 delikli mini golf: Metin Manipülasyonu [kapalı]


26

9 delikli mini golf: Açıklama

  • 9 (çoğunlukla oldukça kolay) kod değişikliğinde zorluklarla mücadele zorlukları
  • Aynı dili bir defadan fazla kullanmanın cezaları
  • Belirli bir tema ile ilgili tüm zorluklar (bu tema: Metin İşleme)
  • Giriş ve çıkış makul herhangi bir yerde olabilir (örn. STDIN ve STDOUT, bir dosyadan / dosyadan okuma, fonksiyon argümanı ve dönüş değeri, vb.), Ancak programa kodlanmamalıdır
  • 9 Delik Görevi ve Metin Mekaniğinden esinlenerek

delikler

  1. Kod golf çantası

    Giriş olarak iki karakter atın.
    İkinci dizgede herhangi bir karakterin varlığını göz ardı ederek ilk dizginin karakter sayısını çıktılar.
    Örnek: f("foobarbaz", "ao")=>5
  2. Golf için bir ön metin

    Giriş olarak iki karakter atın.
    İlk dizgeyi, her satırın ikincisiyle birlikte alınmasını sağlayın.
    Örnek: f("foo\nbar\nbaz", "a")=>"a foo\na bar\na baz"
  3. Tablar Savaşı vs boşluk

    Girdi olarak bir dize s, sayı nve bir boole b(istediğiniz şekilde belirtilmiş) atın .
    Eğer bdoğruysa, çıkış sher sekme ile dönüştürüldü nboşluklar.
    Aksi halde, sekmelere dönüştürülmüş sher nboşlukla birlikte çıktı alın .
    Örnek: f("if (x) {\n\tdoStuff();\n}", 4, true)=> "if (x) {\n[sp][sp][sp][sp]doStuff();\n}"( [sp]boşluk demektir)
  4. Golf ayağı

    Girdi olarak bir dize s, sayı nve başka bir sayı alın m.
    Çıkış ssütunlarında nhatları her biri, birbirinden mkolon başına karakter.
    Ayrıca sütunlar arasında bir boşluk doldurun.
    Örnek: f("this is some placeholder text, foo bar baz...", 3, 5)=>

    this  aceho  foo 
    is so lder  bar b
    me pl text, az...
    
  5. Dost mektuplar

    Girdi olarak bir dize sve bir sayı alın n.
    En yaygın nharf grubunu çıktı s.
    Bir kravat varsa, bunların herhangi birini veya tümünü çıkartın.
    Örnek: f("abcdeabcfghiabc", 3)=>"abc"
  6. Kahvaltı için sahanda yumurta harfler

    Giriş olarak bir dize atın.
    İlk ve son harfleri hariç, dizelerinin tümü karıştırılmış (harf sırasına randomize) yazılan kelimelerle birlikte çıkın.
    Basit olması için, girişin boşlukla ayrılmış (yani @$&_():;" foo bar, @$&_():;"bir "kelime" olarak kabul edilir) "kelime" lerin bir listesi olacağını varsayalım .
    Örnek: f("this is a sentence that will be scrambled")=>"tihs is a stcneene that wlil be sclamrbed"
  7. ASCIIfy

    Giriş olarak bir dize atın.
    Dize yalnızca sayılar ve boşluklar içeriyorsa, sayıları ilgili ASCII karakterleriyle değiştirin (boşlukları kaldırarak).
    Aksi takdirde, tersini yapın (karakterlerden sayılara).
    Örnek: f("ASCIIfy challenge")=> "65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101"
    Örnek 2: f("65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101")=>"ASCIIfy challenge"
  8. Mini-mini markdown dönüşümü

    Giriş olarak bir dize atın.
    Stack Exchange ile ilgili yorumlarda kullanıldığı gibi mini markdown ile dönüştürülen dizgeyi çıktılayın.
    Bu daha da mini er sürümü: Yalnızca işlemek gerekir **bold**, *italics*ve `code`.
    Gibi geçersiz iç içe geçme işlemine gerek yoktur **foo *bar** baz*. Ayrıca bir sınırlayıcı ( *veya `) gördüğünüzde , her zaman biçimlendirmenin (yani te**st**ing=> te<b>st</b>ing, ve foo* bar *baz=> foo<i> bar </i>baz) geleceğini varsayalım .
    Örnek: f("**foo** *bar **baz*** `qux`")=>"<b>foo</b> <i>bar <b>baz</b></i> <code>qux</code>"
  9. Sadece en iyi karakterler

    Girdi olarak bir dize s, sayı nve dize alın r.
    Çıktı nher kelimenin inci karakter s. (0 dizinli, kelimeler boşlukla ayrılmıştır).
    Kelimenin uzunluğu daha azsa n, rbunun yerine o kelimeyi kullanın.
    Örnek: f("this is a test sentence foo bar baz", 2, "-")=>"i--snorz"

puanlama

Puanınız, programlarınızın karakter sayısının toplamıdır. Her tekrarlanan dil için,% 110 ile çarpın. Örneğin, üç Ruby çözümünüz varsa ve tüm çözümleriniz için toplam karakter sayısı 1000 ise, puanınız 1000 * 1.1 * 1.1 = 1210'dur. Tam sayı olmayan bir puanınız varsa, tamamlama.

İyi şanslar!


1
Yarışma 8, Markdown'ın en az iyi tanımlanmış yönlerinden birine ve gerçekten iyi yapması en zor olana değiniyor. Belirsizliklerin nasıl ele alınacağına ve iyi bir test odasına nasıl açık bir şekilde açıklanması gerekiyor. Mdtest paketindeki Emphasis.text dosyasına bakın .
Peter Taylor

@PeterTaylor Şey, _dahil etmemeyi belirttiğimden beri önemli değil. Diğerlerini açıklığa kavuşturmak için düzenleme yaptım.
Doorknob

Ne hakkında **foo***bar**baz*?
Peter Taylor,

1
Zor 6 ile aynıdır bu bir .
daniero

4
O çünkü ben konu dışı olarak bu soruyu kapatmak için oy vereceğim parçalar arasında yetersiz etkileşim ile çok parçalı meydan
pppery

Yanıtlar:


12

Puan: 382 * 1,1 2 = 462

Diller değişmeye yatkın.

1. APL, 8 4

4 karakterli tıraş için teşekkürler @ marinus.

f←⍴~

Dizeler ile sol ve sağ argümanlar olarak adlandırılır, örneğin.

      'foobarbaz' f 'ao'
5

2. Yakut, 35 31

4 karakterli tıraş için teşekkürler @DoorknobofSnow.

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;

Argümanların yığında olduğunu varsayar. Çevrimiçi test

5. J, 50

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

Sol argüman olarak dize ve sağdaki sayı olarak adlandırılır, örn.

   'abcdeabcfghiabc' f 3
abc

6. Yakut, 61

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

7. GolfScript, 39 35 34

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

Yine, argümanın yığında olduğunu varsayar. Çevrimiçi test

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]

Harika! f=->s,r{...}Bir işlev yerine proc ( ) kullanarak Ruby'deki bazı karakterleri kaydedebilirsiniz . Tamamlanana kadar oy vermeyi reddediyorum, ancak: P
Doorknob

@DoorknobofSnow ah, teşekkürler. Ruby'de yetkin değil :)
Volatility

Yaşasın, bitiren ilk kişisin :-D +1
Doorknob

Tüm fonksiyonların bir string döndürmesi gerektiği izlenimini edindim, bu yüzden 4 numara için bir karakter daha kullanmanız gerektiğini düşünüyorum.
Peter Taylor

@PeterTaylor fixed :)
Oynaklık

4

Python - 697 × 1.1 9, 1644

Gee, eminim lambdaları severim.

Not : 3 ve 5, daha iyi bir alternatif bulamadığım için Volatility'nin cevabından utanmadan kopyalandı . Ayrıca, bu sadece eğlence için yapıldı .

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 : İpuçları için Volatility sayesinde.


Jeneratör ifadelerini çoğu için kullanabilirsiniz, bu da size birkaç karakter kazandıracaktır. Ayrıca, 1. için kullanmaya gerek yoktur int, çünkü boolean'ler bunların bir alt sınıfıdır ve 7. all([...])için kısaltılabilirx.replace(' ','').isdigit()
Volatility

İkinci cevap ilk satırın ön ekini vermiyor a.
daniero

1

Puan 513 * 1,1 5 = 826 

Aynı dilde penaltı ile oldukça dayak aldı. Bunların çoğunu Ruby'de çözebildiğim kadar hızlı bir şekilde bitirmek için çözdüm. Daha sonra bazı dilleri değiştirebilir. Her cevaba küçük bir özet / açıklama eklendi.

1: Python (46)

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

İlk olarak, daha fazla ceza ve daha yüksek toplam puan veren Ruby 2.0'da (30) kısa cevap :

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

2: Yakut 1.9+ (37)

Her satırı döndürür söneki ile t:

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

3: Yakut 1.9+ (48)

Şunlara bağlı olarak, boşluklarla veya tam tersi sile değiştirilmiş sekmelerle birlikte döndürür :nb

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

4: Yakut 1.9+ (95)

Biri beni vuruyor.

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

5: Yakut 1.9+ (58)

En sık kullanılan nkarakter dizisini döndürür s:

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

6: J (47)

Metni bir şekilde karıştırır; Utanmadan çalınan sözler marinustan :

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

7: Yakut (57 + 1)

ASCIIfied veya ASCIIfied girişini yazdırır. -pAnahtarı ile çalıştırın .

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

8: Sed (87)

(Mini) işaretlemesinden HTML'ye dönüştürülen girişi yazdırır:

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

9 Yakut 1.9+ (37)

Veya niçindeki her ilk kelimenin th karakterinin dizesini döndürür :sr

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

8 çıktınız <b>test** **test2</b>için olmaz **test** **test2**mı?
Doorknob

@DoorknobofSnow evet;;) Sabit (sed açgözlü olmayan tekrarı yok).
daniero

Ne için verecek **foo *bar* baz**?
Oynaklık

@Volatility Oops. Soruyu doğru okumadım, yuva yapamayacağını düşündüm, ancak geçersiz yuvalama olmadığını söyledi . Şu an tamir etmeye zahmet edeceğimden emin değilim.
daniero

1. yakut kodu -operatörü için numaralandırıcı ile çalışır?
Siva

1

Çalışma devam ediyor

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.


İlk delik başta olması gerektiği for(char c:b.toCharArray())ve replace(c+"","");ve return s.length();(veya böyle bir şey) burayı işi alır.
bobbel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.