이제 모두 함께


24

1에서 9까지의 숫자 목록이 주어지면 각 숫자가 하나의 연속 된 블록으로 함께 그룹화되는지 여부를 출력합니다. 즉, 동일한 숫자 중 두 개가 다른 숫자로 구분되지 않습니다. 숫자가 전혀 나타나지 않으면 괜찮습니다. 가장 적은 바이트가 이깁니다.

입력 : 1에서 9까지의 비어 있지 않은 숫자 목록입니다. 이것은 10 진수, 문자열, 목록 또는 이와 유사한 순서 일 수 있습니다.

출력 : 모든 숫자가 연속 된 블록으로 그룹화 된 경우 일관된 Truthy 값, 그렇지 않은 경우 일관된 Falsey 값.

실제 사례 :

3
51
44999911
123456789
222222222222222222222

틀린 경우 :

818
8884443334
4545
554553
1234567891


2
싱글 톤 문자열 목록이 허용 가능한 입력 형식입니까?
Dennis

예, 싱글 톤은 괜찮습니다.
xnor

누구 든지이 문제에 가장 효율적인 알고리즘이 무엇인지 말해 줄 수 있습니까? 아니면 내가 찾을 수 있다는 더 일반적인 문제가 있습니까?

@ amt528 각 숫자를 반복하고 첫 번째 숫자 이후에 런이 없는지 확인하여 선형 시간으로 수행 할 수 있습니다.
xnor

구현 방법의 예를 제공 할 수 있습니까?

답변:


18

파이썬 3, 38 34 33 바이트

lambda s:s==sorted(s,key=s.index)

이것은 숫자 목록 또는 단일 문자열을 인수로 예상합니다. Ideone에서 테스트하십시오 .

4 바이트로 골프를 치는 @xsot에게 감사합니다!

1 바이트로 골프를 해준 @immibis에게 감사드립니다!


대신 문자열 목록을 수락하도록 허용하면 다음과 같이 줄이십시오.lambda s:s==sorted(s,key=`s`.find)
xsot

아, 목록을 보려고했지만 백틱을 사용할 생각은 없었어요 ... OP에게 물어 볼게요.
Dennis

내가 뭔가를 놓치고 s.find있습니까? 왜 그냥 사용할 수 없습니까?
user253751

@immibis는 s싱글 문자열 (또는 내가 캐스트해야 할 것 목록이어야 s비교에 대한 목록을), 그리고 list.find... 정의되지 않은
데니스

s.index그렇다면 @Dennis ? 나를 위해 일하는 것 같습니다.
user253751

14

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

s=>!/(.)(?!\1).*\1/.test(s)

네거티브 lookahead를 사용하여 두 개의 연속되지 않은 숫자를 찾습니다. 그러한 숫자가 두 개 이상 있으면 첫 번째 숫자가 다른 숫자 앞에 오도록 선택할 수 있습니다.


1
또는 정규식 XD를 사용하십시오. 그것도 작동합니다.
Conor O'Brien

1
ahem Retina ahem
존 드보락

13

05AB1E , 4 바이트

암호:

Ô¹ÙQ

설명:

Ô     # Push connected uniquified input. E.g. 111223345565 would give 1234565.
 ¹    # Push input again.
  Ù   # Uniquify the input. E.g. 111223345565 would give 123456.
   Q  # Check if equal, which yields 1 or 0.

CP-1252 인코딩을 사용합니다 .

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


2
당신은 ... 그냥 젤리를 이길 ... 나는 이것이 가능하다고 생각하지 않았다 ...
Bálint

11

젤리 , 5 바이트

ĠIFPỊ

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

작동 원리

ĠIFPỊ  Main link. Input: n (list of digits or integer)

Ġ      Group the indices of n by their corresponding values, in ascending order.
       For 8884443334, this yields [[7, 8, 9], [4, 5, 6, 10], [1, 2, 3]].
 I     Increments; compute the all differences of consecutive numbers.
       For 8884443334, this yields [[1, 1], [1, 1, 4], [1, 1]].
  F    Flatten the resulting 2D list of increments.
   P   Product; multiply all increments.
    Ị  Insignificant; check if the product's absolute value is 1 or smaller.

당신이 말하는 5 바이트? 어떤 종류의 인코딩입니까?
John Dvorak

4
젤리는 자체 코드 페이지 를 가지고 있는데, 이는 256 바이트 문자 각각을 단일 바이트로 인코딩합니다.
Dennis

