Önek kodu mu?


33

Bilgi teorisinde "önek kodu", anahtarlardan hiçbirinin başka bir önek olmadığı bir sözlüktür. Başka bir deyişle, bu, hiçbir dizenin diğerinin hiçbiriyle başlamayacağı anlamına gelir.

Örneğin {"9", "55"}, bir önek kodudur, fakat {"5", "9", "55"}değildir.

Bunun en büyük avantajı, kodlanmış metnin aralarında bir ayırıcı olmadan yazılabilmesi ve yine de benzersiz bir şekilde deşifre edilebilir olmasıdır. Bu gibi sıkıştırma algoritmaları gösterir her zaman en uygun önek kodunu üreten Huffman kodlaması görülür .

Göreviniz basit: Dizelerin bir listesi verildiğinde, geçerli bir önek kodu olup olmadığını belirleyin.

Girişiniz:

  • Herhangi bir makul formatta dizelerin bir listesi olacaktır .

  • Yalnızca yazdırılabilir ASCII dizeleri içerecektir.

  • Boş dizeler içermeyecek.

Çıktınız bir truthy / falsey değeri olacaktır: Geçerli bir önek kodu ise Truthy ve değilse falsey.

İşte bazı gerçek test durumları:

["Hello", "World"]                      
["Code", "Golf", "Is", "Cool"]
["1", "2", "3", "4", "5"]
["This", "test", "case", "is", "true"]          

["111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011", 
 "0110", "11001", "00110", "10011", "11000", "00111", "10010"]

İşte bazı yanlış test durumları:

["4", "42"]                             
["1", "2", "3", "34"]                   
["This", "test", "case", "is", "false", "t"]
["He", "said", "Hello"]
["0", "00", "00001"]
["Duplicate", "Duplicate", "Keys", "Keys"]

Bu kod-golf'dür, bu nedenle standart boşluklar uygulanır ve baytlarda en kısa sürede cevap verilir.


Tutarlı bir truthy değeri mi istiyorsunuz, yoksa örneğin "bazı pozitif tamsayılar" olabilir (farklı girdiler arasında değişebilir).
Martin Ender


@DrGreenEggsandHamDJ Cevabın çıktıların tutarlılığına değinmek olduğunu düşünmüyorum, dolayısıyla soru. ;)
Martin Ender

Sadece meraktan: Zorluk şöyle der: "Bunun en büyük avantajı, kodlanmış metnin aralarında hiçbir ayırıcı olmadan yazılabilmesi ve yine de benzersiz bir şekilde deşifre edilebilecek olmasıdır." Nasıl bir şey 001benzersiz bir şekilde deşifre edilebilir olur? Ya olabilir 00, 1veya 0, 11.
Joba

2
@ Joba Bu, anahtarlarınızın ne olduğuna bağlıdır. Eğer varsa 0, 00, 1, 11anahtarları olarak tüm 0 00 bir önek olduğundan bu bir önek kodu değildir ve 1 11. Bir önek kodu öneki olduğu hiçbiri başka anahtarla tuşları başlar. Örneğin, eğer anahtarlarınız 0, 10, 11bu bir ön kod ise ve benzersiz bir şekilde deşifre edilebilirse. 001Geçerli bir mesaj değil, ama 0011ya 0010benzersiz çözülebilir vardır.
DJMcMayhem

Yanıtlar:


11

Pyth, 8 bayt

.AxM.PQ2

Test odası

Girişin tüm 2 eleman permütasyonunu alın, her birini diğerindeki bir dizginin indeksine eşleyin (önek için 0) ve tüm sonuçların kaba olup olmadığını (sıfır olmayan) döndürün.


12

Haskell, 37 bayt

f l=[x|x<-l,y<-l,zip x x==zip x y]==l

Her eleman x , lönek içermeyen bir liste için tam olarak bir kez olan, öneki olduğu her öğe için bir kez tekrarlanır, orijinal liste verilir. Prefix özelliği, her iki listeyi de sıkıştırmak suretiyle kontrol edilir x, bu da elemanları uzunluğu keser x.


Bu zarif bir çözüm (+1)
Michael Klein

9

Java, 128 127 126 125 124 121 bayt

