문자열에서 숫자를 문자로 변환하거나 그 반대로 변환


12

숫자 및 해당 문자 목록을 기반으로 문자열 입력을 사용하여 해당 문자열의 문자를 해당 숫자 / 문자로 바꾸고 결과를 출력하십시오.

명부

  • 1 = a
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = 전자
  • 6 = f
  • 7 = g
  • 8 = 시간
  • 9 = 나는
  • 0 = j

입력

thisisastring1124

산출

t89s9s1str9n7aabd

규칙

  • 숫자는 소문자 만 해당합니다.
  • 목록 외부의 모든 문자는 그대로 남아 있습니다.
  • 입력 문자열에는 공백이 없어야합니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 코드 골프이기 때문에 가장 적은 바이트가 이깁니다.

2
PPCG에 오신 것을 환영합니다. 좋은 도전!
Adám

2
대문자를 대신 바꿀 수 있습니까?
Adám

소문자, 대문자 만 목록의 범위를 벗어납니다.
느와르 안타레스

입력에 문자와 숫자 만 포함되거나 공백이 아닌 다른 문자 (예 : 구두점)가 포함되어 있습니까?
sundar-복원 모니카

입력 문자열은 공백을 제외한 다른 문자를 포함 할 수 있지만 목록 외부의 항목은 출력 문자열에서 그대로 유지됩니다.
느와르 안타레스

답변:











3

R , 40 바이트

function(s)chartr("0-9ja-i","ja-i0-9",s)

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

놀랍게도, R은 Bash 답변 과 같은 기능을 가지고 있기 때문에 이러한 종류의 도전 tr에 적합합니다 . 왜 존재하는지 모르겠지만 감사합니다!


놀랄 만한! chartr ()가 정규식을 이해하지 못했습니다.
snoram

@snoram은 정규 표현식이 아닙니다. 그것은 지정 문서에 있음 "범위가 사양에서 지원되지만 문자 클래스와 반복되는 문자는 없습니다."
Giuseppe

3

MS-SQL, 71 바이트

SELECT TRANSLATE(v,'1234567890abcdefghij','abcdefghij1234567890')FROM t

새로운 SQL 2017 함수는 TRANSLATE개별 문자 교체를 수행하므로이 목적에 가장 적합합니다. 이전 도전에서 비슷한 답변을 참조하십시오 .

입력은 기존의 테이블을 통해입니다 t varchar 열을 가진 V , 우리의 IO의 규칙에 따라 . 소문자 만 바꾸려면 대소 문자 구분 데이터 정렬을 사용하여 테이블을 만들어야합니다 .

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


2

Pyth , 13 바이트

Xz+jk+0_S9<GT

여기 사용해보십시오!

설명

Xz+jk+0_S9<GT – Full program.
       _S9    – Yield [9, 8, 7, ..., 1]
     +0       – Prepend a 0.
   jk         – Join to a single string.
  +       <GT – And append the first 10 letters of the alphabet to it.
                Yields 0987654321abcdefghij.
Xz            – Transliterates the input from the above to the above reversed.


1

REXX, 57 바이트

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)

1

C (gcc) , 81 72 바이트

Giacomo Garabello에게 제안 해 주셔서 감사합니다.

f(char*s){for(;*s++=*s-97U<11?(*s-6)%10+48:*s-48U<11?(*s-9)%10+97:*s;);}

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


당신은 입력 문자열을 변경하여 6 개 문자를 제거하는 대신 그것을 인쇄 할 수 있습니다 putchar(...)> - *s=...대체하여 다른 4와 *s-48U<11함께 *s<59 온라인으로보십시오!
Giacomo Garabello

*s<59같은 문자 $가 입력에 있으면 @GiacomoGarabello 가 끊어 지기 때문에 내가 한 이유는 *s-48U([0..47]이 [-48 ..- 1]이되어 큰 부호없는 값이됩니다.) -알루미늄은 유효했고, 나는 더 보수적 인 해석으로 갔다.
ErikF

그럴 수 있지. OP는 최근 다른 모든 문자는 유효하지만 공백은 아니라고 언급했습니다. 그러나 당신은 여전히 ​​나의 첫번째 제안을 사용할 수 있습니다
Giacomo Garabello

1

파워 쉘, 94 바이트

-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})

테스트 스크립트 :

$f = {
-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})
}

&$f "thisisastring1124"

설명

  • $args -인수 문자열
  • $args|% t*y-에 |ForEach-Object -Method ToCharArray해당하는 것으로 확장"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)-문자열에서 문자를 찾고 위치를 반환하거나 찾지 못하면 -1을 반환합니다. $ s는 마지막 비트가 다른 이웃 위치에 짝을 이루는 문자를 포함하는 문자열을 저장합시다 : 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) -위치가 발견 된 경우
  • $p-bxor1 -위치 비트 xor 1

와 좋은 트릭 -bxor1.
AdmBorkBork

0

R , 107 바이트

function(s){a=utf8ToInt(s);l=a>96&a<107;n=a>47&a<58;a[n]=(a[n]-9)%%10+97;a[l]=(a[l]+4)%%10+48;intToUtf8(a)}

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

첫 번째 시도, 확실히 즉흥적으로 ...


chartr네 친구가 여기 있다고 생각합니다.
주세페


1
@ 주세페 : 굉장! 전세 기능에 대해 몰랐습니다. 답변으로 게시하십시오. 방법은 완전히 다릅니다.)
digEmAll


0

K4 , 38 바이트

해결책:

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'

설명:

검색 목록의 각 문자 "abcdefghij1234567890"및리스트에 다음 인덱스 "1234567890abcdefghijX"여기서 X일본어 문자이다.

줄을 만드는 더 짧은 방법을 찾아야합니다 ...

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'
{                                  }@' / apply (@) lambda {} to each (')
                                 ?x    / lookup x in
         (                      )      / do this together
                          .Q`a`n       / index into .Q with a (gives a-z) and n (gives 0-9)
                   10 11#'             / take 10 from first list and 11 from second list
              0 1_'                    / drop 0 from first list and 1 from second list
            a:                         / save as a
          ,/                           / flatten
 (      )                              / do this together
     x,a                               / prepend x to a
    |                                  / reverse it
  ,/                                   / flatten

보너스:

38 바이트에 대한 또 다른 해결책 :

{(a,b,x)?[(b:1_11#.Q.n),a:10#.Q.a]x}@'



0

sed, 44 바이트

y/1234567890abcdefghij/abcdefghij1234567890/

조금 지루합니다.

테스트 :

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.