Atau apakah ini untuk Anda


36

Saya suka cypher sederhana ini, sangat menyenangkan membaca kata-kata yang tidak bisa dibaca manusia dan mengisi kekosongan ...

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

Aturannya sangat sederhana:

  • Terima beberapa teks sebagai input (karakter ascii, huruf besar / kecil dan tanda baca).
  • Untuk setiap vokal, putar ke vokal berikutnya, atau kembali ke awal.
    • a => e
    • e => i
    • i => o
    • o => u
    • u => a
  • Huruf besar tetap huruf besar, huruf kecil tetap huruf kecil.
  • Keluarkan teks setelah konversi ini.
  • Tidak perlu mendukung aksen.
  • Semua karakter lain harus tetap tidak berubah.
  • Cobalah untuk melakukannya dalam jumlah byte terkecil.
  • Bahasa lama yang Anda suka.

Uji Kasus

It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of light, it was the season of darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to heaven, we were all going direct the other way –
in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received,
for good or for evil, in the superlative degree of comparison only.

Di luar:

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

Di:

The quick brown fox jumps over the lazy dog.

Di luar:

Thi qaock bruwn fux jamps uvir thi lezy dug.

Di:

Home is where the heart is.

Di luar:

Humi os whiri thi hiert os.

Di:

Boaty McBoatface

Di luar:

Buety McBuetfeci

Di:

AEIOUaeiou

Di luar:

EIOUAeioua

Di:

Programming Puzzles And Code Golf

Di luar:

Prugremmong Pazzlis End Cudi Gulf


4
Hmm. Bahasa Inggris lama?
iammax

10
Masih lebih mudah dibaca daripada Beowulf.
Smeato

4
Tampak seperti penerjemah kiwi bagi saya.
Magoo

1
Saya suka bagaimana "jahat" ketika cipher untuk "ivol", secara efektif diucapkan dengan cara yang sama.
Enrico Borba

Jawaban:



22

MS-SQL, 51 Bytes

Bekerja pada SQL 2017 atau lebih baru:

SELECT TRANSLATE(v,'AEIOUaeiou','EIOUAeioua')FROM t

Fungsi baru TRANSLATEmelakukan penggantian karakter individu, sehingga sangat cocok untuk tantangan ini.

Input adalah melalui tabel t yang sudah ada sebelumnya dengan kolom varchar v , sesuai aturan IO kami .

Dalam hal ini tabel harus dibuat menggunakan susunan case-sensitive , baik dengan menjalankan pada server case-sensitive, atau dengan menggunakan COLLATEkata kunci (tidak dihitung terhadap total karakter):

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)

EDIT : SSMS dapat memotong kutipan panjang di atas ketika mengembalikan hasil dalam jendela "hasil ke teks", ini adalah pengaturan klien, bukan bug dalam program saya .

Untuk memperbaiki, buka Tools > Options > Query Results > SQL Server > Results to Textdan tingkatkan "Jumlah karakter maksimum yang ditampilkan di setiap kolom."


1
Saya benar-benar terkejut bahwa SQL bahkan dekat untuk bersaing untuk ini. Juga, itu fungsi yang keren! Terima kasih telah memberi tahu kami :)
Gugatan Dana Monica

@NicHartley Ya, mereka tampaknya menambahkan beberapa fungsi yang berguna setiap versi. Anda dapat menyarangkannya dengan REPLACEbeberapa trik juga: REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')untuk menghilangkan semua angka dari string, misalnya. Masih panjang, tetapi jauh lebih pendek dari 10 bersarang REPLACE.
BradC


14

Haskell , 52 byte

(a:b)!c|a/=c=b!c|1>0=b!!0
a!b=b
map("aeiouaAEIOUA"!)

Cobalah online!

Lynn menyelamatkan saya dua byte dengan menunjukkan bahwa !!0itu lebih pendek dari head.

Penjelasan

Jika Anda belum pernah membuat kode di Haskell, ini mungkin akan terlihat seperti tumpukan omong kosong. Jadi pertama-tama mari kita ungolf dan memecahnya:

(a:b)!c
 |   a/=c   = b!c
 |otherwise = b!!0
a!b=b
map("aeiouaAEIOUA"!)

Pertama kita memiliki fungsi !, yang mengambil string sdan karakter c. Pencocokan pola pertama kami menerima input jika string tidak kosong. Jika string tidak kosong, kami membandingkan karakter pertamanya dengan c. Jika karakter pertamanya tidak sama dengan ckita melemparkannya dan memanggil !lagi dengan sisa string dan c. Jika sama, kita mengembalikan karakter kedua dalam string.

