Ot wes thist uf tomis ile birlikte


36

Ben sadece bu basit şifreyi seviyorum, insanca okunamayan kelimeleri okumak ve boşlukları doldurmak çok eğlenceli ...

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.

Kurallar süper basittir:

  • Bazı metni giriş olarak kabul edin (ascii karakterler, büyük / küçük harfler ve noktalama işaretleri).
  • Her ünlü için, bir sonraki ünlü için veya bir başa dönün.
    • a => e
    • e => i
    • i => o
    • o => u
    • u => a
  • Büyük harf ünlüler büyük harf, küçük harf ünlüler küçük harf kalır.
  • Bu dönüşümlerden sonra metni çıkar.
  • Aksanları desteklemeye gerek yok.
  • Diğer tüm karakterler değişmeden kalmalıdır.
  • En küçük bayt sayısında yapmaya çalışın.
  • Hoşunuza giden herhangi bir eski dil.

Test Kılıfları

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.

Dışarı:

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.

İçinde:

The quick brown fox jumps over the lazy dog.

Dışarı:

Thi qaock bruwn fux jamps uvir thi lezy dug.

İçinde:

Home is where the heart is.

Dışarı:

Humi os whiri thi hiert os.

İçinde:

Boaty McBoatface

Dışarı:

Buety McBuetfeci

İçinde:

AEIOUaeiou

Dışarı:

EIOUAeioua

İçinde:

Programming Puzzles And Code Golf

Dışarı:

Prugremmong Pazzlis End Cudi Gulf


4
Hmm. Olde İngilizce mi?
iammax

10
Beowulf'tan daha kolay bir okuma.
Smeato

4
Bana kivi tercümanı gibi geldi.
Magoo

1
Şifreleri “ivol” derken “kötülüğün” de aynı şekilde telaffuz edilmesini seviyorum.
Enrico Borba

Yanıtlar:



22

MS-SQL, 51 Bayt

SQL 2017 ve üzeri sürümlerde çalışır:

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

Yeni fonksiyon TRANSLATEbireysel karakter değiştirme işlemini gerçekleştirir, bu nedenle bu zorluk için idealdir.

Girdi, IO kurallarımıza göre , varchar sütunu v ile önceden varolan bir tablo üzerinden t .

Bu durumda, tablo büyük / küçük harf duyarlı bir sunucuda çalıştırılarak veya büyük / küçük harfe duyarlı bir sunucuda çalıştırılarak veya COLLATEanahtar sözcük kullanılarak (karakter toplamına göre sayılmaz) oluşturulmalıdır:

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

EDIT : SSMS, sonucu "yazıya sonuçları" penceresine döndürürken yukarıdaki uzun alıntıyı kesebilir, bu benim programımdaki bir hata değil bir istemci ayarıdır .

Düzeltmek için, gidin Tools > Options > Query Results > SQL Server > Results to Textve "Her sütunda görüntülenen maksimum karakter sayısını" artırın.


1
Gerçekten, SQL'in bunun için rekabete bile yakın olduğu konusunda şok oldum . Ayrıca, bu harika bir fonksiyon! Bize anlattığın için teşekkürler :)
Nic Hartley

@NicHartley Evet, her sürümde birkaç kullanışlı işlev ekliyor gibiler. Örneğin, REPLACEbazı hileler için de iç içe geçirebilirsiniz : REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')örneğin bir dizgede tüm sayıları kaldırmak için. Hala uzun, ama 10 iç içe REPLACEs'den çok daha kısa .
BradC


14

Haskell , 52 bayt

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

Çevrimiçi deneyin!

Lynn !!0, daha kısa olduğunu işaret ederek bana iki bayt kazandırdı head.

açıklama

Eğer Haskell’de hiç kodlamadıysanız, bu muhtemelen bir jibber yığını gibi görünecektir. Öyleyse önce ungolf yapalım ve sonra parçalayalım:

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

İlk önce bir karakter ve !dize alan bir işleve sahibiz . Dize boş değilse, ilk desen eşleştirme yakalamamız girdiyi kabul eder. Dize boş değilse ilk karakterini karşılaştırırız . Eğer ilk karakter eşit değilse, onu fırlatıp tekrar dize ile tekrar çağırırız . Eşitse, dizideki ikinci karakteri döndürürüz.sccc!c

Sıradaki desen eşleşmemiz diğer tüm durumlarda ipi yakalar, yani ip boşsa. Bu durumda sadece geri döneriz c.