(Teşekkürler @Kenny Lau, @Maltysen, @Patrick Roberts, @Joba)

Object a(String[]a){for(int i=0,j,l=a.length;i<l;i++)for(j=0;j<l;)if(i!=j&a[j++].startsWith(a[i]))return 1<0;return 1>0;}

Ungolfed

Object a(String[] a) {
    for (int i = 0, j, l = a.length; i < l; i++) 
        for (j = 0; j < l;) 
            if (i != j & a[j++].startsWith(a[i])) return 1<0;
    return 1>0;
}

Çıktı

[Hello, World]
true

[Code, Golf, Is, Cool]
true

[1, 2, 3, 4, 5]
true

[This, test, case, is, true]
true

[111, 010, 000, 1101, 1010, 1000, 0111, 0010, 1011, 0110, 11001, 00110, 10011, 11000, 00111, 10010]
true

[4, 42]
false

[1, 2, 3, 34]
false

[This, test, case, is, false, t]
false

[He, said, Hello]
false

[0, 00, 00001]
false

[Duplicate, Duplicate, Keys, Keys]
false

1
idk but java, ama &yerine işe yarar &&mı?
Maltysen

1
Tamam, başka bir bayt kaydeder. Java'da, boolean işlenenlere sahip bitsel operatörleri kullanmak, bu durumda gerekmeyen kısa devreler dışında normal mantıksal işleçler gibi davranır.
Marv

Sadece işlevin dönüş türünü değiştirmek olamazdı intve iade 0ve 1? Bu birkaç bayt kurtarır. Ayrıca bunun Java'da geçerli olup olmadığını i, ancak bildirirseniz j, ve ldış fordöngünün içinde bir baytı bir daha az noktalı virgülten kurtaracak olanı unuturum .
Patrick Roberts

@PatrickRoberts Maltysen bunu daha önce önermişti, ancak bu en çok bilinen truthy / falsey tanımına göre geçerli değil . Ancak bildirimleri döngünün içine koymak, tamamen geçerli ve şimdi düşünüyorum. Sabahın 4'ünde golf oynamak için elde ettiğiniz şey şu: ^)
Marv

3
@Joba Dizge bulunmadığında indexOf -1 döndürdüğü için geçerli olmadığından emin olun; indexOf(a[i])==0Bu durumda tasarruf olması gerekmez .
Pokechu22

6

Python 2, 48 51 bayt

lambda l:all(1/map(a.find,l).count(0)for a in l)

Her eleman aiçin l, fonksiyon giriş dizisindeki a.findilk olayın indeksini bulur a, bu -1da devamsızlık sağlar. Yani, 0bir ön eki gösterir. Öneksiz bir listede, bu işlevin eşlenmesi kendisi 0için yalnızca bir tane döndürür a. İşlev bunun her şey için geçerli olup olmadığını kontrol eder a.


51 bayt:

lambda l:[a for a in l for b in l if b<=a<b+'~']==l

değiştirmek ~ASCII kod 128 veya daha yüksek olan bir karakterle .

Her öğe için ade lbir kopya bunun bir önek olduğu her element için dahildir. Önek içermeyen bir liste için, yalnızca bu öğenin akendisidir, bu nedenle orijinal liste verilir.


4

CJam, 14 bayt

q~$W%2ew::#0&!

Test odası.

açıklama

q~   e# Read and evaluate input.
$    e# Sort strings. If a prefix exists it will end up directly in front 
     e# of a string which contains it.
W%   e# Reverse list.
2ew  e# Get all consecutive pairs of strings.
::#  e# For each pair, find the first occurrence of the second string in the first.
     e# If a prefix exists that will result in a 0, otherwise in something non-zero.
0&   e# Set intersection with 0, yielding [0] for falsy cases and [] for truthy ones.
!    e# Logical NOT.

4

JavaScript ES6, 65 43 40 bayt

a=>!/(.*)\1/.test(''+a.sort().join``)
      ^            ^               ^ embedded NUL characters

Tüm UTF-8 karakterlerinin dizge dizilerini işleyen önceki çözümüm:

a=>!/[^\\]("([^"]*\\")*[^\\])",\1/.test(JSON.stringify(a.sort()))

