'A' เป็นÄ converter


12

ขณะนี้ฉันกำลังสแกนเอกสารที่เขียนด้วยลายมือและแปลงเป็น.txtไฟล์ เนื่องจากฉันมีลายมือที่แย่มากตัวแปลง.jpg-> จึง.txtแปลง umlauts ของฉันให้เป็นตัวอักษร"ปกติ" ที่ห่อหุ้มด้วย'

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่:

  • จะได้รับสตริง
    • คุณสามารถเลือกเพจ I / O ใดก็ได้ตราบใดที่
    • อินพุตจะ (ข้างช่องว่าง) มีอักขระที่พิมพ์ได้จากเพจรหัสของคุณเท่านั้น
      • จะมีเพียงวิธีเดียวเท่านั้นดังนั้นสิ่งต่าง ๆ'a'e'จะไม่ปรากฏขึ้น
  • แปลงอักขระทั้งหมดในชุดต่อไปนี้AEIOUaeiouเป็นÄËÏÖÜäëïöü
    • หากและหากมีการล้อมรอบด้วย'อักขระ:
      • ตัวอย่าง :'a''e' -> äë
    • หากสตริงจากเป็นตัวอักษรเดียว
      • ตัวอย่างเช่น'AE'จะไม่เปลี่ยนแปลงเลยส่งออกตามที่เป็น
    • หากอักขระจากไม่ใช่อักขระจากAEIOUaeiouอักขระนั้นจะไม่เปลี่ยนแปลง

หมายเหตุ: จากตัวอักษร / จากสตริง'เป็นหนึ่งในระหว่าง

Testcases

Input
Output
<empty line>

'A'sthetik
Ästhetik

Meinung ist wichtig!
Meinung ist wichtig!

Ich sagte: "Er sagte: 'Ich habe Hunger'"
Ich sagte: "Er sagte: 'Ich habe Hunger'"

Ich sagte: "Er sagte: ''A'sthetik'"
Ich sagte: "Er sagte: 'Ästhetik'"

Hämisch rieb er sich die H'a'nde
Hämisch rieb er sich die Hände

H'a''a'slich isn't a German word
Hääslich isn't a German word

since it's really called h'a'sslich
since it's really called hässlich

6
ส่วนประกอบที่ใช้งานอยู่ในชุดทดสอบทั้งหมดของคุณนั้นเป็น'A'หรือ'a'ไม่ใช่สิ่งที่ฉันคิดว่าเป็นชุดทดสอบที่ดี
Leun Nun

1
คุณสามารถเพิ่มตัวอย่างด้วย'w'(ตามที่wไม่ใช่ของAEIOUaeiou)?
jimmy23013

8
เครื่องหมายการออกเสียงรวมมีสถานะที่ไม่รู้จักแล้วได้รับอนุญาตแล้วถูกไม่ได้รับอนุญาต สิ่งนี้ไม่ถูกต้องอย่างน้อย 4 คำตอบ Boo! ฟ่อ! ฉันเปลี่ยน upvote เป็น downvote :(
Digital Trauma

1
@ DigitalTrauma ฉันเสียใจมากสำหรับเรื่องนี้
Roman Gräf

4
เพิ่ม testcase:'q'e'd'
ชื่อที่แสดง

คำตอบ:


11

JavaScript (ES6), 81 70 68 ไบต์

s=>s.replace(/'[aeiou]'/gi,c=>"ï   ÖÄöä ËÜëüÏ "[c.charCodeAt(1)%15])

ลองมัน

f=
s=>s.replace(/'[aeiou]'/gi,c=>"ï   ÖÄöä ËÜëüÏ "[c.charCodeAt(1)%15])
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("'A'sthetik")) // Ästhetik
console.log(f("Meinung ist wichtig!")) // Meinung ist wichtig!
console.log(f(`Ich sagte: "Er sagte: 'Ich habe Hunger'"`)) // Ich sagte: "Er sagte: 'Ich habe Hunger'"
console.log(f(`Ich sagte: "Er sagte: ''A'sthetik'"`)) // Ich sagte: "Er sagte: 'Ästhetik'"
console.log(f("Hämisch rieb er sich die H'a'nde")) // Hämisch rieb er sich die Hände
console.log(f("H'a''a'slich isn't a German word")) // Hääslich isn't a German word
console.log(f("since it's really called h'a'sslich")) // since it's really called hässlich
<input id=i><pre id=o>


