문자와 숫자 실행 바꾸기


14

영숫자 ASCII 문자 만 포함하고 문자로 시작하는 입력 문자열이 주어지면 각 문자 실행은 다음 숫자 실행으로 바꿉니다.

실행은 연속 문자 또는 숫자의 순서입니다. 입력 문자열이 런으로 끝나는 경우이 런은 그대로 유지됩니다.

연습 예제

예를 들어 입력 문자열이 주어지면 uV5Pt3I0:

  1. 별도의 문자와 숫자로 구성됩니다. uV 5 Pt 3 I 0
  2. 런 쌍을 식별하십시오. (uV 5) (Pt 3) (I 0)
  3. 런 쌍 교체 : (5 uV) (3 Pt) (0 I)
  4. 사슬 같이 잇다: 5uV3Pt0I

uV5Pt3I0 -> 5uV3Pt0I
J0i0m8 -> 0J0i8m
abc256 -> 256abc
Hennebont56Fr -> 56HennebontFr
Em5sA55Ve777Rien -> 5Em55sA777VeRien
nOoP -> nOoP

이것은 이므로 바이트 단위의 최단 답변이 이깁니다. 설명이 권장됩니다.

답변:


9

젤리 , 9 바이트

~ṠŒg⁸ṁṭ2/

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

작동 원리

~ṠŒg⁸ṁṭ2/  Main link. Argument: s (string)

~          Apply bitwise NOT.
           Bitwise operators attempt to cast to int, so if c is a digit, this
           yields ~int(c), a negative number.
           If c cannot be cast to int, ~ will yield 0.
 Ṡ         Take the sign.
           We've now mapped digits to -1, non-digits to 0.
  Œg       Group consecutive equal elements.
    ⁸ṁ     Mold s as the result, grouping run of digits and runs of non-digits.
       2/  Reduce all pairs of runs by...
      ṭ        tack, appending the first run of the pair to the second run.

15

망막 , 15 바이트

(\D+)(\d+)
$2$1

이 정규식 대체 (\D+)(\d+)와를 $2$1. 그것이 무엇을 의미하는지 모른다면 그것을 분류 해 봅시다.

\D수단 '는 숫자가 아닌 일치 아무것도'. \d'숫자 인 모든 항목과 일치'를 의미합니다. +기호 수단은 '한 번에 적어도이 일치하지만 가능한 한 많은 시간으로 일치하려고'. 괄호는 그룹을 정의합니다. 첫 번째 그룹은 (\D+)두 번째(\d+)

두 번째 줄에서 우리는 두 번째 그룹과 일치하는 것을 넣고 첫 번째 그룹과 일치하는 것을 넣기를 원한다고 말합니다. 이것은 문자와 숫자 런을 효과적으로 교환합니다.

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


7

하스켈 , 58 56 바이트

2 바이트를 줄인 @Laikoni에게 감사합니다

f""=""
f s|(a,(b,y))<-span(<':')<$>span(>'9')s=b++a++f y

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

언 골프 드 :

f "" = ""
f string | (letters, afterLetters) <- span (> '9') string
         , (numbers, afterNumbers) <- span (< ':') afterLetters
         = numbers ++ letters ++ f afterNumbers

로 2 바이트를 저장하십시오 (a,(b,y))<-span(<':')<$>span(>'9')s.
Laikoni

1
더 많은 비용을 절약하십시오 (a,(b,y):_)<-lex<$>span(>'9')s: 온라인으로 사용해보십시오!
Laikoni

@Laikoni : 팁 주셔서 감사합니다! lex작동 방식 이 확실하지 않으므로 지금은 포함하지 마십시오 . 어쨌든, Prelude에는 이와 비슷한 것이 있다는 것을 아는 것이 좋습니다
Julian Wolf

7

자바 스크립트 (ES6), 34 바이트

s=>s.replace(/(\D+)(\d+)/g,"$2$1")

시도 해봐

o.innerText=(f=
s=>s.replace(/(\D+)(\d+)/g,"$2$1")
)(i.value="uV5Pt3I0");oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>


6

Pyth , 15 바이트

ss_Mc:z"(\d+)"3 2

설명

     :z"(\d+)"3      # Split the input z onto matches of numbers (\d+)
    c           2    # Split the resulting list in pieces of length 2
  _M                 # Reverse each pair
ss                   # Concatenate

테스트 스위트 .



6

Japt (v2.0a0), 16 바이트