Pencocokan pola kami berikutnya menangkap string dalam semua kasus lain, yaitu jika string kosong. Dalam hal ini kami hanya kembali c.

Semua dalam semua fungsi ini mengambil karakter cdan string sdan mengembalikan karakter setelah kemunculan pertama cdi s. Jika kita melewati ini dengan aeiouaAEIOUAitu akan melakukan sandi kita pada satu karakter. Untuk membuat seluruh fungsi kita, kita harus memetakan ini di seluruh string.


12

Retina ,10 9 8 byte

T`uo`vVA

Cobalah online!

Disimpan 1 byte berkat Neil! Dan satu byte lagi berkat Martin!

Versi baru dari retina memiliki kelas vokal, yang membuat hasilnya sedikit lebih pendek. Transliterasi juga menggunakan kelas "lain". Jadi tokelasnya terlihat seperti "aeiouAEIOUA" sedangkan fromkelasnya tampak seperti "uaeiouAEIOUA"

Ini tidak menimbulkan masalah karena upemetaan kedua Atidak akan pernah dilakukan karena usudah dipetakan a.


9 byte: T`_o`uvUV.
Neil

Ini jawaban yang sangat singkat!
AJFaraday

@Neil pintar, terima kasih! Saya pikir meletakkan _dalam dari set akan memperlakukannya secara harfiah, tetapi sepertinya tidak melakukan itu.
FryAmTheEggman

3
Anda dapat mencukur satu lagi, tapi sepertinya saya tidak bisa mengikat Stax, sayangnya: tio.run/##HYnBDoIwEAXv/…
Martin Ender

@ MartinEnder Terima kasih! Itu pengaturan yang cerdik, menggabungkan keduanya. Saya belum mencoba menggunakan Ybanyak jadi saya akan mencobanya besok.
FryAmTheEggman


6

Python 3, 62 byte

lambda x:x.translate(str.maketrans('aeiouAEIOU','eiouaEIOUA'))

Buat tabel terjemahan (kamus) dengan metode strstatis str.maketrans. Terjemahkan karakter yang relevan ke karakter tujuan mereka.


Di mana ini melakukan I / O?
reinierpost

@reinierpost Ini adalah fungsi. Input melalui xparameter. Dalam python, fungsi lambda tidak perlu pernyataan kembali.
mypetlion

6

C, 85 76 67 65 64 byte

f(char*c){for(;*c;)putchar(1[index("AEIOUAaeioua",*c++)?:c-2]);}

Port of Java Kevin Cruijssen menjawab . Cobalah online di sini .

Terima kasih kepada Kevin Cruijssen untuk bermain golf 9 byte, untuk Christoph untuk bermain golf 11 byte dan untuk ceilingcat untuk bermain golf 1 byte.

Versi tidak disatukan:

f(char* c) { // function taking a char array as parameter and implicitly returning an unused int
    for(; *c ;) // loop over the input
        putchar(1 [index("AEIOUAaeioua", * c++) ?: c-2]); // find the first pointer to the current char in the vowels string, NULL if not present; if it's not NULL, print the next vowel, otherwise just print the char
}

1
Tampaknya tidak ada ekstensi standar dari gcc. Saya tahu itu dari php dan cukup mencobanya.
Christoph

1
@Christoph Saya suka penggunaan rekursi Anda, tapi saya tidak yakin kami bisa menampilkan trailing \0. Juga, ini tidak berfungsi ketika dikompilasi dengan dentang: tio.run/##S9ZNzknMS///…
OOBalance

1
@Christoph: Saya ingin tahu di mana perilaku tidak terdefinisi itu, jadi saya debugged versi dentang, setelah ungolfing lagi. const char *res = strchr("AEIOU...", 0)mengembalikan pointer ke terminator dalam string literal. putchar(res[1])membaca melewati akhir string literal. Dengan gcc ternyata kebetulan menemukan nol byte lain dan kebetulan bekerja, tetapi dengan dentang itu mendapat 73 'I'(mungkin dari mainstring literal, "Itu ...", tapi saya tidak memeriksa asm). Jadi putchartidak mengembalikan 0, dan kami akhirnya segfault ketika *c++membaca halaman yang belum dipetakan.
Peter Cordes

2
@PeterCordes ya saya tahu tentang itu di sini setelah memiliki kecurigaan. Pokoknya di sini 2 byte lagi disimpan f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. Itu saja untuk sekarang saya kira.
Christoph