คำอธิบาย

  • s=> ฟังก์ชั่นไม่ระบุชื่อการใช้สตริงป้อนเข้าเป็นอาร์กิวเมนต์ผ่านพารามิเตอร์ "s"
  • s.replace(x,y) ส่งคืนสตริงที่มี "x" แทนที่ด้วย "y"
  • /'[aeiou]'/gi การแสดงออกปกติที่ไม่ตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่ตรงกับการเกิดเสียงสระทั้งหมดที่อยู่ในเครื่องหมายคำพูดเดี่ยว
  • c=> ส่งแต่ละการจับคู่ของนิพจน์ทั่วไปไปยังฟังก์ชันที่ไม่ระบุชื่อผ่านพารามิเตอร์ "c"
  • "ï ÖÄöä ËÜëüÏ "[n]ผลตอบแทนที่เป็นตัวละครที่ n (0 จัดทำดัชนี) ในสตริง "ผมÖÄöäËÜëüÏ" "ï ÖÄöä ËÜëüÏ ".charAt(n)คล้ายกับ
  • c.charCodeAt(1)%15 รับค่าส่วนที่เหลือของรหัสอักขระของอักขระตัวที่สองใน "c" (เช่นอักขระสระ) เมื่อหารด้วย 15

ทางเลือก40/52 36/48 ไบต์ (35/47 ตัวอักษร)

ต่อไปนี้เป็นคำตอบของฉันก่อนที่จะรวมกำกับกำกับไม่ได้รับอนุญาต (Boo-urns!) - ดูได้ดีขึ้นในซอนี้

s=>s.replace(/'([aeiou])'/gi,"$1̈")

อย่างไรก็ตามผลิตภัณฑ์ ETHแสดงให้เห็นว่าด้วยการเพิ่ม.normalize()สำหรับ 12 ไบต์เพิ่มเติมว่านี้จะถูกต้อง

s=>s.replace(/'([aeiou])'/gi,"$1̈").normalize()

OP ยังไม่ได้รับคำตอบcodegolf.stackexchange.com/users/59183/dzaima
2560

ไม่ถ้าอนุญาตให้ใช้การรวมกำกับ
Adám

การรวมการกำกับออกเสียงเป็นสิ่งต้องห้ามในขณะนี้
Adám

ฉันเชื่อว่าคุณสามารถทำให้ถูกต้องโดยการเพิ่ม.normalize()ไปยังจุดสิ้นสุดของฟังก์ชั่น
ETHproductions

คุณแน่ใจหรือไม่ @ETHproductions หากกำกับรวมห้ามพวกเขาไม่ได้รับอนุญาตจากที่ปรากฏในคำตอบที่ทุกคน ?
Shaggy

8

Perl 5, 25 ไบต์

s/'(\w)'/chr 1+ord$1/age

24 ไบต์บวก 1 สำหรับ-peแทน-e

สิ่งนี้ใช้กฎว่า "คุณสามารถเลือกเพจ I / O ใดก็ได้ตราบเท่าที่มันรองรับอักขระAEIOUaeiouÄËÏÖÜäëïöü'" นอกจากนี้ยังใช้ประโยชน์จากการ/aตั้งค่าสถานะใน regexes ซึ่งทำให้\wการอ้างอิงถึงตัวละครที่แม่นยำabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789ไม่ว่าพวกเขาจะถูกเข้ารหัส

เพจรหัส I / O ที่เลือกสำหรับสคริปต์ของฉันคือ:

 1  a
 2  ä
 3  e
 4  ë
 5  i
 6  ï
 7  o
 8  ö
 9  u
10  ü
11  A
12  Ä
13  E
14  Ë
15  I
16  Ï
17  O
18  Ö
19  U
20  Ü
21  '

(ฉันไม่สามารถทดสอบสคริปต์นี้ในกรณีทดสอบในคำถามเนื่องจากมีอักขระแปลก ๆ เช่นt)


