转换为秘密语言


9

用任何输入字符串的语言编写一些代码,例如“今天是美好的一天”(请注意,没有标点符号),然后将其转换为“秘密语言”。这是“秘密语言”的规则。

  • a = c,b = d,c = e等(y = a和z = b)
  • 每个单词之间用空格隔开
  • 确保有适当的大写

例:

Input: "Today is a great day"

Output: "Vqfca ku c itgcv fca"

这是一场人气竞赛。其他用户应该通过查找大多数“指向重点”但“唯一”的代码来给出分数。

挑战:我正在查找不常见的编程语言,但发现了一种名为Pietesolang)的语言。我挑战任何人用这种语言编写它。


那不是x=z, y=a, z=b吗?
r3mainer 2014年

您说得对“ duh” :)
Vik P

3
直到我意识到a=c是的时候我才感到困惑a -> c
贾斯汀

6
换句话说,它是ROT2
Tobias Kienzler 2014年

2
rot13和rot2都是具有不同密钥(13和2)的凯撒密码
Sylwester 2014年

Answers:


18

Smalltalk(Smalltalk / X),29个 27个字符

我很幸运-它已经在String类中:

'Today is a great day' rot:2
    -> 'Vqfca ku c itgcv fca'

添加I / O,这使得它:

(Stdin nextLine rot:2)print

遵循以下门把手的示例的精神,如何:

Parser evaluate:('(Uvfkp pgzvNkpg tqv:2)rtkpvPN' rot:-2)

2
我从没想过会看到Smalltalk解决方案!
牙刷

13

Ruby,混淆版本(包括注释!)

我建议阅读全部内容;我觉得这很有趣;)

$s='';class Module;def const_missing c

# MAGIC:
$s+="#{c}".split("#{$;}").map{|x|x.ord-8**2}.reduce(:"#{43.chr}").chr;end;end

              # My commentary ;)

ZZZY          # ?
YAYYY         # Oookay; you seem excited
Yaz           # Typo?
Yay           # Better
JEEEEEEF      # You misspelled Jeff's name
LAZZZY        # Yes, you are very lazy
Yax           # Another typo...
LLAMA         # Definitely not completely random at all...
EEEEEEEEEEEEE # Ouch my ears
IIIII         # Ouch stop
ASDFASDFASDF  # I SAID STOP BANGING ON THE KEYBOARD
YUMMY         # ... you eat keyboards?
IIIII         # Stop!
YUMMYY        # Why are you eating your keyboard
LLAMA         # That doesn't make sense :(
VV            # :(
LLAMA         # Could you stop saying that?!
CODEGOLF      # Yay, one of my favorite SE sites! :D
VW            # I don't drive
ASDFASDFASDF  # Why do you keep banging on your keyboard?!?!
EEEEEEEEEEEEE # No
VVV           # Stop
HELLOo        # ...it's a little late for a greeting, isn't it?
DOGS          # ...
OOOOOo        # No, you're not a ghost.
HELLOOOO      # Just a *bit* late.
NNNNNNN       # Huh?
LLAMA         # I said to stop.

print eval$s

有关其工作原理的提示(扰流板,悬停显示):

此代码构建一个字符串,然后对其进行评估。

它用于const_missing按字符建立字符串。

它最终建立的字符串是gets.tr'A-Za-z','C-ZABc-zab'


评注读起来就像一些在这个问题上的聊天记录:codegolf.stackexchange.com/questions/20914/who-is-this-chatbot/...

13

后记

总部要求,从现在起,所有座席应仅使用特殊的最高机密字体以印刷形式(由于电子渠道被证明不可靠)接收通信。您有责任将此最高机密程序纳入我们的打印软件的序幕:

/define_Secret_font {
    /Secret_font
    /Coronet findfont dup 
    /Encoding get 
    aload pop 256 array astore 
    /secret_proc {
        2 copy
        26 getinterval aload pop 
        26 -2 roll 26 array astore
        putinterval
    } def
    dup 65 secret_proc
    dup 97 secret_proc
    exch dup length dict dup
    3 -1 roll {put dup} forall
    exch /Encoding 4 -1 roll put 
    definefont pop
} def

