Karışık mı?


19

Dün bu soruyu tüfek karışıklıkları hakkında sordum . Öyle görünüyor ki, dün soru biraz zor oldu, bu yüzden bu soru ilgili ama çok daha kolay bir iş.

Bugün sizden bir permütasyonun aslında bir tüfek karıştırması olup olmadığını belirlemeniz istenir. Riffle shuffle tanımımız son sorumuzdan uyarlanmıştır:

Karıştırmanın ilk kısmı bölmedir. Bölme bölümünde kart destesi ikiye bölünür. İki alt bölüm sürekli, karşılıklı olarak münhasır ve kapsamlı olmalıdır. Gerçek dünyada bölümünüzü olabildiğince yakınlaştırmak istersiniz, ancak bu meydan okumada bu dikkate alınmaz, dejenere olanlar (bir bölüm boş) dahil olmak üzere tüm bölümler eşit derecede önemlidir.

Bölümlendikten sonra kartlar, üye oldukları bölüm içindeki göreceli sıralarını koruyacak şekilde birbirine eklenir . Örneğin, A kartı destedeki B kartından önce ve A ve B kartları aynı bölümdeyse, aralarındaki kart sayısı artmış olsa bile A kartı nihai sonuçta B kartından önce olmalıdır . Eğer A ve B farklı bölümlere, onlar nihai sonuçta ne olursa olsun başlangıç düzenin, herhangi bir sırada olabilir.

Her bir tüfek karıştırması orijinal kart destesinin bir permütasyonu olarak görülebilir. Örneğin permütasyon

1,2,3 -> 1,3,2

bir tüfek shuffle. Eğer güverteyi böyle ayırırsan

1, 2 | 3

içerisindeki her kartın, 1,3,2bölümündeki diğer tüm kartlarla aynı göreceli sıraya sahip olduğunu görüyoruz . 2hala peşinde 1.

Öte yandan, aşağıdaki permütasyon fırfırlı bir karıştırma değildir .

1,2,3 -> 3,2,1

Bunu görebiliriz çünkü iki (önemsiz) bölümün tümü için

1, 2 | 3
1 | 2, 3 

göreceli sıralamalarını yerine getirmeyen bir çift kart vardır. İlk bölümde 1ve 2sıralarını değiştirirken, ikinci bölümde 2ve 3sıralarını değiştir.

Görev

Herhangi bir makul yöntemle bir permütasyon verildiğinde, geçerli bir tüfek shuffle'ı temsil edip etmediğini belirleyin. Biri "Evet, bu bir tüfek karıştırması" ve diğeri "Hayır, bu bir tüfek karıştırması" için olmak üzere iki farklı sabit değer çıkarmalısınız.

Bu bu yüzden cevaplar daha az bayt daha iyi olacak şekilde bayt cinsinden puanlanır.

Test Durumları

1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False

1
Çıktı tutarsız olabilir, ancak bizim dilimizde doğruluk / sahtelik olabilir mi? (Python, nerede, tamsayıların arasında sadece 0 falsili) 0falsy için ama doğruluk için herhangi bir tamsayı [1, +∞)?
Bay Xcoder

1
@ Mr.Xcoder Doğru / falsy değerlerini sevmiyorum çünkü iyi tanımlamak oldukça zor. Cevaplar mevcut kurallara uymalıdır.
Buğday Büyücüsü

Önerilen test durumu: [3,1,4,2,5].
Ørjan Johansen

9
Bunun için üzgünüm, ama: [2,3,6,1,4,5].
Ørjan Johansen

1
Girdi olarak [0, ..., n-1]yerine permütasyon alabilir miyiz [1, ..., n]?
Dennis

Yanıtlar:


8

JavaScript (ES6), 47 bayt

Girdiyi tamsayılar dizisi olarak alır. Bir boole döndürür.

([x,...a],y)=>a.every(z=>z+~x?y?z==++y:y=z:++x)

Test senaryoları

Nasıl?

Giriş dizisi A , ardışık tamsayıların en fazla iki ayrı titreşimli dizisinden oluşuyorsa geçerli bir tüfek karıştırmasıdır.

Meydan kuralları Sizi belli olduğunuzu belirtmek permütasyon ait [1 ... N] . Bu nedenle, bu dizilerin sıralı birleşiminin gerçekten böyle bir aralığa neden olup olmadığını kontrol etmemize gerek yoktur.

A [0] olarak başlatılmış bir sayaç x ve başlangıçta tanımsız bir sayaç y kullanıyoruz .

A'daki her giriş z için , ikinciden başlayarak:

  • Bu kontrol Z ya da eşit olan , x + 1 ya da y + 1 . Evet ise, karşılık gelen sayacı artırırız.
  • Başka: y hala tanımsızsa, onu z olarak başlatırız .
  • Başka: testi başarısız yaparız.

6

Haskell , 41 bayt

n%h=n+0^(n-h)^2
f l=elem(foldl(%)0$l++l)l

Çevrimiçi deneyin!

Kendine birleştirilmiş listenin bir sayı 0..n-1olarak sırayla sayıları içerip içermediğini kontrol eder .


5

Haskell , 43 bayt

sOP örneklerindeki gibi bir tamsayı listesi alır ve a döndürür Bool.

