같은 길이, 다른 줄


53

도전

인쇄 가능한 ASCII 문자로 구성된 길이가 L 인 비어 있지 않은 문자열 S 가 주어지면 인쇄 가능한 ASCII 문자 로만 구성되지만 길이가 L 인 다른 문자열을 출력 합니다 ( S와 같지 않음) .

이 문제를 해결하기 위해 인쇄 가능한 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 개의 임의의 문자 만 출력 할 수는 없으며 다른 문자열을 기대할 수 있습니다.
  • 줄 바꿈은 출력에서 ​​허용되지 않지만 문자열에 포함되지 않는 후행 줄 바꿈을 출력 할 수 있습니다.

채점

이것은 이므로 각 언어에서 가장 짧은 바이트 단위의 코드가 이깁니다.


"positive"는 빈 문자열을 제외합니다. 좀 더 명확하게하기 위해 "positive"를 "0이 아닌"으로 바꾸겠습니까?
CalculatorFeline

5
@CalculatorFeline 그러나 음수 문자열 / s를 포함합니다
ETHproductions

1
... 존재하지 않습니다.
CalculatorFeline

@CalculatorFeline 더 나은 지금?
ETHproductions

3
간단하지만 사소한 문제는 아닙니다.
Weijun Zhou

답변:


34

파이썬 2 , 21 바이트

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

온라인으로 사용해보십시오!

입력 문자열의 문자열 표현을 가져 와서 입력 문자열의 길이로 자릅니다. 일반적인 문자열의 경우 '따옴표로 묶고 끝 부분을 잘라냅니다.

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

새 문자열은로 시작합니다 '. 출력이 항상 입력과 다르다는 것을 보여 드리겠습니다.

  • 입력에 no가 없으면 '출력이 시작 '되고 입력이 시작 되지 않습니다.

  • 입력에 a '와 no 가 포함되어 있으면 "파이썬은 "외부 따옴표 "에 사용하여 입력 문자열에없는 첫 번째 문자 를 제공 합니다.

  • 입력이 모두있는 경우 '", 그 외부 따옴표는 '각이 '로 이스케이프됩니다 \'. "입력에 첫 번째 가 나타날 때마다 '출력 의 초기 와 가능한 탈출 로 오른쪽으로 이동 합니다. 이는 "출력에서 해당 위치의 와 일치 할 수 없음을 의미합니다 .

마지막으로 입력을 인용하고 문자를 이스케이프 처리하면 항상 문자 수가 증가하므로 출력을 자르면 입력과 길이가 같습니다.

파이썬 "이 두 번째 경우에 적응 적으로 전환하는 것이 중요하다는 점에 유의하십시오 . 그렇게하지 않으면 3 자 input에서 실패합니다 '\'. 또는 더 이상 수정 프로그램의 접두사가을 사용하여 문자열표시합니다' . 따라서이 방법은 대부분의 언어에서 작동하지 않습니다.


때까지 인덱싱에 대한 추론 '무엇 len(s)보다는 -2?
Julian Wolf

1
모두를 포함하는 입력의 @JulianWolf '와는 "따옴표를 이스케이프 할 필요가 있기 때문에, 2 개 이상의 문자가 추가 된 것입니다.
Anders Kaseorg

맞는 말이다; 그것을 고려하지 않았다. 감사!
Julian Wolf

[2:]대신 [:len(s)]16 자 이하로 사용할 수 있습니다 .
xbarbie

@xbarbie 이스케이프가 필요한 문자가있는 경우 항상 같은 길이를 나타내는 것은 아닙니다.
xnor


15

자바 스크립트 (ES6), 37 33 36 29 26 18 21 19 바이트

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

온라인으로 사용해보십시오!

ETHProductions 덕분에 -4 바이트

CalculatorFeline 덕분에 -7 + -5 + -2 바이트

Rick Hitchcock 덕분에 -3 바이트

첫 번째 문자를 끝으로 이동하고 숫자이고 0이 아닌 경우 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

증명

