양수 런


22

입력

입력은 일련의 숫자를 포함하여 합리적인 형식의 단일 숫자 목록입니다. 입력이 비어 있지 않습니다.

산출

출력은 입력 목록이되지만 0이 아닌 숫자의 각 최대 실행은 반전됩니다.

입력을 고려하십시오

95883007414830
<--->  <---->

0이 아닌 런에는 화살표가 표시되어 있습니다. 이러한 각 실행을 취소하면 결과가 나타납니다.

38859003841470

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.

이 문제 는 추가 문자열 처리를 포함하므로 관련이 있지만 훨씬 더 복잡합니다.

테스트 사례

4 -> 4
00 -> 00
123 -> 321
0010 -> 0010
12000345 -> 21000543
18161604 -> 61618104
95883007414830 -> 38859003841470
010230456078912 -> 010320654021987
357509902003550 -> 575309902005530
2492882377675046 -> 5767732882942064
03026302053000357099 -> 03036202035000753099

리더 보드

다음은 언어별로 순위표와 수상자 목록을 생성하는 스택 스 니펫입니다. 답변이 표시되도록하려면 양식 헤더로 시작하십시오.

## Language, N bytes

당신은 취소 선 태그를 사용하여 헤더에있는 오래된 점수를 유지할 수 있습니다 : <s>57</s>로 표시됩니다 57 .

답변:



8

IPOS , 5 바이트

'0!r%

%입력 문자열을 0으로 나누고 명령 r(역)을 모든 하위 문자열에 적용 하고 결과를 0으로 다시 조인합니다.


7

망막 , 15 바이트

S`0
O%^$`.

¶
0

온라인으로 사용해보십시오! (모든 테스트 사례를 한 번에 실행하도록 약간 수정했습니다.)

설명

S`0

입력을 0s로 나눕니다. 즉, 0이 아닌 자릿수의 각 행을 자체 행에 놓습니다.

O%^$`.

이것은 다음과 같이 각 줄을 반대로합니다.

  • 로 각 줄에 개별적으로 스테이지를 적용합니다 %.
  • 와 각 문자를 개별적으로 일치 .시킵니다.
  • $빈 문자열 (빈 두 번째 줄)을 사용한 대체 결과 ( )를 기준으로 정렬합니다 . 즉, 모든 정렬 값이 동일하기 때문에 전혀 정렬되지 않습니다.
  • 그런 다음 정렬 된 문자의 순서를 반대로 바꿉니다.

마지막으로

¶
0

줄 바꿈을 다시 0s 로 돌립니다 .



5

줄리아, 30 바이트

s->replace(s,r"[^0]+",reverse)

이것은 문자열을 받아들이고 문자열을 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

replace함수는 정규식의 일치 항목을 각 일치 항목에 적용된 함수의 결과로 바꾸는 기능을 제공합니다. 이 경우 [^0]+해당 런 reverse을 사용하여 일치하는 텍스트에 적용된 함수 의 결과로 0 이 아닌 값을 얻을 수 있습니다 .

모든 테스트 사례를 온라인으로 확인하십시오!



4

줄프, 8 바이트

RΜGi0λ_0

여기 사용해보십시오!

설명

RΜGi0λ_0
  Gi0     split input on zeroes
 Μ   λ_   map over reversal as a lambda
R      0  join by zeroes

코드 설명은 곁눈질하면 람다처럼 보입니다.

동등한 8 바이트 답변 :

RΜGi0΅O0

같은 것이지만 ΅O대신 (문자열 미러 람다)를 사용합니다.


나는 그것을 찡 그릴 때 재미있는 모양의 텍스트처럼 보입니다. 이 망원경을 치워야 할 것 같습니다.
고양이

1
@cat 아니, 안돼.하지만 람다를 보라.
Conor O'Brien


3

파이썬, 58 50 바이트

lambda x:"0".join([n[::-1] for n in x.split("0")])

문자열 x를 가져 와서 0으로 나누고 나누기의 각 요소를 뒤집고 0을 더한 다음이 빼기 마지막 0을 반환합니다.


1
PPCG에 오신 것을 환영합니다 "0".join.
FryAmTheEggman

팁에 대한 @FryAmTheEggman 감사
1232 년

문제 없습니다 :) ]및 사이의 공백을 제거 할 수도 있습니다 for. 원하는 경우 도움말 페이지에서 더 많은 포인터를 확인할 수 있습니다 .
FryAmTheEggman