并且只允许使用该字体,例如:

define_Secret_font
/Secret_font 36 selectfont
0 841 translate
20 -60 moveto
(Today is a great day) show
20 -120 moveto
(Programming Puzzles & Code Golf) show
showpage

这就是它的输出: 在此处输入图片说明


11

重击

经典。

tr A-Za-z C-ZABc-zab

例:

$ tr A-Za-z C-ZABc-zab <<< "Today is a great day"
Vqfca ku c itgcv fca

我认为您不需要引号。
marinus 2014年

@marinus是的,我将其更改。
daniero 2014年

5

DFSORT(IBM大型机排序程序)

 OPTION COPY
 INREC BUILD=(1,80,TRAN=ALTSEQ)

没有SORT控制语句可以在第一列中开始。

为了使上述代码能够单独工作,您必须更改默认的安装备用转换表,以抵消大写和小写字母的所有值,并环绕最后两个字母。

在不更改默认表的情况下,它将需要一个ALTSEQ语句,该语句列出所有必需的十六进制值对(from-hex-code后立即是to-hex-code,每对十六进制值之间用逗号分隔):

 OPTION COPY
 INREC BUILD=(1,80,TRAN=ALTSEQ)
 ALTSEQ CODE=(xxyy,...)

因此,将大写的EBCDIC A转换为C,将B转换为D:

ALTSEQ代码=(C1C3,C2C4)

当然,对于整个事情,这将是很多容易出错的类型,因此您将使用另一个SORT步骤来为此步骤生成控制卡,并让SORT从该新步骤创建的数据集中读取它们。

当然,对于支持“翻译表”的任何语言,它就像更改翻译表一样容易。不错的COBOL程序,具有特定的代码页,并且可以在一行COBOL过程代码中完成(加上与所有内容一起使用的COBOL强制性行,在这种特殊情况下不多)。

哦,1,80是将包含文本的“卡片图像”。可能在第一次运行时都是大写的...


+1。将DFSORT用于ROT2确实很独特。
阿比吉特(Abhijit)2014年

3

C,75个字节

main(c){while((c=getchar())>0)putchar(isalpha(c)?(c&224)+((c&31)+2)%26:c);}

例:

$echo "Today is a great day" |./a.out
Vqfca ku c itgcv fca

假设EOF为-1,则可以按位不~(c=getchar())保存1个字符
user12205 2014年

并且由于该问题说没有标点符号,所以唯一的非字母字符是空格,因此您可以c-32改用它进行测试,这样可以节省6个字符
user12205 2014年

这是一场人气竞赛,而不是代码竞赛
Mhmd 2014年

代码高尔夫现在与流行相对立吗?
Desty

@ user689,您是对的,对不起,我没有仔细阅读问题。由于此代码是用三元运算符而不是用一行编写的int,甚至没有提供字符计数,因此我以某种方式假定它是代码高尔夫球。抱歉。
user12205 2014年

3

蟒蛇

a = list('abcdefghijklmnopqrstuvwxyz')
b = list('yzabcdefghijklmnopqrstuvwx')

c = {}

#generate conversion dictionary

for i in range(len(a)):
    c[a[i]] = b[i]

instring = "the weather is very nice today"

outstring = ""

for i in list(instring):
    try:
        outstring += c[i]
    except:
        outstring += i

print outstring

输出:

射频ucyrfcp gq tcpw lgac rmbyw


(1)是+3,对吗?(2)您可以内联很多东西以使其更加复杂。(这里似乎是一种趋势)
Simon Kuang

b = a[2:] + a[:2]不太容易出现错字,并且似乎不需要将字符串转换alist
Tobias Kienzler 2014年

哦,还有c = dict(zip(a,b))。而且except不应该这么except KeyError
泛泛

str串联速度非常慢。创建一个list并将它们加入在一起会更好。
yegle 2014年

3

的JavaScript

// setup alphabet and secret rotated alphabet
//
var alpha=' abcdefghijklmnopqrstuvwxyz'
var rotor=' cdefghijklmnopqrstuvwxyzab'
alpha+=alpha.toUpperCase()
rotor+=rotor.toUpperCase()

function encrypt(str) {
 return crypt(str, alpha, rotor)
}

