Ot wes thi bist uf tomis


36

我只是喜欢这个简单的密码,阅读不太可读的单词并填补空白非常有趣...

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.

规则非常简单:

  • 接受一些文本作为输入(ASCII字符,大写/小写字母和标点符号)。
  • 对于每个元音,将其旋转到下一个元音,或返回到开始。
    • a => e
    • e =>我
    • 我=> o
    • o => u
    • u =>一个
  • 大写元音保持大写,小写元音保持小写。
  • 这些转换后输出文本。
  • 无需支持重音符号。
  • 所有其他字符应保持不变。
  • 尝试以最少的字节数执行操作。
  • 您喜欢的任何旧语言。

测试用例

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.

出:

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.

在:

The quick brown fox jumps over the lazy dog.

出:

Thi qaock bruwn fux jamps uvir thi lezy dug.

在:

Home is where the heart is.

出:

Humi os whiri thi hiert os.

在:

Boaty McBoatface

出:

Buety McBuetfeci

在:

AEIOUaeiou

出:

EIOUAeioua

在:

Programming Puzzles And Code Golf

出:

Prugremmong Pazzlis End Cudi Gulf


4
嗯 古英语?
iammax

10
仍然比Beowulf更容易阅读。
Smeato '18 -4-24

4
对我来说看起来像个猕猴桃翻译者。
Magoo

1
我喜欢从密码到“ ivol”的“邪恶”如何以相同的方式有效地发音。
恩里科·博尔巴

Answers:



22

MS-SQL,51字节

适用于SQL 2017或更高版本:

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

新功能TRANSLATE执行单个字符替换,因此非常适合此挑战。

根据我们的IO规则,输入通过带有varchar列v的预先存在的表t进行。

在这种情况下,必须使用区分大小写的排序规则创建表,方法是在区分大小写的服务器上运行,或者使用COLLATE关键字(不计入字符总数):

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

编辑:SSMS在“结果转为文本”窗口中返回结果时,可能会截断上面冗长的引用,这是客户端设置,而不是程序中的错误

要解决此问题,请转到Tools > Options > Query Results > SQL Server > Results to Text并增加“每列中显示的最大字符数”。


1
我真的震惊,SQL甚至接近竞争这个。另外,这是一个很酷的功能!感谢您告诉我们:)
Nic Hartley,

@NicHartley是的,他们似乎在每个版本中添加了几个有用的功能。您也可以使用它来嵌套REPLACE一些技巧:REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')例如,从字符串中消除所有数字。仍然很长,但比10个嵌套REPLACEs 短得多。
BradC


14

Haskell,52个字节

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

在线尝试!

Lynn指出了!!0比短的字节,从而为我节省了两个字节head

说明

如果您从未使用过Haskell编码,则可能看起来像一堆胡言乱语。因此,首先让我们解开它,然后将其分解:

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

首先,我们有一个函数!,该函数需要一个字符串s和一个字符c。如果字符串非空,则我们的第一个模式匹配捕获接受输入。如果字符串非空,则将其第一个字符与进行比较c。如果它的第一个字符不等于c我们抛弃它,!然后用字符串的其余部分和再次调用c。如果相等,则返回字符串中的第二个字符。

在所有其他情况下,即字符串为空时,我们的下一个模式匹配项将捕获字符串。在这种情况下,我们只返回c

总而言之,此函数采用一个字符c和一个字符串,s并在首次出现cin 之后返回该字符s。如果我们通过它,aeiouaAEIOUA它将对单个字符执行密码。为了实现我们的整个功能,我们应该在字符串上映射它。


12

视网膜10 9 8字节

T`uo`vVA

在线尝试!

感谢尼尔,节省了1个字节!还要感谢马丁!

视网膜的新版本具有元音类,这使结果略短。音译也利用“其他”类。因此,to该类看起来像“ aeiouAEIOUA”,而from该类看起来像“ uaeiouAEIOUA”

这不会造成任何问题,因为第二次u映射到已经映射到,因此A将永远不会完成。ua


9个字节:T`_o`uvUV
尼尔

这是一个非常简短的答案!
AJFaraday

@尼尔聪明,谢谢!我以为将_from放到from集合中将按字面意义对待它,但是看起来它并没有那样做。
FryAmTheEggman '18

3
您可以再剃掉一个,但不幸的是,我似乎无法与Stax 并列
Martin Ender

@MartinEnder谢谢!这是一个巧妙的设置,将两者混合在一起。我还没有尝试过使用Y太多东西,所以明天再试一下。
FryAmTheEggman '18