q/(\d+/ ò mw c q

온라인으로 테스트하십시오!

참고 : 이것은 불안정한 알파이므로이 링크가 끊어지면 v1.4.4에서 약간 더 긴 버전을 사용할 수 있습니다. 온라인에서 테스트하십시오!

설명

q/(\d+/ ò mw c q  : Implicit input              "uV5Pt3I0"
q                 : Split input on
 /(\d+/           :   runs of digits, keeping each run. (This compiles to the regex /(\d+)/g)
                  : This gives                  ["uV","5","Pt","3","I","0",""]
        ò         : Take every pair of items.   [["uV","5"],["Pt","3"],["I","0"],[""]]
          m       : Map each pair by
           w      :   reversing.                [["5","uV"],["3","Pt"],["0","I"],[""]]
             c    : Flatten into one array.     ["5","uV","3","Pt","0","I",""]
               q  : Join into a single string.  "5uV3Pt0I"
                  : Implicit: output result of last expression

와 함께 할 수있는 방법이 있는지 알아 내려고했습니다 ò.
얽히고 설킨

5

CJam , 32 30 28 바이트

q{i_64>X\:X^{])[}&c}/]]2/Wf%

CJam에는 정규 표현식이 없으며 "숫자와 문자로 분리"또는 기타가 없기 때문에 일종의 고통 스러웠습니다.

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

설명

q      e# Read the input.
{      e# Do the following for every char c:
 i     e#  Get c's codepoint.
 64>   e#  Check if it's greater than 64 (i.e. if it's a letter), pushing 1 or 0.
 X     e#  Push X (variable predefined to 1).
 \:X   e#  Store whether c was a letter or digit into X.
 ^{    e#  If (old X) XOR (new X) is 1:
  ]    e#   Close the current array.
  )    e#   Pull out its last character.
  [    e#   Open a new array.
 }&    e#  (end if)
 c     e#  Turn the codepoint back into a character. This also shoves it into the new array, 
       e#  in case one was opened.
}/     e# (end for)
]      e# Close the final array, since it hasn't been closed yet.
]      e# Wrap the whole stack into an array.
2/     e# Split elements into groups of 2.
Wf%    e# Reverse each group.
       e# Implicitly flatten and print.

4

Gema , 11 자

<L><D>=$2$1

샘플 실행 :

bash-4.4$ gema '<L><D>=$2$1' <<< 'Em5sA55Ve777Rien'
5Em55sA777VeRien

너무 짧다. 내 말은, 골프 언어가 아니며 11 일 뿐입니 까? 와.
Outgolfer 에릭

예, 그러나 동일한 입력을 두 번 터치 할 필요가없는 작업에만 해당됩니다. 그러면 악몽이됩니다. ☹
manatwork

다른 게시물 중 하나를 통해 Gema를 찾았습니다 ... 멋진 언어. Gema가 얼마나 모호하겠습니까?
요나

@Jonah, 나는 그것의 유일한 모호한 부분이 도메인이라고 말할 것입니다. 기능이 문서화되어 있지 않기 때문에 부분적으로 발생합니다. 그렇지 않으면 언어는 훌륭하지만 고통스럽게 제한된 기능의 모음입니다. 예를 들어 인식기는 흔들리지 만 정규 표현식 문자 클래스처럼 결합 할 수 있으면 훨씬 강력합니다.
흔들리지 만

90 년대의 gema는 얼마나 인기가 있었습니까? 그리고 현대의 상대방 / 경쟁 업체가 있습니까? 당신은 일을 위해 그것을 사용하거나 재미를 위해 그것을 찾았습니까?
요나


2

apt, 18 바이트

r"(%D+)(%d+)""$2$1

그것을 테스트


설명을 추가 할 수 있습니까?
Jim

@ Jim, 그것은 내 JS 솔루션 (Japt transpiles to JS)의 포트 일뿐입니다. 그렇지 않은 경우 Okx Retina 솔루션의 설명을 참조하십시오. 내 둘 다 똑같은 일을합니다.
얽히고 설킨

4
??? @Downvoter : 피드백을 제공하십시오.
얽히고 설킨

@Shaggy 당신은 그것을 스스로 말했다, 그것은 기본적으로 Okx의 솔루션을 복사하여 붙여 넣은 다음 다른 답변과 정확히 동일한 코드로 컴파일되는 언어로 한 단계 더 나아갔습니다 . 그래서 이것은 흥미로운 골프 기술이나 독창성을 사용하지 않는 독특한 솔루션이 아니기 때문에 공감했습니다. 오히려 다른 답변의 번역
Downgoat

1
@ Downgoat, 댓글 주셔서 감사합니다. 그러나 Okx의 솔루션을 복사했다고 말하지 않았으며 Jim에게 설명을 요청했습니다. 타임 스탬프를 확인하면 Okx와 거의 같은 시간에 JS 솔루션을 게시 한 것을 볼 수 있습니다 (최초 일 수도 있지만 모바일에서는 정확한 타임 스탬프를 볼 수 없습니다). 그런 다음 내 자신의 솔루션을 다른 언어 로 이식 했습니다. 여기서는 항상 발생하므로 모든 포트를 다운 다운하지 않으면 왜이 언어를 단일화 했는지 이해할 수 없습니다.
얽히고 설킨

