Bây giờ tất cả cùng nhau


24

Đưa ra một danh sách các chữ số từ 1 đến 9, xuất ra cho dù mỗi chữ số được nhóm lại thành một khối liền kề. Nói cách khác, không có hai chữ số giống nhau được phân tách bằng các chữ số khác nhau. Không sao nếu một chữ số hoàn toàn không xuất hiện. Ít byte nhất sẽ thắng.

Đầu vào: Một danh sách không trống các chữ số từ 1 đến 9. Đây có thể là một số thập phân, chuỗi, danh sách hoặc chuỗi tương tự.

Đầu ra: Một giá trị Truthy nhất quán nếu tất cả các chữ số được nhóm trong các khối liền kề và giá trị Falsey nhất quán nếu không.

Trường hợp đúng:

3
51
44999911
123456789
222222222222222222222

Trường hợp sai:

818
8884443334
4545
554553
1234567891


2
Một danh sách các chuỗi singleton có phải là một định dạng đầu vào chấp nhận được không?
Dennis

Vâng, singletons là tốt.
xnor

Ai đó có thể cho tôi biết thuật toán hiệu quả nhất cho vấn đề này sẽ là gì không? Hoặc có một vấn đề chung hơn mà điều này rơi vào mà tôi có thể tìm kiếm?

@ amt528 Bạn có thể thực hiện nó trong thời gian tuyến tính bằng cách lặp qua từng chữ số và kiểm tra xem không có lần chạy nào qua đầu tiên.
xnor

Bạn có thể cung cấp một ví dụ về cách nó được thực hiện?

Câu trả lời:


18

Python 3, 38 34 33 byte

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

Điều này mong đợi một danh sách các chữ số hoặc chuỗi đơn lẻ làm đối số. Kiểm tra nó trên Ideone .

Cảm ơn @xsot vì đã chơi golf 4 byte!

Cảm ơn @immibis vì đã chơi golf 1 byte!


Nếu bạn được phép chấp nhận danh sách các chuỗi thay vào đó, bạn có thể rút ngắn chuỗi này thànhlambda s:s==sorted(s,key=`s`.find)
xsot

À, tôi đã thử lấy một danh sách, nhưng tôi không nghĩ đến việc sử dụng backticks ... Tôi sẽ hỏi OP.
Dennis

Tôi có thiếu thứ gì không - tại sao bạn không thể sử dụng s.find?
user253751

@immibis sphải là một danh sách các chuỗi đơn (hoặc tôi phải chọn sđể liệt kê để so sánh) và list.findkhông được xác định ...
Dennis

@Dennis s.indexthì sao? Dường như làm việc cho tôi.
user253751

14

JavaScript (ES6), 27 byte

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

Sử dụng cái nhìn tiêu cực để tìm kiếm hai chữ số không liền nhau. Nếu có ít nhất hai chữ số như vậy tồn tại, thì chúng có thể được chọn sao cho chữ số đầu tiên đứng trước một chữ số khác nhau.


1
Hoặc, chỉ cần sử dụng một XD regex. Điều đó cũng làm việc.
Conor O'Brien

1
ahem Retina ahem
John Dvorak

13

05AB1E , 4 byte

Mã số:

Ô¹ÙQ

Giải trình:

Ô     # 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.

Sử dụng mã hóa CP-1252 .

Hãy thử trực tuyến!


2
Bạn ... chỉ cần đánh bại thạch ... Tôi chưa bao giờ nghĩ điều này là có thể ...
Bálint

11

Thạch , 5 byte

ĠIFPỊ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ġ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.

Năm byte bạn nói gì? Đó là loại mã hóa nào?
John Dvorak

4
Jelly có trang mã riêng , mã hóa từng trong số 256 ký tự mà nó hiểu là một byte đơn.
Dennis

9

Bình thường, 6 5 byte

1 byte nhờ FryAmTheEggman

SIxLQ

Lấy cảm hứng từ giải pháp Python tại đây .

Bộ kiểm tra

Giải trình:

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
SIxLQdường như làm việc
FryAmTheEggman

Đây là thiên tài.
Maltysen

1
Cái thứ hai Qdường như không được phân tích cú pháp đúng cách, nó hoán đổi thứ tự đối số hoặc thứ gì đó để bạn có được tất cả 0và nó luôn luôn đúng. Đây là một bộ thử nghiệm.
FryAmTheEggman