6

Python 3,62个字节

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

使用str的静态str.maketrans方法制作翻译表(字典)。将相关字符转换为目标字符。


它在哪里执行I / O?
reinierpost

@reinierpost这是一个函数。通过x参数输入。在python中,lambda函数不需要return语句。
mypetlion 18'Apr

6

C,85 76 67 65 64字节

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

凯文·克鲁伊森(Kevin Cruijssen)的Java 回答端口。在这里在线尝试。

多亏了Kevin Cruijssen打了9字节的高尔夫球,感谢Christoph打了11字节的高尔夫球,还有ceilingcat打了1字节的高尔夫球。

非高尔夫版本:

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的非标准扩展。我从php知道它并且只是尝试了它。
Christoph

1
@Christoph我喜欢您对递归的使用,但是我不确定我们是否可以输出尾随\0。此外,当使用clang编译时,这不起作用:tio.run
##S9ZNzknMS

1
@Christoph:我很好奇未定义行为的位置,因此在解开了更多代码之后,我调试了clang版本。 const char *res = strchr("AEIOU...", 0)返回字符串文字中终止符的指针。 putchar(res[1])读取字符串文字的末尾。使用gcc,显然碰巧找到了另一个零字节,并且碰巧可以工作,但是使用clang,它得到了一个73 'I'(可能来自main字符串原义“ It was ...”,但我没有检查过asm)。因此putchar不会返回0,并且当*c++读取未映射的页面时,我们最终会出现段错误。
彼得·科德斯

2
@PeterCordes是的,我怀疑后才在这里发现了。无论如何,这里又保存了2个字节f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}。我想现在就这些了。
Christoph'Apr

1
@Rogem由于加法的交换性质,a[b]==*(a+b)==*(b+a)==b[a]。因此1[...]==(...)[1]
ceilingcat '18年






4

Pyth,17个字节

em=.rQdrB"aeiou"1

在这里尝试

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字节

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

在受到@Arnauld的JavaScript答案(他的60字节版本)启发后,变为 -10个字节

在线尝试。

说明:

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



3

APL + WIN,55个字节

提示输入字符串:

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

3

腮腺炎,38字节

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

流行性腮腺炎通常不会添加回车符,因为我没有看到将输入与输出分离的要求,但在第一次运行时看起来确实有点怪异。例如,最后一个测试用例的输出如下所示:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

如果您确实想添加回车符,请增加两个字节:

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

3

Vim + tpope / vim-abolish,30字节

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

备用解决方案,也为30个字节:

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

根据meta,vim答案可以使用没有字节数损失的插件。这不是vim答案,而是vim +废除答案。


取消是一个非常有用的插件。README的这一部分很好地描述了此命令(Subvert命令)的工作方式。


3

CJam29 19字节

q"aeioua"_eu+_1m<er

在线尝试!

-10个字节感谢@Peter Taylor

说明:

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

尽管问题不是针对输入的,但我认为您应该使用q而不是l接受输入。第一个测试用例似乎是多行的。您也可以缩短"eioua"_1m<。实际上,您可以更进一步,将其q"aeioua"_eu+_1m<er
Peter Taylor


2

PHP,90字节

在线尝试

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

说明

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.
 );
}

如果php -r使用来运行,则为75个字节$argv

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


2

str,18字节

[aeiouaAEIOUA]#D#U

在线尝试!

说明

                       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字节

很简单,不是很有创造力,用于strtr替换元音:

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

运行echo '<input>' | php -nF <filename>在线尝试


这是否不假定输入已分配给预定义变量argn?如果是这样,那是无效的;您需要将字符串作为参数传递并使用$argv1]
毛茸茸的

2
@Shaggy否,如果您使用-F标志运行它,则它可以在命令行中使用输入。从PHP文档上的options-F --process-file PHP file to execute for every input line. Added in PHP 5.尝试在线尝试变量变量的定义仅仅是因为有些人没有在本地安装PHP,而且我无法-F在TIO中使用该标志。
Davіd

1
谢谢@David-这是我今天对PHP的“新东西” :)
Shaggy

2

q / kdb +,36 33字节

解:

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

例子:

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"

说明:

找出元音的索引,添加一个以推入下一个,然后索引。仍然认为此方法可以显着改善...

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

奖金:

我以前的** 36 byte(())解决方案我认为很酷,但需要仔细研究才能使其具有竞争力:

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

2

木炭,35字节

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

在线尝试!

天真的方法。

说明:

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个字节。

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

看看这个!

这是我用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
        )
    );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.