두 번째 문자가 첫 번째 문자가되기 때문에 세 번째 문자가 두 번째 문자가됩니다. 모든 문자는 동일해야합니다. 마지막 남은 문자는 0 또는 1 일 수 있으므로 반복되는 문자는 0 또는 1이어야합니다. 그러나 0의 문자열은 끝에 1을 생성하고 그 반대도 마찬가지입니다. 따라서 출력과 동일한 입력을 작성할 수 없습니다. -ETHProductions

이전 버전 및 설명 편집을 참조하십시오.

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

하스켈 , 20 바이트

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

온라인으로 사용해보십시오!

F및 의 문자열로 변환합니다 T. 중요한 것은 문자 FT서로 변환하는 것입니다. 이것은 캐릭터가보다 작은 경우 확인하여 이루어집니다 M얻을 True또는 False다음 문자열 표현의 첫 번째 문자를 복용.


하스켈 , 23 바이트

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

온라인으로 사용해보십시오

공백이되는 ~것을 제외하고 모든 문자를로 바꿉니다 ~.


공간의 의미는 무엇입니까 q '~'? 왜 제거 할 수 없습니까?
Cyoce

@Cyoce 하스켈은 허용 '식별자의 문자로, 그래서 q'~'=' '으로 해석 될 것이다 q' ~ '=' '(마지막 때문에 어휘 오류를보고 '타의 추종을 불허합니다.)
Ørjan 요한센에게

5

공백, 59 바이트

보이는 표현

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

그것이하는 일 :

읽은 모든 문자에 대해 공백 일 때를 제외하고 공백을 인쇄 한 다음 @를 인쇄합니다.

분해 :

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

공백에서 솔루션을 보는 것이 항상 좋습니다. 특히 일반적으로 실제로 수없는 경우. +1
Josiah Winslow

좋은 대답입니다! 나는 구조에 더 짧은 것을 생각해 보았지만 아무것도 찾을 수 없었습니다. 하지만 당신은 골프 2를 변경하여 바이트 수 SSSTSSSSSN (push 32)SSSTSSTN (push 9)하고,이 TSSS (add)TSSN (multiply). 유니 코드 값이 9를 초과하는 모든 문자에 대한 탭과 유니 코드 값이 인 모든 문자에 대해 Q(9 * 9 = 81)을 인쇄합니다 0..9. 온라인으로 원시 57 바이트시도
Kevin Cruijssen

위의 내 의견을 무시하십시오. 도전을 위해 탭은 인쇄 가능한 ASCII 문자로 간주되지 않습니다.
Kevin Cruijssen

5

MATL , 6 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

하스켈 , 19 바이트

익명 함수를 가져 와서 반환합니다 String. 로 사용하십시오 (map$(!!1).show.succ) "1111".

map$(!!1).show.succ

