ภาษา Geobitsian


16

ภาษา Geobitsianเป็นใหม่ที่บิดเบือนภาษาอังกฤษซึ่งคำแตกออกเป็นส่วน ๆ ซึ่งแต่ละส่วนจะต้องเริ่มต้นด้วยตัวอักษรที่แตกต่างกัน จากนั้นทุกครั้งที่ตัวอักษรเริ่มต้นตัวใดตัวหนึ่งปรากฏในสตริงอื่นตัวอักษรนั้นจะถูกแทนที่ด้วยส่วนที่สอดคล้องกันทั้งหมดของมัน

กระบวนการนี้เรียกว่าGeobitsizing

ตัวอย่างเช่นคำว่า " Geobits " อาจแบ่งออกเป็นgeo bitsและบทกวีไร้สาระ

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

จะถูก Geobitsized ด้วย

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

เพราะทุกgกลายเป็นgeoทุกคนG(แม้จะมีผู้ใด) จะกลายเป็นGeoทุกคนbจะกลายเป็นbitsและทุกกลายเป็นBBits

โปรดทราบว่าการทดแทนแต่ละครั้งจะดำเนินการตามสตริงเดิมไม่ใช่ขั้นตอนกลางใด ๆ เช่นถ้าgeoได้รับgboแทนb's bitsสร้างขึ้นจะไม่ถูกแทนที่ด้วย

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่สามารถสร้างภาษา Geobitsian

ใช้สายอักขระบรรทัดเดียวที่ประกอบด้วยตัวอักษรตัวพิมพ์เล็ก (az) และช่องว่าง นี่คือคำที่ใช้เป็นอาร์กิวเมนต์ Geobitsizing โดยมีการเว้นวรรคเพื่อแยกเซกเมนต์ คุณสามารถสันนิษฐานได้ว่า:

  • กลุ่มจะไม่ว่างเปล่า ดังนั้นช่องว่างจะไม่ติดกันหรืออยู่ที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริง
  • แต่ละส่วนเริ่มต้นด้วยตัวอักษรที่แตกต่างกัน ดังนั้นจึงมีไม่เกิน 26

ตัวอย่างเช่นบางสายที่แบ่งกลุ่มที่ถูกต้องคุณจะต้องสนับสนุนการมีgeo bits, butt ner, alexและdo o r k nob(กลุ่มตัวอักษรเดียวไม่มีผล แต่ที่ถูกต้อง) แต่geo , butt ner, Alexและdo o r k n obไม่ถูกต้อง

โปรแกรมหรือฟังก์ชั่นของคุณยังต้องใช้สายอักขระอื่นเพื่อนำไปใช้กับ Geobitsizing และพิมพ์หรือส่งคืนภาษา Geobitsian ที่เกิดขึ้น

  • คุณสามารถสันนิษฐานว่าสตริงนี้มีการขึ้นบรรทัดใหม่และASCII ที่พิมพ์ได้เท่านั้น

  • โปรดจำไว้ว่ากรณีตัวอักษรต้องได้รับการเก็บรักษาไว้จากอินพุตไปยังเอาต์พุต

นี่คือตัวอย่างเพิ่มเติมที่ใช้no pro gr am m ingเป็นอาร์กิวเมนต์ Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(ไม่มีการเปลี่ยนแปลง)

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

โปรดทราบว่าผลลัพธ์ควรเหมือนกันไม่ว่าจะมีการจัดเรียงอาร์กิวเมนต์อย่างไรเช่นing pro m no am grควรให้ผลลัพธ์แบบเดียวกันกับด้านบน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


เราสามารถใช้ "Geobitsizing อาร์กิวเมนต์" เป็นอาร์เรย์ได้หรือไม่? เช่น["no", "pro", "gr", "am", "m", "ing"]
Downgoat

@Upgoat ขออภัย แต่ไม่ใช่
งานอดิเรกของ Calvin

@Upgoat ลอง\\b${l}(\\S+)แม้ว่าจะมีค่าใช้จ่าย 5 ไบต์
Neil

3
-1 สำหรับความต้องการอินพุตโดยพลการของสตริงที่คั่นด้วยช่องว่าง
AdmBorkBork

2
กรณีทดสอบที่แนะนำ: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ควรครอบคลุมทุกกรณีและมีจำนวนมากหากพยายามใช้ regexes ...
Dennis

คำตอบ:


6

เยลลี่ขนาด 18 ไบต์

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

ลองออนไลน์!

รุ่นทางเลือก 15 ไบต์ (ไม่แข่งขัน)

ฟังก์ชันเคสชื่อเรื่องของ Jelly มีข้อบกพร่อง มันไม่ได้ใช้ประโยชน์จากคำแรก ที่ได้รับการแก้ไขแล้วดังนั้นงานต่อไปนี้ในขณะนี้

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

รหัสนี้ทำเช่นเดียวกับในเวอร์ชันที่แข่งขันกันยกเว้นว่าŒt(ตัวพิมพ์ชื่อเรื่อง) แทนที่การพิมพ์ใหญ่ที่มีเงื่อนไขด้วยŒu1¦€เงื่อนไขทำได้โดย

มันทำงานอย่างไร

ṣ⁶;Œ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 ไบต์

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

ทดสอบบนIdeone

มันทำงานอย่างไร