8

R, 66 48 46 43 38 byte

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

Đây là một hàm chấp nhận đầu vào dưới dạng một vectơ các chữ số và trả về một boolean. Để gọi nó, gán nó cho một biến.

Không phải là ngắn nhất nhưng tôi nghĩ đó là một cách tiếp cận thú vị. Chúng tôi chạy chiều dài mã hóa đầu vào và trích xuất các giá trị. Nếu danh sách các giá trị chứa trùng lặp thì trả về FALSE, nếu không thì trả về TRUE.

Xác nhận tất cả các trường hợp kiểm tra trực tuyến

Đã lưu 20 byte nhờ MickyT, 3 nhờ Albert Masclans và 5 nhờ mnel!


7

MATL , 8 byte

t!=tXSP=

Đầu ra là một mảng chỉ chứa những mảng cho sự thật hoặc một mảng chứa ít nhất một số 0 cho falsey.

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào 22331, thỏa mãn điều kiện. Kiểm tra xem mỗi ký tự có bằng nhau không cho mảng 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

Kết quả cuối cùng phải là sự thật nếu các hàng của mảng đó (được coi là nguyên tử) theo thứ tự giảm dần (từ điển) . Để so sánh, đầu vào 22321cho mảng

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

trong đó các hàng không được sắp xếp.

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

Võng mạc , 17 byte

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

Hãy thử trực tuyến! (Sửa đổi một chút để chạy tất cả các trường hợp thử nghiệm cùng một lúc.)

Regex đầu tiên khớp với các chữ số được phân tách bằng các chữ số khác, vì vậy chúng tôi nhận được một 0đầu vào hợp lệ và bất cứ nơi nào giữa 19cho các đầu vào không hợp lệ (do sự tham lam của .+, chúng tôi không thể nhận được nhiều hơn so n-1với ncác chữ số khác nhau).

Để đảo ngược tính trung thực của kết quả, chúng tôi đếm số 0s, 1dành cho đầu vào hợp lệ và 0cho đầu vào không hợp lệ.


