ทำซ้ำสัมผัสและวนลูปบนสระ


15

เสียงสระสัมผัส: แอปเปิ้ลและกล้วย

มีเพลงเด็กแบบดั้งเดิมที่ซ้ำข้อความเดิมซ้ำแล้วซ้ำอีกทุกครั้งที่เสียงสระทุกครั้งจะถูกแทนที่ด้วยเสียงสระแบบสุ่ม แต่จะคงที่ในบทบทปัจจุบัน

ท้าทาย

วัตถุประสงค์คือเพื่อเสนอรหัสที่สั้นที่สุดที่ดำเนินการเปลี่ยนแปลงดังกล่าวในข้อความอินพุต

กฎระเบียบ

  1. คุณต้องพิมพ์คำคล้องจองหลาย ๆ ครั้งเนื่องจากมีเสียงสระชัดเจน
  2. การพิมพ์แต่ละครั้งจะต้องคั่นด้วยตัวแบ่งบรรทัด (คอมโบเฉพาะแพลตฟอร์มของ\nและ\rเป็นที่ยอมรับ)
  3. สำหรับการวนซ้ำiให้แทนที่สระแต่ละตัวด้วยสระที่iแตกต่างกันในข้อความต้นฉบับ
  4. ป้อนข้อความเป็นลำดับของอักขระ ASCII ที่พิมพ์ได้ [32, 126](ช่วง
  5. ข้อมูลที่ป้อนจะไม่มีตัวแบ่งบรรทัดฝังอยู่
  6. ตัวอักษรสระจะต้องได้รับผลกระทบส่วนอื่น ๆ จะต้องส่งออกตรงตามที่ป้อน
  7. มีเพียงตัวอักษรสระเท่านั้นที่มีให้: สระจมูกแม้ว่าจะฟังดูเหมือนสระ (เช่นในภาษาฝรั่งเศส"ตินติน" ) จะต้องไม่ถูกจัดการเป็นสระเดี่ยว
  8. กรณีสำคัญสำหรับเอาต์พุต แต่เป็นตำแหน่ง (การแทนที่สระตัวพิมพ์ใหญ่จะทำกับสระตัวพิมพ์ใหญ่แทน)
  9. เสียงสระตัวใหญ่ไม่แตกต่างจากตัวพิมพ์เล็ก (เช่นa<=> A)
  10. สระที่ต่อเนื่องกันจะพิจารณาแยกกันเสมอ (เช่นBoatให้ผลผลิตทั้งสองBootและBaat)
  11. เนื่องจากตัวอักษรyแสดงถึงสระหรือพยัญชนะสระ (ขณะที่เรากำลังพูดภาษาอังกฤษ) การจัดการเป็นสระหรือพยัญชนะได้รับอนุญาต แต่คำตอบจะต้องระบุอย่างชัดเจนว่าพวกเขาจัดการyเป็นสระหรือไม่

ตัวอย่าง:

สวัสดีชาวโลก

Hello world!

ให้:

Helle werld!
Hollo world!

ข้อความที่ตัดตอนมาจากข้อความต้นฉบับภาษาฝรั่งเศส (แปล) โดยมีyการจัดการเป็นสระ:

An elephant that was rambling all gently in the woods...

ให้:

An alaphant that was ramblang all gantla an tha waads...
En elephent thet wes rembleng ell gentle en the weeds...
In iliphint thit wis rimbling ill gintli in thi wiids...
Yn ylyphynt thyt wys rymblyng yll gyntly yn thy wyyds...
On olophont thot wos romblong oll gontlo on tho woods...

สังเกตพฤติกรรมของเสียงสระตัวพิมพ์ใหญ่นำหน้า: case ถูกเก็บไว้ที่ดัชนี (กฎ 8 และ 9)

ตัวอย่างเสียงสระ

อินพุตที่ไม่มีสระใด ๆ เช่น:

lgn@hst:~$ rm -rf ./* ~ /

ต้องไม่สร้างเอาต์พุตหรือตัวแบ่งบรรทัดเดียว

อินพุตเสียงสระเดี่ยว

อินพุตที่มีสระเดี่ยวจะถูกเอาต์พุตตามที่เป็น

Dad sat at a car and saw a fat bat.

ให้:

Dad sat at a car and saw a fat bat.

นี่คือดังนั้นรหัส bytecount ที่น้อยที่สุดชนะ (ไม่มีอะไรนอกจากความรุ่งโรจน์ PPCG นิรันดร์)!

คำตอบ:


6

จอตาติน่า 45 ไบต์

~(K`A\EI\OU
L$`\\?(.)
./$1/i&$*\T`Vv`5*$&$L$&

ลองออนไลน์!ไม่นับyเป็นสระ คำอธิบาย:

K`A\EI\OU

A\EI\OUแทนที่ข้อความที่มีสายอักขระตัวอักษร

L$`\\?(.)

ตรงกับตัวอักษรแต่ละตัวเลือกนำหน้าด้วยแบ็กสแลช

./$1/i&$*\T`Vv`5*$&$L$&

ส่งออกบรรทัดรหัส Retina สำหรับตัวอักษรแต่ละตัว

~(

ประเมินรหัสที่สร้าง (แสดงด้านล่าง) โดยใช้อินพุตต้นฉบับ .ทำให้เกิดรหัสที่จะไม่เอาท์พุท (สุดท้าย) บัฟเฟอร์ /<vowel>/i&ทำให้เกิดส่วนที่เหลือของบรรทัดให้ทำงานเฉพาะถ้าใส่มีสระที่กำหนด (กรณี insensitively) *ทำให้เกิดผลของบรรทัดที่จะละเลยเพื่อให้สระถัดไปสามารถทดสอบได้ \ทำให้เกิดผลที่จะพิมพ์บนเส้นของตัวเองก่อนที่มันจะถูกละเว้น T`Vv`AAAAAatransliterates พิมพ์ใหญ่Vowels ไปAAAAAและตัวพิมพ์เล็กทั้งหมดvowels aไป ไม่ใช่คลาสตัวละคร แต่โชคดีที่มันไม่ได้หลบหนีเช่นกัน)\Aคือการหลบหนีที่หมายถึง ASCII 07 (BEL) แต่E, Oและoถูกสร้างขึ้นในชั้นเรียนตัวอักษรที่จะต้องหนีไปให้ค่าที่แท้จริงของพวกเขา (e

./A/i&*\T`Vv`AAAAAa
./E/i&*\T`Vv`\E\E\E\E\E\e
./I/i&*\T`Vv`IIIIIi
./O/i&*\T`Vv`\O\O\O\O\O\o
./U/i&*\T`Vv`UUUUUu

อืมรหัสที่สร้างตัวเอง ฉันไม่รู้จักจอตาดี แต่ก็น่าประทับใจ!
joH1

@ joH1 สำหรับฉันบิตที่น่าประทับใจคือมันช่วยประหยัด 60 ไบต์!
Neil


4

ทุบตี, 96 ไบต์

โซลูชันสองตัวที่มีความยาวเท่ากัน:

v=aeiouAEIOU;for x in `grep -o [$v]<<<$1|sed 's/./\L&&&&&\U&/'|awk !a[\\$0]++`;{ tr $v $x<<<$1;}
v=aeiouAEIOU;for x in `tr -cd $v<<<$1|sed 's/./\L&&&&&\U&\n/g'|awk !a[\\$0]++`;{ tr $v $x<<<$1;}

ลองออนไลน์!

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งและส่งออกไปยัง STDOUT


4

05AB1E (ดั้งเดิม) , 19 ไบต์

(ทางอ้อม) บันทึกหนึ่งไบต์ด้วยเควิน (การพิมพ์โดยตรงภายในลูปแทนที่จะเข้าร่วมทำได้เฉพาะในเวอร์ชันดั้งเดิม)

lžMÃÙεžMDu«s5×Du«‡=

ลองออนไลน์!

ใช้ Elixir เขียนใหม่ 20 ไบต์

lžMÃÙεžMDu«s5×Du«‡}»

ลองออนไลน์! (ไม่รวมy) | ลองออนไลน์! (มีy,žMถูกแทนที่ด้วยžO- เช่นเดียวกับรุ่นเดิม)

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

lžMÃÙεžMDu«s5×Du«‡}»     Full program. Example: "Hello"
l                        Convert the input to lowercase. "Hello" –> "hello"
 žMÃ                     Keep only lowercase vowels. "hello" –> "eo"
    Ù                    Remove duplicates. "eo" –> "eo"
     ε            }      For each of the characters (example with "e"):
      žMDu«              Yield "aeiouAEIOU"
           s5×           Swap, and repeat the current char 5 times. "e" –> "eeeee"
              Du«        Duplicate, uppercase and merge. "eeeee" –> "eeeeeEEEE"
                 ‡       Transliteration. For each item in B, replace it in A with
                         the corresponding item in C.
                   »     Join on newlines.

คำตอบที่ดีสั้นกว่าคำตอบ 21 ไบต์ที่ฉันเตรียมไว้ คุณสามารถกอล์ฟหนึ่งไบต์มากขึ้นโดยการวนลูปและการพิมพ์แทนการทำแผนที่: 19 ไบต์ TIO ของคุณด้วยyควรใช้6แทน5, btw
Kevin Cruijssen

@KevinCruijssen แก้ไขแล้วขอบคุณ! เกี่ยวกับyรุ่น -vowel ฉันบังเอิญคัดลอกลิงค์ TIO ผิดเมื่อฉันตอบ: | ...
Mr. Xcoder

อ่าตอนนี้ฉันรู้แล้วว่าทำไมฉันถึงได้iในรหัสของฉัน .. คำตอบของคุณล้มเหลวในการป้อนข้อมูลโดยไม่ต้องสระ คาดว่าจะเป็นเอาต์พุตที่ว่างเปล่า แต่จริง ๆ แล้วมันจะพิมพ์อินพุตเอง .. :(
Kevin Cruijssen

1
@KevinCruijssen 20-byter ทำงานได้ดังนั้นฉันจึงย้อนกลับและแก้ไขลิงก์ที่สอง
Mr. Xcoder

4

Japt v2.0a0 -R, 24 22 ไบต์

ถือว่าyเป็นเสียงสระ เปลี่ยนทั้งที่ปรากฏของ\yการ\vที่จะรักษามันเป็นพยัญชนะ

v f\y â £r\y_Xc^H*ZøZu

ลองมัน


คำอธิบาย

v                          :Lowercase
   \y                      :RegEx /[aeiouy]/gi (\v is /[aeiou]/gi)
  f                        :Get all matches as an array
      â                    :Deduplicate
        £                  :Map each X
         r\y               :  Replace all matches of the RegEx above in the input
             _             :  Pass matches through a function as Z
              Xc^          :    XOR the character code of X with
                 H*        :     32 multiplied by
                   Zø      :     Does Z contain
                     Zu    :      Uppercase Z
                           :Implicitly join with newlines and output

3

เยลลี่ ,  23 20 18  17 ไบต์

-2 ขอบคุณ Erik the Outgolfer

ØcŒHZx5fƇðØc,yð€Y

ในการyใช้เสียงสระแทนสระทั้งสองcด้วยys

ลองออนไลน์!

อย่างไร?

ØcŒHZx5fƇðØc,yð€Y - Link: list of characters, S
Øc                - vowels -> "AEIOUaeiou"
  ŒH              - split in half -> ["AEIOU", "aeiou"]
    Z             - transpose -> ["Aa", "Ee", "Ii", "Oo", "Uu"]
     x5           - times 5 -> ["AAAAAaaaaa", "EEEEEeeeee", "IIIIIiiiii", "OOOOOooooo", "UUUUUuuuuu"]
        Ƈ         - filter keep if:
       f          -   filter keep only -> those of X which have required vowels
                  -                       ...i.e. if S = "blah" then ["AAAAAaaaaa"]
         ð    ð€  - dyadic chain for €ach:
          Øc      -   vowels -> "AEIOUaeiou"
            ,     -   pair       e.g. ["AEIOUaeiou","AAAAAaaaaa"]
             y    -   translate  e.g. swap A for A, E for A, ...
                Y - join with newlines

18 bytes (เล็กน้อย) ( ż/ในคู่คือZสอง dyads ในแถวที่ซ้ายหนึ่ง unpaired ใน monad มีอาร์กิวเมนต์ในระหว่างโดยปริยาย)
Erik the Outgolfer

ขอบคุณ ( Z> _ <) ไม่แน่ใจว่าเกิดอะไรขึ้นกับเซสชัน TIO ของฉัน แต่การลบซ้ำซ้อนðไม่ทำงาน รีสตาร์ทคงที่
Jonathan Allan

TBH, ฉันก็แก้ไขx€xเหมือนกัน แต่คุณนินจาฉัน : P
Erik the Outgolfer

3

สีแดง 229 ไบต์

รับเอาyเสียงสระ

func[s][v: charset"aoeiu"w: charset"AOEIU"p: copy""parse s[any[[copy c[v | w](if not find p c[append p c lowercase c
parse s[any[[copy n to[v | w | end]](prin n)opt[v(prin c)|[w(prin uppercase copy c)]| skip]]]print""])]| skip]]]

ลองออนไลน์!

อ่านง่ายขึ้นเล็กน้อย:

f: func [ s ] [
    v: charset "aoeiu"
    w: charset "AOEIU"
    p: copy ""
    parse s[ 
        any [
            [ copy c [ v | w ]
                ( if not find p c [ 
                    append p c
                    lowercase c
                    parse s [
                        any [
                            [ copy n to [ v | w | end ] ]
                                 ( prin n )
                            opt [ v ( prin c )
                                | [ w ( prin uppercase copy c ) ]
                                | skip
                                ]
                            ] 
                        ]
                    print ""
                ] )
            ]
            | skip
        ]
    ]
]


2

Python, 129 119 112 ไบต์

import re
f=lambda s:'\n'.join(r('[AEIOU]',v.upper(),r('[aeiou]',v,s))for v in'aeiou'if v in s.lower());r=re.sub

ลองออนไลน์!

ไม่รักษา Y เป็นเสียงสระ

-7 ไบต์ขอบคุณ @ @ Mr.Xcoder


ดีใจที่เห็นว่าคุณสามารถใช้งานได้และเล่นกอล์ฟสักหน่อย! เยี่ยมมาก
joH1

112 ไบต์
Mr. Xcoder

2

JavaScript (Node.js) , 99 ไบต์

ถือว่า Y เป็นพยัญชนะ

s=>(g=F=>Buffer(s).map(c=>2130466>>c&c>64?F(c):c)+`
`)(v=>g[v&=31]||(g[v]=S+=g(c=>c&96|v)),S='')&&S

ลองออนไลน์!

แสดงความคิดเห็น

s => (                   // s = input string
  g = F =>               // g = helper function taking a callback function F
    Buffer(s)            // turn s into a Buffer
    .map(c =>            // for each ASCII code c in s:
      2130466            //   2130466 is a vowel bitmask: 1000001000001000100010
                         //                               u     o     i   e   a
      >> c               //   the ECMAScript specification enforces that the shiftCount is
                         //   the result of masking out all but the least significant 5 bits
      & c > 64           //   also make sure to ignore non-letter characters
      ?                  //   if a vowel is identified:
        F(c)             //     invoke F with c
      :                  //   else:
        c                //     just yield c
    ) + `\n`             // end of map(); coerce back to a string and append a newline
  )(v =>                 // invoke g with a callback that takes v:
    g[v &= 31] || (      //   unless this vowel has already been encountered:
      g[v] =             //     mark it as encountered
      S +=               //     and append to the output string S
      g(                 //     the result of another call to g:
        c => c & 96 | v  //       where vowels are replaced with v, using the original case
      )                  //     end of inner call to g
    ),                   //
    S = ''               //   start with S = ''
  ) && S                 // end of outer call to g; return S

2

Java 10, 196 188 ไบต์

s->{var d=new int[99];for(var c:s.toUpperCase().replaceAll("[^AEIOU]","").toCharArray())if(d[c]++<1)System.out.println(s.replaceAll("[AEIOU]",c+"").replaceAll("[aeiou]",(char)(c+32)+""));}

-8 ไบต์ขอบคุณที่@ joH1

โดยไม่ต้องใช้yเสียงสระเพื่อบันทึกไบต์

ลองออนไลน์

คำอธิบาย:

s->{                       // Method with String parameter and no return-type
  var d=new int[99];       //  Integer-array indicating which vowels we've already output
  for(var c:s.toUpperCase()//  Convert the input to uppercase
            .replaceAll("[^AEIOU]","")
                           //  Remove all non-vowels
            .toCharArray())//  Convert it to a character array)
                           //  And loop over those vowel-characters
    if(d[c]++              //   Increase the vowel-count by 1
             <1)           //   And if it was 0 this iteration:
      System.out.println(  //    Print with trailing newline:
        s                  //     The input,
         .replaceAll("[AEIOU]",c+"")
                           //     with every uppercase vowel replace with the current vowel
         .replaceAll("[aeiou]",(char)(c+32)+""));}
                           //     and every lowercase vowel replaced as well

188 ไบต์โดยการอินไลน์ตัวแปรvในลูป
joH1

@ joH1 ขอบคุณไม่แน่ใจว่าฉันพลาดไปได้ยังไง ..
Kevin Cruijssen



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