Bütün bu işlev tüm bir karakter alır cve bir dize sve ilk vuku bulmasından sonra karakteri döndürür ciçinde s. Bunu aeiouaAEIOUAgeçersek, şifremizi tek bir karakter üzerinde gerçekleştirir. Bütün fonksiyonumuzu yapabilmek için bunu dizgede eşlemeliyiz.


12

retina ,10 9 8 bayt

T`uo`vVA

Çevrimiçi deneyin!

Neil sayesinde 1 byte kurtarıldı! Martin'e bir bayt daha!

Retina'nın yeni versiyonu, sonucu biraz daha kısaltan ünlü harf sınıflarına sahiptir. Harf çevirisi, "öteki" sınıfını da kullanır. Yani tosınıf "aeiouAEIOUA" gibi görünürken, fromsınıf "uaeiouAEIOUA" gibi görünüyor

Bu , zaten haritalandırıldığından bu yana yapılacak olan ikinci uharitalamanın Aasla yapılmayacağından sorun yaratmaz .ua


9 bayt: T`_o`uvUV.
Neil

Bu oldukça kısa bir cevap!
AJFaraday

@Neil akıllı, teşekkürler! Bir _setin içine koymak kelimenin tam anlamıyla tedavi olacağını düşündüm , ama öyle yapmıyor gibi görünüyor.
FryAmTheEggman

3
Birini daha tıraş edebilirsiniz, ama ne yazık ki Stax'ı bağlayamıyor gibiyim
Martin Ender

@MartinEnder Teşekkürler! Bu ikisi arasında karıştırarak akıllıca bir kurulum. YHenüz bir şey kullanmayı denemedim bu yüzden yarın bir şans vereceğim.
FryAmTheEggman


6

Python 3, 62 bayt

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

strStatik str.maketransyöntemiyle çeviri tablosu (sözlük) hazırlayın . İlgili karakterleri hedef karakterlerine çevirin.


Bu nerede G / Ç gerçekleştirir?
reinierpost

@ reinierpost Bu bir fonksiyondur. Giriş, xparametre ile yapılır. Python'da lambda fonksiyonlarının bir return ifadesine ihtiyacı yoktur.
mypetlion

6

C, 85 76 67 65 64 bayt

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

Kevin Cruijssen'in Java cevabı limanı . Burada çevrimiçi deneyin .

Sayesinde Kevin Cruijssen 9 bayt, golf için Christoph 11 bayt golf için ve ceilingcat 1 bayt golf için.

Ungolfed versiyonu:

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
Gcc'nin standart bir uzantısı olmadığı görülüyor. Ben php den biliyordum ve basitçe denedim.
Christoph

1
@Christoph Özyineleme kullanımınızı beğeniyorum, ancak bir sonuç alabileceğimizden emin değilim \0. Ayrıca, bu clang ile derlendiğinde çalışmaz: tio.run/##S9ZNzknMS///…
OOBalance

1
@ Christoph: tanımsız davranışın nerede olduğunu merak ettim, bu yüzden biraz daha ungolfing yaptıktan sonra clang versiyonunda hata ayıkladım. const char *res = strchr("AEIOU...", 0)string değişmezine bir gösterici ile döner. putchar(res[1])dize değişmezinin sonunu okur. Gcc ile görünüşe göre başka bir sıfır bayt buluyor ve işe yarıyor, ama clang ile bir 73 'I'(büyük olasılıkla maindizenin değişmezinden, "Öyleydi ..." demiştim, ama asm kontrol etmedim). Öyleyse putchar0 döndürmez ve sonunda eşlenemeyen *c++bir sayfa okuduğunda sonuç saparız .
Peter Cordes

2
@PeterCordes evet burada bir şüpheye kapıldığımda öğrendim . Neyse burada başka 2 bayt kaydedildi f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. Şimdilik hepsi bu kadar sanırım.
Christoph

1
@Rogem Eklemenin değişme özelliği nedeniyle a[b]==*(a+b)==*(b+a)==b[a],. Bu nedenle1[...]==(...)[1]
ceilingcat






4

Pyth, 17 bayt

em=.rQdrB"aeiou"1

Burada dene

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 bayt

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

-10 byte, @Arnauld'un JavaScript cevabından ilham aldı (60 bayt versiyonu) .

Çevrimiçi deneyin.

Açıklama:

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 bayt

žMDÀ‡žMuDÀ‡

Çevrimiçi deneyin!


