Bahasa Geobitsian

16

Bahasa Geobitsian adalah penyimpangan bahasa Inggris baru di mana sebuah kata dipecah menjadi segmen yang masing-masing harus dimulai dengan huruf yang berbeda. Kemudian setiap kali salah satu huruf awal muncul di string lain, itu diganti dengan seluruh segmen yang sesuai, mempertahankan kapitalisasi.

Proses ini disebut Geobitsizing .

Misalnya kata " Geobit " bisa dipecah menjadi geo bits, dan puisi omong kosong

Algy met a Bear
A Bear met Algy
The Bear was bulgy
The bulge was Algy

akan menjadi Geobisit dengan itu sebagai

Algeoy met a Bitsear
A Bitsear met Algeoy
The Bitsear was bitsulgeoy
The bitsulgeoe was Algeoy

karena setiap gmenjadi geo, setiap G(meskipun tidak ada) menjadi Geo, setiap bmenjadi bits, dan setiap Bmenjadi Bits.

Perhatikan bahwa setiap penggantian dilakukan sehubungan dengan string asli, bukan langkah perantara. misalnya jika geotelah gbosebaliknya, yang bdibuat tidak akan diganti dengan bits.

Tantangan

Tulis program atau fungsi yang dapat menghasilkan bahasa Geobitsian.

Ambil string satu baris yang terbuat dari huruf kecil (az) dan spasi. Ini akan menjadi kata yang digunakan sebagai argumen Geobitsizing, dengan spasi memisahkan segmen. Anda dapat mengasumsikan:

  • Segmen tidak akan kosong. Jadi spasi tidak akan bertetangga satu sama lain atau berada di awal atau akhir string.
  • Setiap segmen dimulai dengan huruf yang berbeda. Jadi tidak boleh lebih dari 26.

Sebagai contoh, beberapa string tersegmentasi valid Anda harus mendukung adalah geo bits, butt ner, alex, dan do o r k nob(segmen huruf tidak berpengaruh tetapi berlaku). Tapi geo , butt ner, Alex, dan do o r k n obtidak valid.

Program atau fungsi Anda juga perlu menggunakan string arbitrer lain untuk menerapkan Geobitsizing, dan mencetak atau mengembalikan bahasa Geobitsian yang dihasilkan.

  • Anda dapat menganggap bahwa string ini hanya berisi baris baru dan ASCII yang dapat dicetak.

  • Ingat bahwa case huruf harus dipertahankan dari input ke output.

Berikut adalah beberapa contoh lain yang digunakan no pro gr am m ingsebagai argumen Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(tidak ada perubahan)

People think bananas are great, don't you?Proeoprole thingnok bamnoamnoams amre grreamt, dono't you?

Pet a Puppy
Google Wikipedia

Proet am Prouproproy
Groogrle Wingkingproedingam

Perhatikan bahwa hasilnya harus sama tidak peduli bagaimana argumen itu diatur, misalnya ing pro m no am grharus menghasilkan hasil yang sama seperti di atas.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
Bisakah kita mengambil "argumen Geobitsizing" sebagai array? misalnya["no", "pro", "gr", "am", "m", "ing"]
Downgoat
@Upgoat Maaf tapi tidak.
Hobi Calvin
@Upgoat Coba \\b${l}(\\S+)walaupun itu menghabiskan biaya 5 byte.
Neil
3
-1 untuk persyaratan input acak dari string yang dipisahkan spasi.
AdmBorkBork
2
Disarankan kasus uji: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Itu harus mencakup semua kasus tepi, dan ada banyak dari mereka jika mencoba untuk menggunakan regexes ...
Dennis

Jawaban:

6

Jelly , 18 byte

ṣ⁶;Œu1¦€$;©ZḢiЀị®

Cobalah online!

Versi alternatif, 15 byte (tidak bersaing)

Fungsi case title Jelly memiliki bug; itu tidak menggunakan kata pertama. Itu sudah diperbaiki, jadi berikut ini berfungsi sekarang.

ṣ⁶;Œt$;©ZḢiЀị®

Kode ini melakukan hal yang sama seperti pada versi yang bersaing, kecuali bahwa Œt(judul kasus) menggantikan huruf besar bersyarat yang dicapai oleh Œu1¦€.

Bagaimana itu bekerja

ṣ⁶;Œu1¦€$;©ZḢiЀị®  Main link. Left argument: w (words). Right argument: s (string)

ṣ⁶                  Split w at spaces.
        $           Combine the two links to the left into a monadic chain.
       €              Map over the words.
   Œu1¦                 Uppercase the item at index 1.
  ;                   Append the result to the unmodified words.
         ;          Append all characters in s to the list of words.
          ©         Copy the result to the register.
           Z        Zip/transpose, grouping the first chars into the first list.
            Ḣ       Head; extract the list of first characters.
             iЀ    Find the first index of each character in s.
                ị®  Select the characters/strings from the list in the register
                    that are at those indices.
Dennis
sumber
5

Python 3, 71 byte

lambda w,s:s.translate({ord(t[0]):t for t in(w+' '+w.title()).split()})

Uji di Ideone .

Bagaimana itu bekerja

Dalam Python 3 , built-in str.translatemengambil string dan kamus, dan mengganti setiap karakter dalam string yang titik kodenya adalah kunci dari kamus tersebut dengan nilai yang sesuai, yang mungkin berupa string, integer atau None (setara dengan string kosong).

Mengubah string kata w menjadi case title (yaitu, huruf kapital huruf pertama dari setiap kata) dan menambahkannya ke hasil w+' 'menciptakan string kata-kata yang dipisahkan ruang dengan versi huruf kecil dan besar (huruf pertama). Tanpa argumen kedua, str.splitpisahkan di whitespace, jadi (w+' '+w.title()).split()buat daftar semua kata.

