ด้วยกันทั้งหมด


24

ให้รายการตัวเลข 1 ถึง 9 เอาท์พุทว่าแต่ละหลักจะถูกจัดกลุ่มเข้าด้วยกันเป็นบล็อกที่ต่อเนื่องกันหรือไม่ กล่าวอีกนัยหนึ่งไม่มีสองหลักเดียวกันจะถูกคั่นด้วยตัวเลขที่แตกต่างกัน ไม่เป็นไรถ้าตัวเลขไม่ปรากฏขึ้นเลย ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

อินพุต:รายการที่ไม่ว่างของตัวเลข 1 ถึง 9 ซึ่งอาจเป็นตัวเลขทศนิยมสตริงรายการหรือลำดับที่คล้ายกัน

เอาท์พุท:ค่าความจริงที่สอดคล้องกันหากตัวเลขทั้งหมดจะถูกจัดกลุ่มในบล็อกที่ต่อเนื่องกันและค่าFalsey ที่สอดคล้องกันหากพวกเขาไม่ใช่

กรณีจริง:

3
51
44999911
123456789
222222222222222222222

กรณีเท็จ:

818
8884443334
4545
554553
1234567891


2
รายการสตริงเดี่ยวจะเป็นรูปแบบอินพุตที่ยอมรับได้หรือไม่?
เดนนิส

ใช่ซิงเกิลดี
xnor

ใครช่วยบอกฉันได้ว่าอัลกอริทึมที่มีประสิทธิภาพที่สุดสำหรับปัญหานี้จะเป็นอย่างไร หรือมีปัญหาทั่วไปมากกว่านี้ที่ฉันสามารถค้นหาได้หรือไม่

@ amt528 คุณสามารถทำได้ในเวลาเชิงเส้นโดยวนซ้ำแต่ละหลักและตรวจสอบว่าไม่มีการวิ่งของมันผ่านมาก่อน
xnor

คุณสามารถให้ตัวอย่างของการนำไปใช้งานได้อย่างไร

คำตอบ:


18

Python 3, 38 34 33 ไบต์

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

สิ่งนี้คาดว่ารายการของตัวเลขหรือสายเดี่ยวเป็นอาร์กิวเมนต์ ทดสอบบนIdeone

ขอบคุณ @xsot สำหรับการเล่นกอล์ฟ 4 ไบต์!

ขอบคุณ @immibis สำหรับการเล่นกอล์ฟ 1 ไบต์!


หากคุณได้รับอนุญาตให้ยอมรับรายการสตริงแทนคุณสามารถย่อให้เหลือlambda s:s==sorted(s,key=`s`.find)
xsot

อ่าฉันพยายามทำรายการ แต่ฉันไม่คิดว่าจะใช้ backticks ... ฉันจะขอ OP
เดนนิส

ฉันทำอะไรบางอย่างขาดหายไป - ทำไมคุณใช้s.findไม่ได้?
253751

@immibis sจะต้องเป็นรายการของสตริงเดี่ยว (หรือฉันจะต้องโยนsไปยังรายการสำหรับการเปรียบเทียบ) และlist.findไม่ได้กำหนด ...
Dennis

@Dennis s.indexแล้ว? ดูเหมือนว่าจะทำงานให้ฉัน
253751

14

JavaScript (ES6), 27 ไบต์

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

ใช้ lookahead เชิงลบเพื่อค้นหาตัวเลขสองหลักที่ไม่ต่อเนื่องกัน หากมีอย่างน้อยสองหลักนั้นก็สามารถเลือกได้เพื่อให้ตัวเลขตัวแรกนำหน้าตัวเลขที่แตกต่างกัน


1
หรือเพียงแค่ใช้ regex XD มันก็ใช้ได้เหมือนกัน
Conor O'Brien

1
ahem Retina ahem
John Dvorak

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.

คุณบอกว่าห้าไบต์ การเข้ารหัสแบบไหนกันนะ?
John Dvorak

4
เจลลี่มีหน้ารหัสของตัวเองซึ่งเข้ารหัสอักขระ 256 ตัวแต่ละตัวที่มันเข้าใจว่าเป็นไบต์เดียว
เดนนิส

9

Pyth, 6 5 ไบต์

1 ไบต์ขอบคุณ FryAmTheEggman

SIxLQ

แรงบันดาลใจจากการแก้ปัญหางูหลามที่นี่

ชุดทดสอบ

คำอธิบาย:

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

นี่คือฟังก์ชั่นที่รับอินพุตเป็นเวกเตอร์ของตัวเลขและส่งกลับบูลีน หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

ไม่ใช่สั้นที่สุด แต่ฉันคิดว่ามันเป็นวิธีที่สนุก เรารันความยาวเข้ารหัสอินพุตและแยกค่า หากรายการค่ามีการซ้ำกันแล้วส่งกลับFALSEมิฉะนั้นกลับTRUEมิฉะนั้นกลับ

