长度相同,字符串不同


53

挑战

给定一个非空字符串小号长度的大号完全由可打印的ASCII字符的,输出长度的另一个字符串大号即完全由可打印的ASCII字符,但不等于小号

出于此挑战的目的,可打印的ASCII字符是U + 0020和U + 007E(含)之间的一个字符;也就是说,从 (空间)到~(波浪号)。不包括换行符和选项卡。

例如,给定"abcde",一些有效的输出可能是:

  • "11111"
  • "abcdf"
  • "edcba"

但是这些将是无效的:

  • "abcde"
  • "bcde"
  • "abcde0"

测试用例

"asdf"
"1111"
"       "
"~~~~~"
"abcba"
"1"
" "
"~"
" ~"
"~ "
"  0"
"!@#$%^&*()ABCDEFGhijklmnop1234567890"
" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

规则

  • 您可以假定输入完全由可打印的ASCII字符组成。
  • 您可能不会假定输入不包含所有95个可打印字符。
  • 您可能假设输入内容至少包含一个字符,且长度少于256个字符。
  • 输出还必须完全由可打印的ASCII字符组成。例如,您无法为input输出字节\ x7F "~"
  • 输出必须与输入1的概率不同;也就是说,您可以生成随机字符串,直到一个字符串与输入字符串不同为止,但是您不能仅输出L个随机字符并希望它与众不同。
  • 输出中不允许使用换行符,但是您可以输出一个尾随的换行符,该换行符不计入字符串。

计分

这是,因此每种语言中以字节为单位的最短代码获胜。


请注意,“正”排除空字符串。为了更加清楚,也许用“非零”代替“正”?
CalculatorFeline

5
@CalculatorFeline但这将包括负长度字符串/ s
ETHproductions '17

1
...那些都不存在。
CalculatorFeline

@CalculatorFeline现在更好了吗?
ETHproductions's

3
另一个简单但不容易的挑战。
周卫军

Answers:


34

Python 2,21个字节

lambda s:`s`[:len(s)]

在线尝试!

获取输入字符串的字符串表示形式,并将其截断为输入字符串的长度。对于典型的字符串,这会将其放在'引号中并切掉末尾:

abc  ->   'abc'  ->  'ab
     rep        chop

请注意,新字符串以开头'。让我们展示一下输出总是不同于输入。

  • 如果输入no ',则输出以开头,'而输入则没有。

  • 如果输入包含'",则Python将使用"外部引号,并给出第一个"不在输入字符串中的字符。

  • 如果输入具有'",则外部引号为'并且每个'都转义为\'。无论第一个"出现在输入'中的哪个位置,它都会在输出中的首字母和任何可能的转义之间右移。这意味着它不能与"输出中相应位置的匹配。

最后,请注意,用引号引起来并可能转义字符总是会增加字符数,因此截断输出将使其长度与输入相同。

请注意,"在第二种情况下,Python适应性地切换到至关重要。如果不这样做,则在三个字符的input上将失败'\'。或者,修复程序的任何更长前缀都使用显示字符串'。因此,该方法不适用于大多数语言。


索引“直到” len(s)而不是“索引”的原因是什么-2
朱利安·沃尔夫

1
@JulianWolf对于同时包含'和的输入",将添加两个以上的字符,因为需要对引号进行转义。
安德斯·卡塞格

说得通; 没考虑过。谢谢!
朱利安·沃尔夫

您可以使用[2:]而不是将[:len(s)]其减少到16个字符。
xbarbie

@xbarbie如果有需要转义的字符,则长度并不总是相同。
xnor


15

JavaScript(ES6),37 33 36 29 26 18 21 19字节

s=>s.slice(1)+ +!+s

在线尝试!

-4个字节感谢ETHProductions

-7 + -5 + -2个字节,感谢CalculatorFeline

-3个字节,感谢Rick Hitchcock

将第一个字符移到末尾,如果它是数字且非零,则将其设置为0,否则将其设置为1。