2

Sed, 29 바이트

s/([^0-9]+)([0-9]+)/\2\1/g

-r로 실행하십시오.

캡처 그룹을 사용하여 반대 순서로 바꿉니다.


을 (를) 단축 [A-Za-z]할 수 있습니다 [^0-9]. 그러나 플래그를 코드의 일부로 계산해야합니다.
Dennis

깃발은 얼마입니까?
It Guy

차이 사이 sed <command>sed -r <command>, 3 바이트 그래서.
Dennis

@Dennis, 그 차이의 sed -f filenamesed -rf filename(또는 간 sed -e 'command'sed -re 'command'단일 바이트 :)는.
Toby Speight

질문에서 핵심 문구 ( " 문자로 시작 ")를 놓쳤 으므로 s/([a-z]+)([0-9]+)|([0-9]+)([a-z]+)/\2\1\4\3/gi48 바이트였습니다. 그렇지 않으면 거의 같습니다.
Toby Speight

2

젤리 , 12 바이트

e€ØDŒg⁸ṁs2Ṛ€

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

설명:

e€ØDŒg⁸ṁs2Ṛ€ Accepts a string
eۯD         Check if each char is in ['0'..'9']
    Œg       Split runs of 0s and 1s (respectively letter and digit runs)
      ⁸ṁ     Replace with input, keeping the split
        s2   Get pairs of runs, last left alone if letter run
          Ṛ€ Swap each pair

2
설명을 추가 할 수 있습니까?
Jim

@Jim explanaion을 추가했습니다.
Outgolfer Erik

2

PHP, 정규 표현식 없음, 73 바이트

for(;a&$c=$argn[$i++];$p=$c)$c<A?print$c:$s=($p<A?!print$s:$s).$c;echo$s;

파이프로 실행 -nR하거나 온라인으로 테스트 .

고장

for(;a&$c=$argn[$i++];  # loop through input
    $p=$c)                  # 2. remember character
    $c<A                    # 1. if digit
        ?print$c            # then print it
        :$s=($p<A           # else if previous character was digit
            ?!print$s           # then print and reset string
            :$s                 # else do nothing
        ).$c;                   # append current character to string
echo$s;                 # print remaining string

~대신 사용할 수 있습니다a&
Jörg Hülsermann


1

C #, 71 바이트

s=>System.Text.RegularExpressions.Regex.Replace(s,@"(\D+)(\d+)","$2$1")

C #에서는 부끄러운 정규 표현식이 너무 길다.

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

풀 / 포맷 버전 :

using System;

class P
{
    static void Main()
    {
        Func<string, string> f = s => System.Text.RegularExpressions.Regex.Replace(s, @"(\D+)(\d+)", "$2$1");

        Console.WriteLine(f("uV5Pt3I0"));
        Console.WriteLine(f("J0i0m8"));
        Console.WriteLine(f("abc256"));
        Console.WriteLine(f("Hennebont56Fr"));
        Console.WriteLine(f("Em5sA55Ve777Rien"));
        Console.WriteLine(f("nOoP"));

        Console.ReadLine();
    }
}

TIO에 링크를 추가 할 수 있습니까 ?
Jim

@Jim Done. 나는 일반적으로 처음에 추가하기에는 너무 게으르다. 특히 여전히 개선을 찾고 있습니다.
TheLethalCoder

1

클로저, 104 88 바이트

어쨌든 정규식은 정말 편리합니다 ... 어쨌든 ( TIO ) :

#(apply str(flatten(map reverse(partition-all 2(partition-by(fn[i](< 47(int i)58))%)))))

partition-by함수의 반환 값을 기반으로 연속 실행으로 partition-all분할하고, 2 개의 파티션 (스왑 할 쌍)으로 분할하고 , 역순으로 map reverse정렬하고, flatten중첩 된 목록 구조를 제거하고 마지막으로 문자열을 출력합니다. partition대신에 사용 된 경우partition-all 되었고 우리는 홀수의 청크를 가지고 마지막 것은 폐기됩니다.

Original 은 ASCII 정수 범위 대신 장황하지만 재미 (juxt second first)있고 재미있게 사용했습니다 .(set"0123456789")reverse

#(apply str(flatten(map(juxt second first)(partition-all 2(partition-by(comp not(set"0123456789"))%)))))

TIO 에 대한 링크 와 설명 을 추가 할 수 있습니까 ?
Jim

1

QuadR , 15 바이트

(\D+)(\d+)
\2\1

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

Okx에서 훔쳐간 설명 :