1
@Rogem Karena properti komutatif dari penambahan a[b]==*(a+b)==*(b+a)==b[a],. Oleh karena itu1[...]==(...)[1]
ceilingcat



5

Python 2 , 79 68 67 byte

-1 byte terima kasih kepada @ArnoldPalmer

V='uaeiouAEIOUA'
print''.join((V[1:]+c)[V.find(c)]for c in input())

Cobalah online!


67 byte . Juga, maaf jika Anda dibanjiri pemberitahuan, saya belum mengirim komentar untuk sementara waktu dan lupa bagaimana melakukannya.
Arnold Palmer

@ArnoldPalmer Terima kasih! Tidak apa-apa, saya pergi dan mereka semua merindukan saya: D
Dead Possum

5

JavaScript (ES6), 60 byte

s=>s.replace(/./g,c=>(S='aeiouaAEIOUA'+c+c)[S.indexOf(c)+1])

Cobalah online!


s=>s.replace(/./g,c=>'auoieaAUOIEA'.match(".(?=${c})")||c)
tsh

Kesalahan: only.=>unlya
l4m2


4

Pyth, 17 byte

em=.rQdrB"aeiou"1

Coba di sini

em=.rQdrB"aeiou"1
 m                  For each string...
       rB"aeiou"1   ... in ['aeiou', 'AEIOU']...
  =.rQd             ... cyclically rotate the characters in the input.
e                   Take the last.


4

Java 10, 97 87 byte

s->{for(var c:s){var t="AEIOUAaeioua"+c+c;System.out.print(t.charAt(t.indexOf(c)+1));}}

-10 byte setelah terinspirasi oleh jawaban JavaScript @Arnauld (versi 60-byte) .

Cobalah online.

Penjelasan:

s->{                         // Method with character-array parameter and no return-type
  for(var c:s){              //  Loop over the input characters
    var t="AEIOUAaeioua"     //  Temp-String containing the order of vowels 
                             //  (including additional 'A' and 'a'),
          +c+c;              //  appended with two times the current character
    System.out.print(        //  Print:
      t.charAt(              //   The character in String `t` at index:
         t.indexOf(c)+1));}} //    The (first) index of the current character in `t` + 1

4

05AB1E , 14 13 11 byte

žMDÀ‡žMuDÀ‡

Cobalah online!


1
Anda dapat menyimpan dua byte dengan hanya mengambil input sebagai string multi-line, jadi tidak perlu untuk |dan »: Coba online: 11 byte .
Kevin Cruijssen

@KevinCruijssen Terima kasih! Bukankah itu sesuatu yang diperbaiki dalam rilis 05AB1E baru-baru ini?
Kaldo

Tidak tahu tbh. Hanya dimulai pada 05AB1E sejak awal tahun ini. Anda bisa bertanya @Adnan di obrolan 05AB1E ketika fitur ditambahkan jika Anda ingin tahu.
Kevin Cruijssen


3

APL + WIN, 55 byte

Anjuran untuk input string:

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s

3

Mumps, 38 byte

R T W $TR(T,"AEIOUaeiou","EIOUAeioua")

Mumps biasanya tidak menambahkan carriage return, karena saya tidak melihat persyaratan untuk memisahkan input dari output, itu memang terlihat agak aneh saat dijalankan pertama kali. Misalnya, output untuk test case terakhir terlihat seperti ini:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

Jika Anda ingin menambahkan carriage return, tambahkan dua byte dengan demikian:

R T W !,$TR(T,"AEIOUaeiou","EIOUAeioua")

3

Vim + tpope / vim-abolish , 30 byte

:%S/{a,e,i,o,u}/{e,i,o,u,a}/g<cr>

Solusi alternatif, juga 30 byte:

Oe,i,o,u<esc>|D:%s/{a,<C-r>"}/{<C-r>",a}/g

Menurut meta , jawaban vim dapat menggunakan plugin tanpa penalti byte. Ini bukan jawaban vim, tetapi vim + menghapuskan jawaban.


Abolish adalah plugin yang sangat berguna. Bagian README ini dengan baik menggambarkan bagaimana perintah ini ( Subvertperintah) bekerja.


3

CJam , 29 19 byte

q"aeioua"_eu+_1m<er

Cobalah online!

-10 byte terima kasih kepada @Peter Taylor

Penjelasan:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate

Meskipun pertanyaannya tidak spesifik tentang input, saya pikir Anda mungkin harus menggunakan qdaripada lmengambil input. Kasing uji pertama tampaknya multisaluran. Anda juga dapat mempersingkat "eioua"untuk _1m<. Bahkan, Anda bisa melangkah lebih jauh dan bermain golf ini untukq"aeioua"_eu+_1m<er
Peter Taylor