7
lambda x:"0".join(n[::-1]for n in x.split("0"))
orlp

3

Mathematica, 30 바이트

Join@@Reverse/@#~SplitBy~Sign&

예를 들어 Join@@Reverse/@#~SplitBy~Sign&[{1,2,3,0,0,5,9,0}]={3, 2, 1, 0, 0, 9, 5, 0}


2

PowerShell v2 +, 45 바이트

($args-split0|%{-join$_[$_.length..0]})-join0

내일없는 것처럼 암시 적 캐스팅을 남용합니다. 이 인덱싱 트릭보다 짧은 리버스에 대한 내장 기능이 없기 때문에 훨씬 짧아 질 수는 없습니다.

설명

이것이 어떻게 작동하는지에 대한 예 123045는 입력 이라고 가정하자 $args. -spliton 후에 0파이프 라인에는 배열이 포함됩니다 (123,45). with의 첫 번째 루프 |%{...}는 현재 요소가와 $_123으며 암시 적으로 문자열로 캐스트 된 다음 []인덱싱 과 반대로됩니다 . 그것은 그것을 ('3','2','1')문자 배열로 만듭니다. 루프는 그것을 -join문자열로 되돌려 "321"파이프 라인에 남겨 둡니다. 다음 (마지막) 루프 반복은 입력을로 바꿉니다 "54". 그래서 지금 우리의 파이프 라인입니다 "321", "54". 그것은 parens로 캡슐화되어 ()배열로 재구성 -join되고 결과 출력 문자열을 생성하기 위해 0과 함께 다시 반환됩니다."321054". 그것은 파이프 라인에 남아 있으며 콘솔로의 출력은 암시 적입니다.

원래 입력에 후속 0이 있으면 배열에 널 요소가 채워 지므로 출력에 올바른 수의 0이 있습니다. 예를 들어, 1230045-split0로 회전 (123,,45)사물이 위와 같이 계속합니다.



2

인자, 35 바이트

Pyfon과 Clojure를 때리는, 부야!

[ "0"split [ reverse ] map "0"join ]

이 익명 함수는 이 Python 응답 의 리터럴 번역입니다 .

매우 간단합니다. 문자열을 0으로 나누고 결과 배열의 모든 요소를 ​​뒤집고 모든 요소 (길이가없는 문자열 포함)를로 조인하십시오 "0".

다음은 모든 테스트 사례에서 실행되는 예입니다.

IN: scratchpad auto-use {
        "4"
        "00"
        "123"
        "0010"
        "12000345"
        "18161604"
        "95883007414830"
        "010230456078912"
        "357509902003550"
        "2492882377675046"
        "03026302053000357099"
        }
        [ 
          "0" split [ reverse ] map "0" join
        ]
        map .

{
    "4"
    "00"
    "321"
    "0010"
    "21000543"
    "61618104"
    "38859003841470"
    "010320654021987"
    "575309902005530"
    "5767732882942064"
    "03036202035000753099"
}

"00120"-> { "" "" "12" "" }-> { "" "" "21" "" }->"00210"


2

하스켈, 45 바이트

r%(0:t)=r++0:[]%t
r%(h:t)=(h:r)%t
r%_=r
([]%)

에 도달 r하면 앞에 추가 하여 역 청크를 지금까지 반복적으로 누적합니다 0. 나머지 줄이 비어 있으면 방전 r됩니다.

처음 두 코드는 일부 코드를 반복하지만 더 짧은 방법을 찾지 못했습니다 (45 및 47 바이트).

r%(h:t)|h<1=r++h:[]%t|1>0=(h:r)%t
r%_=r
([]%)

r%l|0:t<-l=r++0:[]%t|h:t<-l=(h:r)%t
r%_=r
([]%)

두 번째 줄에 한 쌍의 괄호가 더 필요하다고 생각합니다.r%(h:t)=(h:r)%t
nimi


1

자바 스크립트 (ES6), 50 49 바이트

문자열 버전 :

s=>s.replace(/[^0]+/g,r=>[...r].reverse().join``)

@Kevin Lau 덕분에 바이트를 절약했습니다!

배열 버전 (60 바이트) :

a=>a.map((n,i)=>n?a[z-i+[...a,0].indexOf(0,i)]:(z=i,0),z=-1)

1

J, 20 18 바이트