ตรวจสอบกรณีทดสอบทั้งหมดออนไลน์

บันทึกไว้ 20 ไบต์ด้วย MickyT, 3 ขอบคุณ Albert Masclans และ 5 ขอบคุณ mnel!


7

MATL , 8 ไบต์

t!=tXSP=

เอาท์พุทเป็นอาร์เรย์ที่มีเพียงคนเดียวสำหรับความจริงหรืออาร์เรย์ที่มีอย่างน้อยหนึ่งศูนย์สำหรับความเท็จ

ลองออนไลน์!

คำอธิบาย

พิจารณาอินพุต22331ซึ่งเป็นไปตามเงื่อนไข การทดสอบว่าอักขระแต่ละตัวมีค่าเท่ากันหรือไม่ให้อาร์เรย์ 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

ผลสุดท้ายควรจะ truthy ถ้าแถวของอาร์เรย์ (ถือว่าเป็นอะตอม) อยู่ใน (พจนานุกรม) การสั่งซื้อลดลง สำหรับการเปรียบเทียบอินพุต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

ลองออนไลน์! (แก้ไขเล็กน้อยเพื่อเรียกใช้กรณีทดสอบทั้งหมดในครั้งเดียว)

regex แรกตรงกับตัวเลขที่จะแยกจากกันโดยตัวเลขอื่น ๆ เพื่อให้เราได้รับ0ปัจจัยการผลิตที่ถูกต้องและที่ใดก็ได้ระหว่าง1และ9ปัจจัยการผลิตที่ไม่ถูกต้อง (เนื่องจากความตะกละของที่.+เราไม่สามารถได้รับมากกว่าn-1ตรงnตัวเลขที่แตกต่างกัน)

เพื่อย้อนกลับความจริงของผลลัพธ์เราจะนับจำนวน0s ซึ่ง1ใช้สำหรับอินพุตที่ถูกต้องและ0สำหรับรายการที่ไม่ถูกต้อง


