Gif - Jif, Jif - Gif

24

Dicuri dari @Downgoat dengan izin

Inti dari tantangan ini adalah (tidak) menyelesaikan perdebatan tentang pelafalan "gif".

Gif vs. Jif"


Pengucapan gif masih diperdebatkan dan meskipun seharusnya (dan harus) diucapkan jif , itu masih sering diperdebatkan.

Dalam tantangan ini, Anda akan diberikan satu set kata yang memiliki g atau j , mewakili suara yang diucapkan dengan kata tersebut. Anda juga akan mendapatkan beberapa teks untuk memperbaiki ejaan gif yang salah .

Karena ini internet dan semua orang selalu salah. Ini (bukan) kesopanan umum untuk memperbaikinya.

Contoh pengucapan yang salah adalah:

Ada gif tikus makan burrito

Ejaan gif yang salah ? Tidak bisa diterima Ini harus segera diperbaiki:

Ada jif (seperti dalam kendi) seekor tikus memakan burrito

Sudahkah kita selesai? Tidak, kamu masih salah.

Kamu selalu salah

Ini harus bekerja dengan cara lain:

Di jif , kucing mengenakan topi kucing

Kesalahan mengeja yang jelas ini harus diperbaiki, kami akan memperbaikinya untuk:

Dalam gif (seperti pada gambar) , kucing mengenakan topi kucing

Aturan

  • Input adalah string (kalimat) dan array string (atau alternatif apa pun yang masuk akal, seperti string yang dipisahkan koma) dalam urutan apa pun
  • Anda dapat mengambil gdan jkata - kata dalam urutan apa pun. Mereka dapat diambil secara terpisah.
  • Setiap instance dari gif(setiap kasus) dalam kalimat harus diganti dengan di jif (as in ___)mana ___kata yang dipilih secara acak acak dimulai dengan j dari array string, dan sebaliknya jifdengan kata-kata yang dimulai dengang .
  • HANYA kata-kata gifdan jifharus diganti (yaitu "jiffy" tidak boleh diubah). Kata-kata itu tidak salah.
  • Anda dijamin bahwa setidaknya satu kata dalam array dimulai dengan gdan setidaknya satu kata dimulai dengan j.
  • Kasing harus dilestarikan (mis. GiF->JiF ).
  • Anda dapat menulis program atau fungsi
  • Celah standar berlaku
  • Kita perlu (tidak) menyelesaikan perdebatan dengan cepat; kode terpendek dalam byte menang

Contohnya

Input dan output dipisahkan oleh satu baris:

graphic, jar, jam, gram
I saw a jif of how to pronounce gif that showed gif is pronounced jif

I saw a gif (as in graphic) of how to pronounce jif (as in jar) that showed jif (as in jam) is pronounced gif (as in gram)


gravy, jeff
G is for gIf, h is for JiF, i is for gIF, j is for JIf

G is for jIf (as in jeff), h is for GiF (as in gravy), i is for jIF (as in jeff), j is for JIf (as in gravy)

joke, june, gorilla, great
Jiffy should not be treated as a GIF or JIF, like gifted.

Jiffy should not be treated as a JIF (as in june) or GIF (as in great), like gifted.
Neil A.
sumber
3
The pronunciation of gif is debated and while it's supposed to be (and should be) pronounced **gif,** it's still commonly disputed.FTFY;)
Draco18s
15
Giraffical Interchange Format :)
Mikhail V
3
(The G silent.)
David Conrad
6
Ini jelas jif seperti di Johan. Seperti suara bulu.
R ..
2
Tergoda untuk downvote karena diucapkan dengan ag dan NOT AJ
Stan Strum

Jawaban:

6

Mathematica, 164 165 byte

Ini adalah kekejian, tetapi saya ingin seseorang berbagi rasa sakit saya.