Kaçınmayı başardım JSON.stringifyZorluk yalnızca yazdırılabilir ASCII karakterlerini belirttiğinden .

Ölçek

f=a=>!/(\0.*)\1/.test('\0'+a.sort().join`\0`) // since stackexchange removes embedded NUL characters

O.textContent += 'OK: '+
[["Hello", "World"]                      
,["Code", "Golf", "Is", "Cool"]
,["1", "2", "3", "4", "5"]
,["This", "test", "case", "is", "true"]          
,["111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011", 
 "0110", "11001", "00110", "10011", "11000", "00111", "10010"]
].map(a=>f(a)) 

O.textContent += '\nKO: '+
[["4", "42"]                             
,["1", "2", "3", "34"]                   
,["This", "test", "case", "is", "false", "t"]
,["He", "said", "Hello"]
,["0", "00", "00001"]
,["Duplicate", "Duplicate", "Keys", "Keys"]
].map(a=>f(a))
<pre id=O></pre>


3

Haskell, 49 bayt

g x=[1|z<-map((and.).zipWith(==))x<*>x,z]==(1<$x)

Bunun birkaç kısmı var:

-- Are two lists (or strings) equal for their first min(length_of_1,length_of_2) elements, i.e. is one the prefix of the other?
(and.).zipWith(==)

-- Check whether one element is the prefix of the other, for all pairs of elements (including equal pairs)
map((and.).zipWith(==))x<*>x

-- This is a list of 1's of length (number of elements that are the prefix of the other)
[1|z<-map((and.).zipWith(==))x<*>x,z]

-- This is the input list, with all the elements replaced with 1's
(1<$x)

İki liste eşitse, bir öğe yalnızca kendisinin ön ekidir ve geçerlidir.


3

Retina , 19 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

O`.+
Mm1`^(.+)¶\1
0

Giriş satır besleme ile ayrılmalıdır. Çıktı 0sahtekarlık ve 1hakikat için.

Çevrimiçi deneyin! (Bunun yerine birden çok boşlukla ayrılmış test durumlarını desteklemek için hafifçe değiştirilmiş.)

açıklama

O`.+

Girişteki satırları sıralayın. Eğer bir önek varsa, doğrudan onu içeren bir dizgenin önüne çıkar.

Mm1`^(.+)¶\1

MBir sonraki satırın başında da bulunan tam bir satırı eşleştirmeye çalışın ( ). mÖyle ki satırlı modunu aktive ^maçlar hat başlangıçlar ve 1olmasını sağlar sadece çıkış olacak şekilde en az bir maç sayımı 0ya 1.

0

Değişmek 0ve 1sonuç olarak, 0s sayısını sayarız .


3

Java, 97 bayt

Object a(String[]a){for(String t:a)for(String e:a)if(t!=e&t.startsWith(e))return 1<0;return 1>0;}

@ Marv'ın cevabında bulunan püf noktalarının çoğunu kullanır , fakat aynı zamanda foreach döngüsünü ve string referans eşitliğini kullanır.

Unminified:

Object a(String[]a){
    for (String t : a)
        for (String e : a)
            if (t != e & t.startsWith(e))
                return 1<0;
    return 1>0;
}

Dediğim gibi, bunun string referans eşitliği kullandığına dikkat edin. Bu, String ınterning nedeniyle kodun tuhaf davranabileceği anlamına gelir . Kod, komut satırından iletilen argümanları kullanırken ve ayrıca komut satırından okunan bir şeyi kullanırken çalışır. Ancak, test edilecek değerleri kodlamak istiyorsanız, interning'i gerçekleştirmeye zorlamak için String yapıcısını elle çağırmanız gerekir:

System.out.println(a(new String[] {new String("Hello"), new String("World")}));
System.out.println(a(new String[] {new String("Code"), new String("Golf"), new String("Is"), new String("Cool")}));
System.out.println(a(new String[] {new String("1"), new String("2"), new String("3"), new String("4"), new String("5")}));
System.out.println(a(new String[] {new String("This"), new String("test"), new String("case"), new String("is"), new String("true")}));
System.out.println(a(new String[] {new String("111"), new String("010"), new String("000"), new String("1101"), new String("1010"), new String("1000"), new String("0111"), new String("0010"), new String("1011"), new String("0110"), new String("11001"), new String("00110"), new String("10011"), new String("11000"), new String("00111"), new String("10010")}));
System.out.println(a(new String[] {new String("4"), new String("42")}));
System.out.println(a(new String[] {new String("1"), new String("2"), new String("3"), new String("34")}));
System.out.println(a(new String[] {new String("This"), new String("test"), new String("case"), new String("is"), new String("false"), new String("t")}));
System.out.println(a(new String[] {new String("He"), new String("said"), new String("Hello")}));
System.out.println(a(new String[] {new String("0"), new String("00"), new String("00001")}));
System.out.println(a(new String[] {new String("Duplicate"), new String("Duplicate"), new String("Keys"), new String("Keys")}));

@Jo King Cevabımın ikinci yarısına bakın; biraz karışık ve girişin nasıl belirtildiğine bağlı. Aslında, bunu yazarken hatırlamıyorum
Pokechu22

3

PostgreSQL, 186 , 173 bayt

WITH y AS(SELECT * FROM t,LATERAL unnest(c)WITH ORDINALITY s(z,r))
SELECT y.c,EVERY(u.z IS NULL)
FROM y LEFT JOIN y u ON y.i=u.i AND y.r<>u.r AND y.z LIKE u.z||'%' GROUP BY y.c

Çıktı:

enter image description here

Bu sefer canlı demo yok. http://sqlfiddle.com sadece 9.3'ü destekliyor ve bu gösterimi yapmak için 9.4 gerekiyor.

Nasıl çalışır:

  1. Dize dizisini sayı ile ayırın ve adlandırın y
  2. Hepsini al
  3. LEFT OUTER JOINaynı i(kimliği) temel alan aynı türetilmiş tabloya , ancak oridinalönekle başlayan farklıy.z LIKE u.z||'%'
  4. c(İlk dizi) dayalı grup sonucu ve EVERYgruplama işlevini kullanın . İkinci tablodaki her satır IS NULLönek olmadığı anlamına gelir.

Birisi ilgileniyorsa giriş:

CREATE TABLE t(i SERIAL,c text[]);

INSERT INTO t(c)
SELECT '{"Hello", "World"}'::text[]
UNION ALL SELECT  '{"Code", "Golf", "Is", "Cool"}'
UNION ALL SELECT  '{"1", "2", "3", "4", "5"}'
UNION ALL SELECT  '{"This", "test", "case", "is", "true"}'         
UNION ALL SELECT  '{"111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011","0110", "11001", "00110", "10011", "11000", "00111", "10010"}'
UNION ALL SELECT  '{"4", "42"}'
UNION ALL SELECT  '{"1", "2", "3", "34"}'                   
UNION ALL SELECT  '{"This", "test", "case", "is", "false", "t"}'
UNION ALL SELECT  '{"He", "said", "Hello"}'
UNION ALL SELECT  '{"0", "00", "00001"}'
UNION ALL SELECT  '{"Duplicate", "Duplicate", "Keys", "Keys"}';

DÜZENLE:

SQL Server 2016+ uygulama:

WITH y AS (SELECT *,z=value,r=ROW_NUMBER()OVER(ORDER BY 1/0) FROM #t CROSS APPLY STRING_SPLIT(c,','))
SELECT y.c, IIF(COUNT(u.z)>0,'F','T')
FROM y LEFT JOIN y u ON y.i=u.i AND y.r<>u.r AND y.z LIKE u.z+'%' 
GROUP BY y.c;

LiveDemo

Not: Virgülle ayrılmış listedir, gerçek dizi değildir. Ancak ana fikir, ile aynıdır PostgreSQL.


EDIT 2:

Aslında WITH ORDINALITYdeğiştirilebilir:

WITH y AS(SELECT *,ROW_NUMBER()OVER()r FROM t,LATERAL unnest(c)z)
SELECT y.c,EVERY(u.z IS NULL)
FROM y LEFT JOIN y u ON y.i=u.i AND y.r<>u.r AND y.z LIKE u.z||'%' GROUP BY y.c

SqlFiddleDemo


3

Brachylog , 8 bayt

¬(⊇pa₀ᵈ)

Çevrimiçi deneyin!

Tahmini başarı / başarısızlık yoluyla çıktılar. Son deneme testinde 60 saniyeden fazla zaman alır ["111","010","000","1101","1010","1000","0111","0010","1011","0110","11001","00110","10011","11000","00111","10010"] ancak hızlı bir şekilde programın daha Ċönce yapabileceğinden çok daha fazla olasılıkları ortadan kaldıran ek bir baytla geçer (alt listenin uzunluğunu sınırlamak için izinleri kontrol ettikten sonra izinleri kontrol etmeden önce) iki).