ฉันทำแบบย่อให้สั้นลง แต่ใกล้กับคุณมากพอที่จะแสดงความคิดเห็นแทน ใช้ AntiGrep แทนการจับคู่แล้วลบบรรทัดสุดท้าย: เป็นA`(.)(?!\1).+\1เวลา 15 ไบต์ ยังใช้งานได้กับอินพุตหลายอินพุต ความจริงคือสิ่งที่ป้อนเข้ามา ไม่มีใครสามารถออกมาร์ตินด้วยภาษาของเขาเองได้ :)
mbomb007

@ mbomb007 ฉันคิดว่าจริง ๆ แล้วฉันคิดว่า แต่น่าเสียดายที่ความท้าทายขอค่าความจริง (และเท็จ) ที่สอดคล้องกันดังนั้นการพิมพ์ข้อมูลที่เป็นจริงไม่ได้รับอนุญาต
Martin Ender

5

Java, 161 156 ไบต์

เพราะจาวา ...

การขโมย regex จากคำตอบนี้อย่างไม่มีเลศนัยเพราะฉันเริ่มพยายามทำสิ่งนี้ด้วยอาร์เรย์และการจัดการทางคณิตศาสตร์ แต่มันซับซ้อนอย่างน่าเกรงขามและ regex ก็เป็นเครื่องมือที่ดีสำหรับปัญหานี้

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

Ungolfed:

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 personนั่นคงไม่ใช่การใช้ Java เลย
แมว

โซลูชั่นอื่น ๆ เพียงแค่ให้ฟังก์ชั่นจะทำให้สั้นลงมาก มีบางอย่างที่เหมือนกันs->s.match("(.)(?!\\1).*\\1")
Andreas

2
แต่แล้วเราก็ไม่สามารถชื่นชมยินดีในคำตอบที่เต็มเปี่ยม
JamesENL


4

ทับทิมขนาด 23 ไบต์

ฟังก์ชั่นไม่ระบุชื่อ ยอมรับสตริง Regex strat

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

การแยก 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

!~หมายความว่าถ้ามีการแข่งขันของ regex ภายในสตริงกลับไม่มีtrueและอื่น ๆ falseกลับมา



4

MATL, 13 11 ไบต์

u"G@=fd2<vA

ขอบคุณ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ภายในวงและลบ]
หลุยส์ Mendo

@LuisMendo ขอบคุณ! ฉันยุ่งกับการวางY&ข้างใน แต่นั่นไม่ได้ผลเพราะว่างfd2<เปล่า การย้ายvAเข้าไปอยู่ข้างในนั้นเยี่ยมมาก! นอกจากนี้ฉันยังหวังว่าเราจะมีเสถียรภาพuniqueที่ไม่ต้องใช้จำนวนมากไบต์
Suever

ตอนนี้ความเสถียรที่ไม่ซ้ำกันใช้เวลาน้อยกว่าเล็กน้อยโดยใช้ตัวเลขแทนสตริงที่กำหนดไว้ล่วงหน้า ฉันอาจเพิ่มรุ่นที่สั้นกว่านี้ในอนาคต หรือเพียงแค่ทำให้uเสถียรโดยค่าเริ่มต้น (คุณสามารถรวมSหลังจากนั้นสองไบต์เสมอ) คุณคิดอย่างไร?
Luis Mendo

3

Haskell, 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
Not sure if joke or golfing suggestion...
Dennis


3

C#, 119 bytes

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

Ungolfed

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
Welcome to PPCG! Instead of deleting a post and making a new post with the fixed version, you could also edit your old post and then undelete it. (No need to do that now that there's two posts already anyway, but just so you know in the future.)
Martin Ender

My bad. When I first intended to participate in this Code Golf I misread the objective and didn't had much time to do another solution ( and knowing myself, I wouldn't try to correct the previous posted solution ). But then I was told I had some more time free and attempted to post the "correct solution". Didn't even thought in doing what you said. Next time I'll have that in mind!
auhmaan

No problem at all, I hope you'll have a good time in the community. :)
Martin Ender

2

Julia, 35 bytes

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

For whatever reason, sort does not take a string, but issorted does...


...Are strings not immutable arrays in Julia like Python? That would make me really sad.
cat

1
Yes, strings are immutable. That's probably why issorted works, but sort doesn't.
Dennis

1
There isn't a sorting method defined for strings, but it wouldn't work if they were processed in the same way as one-dimensional arrays because those are sorted by performing an in-place sort of a copy, and as you said, strings are immutable. It's not a problem for checking for sorted order though because it's implemented as a simple loop over an iterable, which is fine for strings. Just some trivia. ¯\_(ツ)_/¯
Alex A.

@AlexA. So very much like Python in fact; the difference is that Python's builtin sorted turns its iterable argument into a mutable list first -- that's why sorted(string) returns a list of strings
cat

2

Factor, 22 bytes

[ dup natural-sort = ]

Does what it says on the tin. As an anonymouse function, you should call this, or make it a : word ;.


4
it scares me when a cat brings a mouse into the game
downrep_nation

@downrep_nation :P
cat

2

Lua, 107 94 85 Bytes

13 bytes saved thanks to @LeakyNun

At least, it beats Java :D. Lua sucks at manipulating strings, but I think it is good enough :).

It takes its input as a command-line argument, and outputs 1 for truthy cases and false for falsy ones. Now outputs using its exit code. Exit code 0 for truthy, and 1 for falsy

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

Ungolfed

Be care, there's two magic-variables called ..., the first one contains the argument of the program, the second one is local to the anonymous function and contains its parameters

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

If it is permitted, you can replace os.exit() with i=#0...
Leaky Nun

1

JavaScript ES6, 71 69 bytes

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

Or, equivalently:

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

Golfing in progress.

Verify test cases

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 bytes

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

old strategy 131 bytes

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

first golf i think i did ok in


1

C, 74 73 71 bytes

Shaved one three byte thanks to @xsot!

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

a[99] I love Perl's autovivification! Oh, wait...
cat

I think this works: a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot

@xsot - Thank you for shaving one byte by replacing !--m with 1/m. About a[d=c]+=c!=d, I tried it with gcc and it didn't work on my computer because of order of evaluation. We must find a compiler that will play along.
mIllIbyte

Oh, I just tested it on ideone and it worked fine. How about this: a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot

1

Haskell, 37 bytes

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

Uses the same approach as Luis Mendo's MATL answer: creates a vector for each entry which indices equal it, and checks that the result is sorted in decreasing order.

(<$>l).(==)<$>l is shorter version of [map(==a)l|a<-l]. The function (<$>l).(==) that takes a to map(==a)l is mapped onto l.

scanl1 min takes the cumulative smallest elements of l, which equals the original only if l is reverse-sorted. (==)=<< checks if the list is indeed invariant under this operation.


A different recursive strategy gave 40 bytes:

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

This checks each suffix to see if its first element doesn't appear in the remainder, excusing cases where the first two elements are equal as part of a contiguous block.


1

Racket, 53 bytes

The dumb, simple version.

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

Ungolfed:

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

Racket, 86 bytes

Here's the version implementing @xnor's comment about more efficient ways to do this.

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

Ungolfed:

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

Okay, this may actually just shift the weight of computation from the sort function to regexp-replace, but it was an interesting solution. Basically, it removes runs of duplicate characters first (see here), then tests if the remaining length-1 runs are in sorted fashion.





0

Japt, 9 bytes

ò¦ mÌ
eUâ

Try it


Explanation

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