s p=or[f(<x)p++f(>=x)p<[1..]|x<-p]
f=filter

Çevrimiçi deneyin!

Nasıl çalışır

  • Liste anlama her eleman çalışır xait po hengamede ikinci bölümünün ilk öğe olabilir eğer dönüş ve çekler. Sonra kontrollerden herhangi biri olsaydı ordöner .TrueTrue
  • Anlama bunu, daha küçük ve daha büyük (veya eşit filter) pöğelere bölerek ( xbirleştirerek ) , birleştirerek ve elde edilen listenin [1..length p], yani sırayla öğelerin olup olmadığını kontrol ederek yapar .
  • Ortaya çıkan listenin [1..length p]yapılıp yapılmadığının kontrolü, sonucun [1..] == [1,2,3,etc.]herhangi bir permütasyon için aynı sonucu veren sonsuz listeden kesinlikle daha küçük olup olmadığına bakılarak yapılır.

5

Jöle , 13 6 bayt

ỤIṢḊRẠ

Çevrimiçi deneyin!

Alternatif sürüm, postdates meydan okuması, 5 bayt

Ụ>ƝSỊ

Çevrimiçi deneyin!

Nasıl çalışır

ỤIṢḊRẠ  Main link. Argument: A (permutation of [1, ..., n])

Ụ       Grade up; sort the indices of A by their respective values.
        For shuffles, the result is the concatenation of up to two increasing
        sequences of indices.
 I      Compute the forward differences.
        In a shuffle, only one difference may be negative.
  Ṣ     Sort the differences.
   Ḋ    Dequeue; remove the first (smallest) difference.
    R   Range; map each k to [1, ..., k].
        This yields an empty array for non-positive values of k.
     Ạ  All; check if all resulting ranges are non-empty.


4

Brachylog , 9 bayt

o~cĊ⟨⊆⊇⟩?

Çevrimiçi deneyin!

Girdi, bir riffle shuffle'ı temsil ederse başarısız olursa başarılı olur, diğer bir deyişle, yüklem tüm program olarak çalıştırılırsa, başarı yazdırılır true.ve başarısızlık yazdırılır false.. Girdi, her türlü öğenin bir listesi olarak alınır ve onu, kendisinin sıralanmış bir permütasyonu temsil ettiği şeklinde yorumlar.

   Ċ         Some length-two list
 ~c          which concatenated
o            is the input sorted
    ⟨        satisfies the condition that its first element
     ⊆       is an ordered not-necessarily-contiguous sublist
        ?    of the input
      ⊇      which is an ordered superlist of
       ⟩     the list's second element.

Ruhaniyetinde ⊆ᵐdört baytlık "sandviç" yapının yerine çalışması gereken bir şey varmış gibi hissediyorum ⟨⊆⊇⟩.


1
Bence bir PPCG cevabında sandviç kullanan ilk kişi sizsiniz (ve güzel bir simetrik olan :))
Mart'ta


2

Yakut , 35 bayt

->l{l.any?{|a|l&[*1..a]|l==l.sort}}

Çevrimiçi deneyin!

Nasıl?

  • l & [*1..a] | lBir kavşağa ve daha sonra bir birliğe geçerlidir: İlk unsurlarını almak lolduğunu <=ageri kalan elemanlarını eklemek ve daha sonra lsırasını değiştirmeden. Eğer aradığımız sayı a ise, bu işlem sıralama ile aynıdır l.


2

Pyth, 5 bayt

}SQy+

Test odası

}SQy+

    +QQ  concatenated two copies of the (implicit) input
   y     all subsequences of it
}        contain an element equaling
 SQ      the input list sorted 

Çift giriş listesinin ardışık olarak kendisinin sıralı bir sürümünü içerip içermediğini kontrol eder.

1 bayt için Outgolfer Erik sayesinde daha +QQziyade örtük girdiden daha iyi yararlanıyor *2Q.


5 bayt: }SQy+. Genişletilir }SQy+QQ.
Outgolfer Erik

@EriktheOutgolfer İyi biri, teşekkürler.
xnor

1

Pyth , 9 bayt

!t-.+xLQS

Test odası.

İsaacg sayesinde 3 bayt kaydedildi .

Pyth , 14 bayt

}SQm.nS.Tcd2./

Burada deneyin! veya Tüm test senaryolarını doğrulayın.

Çıktılar Trueve Falsesırasıyla riffle shuffle ve riffle shuffle için.

Nasıl?

} SQm.nS.Tcd2./ ~ Tam program. STDIN girişini ve STDOUT çıkışını okur.

            ./ ~ Girişin tüm bölümlerini ayrık alt dizelere (bölüm) geri döndür.
   m ~ d değişkenini kullanarak yukarıdakini eşleyin.
         cd2 ~ d'yi iki elemanlı listeler halinde kesin.
       .T ~ Devamsızlık, eksiklikleri yok sayarak.
      S ~ Sıralama (sözlükbilimsel olarak).
    .n ~ Derin düzleştirin.
} ~ Yukarıdakilerin içerip içermediğini kontrol edin ...
 SQ ~ Sıralanan giriş.

Ayrıca, 2 bayt daha <#0değiştirilebilir -.
isaacg

@isaacg Oh evet facepalm teşekkürler. Düzenlenen. Düzenlenen.
Bay Xcoder



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.