온라인으로 사용해보십시오! (@xnor의 테스트 장치 사용)

  • 입력 문자열의 각 문자에 대해 문자를 증가시킨 다음 문자 리터럴 형식으로 변환 한 다음 리터럴의 두 번째 문자 (시작 '인용 부호 바로 뒤에있는 문자)를 사용합니다 .
  • 거의 모든 인쇄 가능한 문자의 경우 단순히 문자가 증가합니다. 예외는 &하고 ~대신 제공하는 \후임자 때문에, '그리고 \DEL문자 리터럴에서 탈출 얻을.

여분의 바이트 head대신에 꽤 사용할 수 있습니다(!!1)
Julian Wolf

아니, head있다 (!!0), 없다 (!!1). 캐릭터에 실패합니다 '.
Ørjan Johansen

아 맞아 방금 파이썬 답변을 읽었으며 따옴표는 일반적으로 특별한 처리가 필요하다는 것을 잊었습니다.
Julian Wolf

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

@ nmjcman101 아, 좋은 지적입니다. 나는 되 돌렸다
DJMcMayhem

나는 V (메신저) 몰랐어 할 수있는, 비록 ROT13 일을 좋아한다
nmjcman101

4

C (gcc) , 22 바이트

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

문자열 포인터를 가져 와서 첫 번째 문자를 수정합니다.

온라인으로 사용해보십시오!


1
더 짧음 : *s=159-*s. 항상 마지막 비트를 변경하므로 동일한 문자를 제공하지 않습니다. 참고159 = ' ' + '~'
celtschk

158 = ''+ '~'을 의미한다고 생각합니다. 159-32 = 127이며 범위를 벗어난 문자입니다. 그러나 좋은 생각입니다.
Computronium

@celtschk Involutions는 인쇄 가능한 chraracters가 홀수 (95) 개이므로 작동하지 않으므로 적어도 하나는 자체 매핑됩니다.
Dennis

@Computronium : 죄송합니다 ~. 문자 코드가 잘못되었습니다.
celtschk

4

C (gcc) , 20 바이트

Dennis의 대답은 2 바이트 필수 개선에 대한 생각이었습니다.

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

온라인으로 사용해보십시오! (데니스의 발자국)

원본과 마찬가지로 문자열의 첫 번째 문자를 수정하지만 값을 3으로 나눈 값으로 조정합니다 (가장 작은 숫자입니다. 2 'U'는 127을 제공 하는 단일 문자에서 실패하며 인쇄 할 수 없습니다).


4

파이썬 2 , 25 바이트

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

온라인으로 사용해보십시오!

Anders Kaseorg는 True또는 에서 첫 문자를 추출하여 바이트를 저장했습니다 False.


나는 변화 좋을 것 '?'2 자리 charCode 값에 있지만, 파이썬은 그 :(를 할 수있는 이러한 언어 중 하나가 아닌
CalculatorFeline

바이트를 절약하는 변종 (그러나 Python 3 호환성을 떨어 뜨림) : lambda s:`+(s<'1')`+s[1:]또는lambda s:`s<'T'`[0]+s[1:]
Anders Kaseorg


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

Alice , 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

tmod 10에 사용 하는 것은 정말 영리합니다. :)
Martin Ender 2012 년

3

Pushy , 1 바이트

Q

온라인으로 사용해보십시오!

주어진 문자열을 ASCII 문자 코드 목록으로 변환하고 대문자로 알파벳순으로 색인화 (모듈 식 색인화) 한 다음 결과를 인쇄합니다. 기본적으로 각 문자 n는에 매핑됩니다 chr(ord(n) % 26 + 65). 이 프로그램 을 사용 하여 매핑 작동 방식을 확인할 수 있습니다 .

출력 :

  • 문자가 새로운 문자로 직접 매핑되므로 항상 입력과 길이가 같습니다.
  • 항상 인쇄 가능한 ASCII 문자 만 포함합니다 (대문자 만 포함).
  • 어떤 가능한 입력 문자가있는 한 항상 입력 다를 수 n있다는 등의 chr(ord(n) % 26 + 65) == n사실이에 관해서는 정수가 있어야합니다, x있도록 26x = 65하는 해결책이 없습니다.

1 바이트

q

온라인으로 사용해보십시오!

이 답변은 대문자 알파벳 문자가 아닌 소문자 알파벳 문자로 매핑된다는 점을 제외하면 정확히 동일 합니다. 입력 문자가 없기 때문에 여전히 유효 합니다 .nchr(ord(n) % 26 + 97) == n


2

Brain-Flak , 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

PHP, 30 27

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

비트 수가 가장 적은 비트를 가진 문자를 사용하여 각 문자를 첫 번째 문자와 동일하게 변경합니다.


"~"가 작동합니까?.
CalculatorFeline

실제로 첫 번째 문자의 최하위 비트를 뒤집지 않습니다. 그것은 정수로 변환하고의 최하위 비트 플립 것을 . 예, @CalculatorFeline ~이 작동하여 출력 1합니다.
ETHproductions

오. 합니까 !$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 어디에서 실패합니까?
Jörg Hülsermann

1
PHP 7.1 수율 A non-numeric value encountered. 그리고 ~대신에 사용할 수 있습니다 a&.
Titus

2

골프 스크립트, 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이 될 것이며, 0 또는 1 중 어느 하나에 제한 1등에 대한 1이 될 것이다 0. 따라서이 문자열은 항상 고유합니다.

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.