ขอบคุณGrimy ที่ช่วยฉันสามไบต์ ก่อนหน้านี้ฉันมีs/'([a-z])'/chr 1+ord$1/gieซึ่งใช้ประโยชน์จาก (การเข้ารหัสและ) ความจริงที่น่าสนใจซึ่ง[a-z]เป็นกรณีพิเศษใน Perl เพื่อจับคู่อย่างแม่นยำabcdefghijklmnopqrstuvwxyzไม่ว่าจะเป็นการเข้ารหัส คำตอบก่อนหน้าของฉันคือ IMO น่าสนใจยิ่งขึ้น แต่อันนี้สั้นกว่าดังนั้นห่าฉันจะรับไป


1
ฉันตรวจสอบรายการ "ช่องโหว่ที่ถูกห้ามโดยค่าเริ่มต้น" อย่างรอบคอบก่อนที่จะโพสต์สิ่งนี้และการประดิษฐ์เพจรหัสไม่ได้อยู่ในหมู่พวกเขา และโดยเฉพาะอย่างยิ่งความจริงที่ว่าคำถามเชิญให้ใช้ "เพจ I / O ใด ๆ " ดูเหมือนว่าจะอนุญาตให้คำตอบนี้ แล้วa-zเคล็ดลับก็ทำให้คำตอบน่าสนใจจริง ๆ แทนที่จะเป็นแค่โกง (IMO, อย่างไรก็ตาม)
msh210

3
นี่เป็นกลอุบายที่ตลกเพียงครั้งเดียว แต่ฉันเชื่อว่าคุณเป็นคนแรกที่ใช้งานได้ (=
Grimmy

1
คุณสามารถประหยัด 3 ไบต์โดยใช้\wแทน[a-z]เช่นเดียวกับแทน/a /iหากตัวดัดแปลง "/ a" มีผลใช้งาน\wตรงกับอักขระ [a-zA-Z0-9_] โดยไม่คำนึงถึงวิธีการเข้ารหัส
Grimmy

@Grimy ขอบคุณ! ฉันจะแก้ไข ....
msh210


4

Japt 29 ไบต์

r"'%v'"@"ï   ÖÄöä ËÜëüÏ "gXc1

ลองออนไลน์!

คำอธิบาย

r"'%v'"@"ï   ÖÄöä ËÜëüÏ "gXc1

r"'%v'"@                       // Replace each match X of /'<vowel>'/ in the input with
        "ï   ÖÄöä ËÜëüÏ "g     //   the character in this string at index
                          Xc1  //     X.charCodeAt(1).
                               //   Values larger than the length of the string wrap around,
                               //   so this is effectively equal to " ... "[n%15].
                               // Implicit: output result of last expression

1
การใช้การกำกับรวมเป็นการโต้เถียง
Leun Nun

เอาชนะฉันไป ทางออกของคุณสั้นกว่าของฉันมาก แต่ทำได้ดีมาก
ลุ

@LeakyNun เป็นที่ถกเถียงกันสำหรับคำถามนี้หรือโดยทั่วไป?
Digital Trauma

การโต้เถียงสำหรับคำถามนี้เพราะคุณยกมันขึ้นมาในความคิดเห็น แต่มันก็ไม่เคยได้รับการแก้ไข
Leun Nun

@ Adámเอาชนะคุณได้ 38 วินาที ;-)
ETHproductions

4

Javascript, 67 ไบต์

s=>s.replace(/'.'/g,c=>"äëïöüÄËÏÖÜ"['aeiouAEIOU'.indexOf(c[1])]||c)

ลองออนไลน์!

แทนที่อักขระทั้งหมดระหว่างเครื่องหมายคำพูดด้วยอักขระ umlauted ที่เกี่ยวข้องหรือจับคู่ตัวเองหากอักขระนั้นไม่อยู่ในกลุ่มของอักขระที่ต้องเปลี่ยน


3

เยลลี่ 36 ไบต์

œṣ⁹Ṫ¤j
“.ạẏụ’D196;+\Ọż⁾''jЀØc¤;@Wç/

ลองออนไลน์!

ดูเหมือนว่าจะซับซ้อนสำหรับเยลลี่!

อย่างไร?

หมายเหตุ: เนื่องจากตัวละครไม่ได้อยู่ในโค้ดเพจ แต่อยู่ในช่วงของไบต์ใน Unicode ฉันคิดว่ามันจะต้องถูกสร้างขึ้นตามลำดับดังนั้นฉันจึงมี