2

PHP, 90 Bytes

Cobalah online

Kode

function f($s){echo strtr($s,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));}

Penjelasan

function f($s){
 echo strtr(
       $s,                          #The string to operate
       array_combine(               #combining arrays
            str_split(UuAaEeIiOo),  #splitting this strings
            str_split(AaEeIiOoUu))
              # With array combine php creates an array like
              # ["U"=>"A", "a"=>"e"....and so on]
              # strtr can replace strings in a string, using an array with 
              # the values to replace and with what replace each value.
 );
}

75 Bytes jika dijalankan dengan php -rmenggunakan$argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));


2

str , 18 byte

[aeiouaAEIOUA]#D#U

Cobalah online!

Penjelasan

                       implicit: over each character of the input:
[aeiouaAEIOUA]#D#U
[            ]         push this string
              #D       set this to the operation domain
                #U     set the charcter to the next character in the domain

2

PHP, 38 byte

Cukup sederhana, tidak terlalu kreatif, digunakan strtruntuk mengganti vokal:

<?=strtr($argn,aeiouAEIOU,eiouaEIOUA);

Jalankan dengan echo '<input>' | php -nF <filename>atau Coba online .


Apakah ini tidak mengasumsikan bahwa input diberikan ke variabel yang telah ditentukan argn? Jika demikian maka itu tidak valid; Anda harus meneruskan string sebagai argumen dan menggunakannya $argv1].
Shaggy

2
@ Shaggy Tidak, jika Anda menjalankannya dengan -Fflag, maka itu berfungsi dengan input pada baris perintah. Dari opsi-opsi dokumentasi PHP : -F --process-file PHP file to execute for every input line. Added in PHP 5.Coba mendefinisikan variabel online hanya karena beberapa orang tidak memiliki PHP diinstal secara lokal, dan saya tidak bisa mendapatkan -Fbendera bekerja di TIO.
Davіd

1
Terima kasih, @ David - itu "sesuatu yang baru" untuk PHP hari ini :)
Shaggy

2

q / kdb +, 36 33 byte

Larutan:

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'

Contoh:

q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"AEIOUaeiou"
"EIOUAeioua
q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"Programming Puzzles And Code Golf"
"Prugremmong Pazzlis End Cudi Gulf"

Penjelasan:

Mencari tahu indeks vokal, tambahkan satu untuk mendorong ke yang berikutnya dan indeks masuk Masih berpikir pendekatan ini dapat ditingkatkan secara signifikan ...

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@' / the solution
{                             }@' / apply lambda to each character of input
                            ?x    / look up x in...
          (                )      / do together
             "aeiouaAEIOUA"       / lookup list
           v:                     / save as v
        1+                        / add one
 (     )                          / do together
    2#x                           / take 2 copies of x
  v,                              / prepend v

Bonus:

Solusi ** 36 byte (()) saya yang lama yang saya pikir cukup keren, tetapi perlu mengurangi daftar untuk membuatnya kompetitif:

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]

2

Arang , 35 byte

UT≔AUOIEAauoieaσF¹¹⊞υ➙§σ⊕ι§σι▷SR⟦Sυ

Cobalah online!

Metode naif.

Penjelasan:

UT                                         Set trim option to on, so output won't be a rectangle
    ≔AUOIEAauoieaσ                          Assign "AUIOEAauioea" to s
                   F¹¹                      For i (ι) from 0 to 10
                       ⊞υ                   Push to u (initially empty list)
                          ➙                 Rule of:
                            §σ⊕ι            S[i + 1]
                                 §σι         to S[i]. This is so a->A gets overwriteen by a->e
                                    ▷SR⟦Sυ  Replace input as string using u (now a list of rules)

2

PHP , 76 byte

$s=strtr($s,array_combine(str_split("aeiouAEIOU"),str_split("eiouaEIOUA")));

Saksikan berikut ini!

Ini adalah yang terpendek yang dapat saya lakukan dalam PHP.

$s = //overwrite $s variable ($s should be a defined string or input)
    strtr(  //strtr replaces key => value pairs from arrays in a string
        $s, //the string we are converting
        array_combine( //create an array with key value pairs, key should be original vowel letter and value should be it's replacement
            str_split("aeiouAEIOU") //turn vowels (lower and upper) into an array
            ,str_split("eiouaEIOUA") //turn vowel replacements into an array
        )
    );
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.