function decrypt(str) {
 return crypt(str, rotor, alpha)
}

// swap position of char from one dictionary to the other
function crypt(msg, d1, d2) {
 var out=''
 var len=str.length
 for(var i=0; i < len; i++) {
  var c = msg.charAt(i)
  var j = d1.indexOf(c)
  out += d2.charAt(j)
 }
 return out
}

3

的PHP

不是最短的一个!

实时示例:https//eval.in/102173

<?php
$str = 'Today is a great day';
$out = implode('', array_map(function ($val) {
  if ($val == ' ') return ' ';
  $c = ord($val)+2;

  if (ctype_lower($val)) {
    if ($c > ord('z')) {
      return chr(ord('`') + ($c - ord('z')));
    }
    return chr($c);
  }
  else {
    if ($c > ord('Z')) {
      return chr(ord('A') + ($c - ord('Z')));
    }
    return chr($c);
  }  
}, str_split($str)));

var_dump($out);

注意:

ord('`') = ord('a') - 1

3

TI-Basic(在TI-83图形计算器上运行的语言)

:ClrHome  
:" abcdefghijklmnopqrstuvwxyz" //all symbols that can be interpreted  
:Ans+Ans+Ans->Str1  
:Menu("crippter","encript",1,"decript",2  
:Lbl 2  
:1->C  
:Lbl 1  
:if not(C)  
:Imput ">",Str2  
:if C  
:Imput "<",Str2  
:length(Str2)->D  
:lenght(Str1)/3->E  
:if not(C)  
:Then  
:randInt(1,E)->B  
:sub(Str1,B,1)->Str3  
:Else  
:inString(Str1,sub(Str2,1,1),1)->B  
":"->Str3  
:For(X,1+C,D  
:inString(Str1,sub(Str2,X,1)->A  
:if not(C  
:A+E-B-X->A  
:if C  
:A+B+X-1->A  
:Str3+sub(Str1,A,1)->Str3  
:End  
:if C  
:sub(Str3,2,D-1)->Str3  
:Pause Str3  
:Goto A  

这是一些不错的加密软件(用于TI-83)。ti-83是ti-83或ti-84系列中的任何计算器。“->”表示“ STO>”访问的“ STORE”


3

红宝石 40 32

p gets.tr("A-XY-Za-xy-z","C-ZA-Bc-za-b") 

更新(从danieros bash解决方案中看到):

p gets.tr("A-Za-z","C-ZABc-zab")

3

Java,实际上是可以理解的。

我知道任何带有空格和括号的东西在CG上都很难,但是这里有一个镜头。

    class SecretLanguage {

    public static void main(String[] args) {
    for (String S : args) {
        for (char s : S.toCharArray()) {
        System.out.print((char) (s + ((s < 'y') ? 2 : -24)));
        }
        System.out.print(" ");
    }
    }
}

对于混淆代码,有单独的竞赛,但是我也可以使我荒谬。

class S{public static void main(String[]args){for(String str:args){for(char i:(str).toCharArray())System.out.print((char)(i+((i<'y')?2:-24)));System.out.print(" ");}}

2

Java脚本

var str = '';
var textInput = 'myString';
for (var i = 0; i < textInput.length; i++) {
    str += textInput.charAt(i).replace(/([a-zA-Z])[^a-zA-Z]*$/, function (a) {
        var c = a.charCodeAt(0);
        switch (c) {
            case 89:
                return 'A'; //Letter Y!
            case 90:
                return 'B'; //Letter Z!
            case 121:
                return 'a'; //Letter y!
            case 122: //Letter z!
                return 'b';
            default:
                return String.fromCharCode(c + 2); //If not y, Y, z, or Z, then just two more from the usual char code
        }
    })
}
console.log(str);

带着所有评论,仓鼠可以理解这一点。


2

我想我会ROT2了!

Java脚本

function r(a,b){return++b?String.fromCharCode((a<"["?91:123)>(a=a.charCodeAt()+2)?a:a-26):a.replace(/[A-z]/g,r)}

console.log(r('Qccipcr'));

我起初曾想过类似的事情,但我从未想到[A-z]
牙刷

2

哈斯克尔

这是基于镜头的实现。我Iso用来表示常规文本和转换为秘密语言的文本之间的同构。除非您提供--from选项,否则输入将转换为秘密语言。如果--from提供了该选项,则执行相反的转换。

module Main where
import Control.Lens
import System.Environment (getArgs)
import Data.Char          (ord, chr, isUpper, isSpace)
import Data.Word          (Word8)

ord8 :: Char -> Word8
ord8 = fromIntegral . ord

chr8 :: Word8 -> Char
chr8 = chr . fromIntegral

ordIso :: Iso' Char Word8
ordIso = iso ord8 chr8

firstLetterOrd :: Word8 -> Word8
firstLetterOrd n
  | n ^. from ordIso . to isUpper = ord8 'A'
  | otherwise                     = ord8 'a'

secretChar :: Iso' Char Char
secretChar =
  iso toSecret
      fromSecret
  where
    toSecret, fromSecret :: Char -> Char
    toSecret   = secretConversion   2
    fromSecret = secretConversion (-2)

secretConversion :: Int -> Char -> Char
secretConversion n c
  | isSpace c = c
  | otherwise = c & over ordIso (secretShift n)

secretShift :: Int -> Word8 -> Word8
secretShift shiftAmount =
  preserveLetters $ (`mod` 26) . (+ shiftAmount)

preserveLetters :: (Int -> Int) -> Word8 -> Word8
preserveLetters fn n =
  firstLetter + overWord8 fn (n - firstLetter)
  where
    firstLetter = firstLetterOrd n

overWord8 :: (Int -> Int) -> Word8 -> Word8
overWord8 fn = fromIntegral . fn . fromIntegral

help :: IO ()
help =
  putStr
  $ unlines
      ["SecretLang [--from]"
      ,"If the --from option is provided, the program"
      ,"converts from the secret language. Otherwise,"
      ,"it converts to the secret language."
      ]

convertContents :: (String -> String) -> IO ()
convertContents fn = do
  input <- getContents
  putStrLn . ("Output: " ++) $ fn input

main :: IO ()
main = do
  args <- getArgs

  case args of
    ("--from":_) ->
      convertContents (^. mapping (from secretChar))

    ("--help":_) -> help
    ("-h"    :_) -> help

    _            ->
      convertContents (^. mapping secretChar)

例子:

$ ./SecretLang
Today is a great day
Output: Vqfca ku c itgcv fca

$ ./SecretLang --from
Vqfca ku c itgcv fca
Output: Today is a great day

1

C

    #include<stdio.h>

    int main()
    { char p[256];
    int i;
    fgets ( p, 256, stdin );
    for(i=0; i<256 ; i++)
    {
   if ( p[i] == '\n' )
    {
    p[i] = '\0';
    break;
    }
    else
    {

    if((p[i] >= 'a' && p[i] <= 'x') || (p[i] >= 'A' && p[i] <= 'X') )
    {
        p[i] +=2;
    }

    else
    {
    switch(p[i])
     {
        case 'y':    p[i] = 'a';
                     break;

       case 'Y':    p[i] = 'A';
                     break;

       case 'z':    p[i] = 'b';
                     break;
       case 'Z':    p[i] = 'B';
                     break;
       case ' ':    p[i] = ' ';
                     break;


     }
    }
}}

printf("%s", p);

    return 0;
 }

您可以通过在字符上使用模运算来节省大量代码...
blabla999

@ blabla999这是一场人气竞赛,而非代码高尔夫
Mhmd

1
对不起-不想冒犯。我忽略了这一点。
blabla999

1

EcmaScript 6:

alert(prompt(_='').split(_).map(x=>String.fromCharCode(x.charCodeAt()+(x>' '?x>'x'|x>'X'&x<'['?-24:2:0))).join(_))

EcmaScript的,我下放醇”敌人
Cilan

1

爪哇

32space,所以我们把它打印出来的是
88X使任何小于89上移2个字符
90Z那么任何小于91向下移动24个字符(含任何小于89已经处理,这样只有8990有效)
重复同样的过程,小写字母,从97作为a122作为z

void secret(String s) {
    for (char c : s.toCharArray()) {
        System.out.print((char)(c == 32 ? c : c < 89 ? c + 2 : c < 91 ? c - 24 : c < 121 ? c + 2 : c - 24));
    }
}

1

电源外壳

$chars = [int]('a')[0]..[int]('z')[0] | %{ [char]$_, [char]::ToUpper([char]$_) }

$y = $args[0].ToCharArray() | %{
    $idx = $chars.indexOf($_);
    if ($idx -ge 0) {
        $chars[($idx + 4) % 52]
    } else  {
        $_
    } 
}

-join [char[]]$y

输出:

PS C:\Temp> .\z.ps1 "Today is a great day"
Vqfca ku c itgcv fca
PS C:\Temp>

1

的PHP

这个解决方案很无聊:

echo strtr('Today is a great day','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz','CDEFGHIJKLMNOPQRSTUVWXYZABcdefghijklmnopqrstuvwxyzab');

1

Python 3

我认为我不太了解这个问题,但是无论如何:

alphabet = "abcdefghijklmnopqrstuvwxyz"
rot = alphabet[2:] + alphabet[:2]
rot = rot + rot.upper()
alphabet = alphabet + alphabet.upper()

def encode_letter(letter):
    return rot[alphabet.index(letter)]

def encode_word(word):
    return "".join(encode_letter(letter) for letter in word)

def encode_string(string):
    return " ".join(encode_word(word) for word in string.split())

print("Output: " + encode_string(input("Input: ")))

1

Python 2.x

尝试功能丰富的Python解决方案。

特征:

  • 字典的使用
  • 以循环方式处理列表,因此shift=2可以进行更改
  • 您也可以在知道的时候使用它来解密shift(只使用减号),它也可以让您测试输出。
  • 添加“移动范围”的能力-您在其中循环的范围
  • 选项可以是strict未定义的字符,或者只返回未定义的输入字符。
  • 秘密的语言没有痕迹;)

开始:

# Shifting scopes
lower_case = map(chr, range(97, 123))
upper_case = map(chr, range(65, 91))
space = [" "] # space will always be transformed to space

def secret(instring, shift, scopes, strict=False):
    def buildTranslationDict(scores):
        translation_dict = {}
        for scope in scopes: 
            for index in range(len(scope)): 
                translation_dict[scope[index]] = scope[(index+shift) % len(scope)]
        return translation_dict 
    translation_dict = buildTranslationDict(scopes)
    # Use the translation dictionary to transform input
    output = ""        
    for char in instring:
        if strict:
           output += translation_dict[char]   # will crash if unexpected char
        else:
            try:    
               output += translation_dict[char]
            except: 
               output += char
    return output    

证明:

secret(instring="Today is a great day", shift=2, scopes=[lower_case, upper_case, space])
'Vqfca ku c itgcv fca'

你能解密'Wrpruurz lv qrw edg hlwkhu!':)吗?


只是好奇,您是否考虑将这个额外的“严格”功能“不切实际”添加
PascalVKooten 2014年

这将节省6行代码...
PascalVKooten 2014年

1
您是在自言自语还是我想念什么?喜欢删除的评论?
Timtech

1
是的,已删除,请也不要删除您的评论...
PascalVKooten 2014年

0

扩展的BrainFuck

由于这是一场人气竞赛,因此我写这篇文章的目的是要使其像EBF一样易于遵循。它被大量评论,并且我故意使用宏来使程序流更直观。

这里最困难的事情可能是主开关,因为EBF没有任何特殊的方法可以做到,因此除了变量和平衡括号外,它实际上不比BrainFuck的实现方法简单。

;;;; rot2.ebf : Perform rot2 on ascii text
;;;; Usage: bf ebf.bf < rot2.ebf > rot2.bf
;;;;        echo "Today is a great day" | bf rot2.bf
;;;;        # => Vqfca ku c itgcv fca
;;;;
;;;; BF interpreter/Compiler requirement: 
;;;; Wrapping cells at any size (allmost all of them do)
;;;;


;;; Memory map  
:tmp    ; a temporary cell used for the read routine
:input  ; a copy of the input for output purposes
:switch ; a copy of the input for the switch statements
:flag   ; flag to indicate the predicate has been processed or not

;;; Macros
;; Ultracompatible read
;; supports EOF 0, -1 and no change
{read_tmp 
  $input+ 
  $tmp(-),
  [+[-$input-]] ; blanks for all EOFs
  $switch [
    @input &clear
    $switch
  ]
}

;; for the switch we need
;; to do destructive testing
;; and we need to preserve the
;; original as well. 
{copy_input 
  $tmp(-$input+$switch+)
}

;; clears the cell
{clear (-)}

;; prints current cell
{print .}

;;; Main proram
;;; flow starts here
&read_tmp
while $tmp not eof
(
  &copy_input
  $flag+
  $switch 10-(22-(
    ;; not linefeed/space
    $switch 57-(-(31-(-(
       ;; default: not wrapping
       &clear
       $flag-
       $input 2+))))
    $flag (-
       ;; wrapping
       $input 24-)))
  $flag &clear
  $input &print &clear
  &read_tmp
)
;;; End

0

Java脚本

var STR = "Today is a great day";
//so i can replace chars at a index in the string
String.prototype.replaceAt=function(i, char) {
    var a = this.split("");
    a[i] = char;
    return a.join("");
}

function secretIt( str ){
    for( var i = 0; i < str.length; i++ ) {
        var c = str.charCodeAt( i );
        /**
        * check for spaces first
        * check if get outside of the letter range for both lower and upper
        * if we dont go then were good
        * if so go back 26 chars
        */
        str = str.replaceAt( i, String.fromCharCode( ( c == 32 ) ? c : ( ( c = c + 2 ) > 91 && c < 97 || c < 123 ) ? c : c - 26 ) ) ;
    }
    return str;
}

console.log( secretIt( "Qsncp qcapcr ambc" ), ' ' , secretIt( STR ));



0

C#,163

是的,这不是代码高尔夫。无论如何,我都走了最短的路程(或者至少第一次刺穿了它)

using System.Linq;class P{static void Main(string[]a){System.Console.WriteLine(string.Concat(a[0].Select(c=>(char)(c==32?c:c<89?c+2:c<91?c-24:c<121?c+2:c-24))));}}

格式:

using System.Linq;
class P
{
    static void Main(string[] a)
    {
        System.Console.WriteLine(string.Concat(a[0].Select(c => (char)(c == 32 ? c : c < 89 ? c + 2 : c < 91 ? c - 24 : c < 121 ? c + 2 : c - 24))));
    }
}

是的,我确实对ufis的回答有所了解


0

C# 5KB

(381个字符)

391

using System;
namespace WinHelper {
    class P {
        static void Main(string[] args) {
            char[] f =  "abcdefghijklmnopqrstuvwxyz ".ToCharArray();
            char[] g =  "cdefghijklmnopqrstuvwxyzab ".ToCharArray();

            foreach (char c in Console.ReadLine().ToCharArray().ToLower()) 
                Console.Write(g[Array.FindIndex(f, a => a == c)]);
        }
    }
}

编译大小(5KB)无关紧要。对于代码高尔夫球来说,(源代码的)字符数通常很重要,但是由于这个特殊的挑战是一场流行竞赛,而不是代码高尔夫球,所以字符数/大小根本无关紧要。将鼠标悬停popularity contest在挑战下方的徽章上(您将看到一个工具提示,其中对此进行了解释:“ 人气竞赛是一项竞赛,在竞赛中,投票率最高的正确答案将获胜,usually the most creative answer ”)。
RobIII 2014年

此外,Today is a great day由于它不支持大写字母,因此在挑战的示例输入中崩溃。
RobIII

0

重击,8个字符

...如果您恰好安装了bsdgames软件包!从标准输入读取。

caesar 2

echo Today is a great day|caesar 2

输出: Vqfca ku c itgcv fca


0

C

#include <stdio.h>
char c[100];
int main()
{
gets(c);
char *p=c,x;
while(*p)
{
    x=*p;
    if(x>='a'&&x<='z')
    {
        *p=((*p-'a'+2)%(26)+'a');
    }
    if(x>='A'&&x<='Z')
    {
        *p=((*p-'A'+2)%(26)+'A');
    }

    p++;
}
puts(c);
}
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.