œṣ⁹Ṫ¤j - Link 1, Replace: char list S [...], list R [char T, char list F]
œṣ     - split S at sublists equal to:
    ¤  -   nilad followed by link(s) as a nilad:
  ⁹    -     link's right argument, R
   Ṫ   -     tail - yield char list F and modify R to become [T]
     j - join with R (now [T])
       - all in all split S at Rs and join back up with [T]s.

“.ạẏụ’D196;+\Ọż⁾''jЀØc¤;@Wç/ - Main link: char list S
       196;                   - 196 concatenate with:
“.ạẏụ’                        -   base 250 literal 747687476
      D                       -   to decimal list [7,4,7,6,8,7,4,7,6]
           +\                 - cumulative reduce with addition: [196,203,207,214,220,228,235,239,246,252]
             Ọ                - cast to characters: ÄËÏÖÜäëïöü
                       ¤      - nilad followed by link(s) as a nilad:
               ⁾''            -   literal ["'", "'"]
                     Øc       -   vowel yield: AEIOUaeiou
                  jЀ         -   join mapped:  ["'A'", "'E'", ...]
              ż               - zip together
                          W   - wrap S in a list
                        ;@    - concatenate (swap @rguments)
                           ç/ - reduce with last link (1) as a dyad
                              - implicit print

3

V , 24 ไบต์

Óã'¨[aeiou]©'/±:
éiD@"

ลองออนไลน์!

hexdump:

00000000: d3e3 27a8 5b61 6569 6f75 5da9 272f 160b  ..'.[aeiou].'/..
00000010: b13a 0ae9 6944 4022                      .:..iD@"

นี่เป็นเพียงการแปลโดยตรงของคำตอบกลุ่มของฉันเพื่อให้ฉันสามารถเอาชนะภาษากอล์ฟทั้งหมด : P



1

/// , 67 ไบต์