0}:@;@(<@|.;.1)@,]

도움을 주신 Zgarb에게 감사드립니다! 공백으로 구분 된 목록을 올바른 인수로 취합니다.

Zgarb 덕분에 -2 바이트!


1

Clojure / ClojureScript, 44 자

#(flatten(map reverse(partition-by pos? %)))

긴 함수 이름 덕분에 다른 솔루션과 동일한 솔루션입니다. 그 때문에 게시하지는 않았지만 다른 답변을 능가하는 이유는 무엇입니까?

모든 시퀀스 유형에서 작동합니다. ClojureScript에서는 문자열이 문자 목록으로 처리 할 수 ​​있기 때문에 문자열에서도 작동합니다. 실제로는 길이가 1 인 문자열이며 pos?.


1

하스켈, 46 바이트

import Data.Lists
(reverse=<<).split(oneOf"0")

사용 예 : (reverse=<<).split(oneOf"0") $ "0123004500678090"-> "0321005400876090".

안타깝게도이 split기능에는 값 비싼 수입이 필요합니다. 0예를 들어 split(oneOf"0") "0120030"-> ["","0","12","0","","0","3","0",""]와 같이 입력 목록을 분할하고 각 청크를 뒤집고 단일 문자열로 연결하십시오.


1

F #, 103 바이트

let f x=x="";x.Split '0'|>Array.map(fun s->System.String(s|>Seq.toArray|>Array.rev))|>String.concat "0"

1

자바, 179 바이트 (가져 오기 포함)

import java.util.*;static void r(String s){StringJoiner x= new StringJoiner("0");for(String a:s.split("0",s.length())){x.add(new StringBuilder(a).reverse());}System.out.print(x);}

문자열 입력을 받아서 문자를 0으로 나누고 StringJoiner 클래스에서 add 메소드를 호출하여 다시 추가합니다.


1

Oracle SQL 11.2, 131123 바이트

XML 함수를 남용합니다.

SELECT LISTAGG(REVERSE(COLUMN_VALUE||''))WITHIN GROUP(ORDER BY rownum)FROM XMLTABLE(('"'||REPLACE(:1,'0','","0","')||'"'));

1

펄, 22 바이트

-p옵션에 +1 포함 :

s/[^0]+/reverse$&/eg

이것은 매우 사소한 대체물입니다. 너무 지루해서 죄송합니다. 사용자의 입력 (사용 예를 들어, 줄 바꿈 끝나는 경우주의 perl -pe 's/[^0]+/reverse$&/eg' <<<21000543사용 - 배쉬에서),이 숫자로 줄 바꿈을 잡을 것 echo -n또는 printf이를 방지 할 수 있습니다. 또는 1 바이트 추가 비용으로 문자 클래스를로 변경하고 [1-9]한 줄에 하나씩 많은 입력을 제공 할 수 있습니다.


1

C, 105 바이트

#define x(o)for(p=s;*s&&'0'o*s;++s);for(r=s;r-->p;putchar(*r));
f(s,p,r)char*s,*p,*r;{x(^)x(==)*s&&f(s);}

f숫자 목록을 널 종료 문자열로 호출 하면 올바른 출력이 인쇄됩니다.

언 골프하고 설명 :

f(s,p,r)
char*s,*p,*r; // K&R style to avoid repeating `char`
{

    // x(^)x(==) expands to...

    // Find the next zero digit
    for(p = s; *s && '0' ^ *s; ++s)
        ;

    // Print that run backwards
    for(r = s; r-- > p; putchar(*r))
        ;

    // Find the next non-zero digit
    for(p = s; *s && '0' == *s; ++s)
        ;

    // Print that run backwards (no difference, it's all zeros)
    for(r = s; r-- > p; putchar(*r))
        ;

    // If there's more string, recurse
    *s && f(s);
}

콜리 루에서 생방송보기


0

펄 5, 52 바이트

서브 루틴 :

{$_=pop;y/0/ /;map$i.=reverse,split/\b/;$i=~y/ /0/r}

-awith가 포함되어 0있기 때문에 입력 문자열이로 끝나면 적어도 딸기에서는 작동하지 않습니다 . split/\b/$/0
msh210

0

실제로 22 바이트

k"a%sa"%'0@s♂R'0j#pXdX