9

Pyth, 6 5 바이트

FryAmTheEggman 덕분에 1 바이트

SIxLQ

Python 솔루션 에서 영감을 얻었 습니다 .

테스트 스위트

설명:

SIxLQ
  xLQ   Map each element in the input to its index in the input. Input is implicit.
SI      Check whether this list is sorted.

3
SIxLQ작동하는 것 같습니다.
FryAmTheEggman

이것은 천재입니다.
Maltysen

1
두 번째 Q는 올바르게 구문 분석되지 않는 것 같습니다. 인수 순서 또는 무언가를 교환하여 모든 것을 얻 0습니다. 항상 사실입니다. 여기 테스트 스위트는.
FryAmTheEggman

8

R, 66 48 46 43 38 바이트

function(s)!any(duplicated(rle(s)$v))

입력을 숫자로 구성된 벡터로 받아들이고 부울을 반환하는 함수입니다. 호출하려면 변수에 지정하십시오.

가장 짧지는 않지만 재미있는 접근법이라고 생각했습니다. 우리는 length 인코딩 입력을 실행하고 값을 추출합니다. 값 목록에 중복이 포함되어 있으면를 반환하고 FALSE, 그렇지 않으면를 반환 TRUE합니다.

모든 테스트 사례를 온라인으로 확인

MickyT 덕분에 20 바이트, Albert Masclans 덕분에 3 바이트, mnel 덕분에 5 바이트 절약!


7

MATL , 8 바이트

t!=tXSP=

출력은 진리에 대한 것만 포함하는 배열이거나 거짓에 대한 하나 이상의 0을 포함하는 배열입니다.

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

설명

22331조건을 만족 하는 input을 고려하십시오 . 각 문자가 서로 같은지 테스트하면 2D 배열이 제공됩니다.

1 1 0 0 0
1 1 0 0 0
0 0 1 1 0
0 0 1 1 0
0 0 0 0 1

해당 배열의 행 (원자로 간주 됨)이 (사전 적) 내림차순 이면 최종 결과는 진실해야합니다 . 비교를 위해 입력 22321은 배열을 제공합니다

1 1 0 1 0
1 1 0 1 0
0 0 1 0 0
1 1 0 1 0
0 0 0 0 1

행이 정렬되지 않은

t!   % Take string input. Duplicate and tranpose
=    % Test for equality, element-wise with broadcast: gives a 2D array that
     % contains 0 or 1, for all pairs of characters in the input
t    % Duplicate
XS   % Sort rows (as atomic) in increasing order
P    % Flip vertically to obtain decreasing order
=    % Test for equality, element-wise

5

레티 나 , 17 바이트

M`(.)(?!\1).+\1
0

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

첫 번째 정규 표현식은 숫자와 일치 하는 우리가 얻을 수 있도록, 다른 자리로 구분을 0사이에 어디 유효한 입력과 19(유효하지 않은 입력에 의한 상기의 탐욕에 .+, 우리는보다 더 얻을 수 n-1에 대한 일치n 다른 숫자에 ).

결과의 truthiness을 반전하기 위해, 우리는의 수를 계산 0이다의, 1유효 입력과 0잘못된 것들에 대한합니다.


나는 더 짧은 것을 만들었지 만 그것은 당신의 의견과 비슷해야합니다. 일치 대신 AntiGrep을 사용하고 마지막 줄 A`(.)(?!\1).+\1을 15 바이트 동안 제거하십시오 . 여러 입력에도 작동합니다. 진실은 입력이고 거짓은 아무것도 아닙니다. 마틴은 단순히 자신의 언어로 Martin을 아웃 골프하지 않습니다. :)
mbomb007

@ mbomb007 나는 실제로 그것을 고려했다고 생각하지만, 불행히도, 도전은 일관된 진실성 (및 허위) 가치를 요구하므로 입력을 진실성으로 인쇄하는 것은 허용되지 않습니다.
Martin Ender

5

자바, 161 156 바이트

자바 때문에 ...

배열과 수학 조작 으로이 작업을 시도하기 시작했기 때문에이 대답 에서 정규 표현식을 빌리는 것을 부끄럽게 도용 했습니다.

import java.util.regex.*;public class a{public static void main(String[] a){System.out.println(!Pattern.compile("(.)(?!\\1).*\\1").matcher(a[0]).find());}}

언 골프 드 :