说明

s=>                    anonymous function with parameter s
                 +s    convert s to a number
                !      not (converts to boolean; relevant: 0->true,1->false)
               +       convert !+s back to number (true->1, false->0)
   s.slice(1)+         prefix the rest of the string
              ␣        needed to avoid the +s combining

证明

因为第二个字符变成第一个,第三个字符变成第二个,依此类推。所有字符必须相同。最后剩余的char只能为0或1,因此重复的char必须为0或1。但是任何0字符串都在末尾产生1,反之亦然;因此,不可能创建与其输出相等的输入。-ETH制作

有关以前的版本和说明,请参见编辑。

f=
s=>s.slice(1)+ +!+s

console.log(f("000"))
console.log(f("111"))
console.log(f("001"))
console.log(f("110"))
console.log(f("~"))
console.log(f("111111111111111111111111111111111111111111111111111"))
console.log(f("Hello world!"))
console.log(f("23"))
console.log(f(" "))
console.log(f("1x"))


13

果冻,3个字节

~Ṿṁ

输出是一串数字,逗号和减号字符,其第一个字符将与输入字符串的第一个字符不同。

在线尝试!

这个怎么运作

~Ṿṁ  Main link. Argument: s (string)

~    Map bitwise NOT over the characters c in s.
     This attempts to cast c to int and then apply bitwise NOT, mapping
     '0', ..., '9' to 0, ..., 9 (before ~), then -1, ..., -10 (after ~).
     For non-digits, the attempt fails, mapping c to 0.
 Ṿ   Uneval, yielding a comma-separated string of integers in [-10, ..., 0].
     The first character will be '-' if s starts with a digit and '0' if not.
  ṁ  Mold; truncate the result to the length of s.

6

Haskell,20个字节

map$head.show.(<'M')

在线尝试!

转换为串FT。重要的是,人物FT转换成对方。这是通过检查字符是否小于Mget TrueFalse,然后获取字符串表示形式的第一个字符来完成的。


Haskell,23个字节

q '~'=' '
q _='~'
map q

在线尝试

将所有字符替换为~,除了~变为空格。


中的空间有q '~'什么意义?为什么不能将其删除?
Cyoce

@Cyoce Haskell允许'作为标识符中的字符,因此q'~'=' '将被解析为q' ~ '=' '(报告词汇错误,因为最后一个'不匹配。)
ØrjanJohansen

5

空格,59个字节

可见的表示

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

它能做什么:

它读取的每个字符都会打印一个空格,除非是空格,然后打印一个@。

拆卸:

loop:
    push 32
     dup
      dup
       dup
        ichr
       get
       sub
      jn not_32
     dup
      add
not_32:
     pchr
    jmp loop

总是很高兴在Whitespace中看到一个解决方案。尤其是当您通常无法实际看到它时。+1
Josiah Winslow

好答案!我试图提出一些简短的结构,但找不到任何东西。但是您可以通过将SSSTSSSSSN (push 32)to SSSTSSTN (push 9)TSSS (add)to 更改为2个字节TSSN (multiply)。它将为unicode值大于9的每个字符打印一个标签,为unicode值为的每个字符打印一个Q(9 * 9 = 81)0..9在线尝试原始57字节,或者在线尝试添加突出显示和解释
Kevin Cruijssen 18-4-3

忽略我上面的评论。对于挑战标签不被视为可打印的ASCII字符..
凯文Cruijssen

5

MATL6 5字节

Qo!V!

在线尝试!

说明

Q     % Implicitly input a string. Add 1 to each code point.
o     % Parity: 0 if odd, 1 if even. Note that '0' has ASCII code 48, so after
      % having added 1 it now gives 1. Similarly. '1' has ASCII code 49, so it
      % now gives 0. All other chars give 0 or 1. 
!V!   % Convert each number to the corresponding char. Implicitly display