¬(     )    It cannot be shown that
   p        a permutation of
  ⊇         a sublist of the input
      ᵈ     is a pair of values [A,B] such that
    a₀      A is a prefix of B.

Az önemsiz 9 bayt daha varyantları ¬(⊇Ċpa₀ᵈ)olan makul bir süre içinde hangi çalışma ¬(⊇o₁a₀ᵈ), ¬(⊇o↔a₀ᵈ)ve ¬(⊇oa₀ᵈ¹).


Bu zorluk "truthy / falsy" yerine "iki farklı ve tutarlı değer" kullandıysa, bu sadece 5 bayt alacaktır.
İlişkisiz Dize

2

Perl 6 , 24 bayt

{.all.starts-with(.one)}

Çevrimiçi deneyin!

Wow, uzun bir dahili kullanırken şaşırtıcı derecede kısa.

açıklama

{                      }  # Anonymous code block taking a list
 .all                     # Do all of the strings
     .starts-with(    )   # Start with
                  .one    # Only one other string (i.e. itself)

Ben yazdım 50 baytlık bir cevap ama seninkiler benimkileri sudan attı.
bb94

1
@ bb94 Evet, benzer bir cevapla başladım ancak yinelenen anahtarların gerçeği döndüren setleriyle aynı problemi yaşadım. Bu cevabı yazmak inanılmaz derecede tatmin ediciydi
Jo King

1

Raket, 70 bayt

(λ(l)(andmap(λ(e)(not(ormap(curryr string-prefix? e)(remv e l))))l))

1

Python, 58 55 bayt

lambda l:sum(0==a.find(b)for a in l for b in l)==len(l)

a.index(b)==0biraz daha kısa. Alternatif olarak yapabilirsin 0**sum(a.index(b)for a in l for b in l).
Mego

@Mego Bu işe yaramaz çünkü bulunmazsa indexbir istisna atar b. Ve olması gerektiği için ==değil >=. Ancak, findçalışır. (Ve o da daha kısa!)
DJMcMayhem

Hata! Yazmayı kastediyorum find. Uykulu beyin uykulu. İkinci versiyonun da çalışması gerekiyor find.
Mego

@Mego İkinci sürümü alıp almadığımdan emin değilim. Bu her zaman 0 döndürmez mi?
DJMcMayhem

@Mego Bu sadece her dize aynı ise çalışır. Bunu karşılaştırmamızın nedeni , her birindeki her len(l)şeyi tekrarladığımız için b, her azaman en az bir maç olacak a. Bu yüzden eşleşme sayısının element sayısı ile aynı olup olmadığını kontrol ediyoruz.
DJMcMayhem

1

JavaScript (ES6), 52 54

2 bayt düzenle kaydedildi thx @Neil

a=>!a.some((w,i)=>a.some((v,j)=>i-j&&!w.indexOf(v)))

Ölçek

f=a=>!a.some((w,i)=>a.some((v,j)=>i-j&&!w.indexOf(v)))

O.textContent += 'OK: '+
[["Hello", "World"]                      
,["Code", "Golf", "Is", "Cool"]
,["1", "2", "3", "4", "5"]
,["This", "test", "case", "is", "true"]          
,["111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011", 
 "0110", "11001", "00110", "10011", "11000", "00111", "10010"]
].map(a=>f(a)) 

O.textContent += '\nKO: '+
[["4", "42"]                             
,["1", "2", "3", "34"]                   
,["This", "test", "case", "is", "false", "t"]
,["He", "said", "Hello"]
,["0", "00", "00001"]
,["Duplicate", "Duplicate", "Keys", "Keys"]
].map(a=>f(a))
<pre id=O></pre>