import java.util.regex.*;

public class a {
    public static void main(String[] args) {
        System.out.println(!Pattern.compile("(.)(?!\\1).*\\1").matcher(args[0]).find());
    }

현명한 Java 사람처럼 배치하십시오.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class  {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(.)(?!\\1).*\\1");
        Matcher m = p.matcher(args[0]);
        System.out.println(!m.find());
    }
}

3
like a sensible Java personJava를 사용하지 않는 것입니다.
cat

다른 솔루션은 기능을 제공하기 때문에 훨씬 짧아집니다. 뭔가 같은s->s.match("(.)(?!\\1).*\\1")
안드레아스

2
그러나 우리는 그 답의 장황함을 믿지 못했습니다.
JamesENL


4

루비, 23 바이트

익명의 기능. 문자열을 받아들입니다. 정규식 전략.

->n{/(.)(?!\1).*\1/!~n}

정규식 분석

/(.)(?!\1).*\1/
 (.)            # Match a character and save it to group 1
    (?!\1)      # Negative lookahead, match if next character isn't
                #  the same character from group 1
          .*    # Any number of matches
            \1  # The same sequence as group 1

!~문자열 내에 정규식과 일치하는 것이 없으면 return을 반환 true하고 그렇지 않으면 return을 의미 false합니다.



4

MATL, 13 11 바이트

u"G@=fd2<vA

2 바이트를 절약 한 Luis Mendo 에게 감사 합니다!

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

설명

        % Grab the input implicitly
u       % Find the unique characters
"       % For each of the unique characters
    G   % Grab the input again
    @=  % Determine which chars equal the current char
    f   % Find the locations of these characters
    d   % Compute the difference between the locations
    2<  % Find all index differences < 2 (indicating consecutive chars)
    v   % Vertically concatenate all stack contents
    A   % Ensure that they are all true
        % Implicit end of the for loop

따옴표로 입력하고 (기본적으로 허용됨) 제거 할 수 j있습니다. 또한 vA루프 내에서 이동 하여 제거 할 수 있다고 생각합니다.]
Luis Mendo

@LuisMendo 감사합니다! 나는 Y&안에 넣는 것을 엉망으로 만들었지 만 fd2<비어있을 수 있기 때문에 작동하지 않았습니다 . 이동 vA내 것은 좋은 생각을 작품! 또한 정말 많은 양 unique의 바이트를 차지하지 않는 안정적인 것을 원했습니다.
Suever

이제는 안정적인 고유 값이 미리 정의 된 문자열 대신 숫자를 사용하여 조금 덜 걸립니다. 그래도 앞으로 더 짧은 버전을 추가 할 수 있습니다. 또는 u기본적으로 안정적으로 만드십시오 ( S나중에 2 바이트를 포함 할 수 있음 ). 어떻게 생각해?
Luis Mendo

3

하스켈, 44 바이트

import Data.List 
((==)<*>nub).map head.group

사용 예 : ((==)<*>nub).map head.group $ "44999911"-> True.

포인트없는 버전 :

f x = q == nub q                -- True if q equals q with duplicates removed
  where
  q = map head $ group x        -- group identical digits and take the first
                                -- e.g. "44999911" -> ["44","9999","11"] -> "491"
                                -- e.g  "3443311" -> ["3","44","33","11"] -> "3431"

3

J, 8 바이트

-:]/:i.~

J.js로 테스트하십시오 .

작동 원리

-:]/:i.~  Monadic verb. Argument: y (list of digits)

     i.~  Find the index in y of each d in y.
  ]/:     Sort y by the indices.
-:        Match; compare the reordering with the original y.

1
:] :i :-1
CalculatorFeline

11
농담이나 골프 제안을 잘 모르겠다면 ...
Dennis

3

파이썬, 56 55 바이트

a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1

파이썬에서 실패 3.4.1 ( int not subscriptable)
CalculatorFeline

다음과 같은 추가 바이트를 저장했습니다 : ~(말 그대로 1-) :a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline

3

C #, 119 바이트

bool m(String s){for(int i=0;i<9;i++){if(new Regex(i.ToString()+"+").Matches(s).Count>1){return false;}}return true;}

언 골프

bool m(String s) {
    for(int i=0;i<9;i++) {
        if(new Regex(i.ToString() + "+").Matches(s).Count > 1) {
            return false;
        }
    }

    return true;
}