在CJam中是5 :(l'0f=如果它按照我的想法做)
Martin Ender

@MartinEnder是的,正是这样:-)我刚刚添加了一个解释
Luis Mendo

5

Haskell,19个字节

接受并返回的匿名函数String。用作(map$(!!1).show.succ) "1111"

map$(!!1).show.succ

在线尝试!(使用@xnor的测试工具。)

  • 对于输入字符串中的每个字符,将其递增,然后将其转换为字符文字格式,然后采用文字的第二个字符,即刚开始'引号之后的字符。
  • 对于几乎所有可打印的字符,这只会导致字符增加。例外的情况是&~,这反而给\,因为他们的继任者',并\DEL在字符文字得到了转义。

非常确定head可以代替(!!1)一个额外的字节使用
朱利安·沃尔夫

不,head(!!0),不是(!!1)。这将使角色失败'
与Orjan约翰森

嗯对 我一直在阅读python答案,却忘记了引号通常需要特殊处理。
朱利安·沃尔夫

4

05AB1E,5个字节

žQDÀ‡

在线尝试!

说明

将每个字符替换为下一个可打印的ascii字符,从波浪号到空格包装。

žQ     # push a string of printable acsii chars (space to tilde)
  D    # duplicate
   À   # rotate left
    ‡  # translate

4

V,7个字节

íÁ/a
g?

在线尝试!验证所有测试用例!

它是如何工作的?

考虑所有由可打印ASCII组成的字符串。每个字符串必须要么1)包含字母字符,要么2)不包含字母字符。

因此,该程序的工作方式是首先将一个非字母字符转换为'a',然后对输入字符串执行ROT13。

í       " Substitute:
 Á      "   A non-alphabetic character ([^a-zA-Z])
  /     "   with
   a    "   the letter 'a'
g?      " Perform ROT13 on...
        "   (Implicit) the current line.

如果您有一个像9单独这样的数字,则此操作会中断,递增该操作会在字符串中添加另一个字符
nmjcman101,2016年

@ nmjcman101啊,这很不错。我已回复
DJMcMayhem

我喜欢ROT13,但我不知道V(im)可以做到这一点
nmjcman101 '17

4

C(gcc),22个字节

f(char*s){*s=65+*s%2;}

获取字符串指针并修改第一个字符。

在线尝试!


1
简称:*s=159-*s。始终更改最后一位,因此永远不会给出相同的字符。请注意159 = ' ' + '~'
celtschk

我认为您的意思是158 =''+'〜'。159-32 = 127,这可能是超出范围的字符。但是好主意。
Computronium

@celtschk内卷无法正常工作,因为可打印的汉字数量奇多(95),因此其中至少有一个会映射到自身。
丹尼斯,

@Computronium:糟糕,您是对的,我得到了~错误的字符代码。
celtschk

4

C(gcc),20个字节

看到丹尼斯的答案,想到了2字节的基本改进。

f(char*s){*s^=*s/3;}

在线尝试!(丹尼斯的足迹。)

与原始字符一样,修改字符串的第一个字符,但是将其值除以3(有效的最小数字)对其进行异或运算。单个字符出现2失败'U',给出127,不可打印。)


4

Python 2,25个字节

lambda s:`s<'T'`[0]+s[1:]

在线尝试!

Anders Kaseorg通过从True或中提取第一个字符来保存一个字节False


我建议更改'?'为两位数的字符代码,但是Python并不是您可以做到的那些语言之一:(
CalculatorFeline

保存一个字节的变体(但不支持Python 3兼容性):lambda s:`+(s<'1')`+s[1:]lambda s:`s<'T'`[0]+s[1:]
Anders Kaseorg,

3

Haskell,30 26字节

f ' '='~'
f c=pred c
map f

在线尝试!

用其前身替换每个字符,并用代字号替换空格。


3

八度19 18字节

@(s)['',(s<66)+65]

在线尝试!

说明:

@(s)                 % Anonymous function taking a string s as input
         s<66        % A boolean vector with `1` for all characters below ASCII-66.
        (s<66)+65    % Add 65 to this, so that all elements that are 32-65 are now 66.
                     % All other elements are 65 
    ['',         ]   % Implicitly convert the list of 65 and 66 to the letters A and B

3

CJam,5个字节

l)iA%