1
Girdiyi çok satırlı bir dize olarak alarak iki bayttan tasarruf edebilirsiniz, bu nedenle |ve »:: Çevrimiçi olarak deneyin: 11 bayt .
Kevin Cruijssen

@KevinCruijssen Teşekkürler! Bu, son bir 05AB1E sürümünde düzeltilen bir şey değil mi?
Kaldo

Hiçbir fikrim yok, tbh. Bu yılın başından beri sadece 05AB1E'ye başladı. Özellik eklemek istediğinizde , 05AB1E sohbetinde @Adnan'ı sorabilirsiniz .
Kevin Cruijssen


3

APL + WIN, 55 bayt

Giriş dizesi için bilgi istemi:

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

3

Kabakulak, 38 bayt

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

Kabakulak normalde taşıma dönüşü eklemez, çünkü girdiyi çıktıdan ayırmak için bir gereksinim görmedim, ilk çalıştırmada biraz garip görünüyor. Örneğin, son sınama durumu için çıktı şöyle görünür:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

Bir satır başı eklemek isterseniz, bu şekilde iki bayt ekleyin:

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

3

Vim + tpope / vim-abolish , 30 bayt

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

Alternatif çözüm, ayrıca 30 bayt:

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

Göre meta , vim cevaplar hiçbir bayt cezası ile eklentileri kullanabilirsiniz. Bu bir vim cevabı değil, bir vim + cevabı.


Kaldırılması son derece yararlı bir eklentidir. README'nin bu bölümü, bu komutun ( Subvertkomutun) nasıl çalıştığını güzelce açıklar .


3

CJam , 29 19 bayt

q"aeioua"_eu+_1m<er

Çevrimiçi deneyin!

@Peter Taylor sayesinde -10 bayt

Açıklama:

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

Her ne kadar soru girdiyle ilgili spesifik olmasa da, girdi almak qyerine muhtemelen kullanmanız gerektiğini düşünüyorum l. İlk test durumu çok satırlı görünüyor. Ayrıca kısaltabilirsiniz "eioua"için _1m<. Aslında, daha ileri gidebilirsin ve golf oynayabilirsinq"aeioua"_eu+_1m<er
Peter Taylor

3

AutoHotkey , 24 bayt

AuotHotkey, harfleri büyük / küçük harf duyarlı bir şekilde otomatik olarak değiştirir.

a::e
e::i
i::o
o::u
u::a

2

PHP, 90 Bayt

Çevrimiçi deneyin

kod

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

açıklama

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 Bayt php -rkullanarak koştu$argv

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


2

str , 18 bayt

[aeiouaAEIOUA]#D#U

Çevrimiçi deneyin!

açıklama

                       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 bayt

Oldukça basit, çok yaratıcı değil strtr, ünlülerin yerini almak için kullanır :

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

Çevrimiçi olarak çalıştırın echo '<input>' | php -nF <filename>veya deneyin .


Bu, girişin önceden tanımlanmış değişkene atandığını varsaymıyor argnmu? Eğer öyleyse o zaman bu geçerli değil; dizeyi bir argüman olarak iletmeniz ve $argv1]bunun yerine kullanmanız gerekir .
Shaggy

2
@Shaggy Hayır, -Fbayrakla çalıştırırsanız , komut satırındaki girişle çalışır. Gönderen seçenekleri PHP dokümanlar : -F --process-file PHP file to execute for every input line. Added in PHP 5.bazı insanlar PHP yerel yüklü olmayan sırf online değişken tanımlama olduğunu deneyin ve ben alamadım -FTIO çalışan bayrağı.
Davіd

1
Teşekkürler, @David - bugün PHP için "yeni bir şeyim" :)
Shaggy

2

q / kdb +, 36 33 bayt

Çözüm:

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

Örnekler:

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"

Açıklama:

Ünlüler endeksini hesaplayın, bir sonrakine itmek için bir tane ekleyin ve indeksleyin. Yine de bu yaklaşımın önemli ölçüde iyileştirilebileceğini düşünüyorum ...

{(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:

Oldukça iyi olduğunu düşündüğüm eski ** 36 byte (()) çözümüm, rekabeti arttırmak için listelerde golf oynamaya ihtiyaç duyuyor:

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

2

Kömür , 35 bayt

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

Çevrimiçi deneyin!

Naif yöntem

Açıklama:

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 bayt.

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

Bunu kontrol et!

Bu PHP'de yapabildim en kısa oldu.

$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
        )
    );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.