Akhirnya, pemahaman kamus {ord(t[0]):t for t in...}mengubah setiap kata t menjadi entri kamus dengan kunci ord(t[0])(titik kode huruf pertama) dan nilai t , sehingga str.translateakan melakukan penggantian yang dimaksud.

Dennis
sumber
3

Python, 126 99 95 81 byte

Banyak terima kasih kepada Dennis:

lambda G,S,j=''.join:j(s+j(g[1:]for g in G.split()if g[0]==s.lower())for s in S)

Sunting1: tidak perlu ditambahkan ke sementara

Edit2: Sdapat berisi huruf besar ...

Sunting3: jangan menduplikasi G

Sunting4: dikompres sedikit lebih dan mendorongnya menjadi satu baris

Sunting5: menggunakan lambda tanpa nama dan j=join' '

Karl Napf
sumber
2

Pyth, 19 byte

.rzsC_hMBsm,rd0rd3c

Cobalah online!

bocor Nun
sumber
1
Kita tidak bisa mengambil argumen geobitsizing sebagai array, sayangnya
Downgoat
Maaf, tidak memperhatikan.
Leaky Nun
2

Vim, 46 penekanan tombol

Jelek, dan Meretas.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"
DJMcMayhem
sumber
Kenapa tidak di V? D:
Downgoat
@Upgoat Karena ini kekacauan kereta.
DJMcMayhem
2

Retina , 36 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

i`(?<=^.*\b\2(\w+)[^·]*?(\w))
$1
A1`

Cobalah online!

Martin Ender
sumber
2

Pyth, 18 16

MsXGhMJcjdrBH3)J

Coba di sini

Menentukan fungsi gyang melakukan geobitsising. Sebagai sebuah program, ini akan sedikit lebih pendek jika string kedua adalah baris tunggal, tetapi input multiline tidak sepadan:

sXwhMJcjdrBz3)J

Ide umum di sini adalah untuk memberi judul case string geobitsian dan menambahkannya ke string asli. Kemudian pisahkan itu pada spasi dan untuk setiap string, ambil huruf pertama dan petakan ke string yang diwakilinya. Dengan begitu Xakan mengubah huruf pertama dari setiap kata menjadi kata penuh.

FryAmTheEggman
sumber
Apakah Anda baru saja ... mengalahkan Dennis?
Bojidar Marinov
@BojidarMarinov Jika Anda menganggap Dennis menggunakan bahasa lain yang memiliki bug sebagai outgolfing, maka ya;)
FryAmTheEggman
2

Python 2, 83 78 byte

lambda w,s:''.join(c+w[(' '+w).find(' '+c.lower()):].split()[0][1:]for c in s)

Uji di Ideone .

Bagaimana itu bekerja

Kami mengulangi semua karakter c dalam string s .

Kami menambahkan spasi ke string kata w , lalu mencari kejadian huruf c yang lebih rendah , didahului oleh spasi.

  • Jika kejadian seperti itu ada, findakan mengembalikan indeks spasi dalam string ' '+w, yang cocok dengan indeks c di w .

    w[...:]dengan demikian mengembalikan buntut w , mulai dari kata dengan huruf pertama c . split()membelah ekor pada spasi, [0]memilih potongan pertama (kata) dan [1:]menghapus huruf pertama.

    Setelah menambahkan c ke hasil sebelumnya, kami mendapatkan kata yang ditulis dengan benar yang dimulai dengan c .

  • Jika tidak ada kata yang dimulai dengan c , findakan mengembalikan -1 .

    Dengan demikian, w[...:]menghasilkan karakter terakhir w , split()membungkusnya dalam array, [0]membatalkan pembungkusan, dan [1:]menghapus satu-satunya karakter dari string.

    Setelah mendahului c , kita mendapatkan string singleton yang karakternya c , jadi seluruh operasi adalah no-op.

Akhirnya, ''.joinmenyatukan semua string yang dihasilkan, mengembalikan versi Geobitsized dari s .

Dennis
sumber
1

Julia, 72 68 byte

w%s=prod(c->"$c"join((W=w|>split)[find(t->t[1]==c|' ',W)])[2:end],s)

Cobalah online!

Dennis
sumber
1

CJam, 19 byte

lq\S/_32af.^+_:c\er

Uji di sini.

Penjelasan

l       e# Read first line of input (list of words).
q\      e# Read remaining input and swap with first line.
S/      e# Split around spaces.
_       e# Duplicate.
32af.^  e# Convert the first letter of each word to upper case by taking
        e# the element-wise XOR with the list [32].
+       e# Append the upper-cased words to the original ones.
_:c     e# Duplicate and convert each word to its first character.
\       e# Swap characters with words.
er      e# Transliteration, replacing each character with the corresponding word.
Martin Ender
sumber
1

JavaScript ES6, 67 63 70 byte

g=>s=>s.replace(/\S/g,l=>l+(g.match(`\\b\\${l}(\\S+)`,'i')||[,""])[1])

Uji ini di Firefox. bug membuat ini lebih lama dari yang saya inginkan

Penjelasan

function(gbarg, str) {
   return str.replace(/\S/g, function(chr) { // Replace non-whitespace w/...
        return chr + (
         gbarg.match(`\\b\\${l}(\\S+)`,'i')  // That word in the gbstr
        ||[,""])[1]                          // if not in gbstr, use blank str
   });
}
Downgoat
sumber
f("abracadabra")("1Dbw")kembali "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis
0

Ruby, 65 60 58 byte

->w,s{s.gsub(/\w/){|c|w=~/\b#{c}(\w+)/i;c+($1||c)[1..-1]}}

Cobalah online!

Nilai Tinta
sumber