在线尝试!

将最后一个字符转换为其代码点,并取10为模。对于最后一个位置的非数字字符,这明显不同。但是数字从代码点48开始,因此使用那些mod 10将使它们循环左移,因此最后一个字符始终会更改。




3

Cubix,10个字节

..@|i?2%)O

在线尝试!观看它运行!

对于每个字符,1如果字符具有偶数代码点,2则打印;否则;1它的代码点是奇数,偶数2是偶数,因此输出永远不会等于输入。

说明

此代码对应于以下多维数据集网:

    . .
    @ |
i ? 2 % ) O . .
. . . . . . . .
    . .
    . .

IP(指令指针)始于最左面的左上角,向东。它遵循以下一系列指令:

i     Grab a char-code from STDIN and push it to the stack (-1 if there is no more input).
?     If the top item is negative, turn left and hit @ which ends the program.
      If it's positive (any printable ASCII char), turn right. The IP runs through a bunch
        of no-ops, then hits:
)     Increment the top item.
|     Mirror the IP's direction horizontally (turns it around).
)     Increment the top item again. The IP then wraps around again until it hits:
?     The top item is positive, so turn right.
2     Push a 2 to the stack.
%     Push the modulus of the top two items (0 for even char-code, 1 for odd).
)     Increment the result (now 1 for even char-code, 2 for odd).
O     Output as a number. The IP wraps back around to the i and the process starts again.

3

爱丽丝,9字节

#oi/
t i@

在线尝试!

说明

这个想法来自Martin Ender的CJam提交。将第一个字符作为代码点,将其简化为mod 10,并移至输出的末尾。由于仅更改了一个字符,因此对字符进行置换不会导致返回相同的字符串。

#   skip next command
o   (skipped)
i   push first byte onto stack
    STACK: [97]
/   reflect to SE, switch to ordinal mode (implicit reflect to SW)
i   push remaining input onto stack as string (implicit reflect to NW)
    STACK: [97, "sdf"]
o   output top of stack (implicit reflect to SW)
    STACK: [97]
t   implicitly convert code point to decimal string, and extract last character
    (implicit reflect to NE)
    STACK: ["9", "7"]
o   output this last digit (implicit reflect to SE)
i   push empty string, since there is no more input to take (implicit reflect to NE)
/   reflect to S, switch to cardinal mode
@   terminate

使用t对mod 10是真聪明,漂亮。:)
Martin Ender

3

Pushy,1个字节

Q

在线尝试!

这会将给定的字符串转换为ASCII字符代码列表,对它们进行索引(模块化索引)为大写字母,然后打印结果。本质上,每个字符n都映射到chr(ord(n) % 26 + 65)。您可以使用该程序查看映射的工作方式。

输出:

  • 由于字符会直接映射到新的字符,因此长度将始终与输入的长度相同。
  • 将始终仅包含可打印的ASCII字符(因为它仅包含大写字母)
  • 总是与输入不同,因为没有可能的输入字符 n,对于chr(ord(n) % 26 + 65) == n,为真,必须有一个x使得的整数26x = 65,对此没有解决方案。

1个字节

q

在线尝试!

这个答案完全相同,只是它映射到小写字母字符而不是大写字母字符。这仍然是有效的,因为没有可能的输入字符n这样chr(ord(n) % 26 + 97) == n


2

脑爆裂,53字节

包括+1的 -c

([(((()()()()){}){}){}()]({}())){{}(<({}[()()])>)}{}

除非它是一个空格,否则它将减少第一个字符,在这种情况下,它将增加第一个字符。

在线尝试!

