Ngôn ngữ Geobitsian


16

Ngôn ngữ Geobitsian là một ngôn ngữ mới của tiếng Anh trong đó một từ được chia thành các phân đoạn mà mỗi từ phải bắt đầu bằng một chữ cái khác nhau. Sau đó, mỗi khi một trong những chữ cái bắt đầu xuất hiện trong một chuỗi khác, nó sẽ được thay thế bằng toàn bộ phân khúc tương ứng của nó, duy trì viết hoa.

Quá trình này được gọi là Geobitsizing .

Ví dụ: từ " Geobits " có thể được chia thành geo bitsvà bài thơ vô nghĩa

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

sẽ được Geobitsized với nó như là

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

bởi vì mọi gtrở thành geo, mọi G(dù không có) trở thành Geo, mọi btrở thành bitsvà mọi Btrở thành Bits.

Lưu ý rằng mỗi thay thế được thực hiện đối với chuỗi gốc, không phải bất kỳ bước trung gian nào. ví dụ, nếu geođã được gbothay thế, thì cái bđược tạo sẽ không được thay thế bằng bits.

Thử thách

Viết chương trình hoặc chức năng có thể tạo ngôn ngữ Geobitsian.

Lấy một chuỗi một dòng được làm bằng chữ thường (az) và dấu cách. Đây sẽ là từ được sử dụng làm đối số Geobitsizing, với các khoảng trắng ngăn cách các phân đoạn. Bạn có thể giả sử:

  • Phân khúc sẽ không trống. Vì vậy, các không gian sẽ không lân cận nhau cũng như ở đầu hoặc cuối chuỗi.
  • Mỗi phân đoạn bắt đầu bằng một chữ cái khác nhau. Do đó, không thể có nhiều hơn 26.

Ví dụ, một số chuỗi phân đoạn hợp lệ bạn phải hỗ trợ là geo bits, butt ner, alex, và do o r k nob(phân đoạn chữ cái không có hiệu lực nhưng có giá trị). Nhưng geo , butt ner, Alex, và do o r k n obkhông hợp lệ.

Chương trình hoặc chức năng của bạn cũng cần phải sử dụng một chuỗi tùy ý khác để áp dụng Geobitsizing cho và in hoặc trả về ngôn ngữ Geobitsian kết quả.

  • Bạn có thể giả sử chuỗi này chỉ chứa các dòng mới và ASCII có thể in được.

  • Hãy nhớ rằng các trường hợp chữ cái phải được bảo tồn từ đầu vào đến đầu ra.

Dưới đây là một số ví dụ khác sử dụng no pro gr am m inglàm đối số Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(không thay đổi)

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

Lưu ý rằng các kết quả phải giống hệt nhau cho dù đối số được sắp xếp như thế nào, ví dụ như ing pro m no am grsẽ mang lại kết quả giống như trên.

Mã ngắn nhất tính bằng byte thắng.


Chúng ta có thể lấy "đối số Geobitsizing" làm một mảng không? ví dụ["no", "pro", "gr", "am", "m", "ing"]
Downgoat

@Upgoat Xin lỗi nhưng không.
Sở thích của Calvin

@Upgoat Hãy thử \\b${l}(\\S+)mặc dù điều đó làm bạn tốn 5 byte.
Neil

3
-1 cho yêu cầu đầu vào tùy ý của một chuỗi được phân tách bằng dấu cách.
admBorkBork

2
Đề nghị trường hợp thử nghiệm: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Điều đó sẽ bao gồm tất cả các trường hợp cạnh, và có rất nhiều trong số họ nếu một cố gắng để sử dụng regexes ...
Dennis

Câu trả lời:


6

Thạch , 18 byte

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

Hãy thử trực tuyến!

Phiên bản thay thế, 15 byte (không cạnh tranh)

Chức năng trường hợp tiêu đề của Jelly có một lỗi; nó không viết hoa từ đầu tiên. Điều đó đã được sửa chữa, vì vậy các công trình sau đây.

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

Mã này thực hiện tương tự như trong phiên bản cạnh tranh, ngoại trừ Œttrường hợp đó (trường hợp tiêu đề) thay thế phần trên có điều kiện đạt được Œu1¦€.

Làm thế nào nó hoạt động

ṣ⁶;Œ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.

5

Python 3, 71 byte

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

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