Tôi đã làm một cái ngắn hơn, nhưng nó đủ gần với bạn để thay vào đó là một nhận xét. Sử dụng AntiGrep thay vì Match, sau đó xóa dòng cuối cùng: A`(.)(?!\1).+\1cho 15 byte. Cũng hoạt động cho nhiều đầu vào. Chân lý là đầu vào, giả là không có gì. Một người không chỉ đơn giản là chơi golf Martin bằng ngôn ngữ của mình. :)
mbomb007

@ mbomb007 Tôi nghĩ rằng tôi thực sự đã xem xét điều đó, nhưng thật không may, thử thách yêu cầu một giá trị trung thực (và giả mạo) nhất quán , vì vậy việc in đầu vào là sự thật không được phép.
Martin Ender

5

Java, 161 156 byte

Vì Java ...

Không biết xấu hổ Ăn cắp một cách đáng mượn regex từ câu trả lời này bởi vì tôi đã bắt đầu thử làm điều này với các mảng và thao tác toán học, nhưng nó cực kỳ phức tạp và regex là một công cụ tốt như bất kỳ vấn đề nào.

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

Ung dung:

import java.util.regex.*;

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

Nói ra như một người Java nhạy cảm:

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 personĐó sẽ là, không sử dụng Java bao giờ.
con mèo

Các giải pháp khác chỉ là cung cấp một chức năng, sẽ làm cho nó ngắn hơn rất nhiều. Một cái gì đó giống nhưs->s.match("(.)(?!\\1).*\\1")
Andreas

2
Nhưng sau đó chúng tôi không thể tiết lộ về tính dài dòng của câu trả lời.
JamesENL


4

Ruby, 23 byte

Chức năng ẩn danh. Chấp nhận một chuỗi. Chiến lược Regex.

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

Sự cố Regex

/(.)(?!\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

!~có nghĩa là nếu không có kết quả khớp nào của regex trong chuỗi, trả về truevà ngược lại false.



4

MATL, 13 11 byte

u"G@=fd2<vA

Cảm ơn Luis Mendo vì đã tiết kiệm hai byte!

Hãy thử trực tuyến!

Giải trình

        % 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

Bạn có thể lấy đầu vào với dấu ngoặc kép (được mặc định cho phép) và xóa j. Ngoài ra, tôi nghĩ bạn có thể di chuyển vAtrong vòng lặp và xóa]
Luis Mendo

@LuisMendo Cảm ơn! Tôi đã loay hoay với việc đưa Y&vào bên trong nhưng điều đó không hiệu quả vì fd2<có thể trống rỗng. Di chuyển vAbên trong công trình tuyệt vời mặc dù! Ngoài ra tôi thực sự ước chúng ta có một bộ ổn định uniquekhông chiếm quá nhiều byte.
Suever

Bây giờ tính ổn định duy nhất mất ít hơn một chút, sử dụng một số thay vì chuỗi được xác định trước. Tôi có thể thêm một phiên bản ngắn hơn trong tương lai. Hoặc chỉ làm cho uổn định theo mặc định (bạn luôn có thể bao gồm Ssau đó, hai byte). Bạn nghĩ sao?
Luis Mendo

3

Haskell, 44 byte

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

Ví dụ sử dụng: ((==)<*>nub).map head.group $ "44999911"-> True.

Một phiên bản không có điểm:

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 byte

-:]/:i.~

Kiểm tra nó với J.js .

Làm thế nào nó hoạt động

-:]/: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
Máy

11
Không chắc chắn nếu trò đùa hoặc đề nghị chơi gôn ...
Dennis

3

Python, 56 55 byte

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

Thất bại trong Python 3.4.1 ( int not subscriptable)
Máy

Đã lưu thêm một byte với ~(nghĩa đen tương đương với 1-):a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline

3

C #, 119 byte

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

Bị đánh cắp

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
Chào mừng đến với PPCG! Thay vì xóa một bài đăng và tạo một bài đăng mới với phiên bản cố định, bạn cũng có thể chỉnh sửa bài đăng cũ của mình và sau đó phục hồi nó. (Không cần phải làm điều đó ngay bây giờ vì đã có hai bài viết, nhưng chỉ để bạn biết trong tương lai.)
Martin Ender

Lỗi của tôi. Khi tôi lần đầu tiên tham gia vào Code Golf này, tôi đã đọc sai mục tiêu và không có nhiều thời gian để thực hiện một giải pháp khác (và biết bản thân mình, tôi sẽ không cố gắng sửa giải pháp đã đăng trước đó). Nhưng sau đó tôi được cho biết là tôi có thêm thời gian rảnh và cố gắng đăng "giải pháp chính xác". Thậm chí không nghĩ làm những gì bạn nói. Lần sau tôi sẽ có ý nghĩ đó!
auhmaan

Không có vấn đề gì cả, tôi hy vọng bạn sẽ có một khoảng thời gian vui vẻ trong cộng đồng. :)
Martin Ender

2

Julia, 35 byte

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

Vì lý do nào, sortkhông lấy một chuỗi, nhưng issorted...


... Các chuỗi không phải là mảng bất biến trong Julia như Python? Điều đó sẽ làm tôi thực sự buồn.
con mèo

1
Vâng, chuỗi là bất biến. Đó có thể là lý do tại sao issortedhoạt động, nhưng sortkhông.
Dennis

1
Không có một phương pháp sắp xếp nào được xác định cho các chuỗi, nhưng nó sẽ không hoạt động nếu chúng được xử lý theo cùng một cách với các mảng một chiều vì chúng được sắp xếp bằng cách thực hiện một loại bản sao tại chỗ, và như bạn đã nói, chuỗi là bất biến. Nó không phải là một vấn đề để kiểm tra thứ tự được sắp xếp bởi vì nó được triển khai như một vòng lặp đơn giản trên một vòng lặp, điều này tốt cho các chuỗi. Chỉ là vài chuyện vặt vãnh. ¯ \ _ (ツ) _ / ¯
Alex A.

@AlexA. Vì vậy, rất nhiều như Python trên thực tế; sự khác biệt là phần dựng sẵn của Python sortedbiến đối số lặp lại của nó thành một danh sách có thể thay đổi trước tiên - đó là lý do tại sao sorted(string)trả về một danh sách các chuỗi
con mèo

2

Yếu tố, 22 byte

[ dup natural-sort = ]

Liệu những gì nó nói trên tin. Là một hàm ẩn danh, bạn nên làm callđiều này hoặc làm cho nó một : word ;.


4
nó làm tôi sợ khi một con mèo đưa chuột vào trò chơi
downrep_nation

@downrep_nation: P
mèo

2

Lua, 107 94 85 byte

13 byte được lưu nhờ @LeakyNun

Ít nhất, nó đánh bại Java: D. Lua hút lúc thao túng các chuỗi, nhưng tôi nghĩ nó đủ tốt :).

Nó lấy đầu vào của nó làm đối số dòng lệnh và đầu ra 1cho các trường hợp trung thực và falsecho các trường hợp giả . Bây giờ đầu ra bằng cách sử dụng mã thoát của nó. Mã thoát 0 cho sự thật và 1 cho sai

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

Bị đánh cắp

Hãy cẩn thận, có hai biến ma thuật được gọi ..., biến thứ nhất chứa đối số của chương trình, biến thứ hai là cục bộ của hàm ẩn danh và chứa tham số của nó

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

Nếu được cho phép, bạn có thể thay thế os.exit()bằng i=#0...
Leaky Nun

1

JavaScript ES6, 71 69 byte

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

Hoặc, tương đương:

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

Chơi gôn trong tiến trình.

Xác nhận trường hợp kiểm tra

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 byte

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;}

chiến lược cũ 131 byte

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);}

golf đầu tiên tôi nghĩ rằng tôi đã làm tốt trong


1

C, 74 73 71 byte

Cạo một ba byte nhờ @xsot!

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

a[99]Tôi yêu sự tự động hóa của Perl! Oh, đợi đã ...
con mèo

Tôi nghĩ rằng điều này hoạt động:a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot

@xsot - Cảm ơn bạn đã cạo một byte bằng cách thay thế !--mbằng 1/m. Về a[d=c]+=c!=d, tôi đã thử nó với gcc và nó không hoạt động trên máy tính của tôi vì thứ tự đánh giá. Chúng ta phải tìm một trình biên dịch sẽ chơi cùng.
mIllIbyte

Ồ, tôi vừa thử nó trên ideone và nó hoạt động tốt. Làm thế nào về điều này:a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot

1

Haskell, 37 byte

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

Sử dụng cách tiếp cận tương tự như câu trả lời MATL của Luis Mendo : tạo một vectơ cho mỗi mục nhập có chỉ số bằng nhau và kiểm tra xem kết quả được sắp xếp theo thứ tự giảm dần.

(<$>l).(==)<$>llà phiên bản ngắn hơn của [map(==a)l|a<-l]. Các chức năng (<$>l).(==)mà được đưa avào map(==a)lđược ánh xạ lên l.

scanl1 minlấy các phần tử nhỏ nhất tích lũy của l, chỉ bằng với bản gốc nếu lđược sắp xếp ngược lại. (==)=<<kiểm tra xem danh sách có thực sự bất biến trong hoạt động này không.


Một chiến lược đệ quy khác đã cho 40 byte:

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

Điều này kiểm tra từng hậu tố để xem nếu phần tử đầu tiên của nó không xuất hiện trong phần còn lại, xin lỗi các trường hợp trong đó hai phần tử đầu tiên bằng nhau như là một phần của khối liền kề.


1

Vợt, 53 byte

Phiên bản câm, đơn giản.

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

Ung dung:

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

Vợt, 86 byte

Đây là phiên bản triển khai nhận xét của @ xnor về những cách hiệu quả hơn để làm điều này.

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

Ung dung:

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

Được rồi, điều này thực sự có thể chỉ chuyển trọng số tính toán từ sorthàm sang regexp-replace, nhưng đó là một giải pháp thú vị. Về cơ bản, nó loại bỏ các lần chạy của các ký tự trùng lặp trước ( xem tại đây ), sau đó kiểm tra xem các lần chạy có độ dài 1 còn lại có theo kiểu được sắp xếp hay không.


1

Perl 5, 20 byte

19, cộng 1 cho -pethay vì -e.

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

1

Ngôn ngữ Wolfram (Mathicala) , 18 byte

Gather@#==Split@#&

Hãy thử trực tuyến!

Gathertập hợp một danh sách thành danh sách con của các yếu tố giống hệt nhau và Splitchia danh sách thành danh sách con của các yếu tố giống hệt nhau liên tiếp. Chúng cho cùng một kết quả khi và chỉ khi mỗi giá trị chỉ xuất hiện trong một khối liền kề.



0

Japt , 9 byte

ò¦ mÌ
eUâ

Thử nó


Giải trình

          :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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.