이것은 실제로 split 명령에 버그가 있음을 알았습니다. 빈 분할은 유지하지 않습니다. 해결 방법으로 a분할, 반전 및 결합을 수행하기 전에 입력 문자열을 s로 묶은 다음 a끝에 s 를 제거하십시오 . 입력은 문자열로, 출력은 단일 문자 문자열의 목록입니다.

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

설명:

k"a%sa"%'0@s♂R'0j#pXdX
k"a%sa"%                surround input with "a" characters
        '0@s            split on 0
            ♂R          reverse each piece
              '0j       join on 0
                 #pXdX  listify, remove first and last element (the "a"s)

0

C #, 131 바이트 ##

솔루션 결함!

string j(string i){foreach(var s in i.Split('0'))if(s!="")i=i.Replace(s,new string(s.ToCharArray().Reverse().ToArray()));return i;}

언 골프 :

string j(string input)
    {

        string[] a = input.Split('0');

        foreach (string s in a)
        {
            if (s!="")
            input=input.Replace(s, new string(s.ToCharArray().Reverse().ToArray()));
        }

        return input;
    }

1
반전 될 문자열이 다른 문자열의 하위 집합 인 경우이 방법에 버그가 있다고 생각합니다. 입력 01201230이 주어지면 , 이것은 반환 될 것이다 02102130. String.Replace 메서드는 첫 번째 문자열의 모든 항목을 두 번째 문자열로 대체하기 때문입니다. 이 버그는 역순으로 하나의 패턴이 나타나는 경우에도 발생합니다 ( 0120210return 0120120).
Xynariz

난 생각조차 못 했어 ..
downrep_nation

0

C #, 133 바이트


골프

String m(String s){for(int i=0,p=i;i<s.Length;i++){if(s[i]=='0'){p=i+1;}else{s=s.Insert(p,s[i].ToString()).Remove(i+1,1);}}return s;}

언 골프

String m( String s ) {
    // i = Index on the String
    // p = Pointer of the last '0' found
    for (int i = 0, p = i; i < s.Length; i++) {
        if (s[ i ] == '0') {
            // Move the 'p' pointer to the index after this '0'
            p = i + 1;
        } else {
            // Insert the Char at the Index location to the Pointer location 
            //    and remove the one at the Index Location + 1,
            //    since the String was incremented by one char due to the 'Insert()'.
            s = s.Insert( p, s[ i ].ToString() )
                 .Remove( i + 1, 1 );
        }
    }

    return s;
}

전체 코드

using System;
using System.Collections.Generic;

namespace Namespace {
    class Program {
        static void Main( String[] args ) {
            List<String> ls = new List<String>() {
                "4",
                "00",
                "123",
                "0010",
                "12000345",
                "18161604",
                "95883007414830",
                "010230456078912",
                "357509902003550",
                "2492882377675046",
                "03026302053000357099"
            };

            foreach (String s in ls) {
                String f = m( s );

                Console.WriteLine( String.Format( "{0,30}", s.Replace( "0", "0 " ) ) );
                Console.WriteLine( String.Format( "{0,30}", f.Replace( "0", "0 " ) ) );
                Console.WriteLine( "" );
            }

            Console.ReadLine();
        }

        static String m( String s ) {
            for (Int32 i = 0, p = i; i < s.Length; i++) {
                if (s[ i ] == '0') {
                    p = i + 1;
                } else {
                    s = s.Insert( p, s[ i ].ToString() ).Remove( i + 1, 1 );
                }
            }

            return s;
        }
    }
}

@downrep_nation이 이미 C #에 대한 솔루션을 여기에 게시 한 것으로 나타났습니다.이 코드는 내 코드를 2 바이트로
뛰었습니다

0

자바, 126

a->{String r="",t[]=a.split("0");for(String s:t){r+=new StringBuilder(s).reverse()+"0";}return r.substring(0, r.length()-1);}

당신은 선언하는 경우 s에 앞에 변수 rt[]당신의 유형 선언을 생략 할 수 있습니다, sfor 루프에서?
Cyoce

아니, 나는 그것을 확인했다. 루프 향상에는 새로 선언 된 변수가 필요하다.
희망적으로도 도움이

응 이상 하네. 오 잘
Cyoce

0

클로저, 37 바이트

#(mapcat reverse(partition-by #{0}%))

용도 #{0}대신에 pos?(로 연결하여 1 바이트의 저장 %과 사용) mapcat대신 (flatten(map. 여전히 Factor 보다 깁니다 .

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