이 정규식 대체 (\D+)(\d+)와를 \2\1. 그것이 무엇을 의미하는지 모른다면 그것을 분류 해 봅시다.

\D수단 '는 숫자가 아닌 일치 아무것도'. \d'숫자 인 모든 항목과 일치'를 의미합니다. +기호 수단은 '한 번에 적어도이 일치하지만 가능한 한 많은 시간으로 일치하려고'. 괄호는 그룹을 정의합니다. 첫 번째 그룹은 (\D+)두 번째(\d+)

두 번째 줄에서 우리는 두 번째 그룹과 일치하는 것을 넣고 첫 번째 그룹과 일치하는 것을 넣기를 원한다고 말합니다. 이것은 문자와 숫자 런을 효과적으로 교환합니다.



1

, 17 바이트

aR-C+XL.C+XD{c.b}

입력을 명령 행 인수로 사용합니다. 온라인으로 사용해보십시오!

설명

이것은 다소 정규화 된 표준 정규식 대체 전략을 사용합니다.

정규식은 다음 -C+XL.C+XD과 같이 평가됩니다 `(?i)([a-z]+)(\d+)`.

   XL       Preset regex variable for lowercase letter: `[a-z]`
  +         Apply + to the regex: `[a-z]+`
 C          Wrap the regex in a capturing group: `([a-z]+)`
-           Apply the case-insensitive flag: `(?i)([a-z]+)`
        XD  Preset regex variable for digit: `\d`
       +    Apply + to the regex: `\d+`
      C     Wrap the regex in a capturing group: `(\d+)`
     .      Concatenate the two regexes: `(?i)([a-z]+)(\d+)`

대체는 {c.b}, 두 번째 그룹 ( c)과 첫 번째 그룹 ( b) 을 연결하는 콜백 함수입니다 . (함수의 첫 번째 인수 a는 전체 일치를 포함합니다.)

순진한 것보다 3 바이트 짧다 aR`(\D+)(\d+)``\2\1`.


1

brainfuck , 98 바이트

,[>>----[---->+<<<-[>]>]>>[.[[-]<]<<[-]+>>]<[[-<<<+>>>]<<<<[-<[<]>[.[-]>]]>[-<+>]>],]<[-]<[<]>[.>]

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

설명

이 프로그램은 아직 출력되지 않은 문자 대기열을 유지 관리하고 적절한 경우 출력합니다.

이 프로그램의 핵심은 >>----[---->+<<<-[>]>]입니다. 입력 셀의 오른쪽에있는 세 개의 셀은 0에서 시작합니다. 입력이 1에서 63 사이의 코드 포인트 인 경우 포인터가 한 칸 오른쪽으로 이동하고이 새로운 위치에서 오른쪽으로 두 칸 입력됩니다. 그렇지 않으면 포인터가 두 칸 오른쪽으로 이동하고 새 위치의 오른쪽 칸 하나의 공간이 63이되고 입력 셀에서 같은 63을 뺍니다. 이것은 입력을 문자 (65-122)와 숫자 (48-57)로 깔끔하게 나눕니다.

,[                       Take first input byte and start main loop
  >>                     Move two cells to the right
  ----[---->+<<<-[>]>]   (See above)
  >>                     Move two cells to the right
                         This cell contains the input if it was a digit, and 0 if input was a letter
  [                      If input was a digit:
   .                     Output digit immediately
   [[-]<]                Zero out digit and working cell
   <<[-]+>>              Set flag so we know later that we've output a digit
  ]
  <                      Move one cell left
                         This cell contains 63 if input was a letter, and 0 if input was a digit
  [                      If input was a letter:
   [-<<<+>>>]            Add 63 back to input letter
   <<<<                  Move to flag
   [                     If a digit has been output since the last letter read:
    -                    Clear flag
    <[<]>                Move to start of queue
    [.[-]>]              Output and clear all queued letters
   ]
   >[-<+>]>              Move input to end of queue
  ]
,]                       Repeat until no input remains
<[-]                     Clear flag if present
<[<]>                    Move to start of queue
[.>]                     Output all queued letters

답이 가장 길지 않은 brainfuck 답변을 축하합니다!
Jim


0

Mathematica, 129 바이트

(n=NumberString;l=Length;s=Riffle[a=StringCases[#,n],b=StringSplit[#,n]];If[l@a==0,s=#,If[l@a<l@b,AppendTo[s,b[[-2;;]]]]];""<>s)&

설명 / 골프 버전을 추가 할 수 있습니까?
Jim

설명 할 내용이 없습니다 ... NumberString이 2 개 세트와 리플로 나뉘어져 있음을 감지합니다. 또한 완벽하게 작동하기 위해 "If"조건이 있습니다.
J42161217
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.