Trong Python 3 , phần tử tích hợp str.translatelấy một chuỗi và một từ điển và thay thế từng ký tự trong chuỗi có điểm mã là một khóa của từ điển đó bằng giá trị tương ứng, có thể là một chuỗi, một số nguyên hoặc Không có (tương đương với chuỗi rỗng).

Chuyển đổi chuỗi từ w sang trường hợp tiêu đề (nghĩa là viết hoa chữ cái đầu tiên của mỗi từ) và nối nó với kết quả w+' 'tạo ra một chuỗi các từ được phân tách bằng dấu cách với phiên bản chữ thường và chữ hoa (chữ cái đầu tiên). Không có đối số thứ hai, str.splitphân tách ở khoảng trắng, do đó (w+' '+w.title()).split()tạo danh sách tất cả các từ.

Cuối cùng, việc hiểu từ điển {ord(t[0]):t for t in...}biến mỗi từ t thành một mục từ điển với khóa ord(t[0])(điểm mã của chữ cái đầu tiên) và giá trị t , do đó str.translatesẽ thực hiện các thay thế dự định.


3

Python, 126 99 95 81 byte

Rất cám ơn 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)

Edit1: không cần phải thêm vào tạm thời

Edit2: Scó thể chứa chữ hoa ...

Chỉnh sửa 3: không trùng lặp G

Edit4: nén thêm một chút nữa và đẩy nó thành một dòng

Chỉnh sửa5: sử dụng lambda không tên và j=join' '



2

Vim, 46 tổ hợp phím

Xấu xí, và Hacky.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"

Tại sao không ở V? D:
Hạ cấp

@Upgoat Vì nó là một mớ hỗn độn.
DJMcMayhem


2

Bình thường 18 16

MsXGhMJcjdrBH3)J

Hãy thử nó ở đây

Xác định một chức năng gthực hiện geobitsising. Là một chương trình, nó sẽ ngắn hơn một chút nếu chuỗi thứ hai là một dòng đơn, nhưng đầu vào đa dòng không có giá trị:

sXwhMJcjdrBz3)J

Ý tưởng chung ở đây là đặt tiêu đề cho chuỗi geobitsian và nối nó với chuỗi gốc. Sau đó phân chia nó trên các khoảng trắng và cho mỗi chuỗi, lấy chữ cái đầu tiên và ánh xạ nó tới chuỗi mà nó đại diện. Bằng cách đó Xsẽ biến chữ cái đầu tiên của mỗi từ thành từ đầy đủ.


Có phải bạn vừa ... vượt qua Dennis?
Bojidar Marinov

@BojidarMarinov Nếu bạn tính Dennis sử dụng một số ngôn ngữ khác có lỗi trong đó là lỗi thời, thì có;)
FryAmTheEggman

2

Python 2, 83 78 byte

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

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

Chúng tôi lặp lại tất cả các ký tự c trong chuỗi s .

Chúng tôi thêm một khoảng trắng vào chuỗi các từ w , sau đó tìm kiếm sự xuất hiện của chữ c thấp hơn , trước một khoảng trắng.

  • Nếu sự xuất hiện như vậy tồn tại, findsẽ trả về chỉ mục của khoảng trắng trong chuỗi ' '+w, khớp với chỉ mục của c trong w .

    w[...:]do đó trả về đuôi của w , bắt đầu từ chữ cái đầu tiên c . split()tách đuôi ở khoảng trắng, [0]chọn đoạn đầu tiên (từ) và [1:]xóa chữ cái đầu tiên của nó.

    Sau khi chuẩn bị c cho kết quả trước đó, chúng ta thu được từ được ghép chính xác bắt đầu bằng c .

  • Nếu không có từ nào bắt đầu bằng c , findsẽ trả về -1 .

    Do đó, w[...:]mang lại ký tự cuối cùng của w , split()bọc nó trong một mảng, [0]hoàn tác gói và [1:]loại bỏ ký tự duy nhất khỏi chuỗi.

    Sau khi chuẩn bị c , chúng ta thu được chuỗi singleton có ký tự là c , vì vậy toàn bộ thao tác là không có op.

Cuối cùng, ''.joinnối tất cả các chuỗi kết quả, trả về phiên bản Geobitsized của s .



1

CJam, 19 byte

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

Kiểm tra nó ở đây.

Giải trình

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.

1

JavaScript ES6, 67 63 70 byte

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

Kiểm tra điều này trên Firefox. lỗi đang làm điều này lâu hơn tôi muốn

Giải trình

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
   });
}

f("abracadabra")("1Dbw")trả lại "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis

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.