ใน Python 3บิวด์อินstr.translateใช้สตริงและพจนานุกรมและแทนที่อักขระแต่ละตัวในสตริงที่จุดโค้ดเป็นกุญแจสำคัญของพจนานุกรมนั้นด้วยค่าที่สอดคล้องกันซึ่งอาจเป็นสตริงจำนวนเต็มหรือไม่มี (เทียบเท่ากับ สตริงว่าง)

การแปลงสตริงของคำwเป็นตัวพิมพ์ใหญ่หัวเรื่อง (เช่นการใช้อักษรตัวพิมพ์ใหญ่ของแต่ละคำ) และต่อท้ายผลลัพธ์ของการw+' 'สร้างสตริงของคำที่คั่นด้วยช่องว่างด้วยเวอร์ชันตัวพิมพ์เล็กและใหญ่ (ตัวอักษรตัวแรก) หากไม่มีอาร์กิวเมนต์str.splitตัวที่สองให้แยกที่ช่องว่างเพื่อ(w+' '+w.title()).split()สร้างรายการคำทั้งหมด

ในที่สุดความเข้าใจในพจนานุกรม{ord(t[0]):t for t in...}จะเปลี่ยนแต่ละคำtเป็นรายการพจนานุกรมด้วยคีย์ord(t[0])(รหัสจุดของตัวอักษรตัวแรก) และค่าtดังนั้นstr.translateจะดำเนินการแทนตามที่ตั้งใจไว้


3

Python, 126 99 95 81 ไบต์

ขอบคุณเดนนิสมาก:

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

แก้ไข 1: ไม่จำเป็นต้องต่อท้ายชั่วคราว

Edit2: Sอาจมีตัวพิมพ์ใหญ่ ...

แก้ไข 3: อย่าทำซ้ำ G

Edit4: บีบอัดเพิ่มอีกนิดแล้วผลักมันเป็นหนึ่งบรรทัด

Edit5: การใช้แลมบ์ดาที่ไม่มีชื่อและ j=join' '



2

เป็นกลุ่ม 46 การกดแป้น

น่าเกลียดและแฮ็ค

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

ทำไมไม่เป็น V D:
Downgoat

@Upgoat สาเหตุที่ทำให้รถสกปรก
DJMcMayhem


2

Pyth, 18 16

MsXGhMJcjdrBH3)J

ลองที่นี่

กำหนดฟังก์ชั่นgที่ทำ geobitsising ในฐานะโปรแกรมนี้จะสั้นลงเล็กน้อยถ้าสตริงที่สองเป็นบรรทัดเดียว แต่อินพุตหลายบรรทัดไม่คุ้มค่า:

sXwhMJcjdrBz3)J

แนวคิดทั่วไปที่นี่คือการตั้งชื่อเรื่องสตริง geobitsian และผนวกเข้ากับสตริงเดิม จากนั้นแยกที่บนช่องว่างและสำหรับแต่ละสตริงให้ใช้ตัวอักษรตัวแรกและแมปกับสตริงที่มันแทน วิธีXนั้นจะทำให้ตัวอักษรตัวแรกของแต่ละคำเป็นคำเต็ม


คุณเพียงแค่ ... outgolf Dennis?
Bojidar Marinov

@BojidarMarinov ถ้าคุณนับว่าเดนนิสใช้ภาษาอื่นที่มีจุดบกพร่องในนั้นเหมือน outgolfing ใช่แล้ว;)
FryAmTheEggman

2

Python 2, 83 78 ไบต์

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

ทดสอบบน Ideone

มันทำงานอย่างไร

เราวนซ้ำอักขระทั้งหมดcในสตริงs s

เราเติมช่องว่างให้กับสตริงของคำwจากนั้นค้นหาการเกิดของc ที่ลดระดับนำหน้าด้วยช่องว่าง

  • ถ้าเช่นเหตุการณ์ที่มีอยู่findจะกลับดัชนีของพื้นที่ในสตริง' '+wซึ่งตรงกับดัชนีของในW

    w[...:] จึงส่งกลับหางของ Wเริ่มต้นจากคำแรกด้วยตัวอักษรC split()แยกหางที่ช่องว่าง[0]เลือกอันแรก (คำ) และ[1:]ลบตัวอักษรตัวแรก

    หลังจาก prepending เพื่อผลก่อนหน้านี้เราได้รับการคำดาดอย่างถูกต้องที่เริ่มต้นด้วยค

  • หากไม่มีคำขึ้นต้นด้วย , findจะกลับ-1

    ดังนั้น, w[...:]ผลตอบแทนถัวเฉลี่ยตัวอักษรตัวสุดท้ายของW , split()wraps ในอาร์เรย์[0]undoes ห่อและ[1:]เอาตัวละครจากสตริง

    หลังจากเตรียมการ cเราจะได้รับสตริงเดี่ยวที่มีอักขระเป็นcดังนั้นการดำเนินการทั้งหมดจึงเป็นแบบไม่ใช้งาน

สุดท้าย''.joinเชื่อมสตริงส่งผลให้ทุกคนกลับมารุ่น Geobitsized ของs s



1

CJam, 19 ไบต์

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

ทดสอบที่นี่

คำอธิบาย

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 ไบต์

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

ทดสอบบน Firefox ข้อผิดพลาดทำให้สิ่งนี้นานกว่าที่ฉันต้องการ

คำอธิบาย

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")"1abracadabraDbracadabrababracadabrawbracadabra"ผลตอบแทน
Dennis

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.