StringReplace[f[f@"g"="j"]="g";f[f@"G"="J"]="G";z=IgnoreCase->1>0;#,x:"g"|"j"~~y:"if ":>{f@x,y,"(as in ",RandomChoice@StringCases[#2,f@x~~Except[","]..,z]}<>") ",z]&

Functionyang mengharapkan argumen pertama #menjadi kalimat yang akan dikoreksi dan argumen kedua #2menjadi serangkaian kata yang dipisahkan koma.

f[f@"g"="j"]="g";f[f@"G"="J"]="G"mendefinisikan fungsi fyang mengambil surat-surat g, G, j, dan Juntuk pengganti yang sesuai mereka. Ini sedikit lebih pendek darif@"g"="j";f@"j"="g";f@"G"="J";f@"J"="G" .

Saya juga menyetel zsama dengan IgnoreCase->Truekarena saya akan menggunakannya dua kali.

x:"g"|"j"~~y:"if "adalah StringExpressionyang cocok "gif "atau "jif ", menamai huruf pertama xdan tiga karakter terakhir y. Karena opsi z(juga dikenal sebagai IgnoreCase->True) diteruskan ke StringReplace, huruf-huruf ini dapat dalam kombinasi huruf besar dan kecil.

Saya kemudian mengganti setiap pertandingan dengan

{f@x,y,"(as in ",RandomChoice@StringCases[#2,f@x~~Except[","]..,z]}<>") " 

RandomChoice@StringCases[#2,f@x~~Except[","]..,z]secara acak memilih satu kata dari argumen kedua #2yang dimulai dengan f[x], sekali lagi mengabaikan kasus karena opsi zdiberikan.

ngenisis
sumber
3
Mengapa Anda menggunakan Mathematica untuk ini? Wow.
Neil A.
1
IgnoreCase->True=>IgnoreCase->1<2
CalculatorFeline
1
@CalculatorFeline Saya sebenarnya sudah disingkat Truedengan 1>0, hanya saja tidak dalam penjelasan saya :)
ngenisis
Anda menggunakan sinppet kode golf sepenuhnya di tempat lain. Kenapa tidak ada?
CalculatorFeline
1
@ CalculatorFeline Saya kira karena dalam kasus itu saya tidak mengutip kode, saya menjelaskan apa yang dilakukannya, yang mengatur variabel zsama dengan IgnoreCase->True. Saya melakukan hal yang sama kemudian: "yang dimulai dengan f[x]". ¯\_(ツ)_/¯
ngenisis
5

Ruby , 88 87 91 byte

-1 byte dari produk ETH. +4 byte karena kata-kata yang mengandung "gif" atau "jif" tidak boleh diganti. -2 byte karena daftar kata pengganti dapat diambil secara terpisah sekarang.

->s,g,j{s.gsub(/\b(g|j)if\b/i){$&.tr("GgJj","JjGg")+" (as in #{($1[/g/i]?j:g).sample})"}}

Cobalah online!

Nilai Tinta
sumber
6
Bisakah Anda mengubah ([gj])ke (g|j)? (idk banyak Ruby tapi saya tahu regex)
ETHproduksi
3

CJam , 78 byte

l',%:A;lS%{_ela"gifjif"3/&{_V=_el:B'g=1W?Z*+V\t" (as in "A{V=elB=!},mR')}O?S}%

Cobalah online!

Membutuhkan daftar karakter pengganti untuk dipisahkan oleh koma.


Penjelasan:

l',%                        e# read line of input and split at commas
    :A;                     e# store in var A and pop off the stack
       lS%{...}%            e# for each word in the next line of input so:

_ela"gifjif"3/&             e#   intersection of ["gif" "jif"] and [lowercase(word)]
               {...}O?      e#   if set it non-empty, run block below, otherwise do nothing (push empty string)
                      S     e#   push space

_V=                         e#     extract first char
   _el:B                    e#     duplicate to lowercase and store in var B
        'g=1W?Z*+           e#     convert g/G <=> j/J
                 V\t        e#     store back to word
" (as in "                  e#     push string
           A{V=elB=!},      e#     filter replacements by words starting with the same char (case insensitive)
                      mR    e#     select random element
                        ')  e#     push ')' char
Siguza
sumber
Tidak berfungsi pada contoh di mana gif / jif diikuti oleh koma.
Michael Boger
1

Python 3 , 237 byte

lambda s,g,j:' '.join([(w if False in(w[0]in q,w[1:2]in['i','I'],w[2:3]in['f','F'],w[3:]in",;!?.")else q[w[0]]+w[1:3]+" (as in "+choice(g if w[0]in 'jJ'else j)+')'+w[3:])for w in s.split()])
from random import*
q=dict(zip("gGjJ","jJgG"))

Cobalah online!

Ini adalah yang terbaik yang bisa saya lakukan - mungkin beberapa cara untuk melakukannya lebih cepat (mungkin dengan regex) tetapi otak saya sakit sekarang.

Penjelasan: qadalah pemetaan kamus sederhana, saya harap itu jelas. s,g,jadalah string input, daftar kata-g, dan daftar kata-j. ' '.joinbergabung bersama pemahaman daftar yang dilakukan di seluruh for w in s.split()karena itu untuk daftar kata-kata di s.

Bagian tengahnya adalah ilmu hitam, yang akan saya hancurkan sedikit demi sedikit. Pertama, kondisi: False in(w[0]in q,w[1:2]in['i','I'],w[2:3]in['f','F'],w[3:]in",;!.").

w[0]in qmemeriksa karakter pertama ada di tombol qyang ada 'g','G','j','J'. Alasan untuk berpisahq sebagai variabel adalah kita juga menggunakannya sebagai dict / map nanti.

w[1:2]in ['i','I']memeriksa apakah karakter kedua adalah i atau I.: 2 diperlukan karena menempatkan hanya w[1]akan menghasilkan kehancuran pada kata-kata 1-huruf, tetapi irisan tidak melakukan itu untuk beberapa alasan (saya pikir mereka melakukannya, apa pun!)

w[2:3]in ['f','F']analog. Saya secara singkat memiliki ini hanya sebagai 2: sebelum saya menyadari saya perlu menjelaskan gif, atau jif, diikuti dengan tanda baca!

w[3:]in",;!?."memeriksa apakah karakter selanjutnya adalah tanda baca. Saya akui kode saya tidak berfungsi jika seseorang meletakkan 'gif ?!' tapi aku tidak bisa sempurna. Orang lain dapat mengambil tantangan membuka kutipan sebelum gif atau jif juga.

False in(,,,)pada dasarnya adalah NAND besar. Sebenarnya bytecount yang sama dengan memisahkan empat item dengan anddan bertukar argumen, tetapi ini terlihat lebih keren dan berfungsi lebih baik jika Anda harus memperluasnya ke andhal ed kelima .

w ifberarti bahwa jika False ada dalam daftar bersyarat, kami hanya mengembalikan kata tidak berubah - itu tidak memenuhi kriteria kami. else, kami mengubahnya menjadi:

q[w[0]]+w[1:3]+" (as in "+choice(g if w[0]in 'jJ'else j)+')'+w[3:]

BAIK. q[w[0]]mengganti huruf pertama dengan benar. w[1:3]paku pada i atau I dan f atau F, w[3:]paku pada tanda baca apapun. Itu meninggalkan seperti pada klausa.

" (as in "+choice(g if w[0]in 'jJ'else j)+')'menempatkan string literal yang jelas di awal dan kurung trailing, bit yang menarik di sini adalah choice(g if w[0]in 'jJ'else j)yang dipilih secara acak dari gatau j, tergantung pada apakah w[0]ada di 'jJ'. dan saya baru sadar saya memiliki bit ini mundur sehingga memperbaiki itu sepanjang, selesai.

Hari yang panjang. choiceada di randommodul karenanya impor. Saya pikir itu segalanya.

Michael Boger
sumber
0

JavaScript (ES6), 142 byte

(s,g,j,r=l=>l[Math.random()*l.length|0])=>s.replace(/\b[gj]if\b/gi,w=>`GJgj`[l=`JGjg`.search(w[0])]+w.slice(1)+` (as in ${r([g,j,g,j][l])})`)

Membawa daftar kata gdan terpisah j.

Neil
sumber
0

Javascript (ES6), 151 byte

f=(s,g,j)=>s.replace(/\b(g|j)(if)\b/ig,(m,p,c)=>`${a=g,p=="j"?"g":p=="J"?"G":(a=j,p=="g"?"j":"J")}${c}(as in ${a[Math.floor(Math.random()*a.length)]})`)

Saya mungkin bisa bermain golf di bagian terner lebih, tapi saya tidak bisa memikirkan bagaimana sekarang. Juga, dibutuhkan kata-kata g dan j secara terpisah.

SuperStormer
sumber