1
PPCG에 오신 것을 환영합니다! 게시물을 삭제하고 고정 버전으로 새 게시물을 만드는 대신 이전 게시물을 편집 한 다음 삭제를 취소 할 수도 있습니다. (어쨌든 이미 두 개의 게시물이 있기 때문에 그렇게 할 필요는 없지만 앞으로는 알 수 있습니다.)
Martin Ender

내 잘못이야. 이 코드 골프에 처음 참여하려고했을 때 나는 목표를 잘못 읽었고 다른 해결책을 취할 시간이 없었습니다. 그러나 나는 더 많은 시간이 없다고 들었고 "올바른 해결책"을 게시하려고 시도했다. 당신이 말한 것을 생각조차하지 않았습니다. 다음에 나는 그것을 명심할 것이다!
auhmaan

전혀 문제 없습니다. 커뮤니티에서 즐거운 시간을 보내시기 바랍니다. :)
Martin Ender

2

줄리아, 35 바이트

s->issorted(s,by=x->findfirst(s,x))

어떤 이유로 든 sort문자열을 가져 가지 않지만 issorted...


... 파이썬처럼 줄리아에서 문자열은 불변 배열이 아닌가? 그것은 나를 정말로 슬프게 할 것이다.
cat

1
예, 문자열은 변경할 수 없습니다. 그 이유 issorted는 아마 작동하지만 작동 sort하지 않습니다.
Dennis

1
문자열에 대해 정렬 방법이 정의되어 있지 않지만 1 차원 배열과 동일한 방식으로 처리되면 정렬되지 않습니다. 문자열은 변경할 수 없습니다. 정렬 순서를 확인하는 데 문제가되지는 않지만 iterable에 대한 간단한 루프로 구현되므로 문자열에 적합합니다. 몇 가지 사소한 것입니다. ¯ \ _ (ツ) _ / ¯
Alex A.

@AlexA. 그래서 매우 많은 사실 파이썬 같은; 차이는 파이썬의 내장이 있다는 것이다 sorted첫번째 변경 가능한 목록에 자사의 반복 가능한 인수를 회전 - 그 이유 sorted(string)반환 문자열 목록
고양이

2

요소, 22 바이트

[ dup natural-sort = ]

깡통에 말한 것을 수행합니다. 익명 함수로서, 당신은 call이것을 해야 합니다 : word ;.


4
고양이 가 게임에 마우스 를 가져
오면 무섭다

@downrep_nation : P
cat

2

루아, 107 94 85 바이트

@LeakyNun 덕분에 13 바이트 절약

적어도 Java : D를 능가합니다. 루아는 문자열 조작에 짜증이 있지만 충분하다고 생각합니다. :).

이 명령어 인자로의 입력을 받아, 출력한다 1truthy 경우 및 falsefalsy들에 대한. 이제 종료 코드를 사용하여 출력합니다. 진실을 나타내는 종료 코드 0, 거짓을 나타내는 1

o=os.exit;(...):gsub("(.)(.+)%1",function(a,b)if 0<#b:gsub(a,"")then o(1)end end)o(0)

언 골프

주의하십시오.라는 두 개의 매직 변수 ...가 있습니다. 첫 번째는 프로그램의 인수를 포함하고 두 번째는 익명 함수에 로컬이며 매개 변수를 포함합니다

o=os.exit;               -- ; mandatory, else it would exit instantly
(...):gsub("(.)(.+)%1",  -- iterate over each group of the form x.*x and apply an anonymous
  function(a,b)          -- function that takes the captured group as parameters
  if 0<#b:gsub(a,"")     -- if the captured group (.+) contain other character than
  then                   -- the one captured by (.)
    o(1)                 -- exit with falsy
  end
end)
o(0)                     -- exit with truthy, reached only when the string is okay

이 허용되는 경우 대체 할 수 os.exit()와 함께 i=#0...
새는 수녀에게

1

자바 스크립트 ES6, 71 69 바이트

h=y=>y.match(/(.)\1*/g);x=>h((u=h(x)).sort().join``).length==u.length

또는 동등하게 :

x=>((u=x.match(r=/(.)\1*/g)).sort().join``).match(r).length==u.length
x=>(h=y=>y.match(/(.)\1*/g))((u=h(x)).sort().join``).length==u.length

골프가 진행 중입니다.

테스트 사례 확인

var truthy = `3
51
44999911
123456789
222222222222222222222`.split `
`;
var falsey = `818
8884443334
4545
554553
1234567891`.split `
`;

var Q = x => ((u = x.match(r = /(.)\1*/g)).sort().join ``).match(r).length == u.length;
truthy.concat(falsey).forEach(e => {
  t = document.createTextNode(`${e} => ${Q(e)}`);
  o.appendChild(t);
  o.appendChild(document.createElement("br"));
});
* {
  font-family: Consolas, monospace;
}
<div id=o></div>


1

C # 111 바이트

bool f(string s){for(int i=0;i<s.Length-1;i++)if(s[i]!=s[i+1]&&s.LastIndexOf(s[i])!=i)return 1==2;return true;}

오래된 전략 131 바이트

bool s(string i){var f=Regex.Matches(i,@"([0-9])\1{0,}").Cast<Match>().Select(m=>m.Value[0]);return f.Distinct().SequenceEqual(f);}

첫 골프는 내가 좋아했다고 생각


1

C, 74 73 71 바이트

면도 @xsot 세 바이트 감사합니다!

a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}