!w.indexOf(v)?
Neil

@Neil, teşekkürler
edc65

1

Mathematica 75 69 68 bayt

Her zamanki gibi konuşkan. Ancak Martin B kodu 7 bayt azaltabildi.

Yöntem 1: çıktıyı bir saklamak Array

(68 bayt)

f@a_:=!Or@@(Join@@Array[a~Drop~{#}~StringStartsQ~a[[#]]&,Length@a])

f@{"111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011", "0110", "11001", "00110", "10011", "11000", "00111", "10010"}

Doğru


f@{"He", "said", "Hello"}

Yanlış


Yöntem 2: çıktıyı bir saklamak List

(69 bayt)

f@a_:=!Or@@Flatten[a~Drop~{#}~StringStartsQ~a[[#]]&/@Range@Length@a]

Öncelik kuralları a~Drop~{#}~StringStartsQ~a[[#]]çalışmalıdır. Ayrıca Array, bazı baytları da tasarruf etmelisiniz Length, çünkü bunun Join@@yerine kullanmanıza izin verecektir Flatten@( Flattenyalnızca tek bir seviye için kullanıyorsanız ).
Martin Ender

Önerin için teşekkürler. Sonra Arraygörüşeceğim.
DavidC

1

Mathematica, 41 bayt

!Or@@StringStartsQ@@@Reverse@Sort@#~Subsets~{2}&

1

APL (Dyalog Unicode) , 13 bayt SBCS

-2 bayt:

≢=∘≢∘⍸∘.(⊃⍷)⍨

Çevrimiçi deneyin!

Açıklama:

≢=∘≢∘⍸∘.(⊃⍷)⍨   Monadic function train
               "Find": Convert the right argument into a boolean vector,
                where ones correspond to instances of the left argument
              Take the first item of the above vector (i.e., only prefixes)
     ∘.(  )⍨   Commutative outer product: take the above function and apply
               it for each possible pair of elements in the input
               If the input is a prefix code, the above should have a number of ones
               equal to the length of the input (i.e., each item is a prefix of only itself)
               To test this...
              Find the location of all ones in the above
   ≢∘          Take the length of the above
≢=∘            Compare to the length of the input

~2∊+\⊃¨∘.⍷⍨⎕­
ngn

1

J , 17 bayt

#=1#.1#.{.@E.&>/~

Çevrimiçi deneyin!

Not: Bunu aslında APL'nin cevabına bakmadan önce, önyargısız yaklaşmak için yazdım. Yaklaşımların neredeyse aynı olduğu ortaya çıktı, bu ilginç. Sanırım bu doğal bir "dizi düşünme" çözümü.

Dizeleri eşit olmayan uzunlukta olduğundan kutulu girdi alın.

/~Her bir elemanla eşleştirilmiş her bir elemanın kendi kendine işlev tablosu yarat ve başlangıçta bir eşleşme olup olmadığına bak.{.@E. . Bu 1-0 sonuçlu bir matris üretecektir.

"Matristeki 1#.1#.herkesi" temsil eden tek bir numara almak için iki kez toplayın ve bu sayının girişin uzunluğu ile aynı olup olmadığını kontrol edin.#= . Öyleyse, yalnızca önek eşleşmeleri kendi kendine eşleşir, yani bir önek kodumuz vardır.

sıralama çözümü, 18 bayt

0=1#.2{.@E.&>/\/:~

Farklı yaklaşımlarda teşebbüs. Bu çözüm bitişik çiftleri sıralar ve inceler.

Çevrimiçi deneyin!


1

R , 48 bayt

function(s)sum(outer(s,s,startsWith))==length(s)

Çevrimiçi deneyin!

Açıklama: bir ön ek outer(s,s,startsWith)olup olmadığını kontrol s[i]eden bir mantık matrisi çıkarır s[j]. Eğer sbir ön ek kod, daha sonra tam olarak orada length(s)çapraz elemanlara sonucu TRUE elemanları ( s[i]kendi başına bir öneki).


1
Bir sürü 48 bayt alternatif daha buldum, function(s)all(colSums(outer(s,s,startsWith))<2)fakat hala startsWithbilmediğim bir fonksiyon! Güzel buldum.
Giuseppe

1
@Giuseppe Matrisin bir kimlik matrisi olup olmadığını kontrol etmenin birkaç yolunu denedim, ancak 48 baytın altına da alamadım. Bu yolun anlaşılmasının en kolay yolu olduğunu düşündüm, ama birisinin golf oynayacağına eminim!
Robin Ryder

47 bayt ters çevirerek TRUEve FALSE...
Giuseppe

@Giuseppe Buna izin var mı? Kurallar, giriş geçerli bir önek kodu olduğunda açıkça truthy ister. (Ayrıca bağlantı 48 bayt sürümüne, ama Öneriniz değiştirmektir olduğunu tahmin ediyorum == ile >:-).)
Robin Ryder


0

Ruby, 48 bayt

Argümanları giriş, stdout işlevi olarak kullanır.

p !$*.map{a,*b=$*.rotate!
a.start_with? *b}.any?

0

Scala, 71 bayt

(s:Seq[String])=>(for{x<-s;y<-s}yield x!=y&&x.startsWith(y)).forall(!_)

0

Raket 130 bayt

(define g #t)(for((n(length l)))(for((i(length l))#:unless(= i n))(when(string-prefix?(list-ref l i)(list-ref l n))(set! g #f))))g

Ungolfed:

(define(f l)
  (define g #t)
  (for ((n (length l)))
    (for ((i (length l)) #:unless (= i n))
      (when (string-prefix? (list-ref l i) (list-ref l n))
        (set! g #f))))g)

Test yapmak:

(f [list "Hello" "World"])             
(f [list "Code" "Golf" "Is" "Cool"])
(f [list "1" "2" "3" "4" "5"])
(f [list "This" "test" "case" "is" "true"])          
(f [list "111" "010" "000" "1101" "1010" "1000" "0111" "0010" "1011" 
         "0110" "11001" "00110" "10011" "11000" "00111" "10010"])

(f [list "4" "42"])                             
(f [list "1" "2" "3" "34"])                   
(f [list "This" "test" "case" "is" "false" "t"])
(f [list "He" "said" "Hello"])
(f [list "0" "00" "00001"])
(f [list "Duplicate" "Duplicate" "Keys" "Keys"])

Çıktı:

#t
#t
#t
#t
#t
#f
#f
#f
#f
#f
#f


0

05AB1E , 13 bayt

2.ÆDí«ε`Å?}O_

Çok uzun .. Başlangıçta 9 baytlık bir çözüme ulaştım, ancak kopyalanan anahtar sınama durumu için başarısız oldu.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

2.Æ             # Get all combinations of two elements from the (implicit) input-list
   Dí           # Duplicate and reverse each pair
     «          # Merge the lists of pairs together
      ε         # Map each pair to:
       `        #  Push both strings to the stack
        Å?      #  And check if the first starts with the second
          }O    # After the map: sum to count all truthy values
            _   # And convert it to truthy if it's 0 or falsey if it's any other integer
                # (which is output implicitly as result)

0

Japt , 8 bayt

á2 ËrbÃe

Dene

á2 ËrbÃe     :Implicit input of array
á2           :Permutations of length 2
   Ë         :Map each pair
    r        :  Reduce by
     b       :  Get the index of the second in the first - 0 (falsey) if it's a prefix
      Ã      :End map
       e     :All truthy (-1 or >0)


0

Stax , 6 bayt

å·↑↑¶Ω

Koş ve hata ayıkla

Bu, truthy için sıfır olmayan üretir.

Genel fikir, girdideki her bir çift çifti dikkate almaktır. Eğer birinin diğerinin alt dizini sıfır ise, o zaman geçerli bir önek kodu değildir. Stax'ta, mevcut olmayan bir alt dizinin endeksi-1 . Bu şekilde, tüm çift tabanlı alt dize endeksleri birlikte çoğaltılabilir.

Bu isaacg'ın pyth çözümü ile aynı algoritma, ama ben bağımsız olarak geliştirdim.

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.