/~/'\///`/\/\/~/'A~Ä`E~Ë`I~Ï`O~Ö`U~Ü`a~ä`e~ë`i~ï`o~ö`u~ü/

ลองออนไลน์!

สิ่งนี้ทำงานได้โดยการแทนที่ตัวอักษรที่ไม่ใช่จุดที่ล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยว ( 'A') ด้วยตัวอักษรเดียวกับเครื่องหมายจุดโดยไม่มีเครื่องหมายคำพูดเดี่ยว ( Ä) ทดแทนเดียวของลักษณะนี้เช่นนี้ /'A'/Ä/(ก่อนกอล์ฟ):

กอล์ฟใช้สองเหตุการณ์ทั่วไป//และ'/และใช้เป็นสิ่งทดแทน


1

Swift - 201 ไบต์

import Foundation;func g(s:String){var e=s;var r="aeiouAEIOUäëïöüÄËÏÖÜ".characters.map{String($0)};for i in r[0...9]{e=e.replacingOccurrences(of:"'\(i)'",with:r[r.index(of:i)!+10])};print(e)}

การใช้งาน: g("'A'sthetik") // => Ästhetik


1
characters.map{blah blah}และreplacingOccurrences()ฆ่าความสนุกจริงๆ: ((
นาย Xcoder

1

APL (Dyalog) , 53 ไบต์

(v'''[AEIOUaeiou]''')⎕R{'  ÄËÏÖÜäëïöü'[v2⊃⍵.Match]}

ลองออนไลน์!

ใช้ PCRE R eplace (บันทึก RegEx เป็นv ) เพื่อใช้ฟังก์ชันต่อไปนี้กับสระที่ยกมา:

{ ฟังก์ชั่นไม่ระบุชื่อ

' ÄËÏÖÜäëïöü'[…ทำ] ดัชนีสตริง (หมายเหตุช่องว่างสองช่องที่ตรงกับ'[) ด้วย:

  ⍵.Match สตริงที่ตรงกัน

  2⊃ เลือกตัวอักษรที่สอง (เสียงสระ)

  v⍳ ค้นหาดัชนีในv

}



1

ไบต์ SOGL , 43 35 (UTF-8)

L∫:ÆW ':h++;"äëïöü”:U+Wŗ

คำอธิบาย:

L∫                        repeat 10 times, pushing current iteration (0-based)
  :                       duplicate the iteration
   ÆW                     get the index (1-based) in "aeiouAEIOU"
      ':h++               quote it
           ;              put the copy (current iteration) ontop
            "äëïöü”       push "äëïöü"
                   :      duplicate it
                    U     uppercase it
                     +    join together, resulting in "äëïöüÄËÏÖÜ"
                      W   get the index (1-based) in it
                       ŗ  replace [in the input, current char from "aeiouAEIOU" with
                          the corresponding char in "äëïöüÄËÏÖÜ"

3
Heh หนึ่งคิดว่า̈+เป็นฟังก์ชั่นใน SOGL
Adám

การรวมการกำกับออกเสียงเป็นสิ่งต้องห้ามในขณะนี้
Adám

1

05AB1E , 30 29 24 ไบต์

-6 ไบต์ขอบคุณ Emigna

žMDu«S''«''ì"äëïöü"Du«S:

05AB1E มีอักขระäëïöüในหน้ารหัสได้อย่างสะดวก

ลองออนไลน์!

(รหัสเก่า)

žMDu«Svy''.ø})"äëïöü"Du«¹ŠS:

คำอธิบาย (ล้าสมัย):

žM                             Push aeiou                    ['aeiou']
  D                            Duplicate                     ['aeiou', 'aeiou']
   u                           Uppercase                     ['aeiou', 'AEIOU']
    «                          Concatenate                   ['aeiouAEIOU']
     vy                        For each...
       ''                        Push '
         .ø                      Surround a with b (a -> bab)
           }                   End loop
            )                  Wrap stack to array           [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"]]
             "äëïöü"           String literal.               [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöü']
                    Du«        Duplicate, uppercase, concat  [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöüÄËÏÖÜ']
                       ¹       Push first input
                        Š      Push c, a, b                  ["'A'sthetik", ["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöüÄËÏÖÜ']
                          S    Convert to char list          ["'A'sthetik", ["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], ['ä', 'ë', 'ï', 'ö', 'ü', 'Ä', 'Ë', 'Ï', 'Ö', 'Ü']]
                           :   Replace all                   ['Ästhetik']
                               Implicit print

ลองออนไลน์!


คุณสามารถแทนที่ด้วย Š
Emigna

คุณสามารถบันทึกเพิ่มอีกไม่กี่ไบต์ด้วยžMDu«S''«''ì"äëïöü"Du«S:
Emigna

@Emigna ขอบคุณอีกครั้ง
Okx

นอกจากนี้คุณยังไม่จำเป็นต้องIที่จุดเริ่มต้น :)
Emigna

1

Python 3.6, 98 92 ตัวอักษร

import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub(p,lambda x:'ÄËÏÖÜäëïöü'[p.index(x[1])-3],i)

มันเป็นฟังก์ชั่นไม่ใช่โปรแกรมที่สมบูรณ์

จัดรูปแบบเพื่อให้อ่านง่าย:

import re

a = lambda i, p="'([AEIOUaeiou])'":\
    re.sub(p, lambda x: 'ÄËÏÖÜäëïöü'[p.index(x[1]) - 3], i)

ขอบคุณ @ValueInk สำหรับเคล็ดลับที่ชาญฉลาดสำหรับการเล่นกอล์ฟต่อไป


ไม่ทำงานสำหรับฉัน หยุดด้วย TypeError
ทั้งหมด

@tallyallyhuman คุณแน่ใจเหรอ? ดูเหมือนว่าจะทำงานให้ฉัน คุณต้องเรียกใช้aฟังก์ชันด้วยสตริงที่คุณต้องการแทนที่
numbermaniac


1
รายงานเอกสาร Python ที่match.__getitem__(g)ใหม่กับ Python 3.6 ดังนั้นควรระบุไว้ในส่วนหัวของคุณ นอกจากนี้ถ้าคุณเปลี่ยน regex ของคุณเพื่อ'([AEIOUaeiou])'ให้คุณประหยัดไบต์โดยการเปลี่ยนx[0][1]ไปx[1]และใช้แทน-3 -2
หมึกมูลค่า

1
ที่จริงแล้วมันสั้นไปกว่าเดิมimport re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...เนื่องจากคุณตัดค่าใช้จ่ายออกไปเล็กน้อยโดยไม่ต้องใช้returnคำสั่งอีกต่อไป!
Value Ink

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