([(((()()()()){}){}){}()]      )                     # Push: input + 1 != 33 on top of...
                         ({}())                      #    input + 1
                                {{}(<          >)}{} # If (input + 1 != 33)
                                     ({}[()()])      #   Push: (input + 1) - 2

2

果冻,4字节

^1Ṿ€

输出数字字符串。没有输出字符将等于相应的输入字符。

在线尝试!

这个怎么运作

^1Ṿ€  Main link. Argument: s (string)

^1    XOR each character c in with 1.
      This attempts to cast c to int, mapping '0', ..., '9' to 0, ..., 9.
      For non-digits, the attempt fails, mapping c to 0.
      After XORing with 1, we get 1, 0, 3, 2, 5, 4, 7, 6, 9, 8 for '0', ..., '9', 
      and 1 for all non-digits.
  Ṿ€  Uneval each; mapping 0, ..., 9 to '0', ..., '9'. This yields a character
      array, which is Jelly's string type.
      Note that no character is mapped to itself.

2

Bash + coreutils,13

tr \ -~ ~\ -}

使用将字符转换~(0x20-0x7e)~,然后转换}(0x7e,0x20-0x7d)。

在线尝试


2

PHP,30 27

<?=strtr($a=$argn,$a,$a^1);

用翻转了最低有效位的字符将每个字符更改为等于第一个字符。


“〜”有效吗?
CalculatorFeline

实际上,它不会翻转第一个字符的最低有效位。它它转换为整数和翻转的至少显著位认为。是的,@CalculatorFeline ~确实可以工作,输出1
ETHproductions's

哦。是否!$a还是~$a工作?
CalculatorFeline

@ETHproductions我上床睡觉前不久做了最后一次编辑,没有时间更新它。当然,您的权利会首先转换为整数,因此可能甚至不更改第一个字符,但也许第二个字符(例如“ 12”)变为“ 13”。
克里斯多夫(Christoph)

@CalculatorFeline可悲的失败,都!$a轮流"12""12",因为false这样,任何被替换转换为空字符串,并~$a把一切都变成unprintables因为~"12"不能转换成int第一,但字面上翻转字符串中的所有位。
克里斯多夫(Christoph)


2

Brachylog,9个字节

{¬Ṣ|∧Ịh}ᵐ

在线尝试!

说明

这会将所有字符替换为一个空格,但用代替的字符除外"0"

{      }ᵐ      Map on each char of the Input
 ¬Ṣ              The Input char is not " ", and the Output char is " "
   |             Or
    ∧Ịh          The Output char is "0"

2

PHP <7.1,31字节

for(;~$c=$argn[$i++];)echo$c^1;

在线尝试!


请删除66字节的解决方案,因为它无效。
CalculatorFeline

输入“ 1”,“ 10”,“ 101”等失败。您不能仅依赖字符串长度。
CalculatorFeline

@CalculatorFeline“ 1”输出“ 0”,“ 10”输出“ 01”,“ 101”输出“ 010”。哪里出问题了?
克里斯多夫(Christoph)

@CalculatorFeline“ 1” => 0,“ 10” => 01,“ 101” => 010哪里失败了?
约尔格Hülsermann

1
PHP 7.1产生A non-numeric value encountered。并且您可以使用~代替a&
泰特斯

2

Golfscript,3个字节

在线尝试!

)5%

将最后一个字符的ASCII值取模5,并用结果替换最后一个字符。这显然适用于非数字字符,但是如果最后一个字符是数字,则它也会更改(“ 0” mod 5 = 3,“ 1” mod 5 = 4,依此类推)。

这同样适用于7或9,同时仍保持相同的长度。

另外,是的!我有一个Golfscript解决方案以及这里最好的解决方案!


2

时髦26 22字节

s=>s::gsub("."a=>1&~a)

计算~a哪些非数字将返回NaN。然后1&它限制为0或1,为数字0,这将是1,和1这将是0。因此,此字符串始终是唯一的。

在线尝试!

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.