a[99]나는 Perl의 자동 생존을 좋아합니다! 아, 잠깐만 ...
cat

나는 이것이 효과가 있다고 생각한다 :a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot

@xsot –로 교체 !--m하여 1 바이트를 면도 해 주셔서 감사합니다 1/m. 에 대해 a[d=c]+=c!=dgcc로 시도했지만 평가 순서로 인해 컴퓨터에서 작동하지 않았습니다. 우리는 함께 할 컴파일러를 찾아야합니다.
mIllIbyte

오, 나는 방금 이데온에서 테스트했고 잘 작동했습니다. a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot

1

하스켈, 37 바이트

f l=(==)=<<scanl1 min$(<$>l).(==)<$>l

Luis Mendo의 MATL 답변 과 동일한 방법을 사용합니다 . 각 항목에 대해 동일한 벡터를 생성하고 결과가 내림차순으로 정렬되어 있는지 확인합니다.

(<$>l).(==)<$>l의 짧은 버전입니다 [map(==a)l|a<-l]. 함수 (<$>l).(==)걸리는 amap(==a)l에 매핑되고l .

scanl1 min의 가장 작은 누적 요소를 가져옵니다.이 요소 는 반대로 정렬 된 l경우에만 원본과 같습니다 l.(==)=<<이 작업에서 목록이 실제로 변하지 않는지 확인합니다.


다른 재귀 전략은 40 바이트를 제공했습니다.

f(a:b:t)=f(b:t)>(elem a t&&a/=b)
f _=1>0

이렇게하면 첫 번째 요소가 나머지 블록에없는 경우를 제외하고 첫 번째 요소가 나머지 요소에 나타나지 않는지 확인하기 위해 각 접미사를 확인합니다.


1

라켓, 53 바이트

바보 같은 간단한 버전.

(λ(s)(let([s(string->list s)])(eq?(sort s char<?)s)))

언 골프 드 :

(define (lame-all-together s)
  (let ([s (string->list s)])
    (eq? (sort s char<?) s)))

라켓, 86 바이트

다음 은 더 효율적인 방법에 대한 @xnor의 의견을 구현하는 버전 입니다.

(λ(s)(let([s(string->list(regexp-replace#px"(.)\\1+"s"\\1"))])(eq?(sort s char<?)s)))

언 골프 드 :

(define (all-together s)
    (let ([s (string->list (regexp-replace #px"(.)\\1+" s "\\1"))])
      (eq? (sort s char<?) s )))

자, 이것은 실제로 계산 가중치를 sort함수 에서로 바뀔 수 regexp-replace있지만 흥미로운 해결책이었습니다. 기본적으로 중복 문자의 런을 먼저 제거한 다음 ( 여기 참조 ) 나머지 length-1 런이 정렬 된 방식인지 테스트합니다.


1

펄 5, 20 바이트

-pe대신 19를 더한 1 입니다 -e.

$_=!/(.)(?!\1).+\1/



0

Japt , 9 바이트

ò¦ mÌ
eUâ

시도 해봐


설명

          :Implicit input of string U             :e.g., "8884443334"
ò¦        :Split on inequality                    :["888","444","333","4"]
   mÌ     :Map and return the last digit of each  :["8","4","3","4"]
\n        :Assign to U
  Uâ      :Remove duplicates                      :["8","4","3"]
e         :Test for equality with U               :false
          :Implicit output of result

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