Ondalık samanlıkta bir ikili iğne bulun


41

Meydan okuma

Size verildi:

  • Boş olmayan, sıralanmamış liste h pozitif tamsayılar (samanlık)
  • pozitif bir tamsayı n (iğne)

Göreviniz , ikili gösterimi n'nin ikili gösterimini içeren, h nin permütasyonlarının tüm benzersiz ondalık birleştirmelerinin listesini döndürmektir .

Örnekler

  1. h = [1, 2, 3]
    n = 65

    örnek

    Yalnızca bir eşleşen birleştirme var, bu nedenle beklenen çıktı [321].

  2. h = [1, 2, 3]
    n = 7

    Bu sefer, 111 ikili desenini içeren üç birleştirme vardır . Beklenen çıktı [123, 231, 312].

  3. h = [12, 3]
    n = 7

    Sadece iki permütasyon mevcuttur ve her ikisi de eşleşmektedir. Beklenen çıktı [123, 312].

  4. h = [1, 2, 2]
    n = 15

    Yalnızca eşleşen birleşimidir 122 ( 1111010 içeren ikili, içinde 1111 beklenen çıkışı bu yüzden,) [122]. İki permütasyon aslında yol açtığını Not 122 ama edilmektedir değil çıkışına izin [122, 122].

Açıklamalar ve kurallar

  • İğneyi bir tamsayı ( 65), ondalık bir değeri ( "65") temsil eden bir dize veya ikili değeri ( "1000001") temsil eden bir dize olarak alabilirsiniz .
  • Samanlık, yerel bir dizi / nesne / tamsayılar kümesi ( [11,12,13]), ondalık değerleri ( ["11","12","13"]) temsil eden bir yerel dizi / nesne / dizi dizisi veya sınırlandırılmış ondalık değer dizisi ( "11 12 13"veya "11,12,13") olarak alabilirsiniz. Rakam dizilerini (benzeri [[1,1],[1,2],[1,3]]) kullanarak bir değişkeni de seçebilirsiniz .
  • Çıktı, samanlık için yukarıda açıklanan formatlardan birini izlemelidir, ancak mutlaka aynı değildir.
  • Onda en yüksek ondalık birleştirme, kendi dilinizde temsil edilebilecek en yüksek işaretsiz tamsayıdan büyük olan haystacks ile işlem yapmamanız gerekir.
  • Bunun dışında, kodunuz yeterli zaman ve hafıza verildiği varsayılarak herhangi bir girişi teorik olarak desteklemelidir.
  • Bu SPARTA! , bu yüzden bayt cinsinden en kısa cevap kazanır!

Test durumları

Haystack             | Needle   | Output
---------------------+----------+-----------------------------------
[ 1, 2, 3 ]          | 65       | [ 321 ]
[ 1, 2, 3 ]          | 7        | [ 123, 231, 312 ]
[ 12, 3 ]            | 7        | [ 123, 312 ]
[ 1, 2, 2 ]          | 15       | [ 122 ]
[ 1, 2 ]             | 7        | []
[ 12, 34, 56 ]       | 21       | [ 125634, 341256, 345612, 563412 ]
[ 1, 2, 3, 4, 5 ]    | 511      | [ 53241 ]
[ 1, 3, 5, 7, 9 ]    | 593      | [ 37519, 51793, 75913, 75931 ]
[ 11, 12, 13, 14 ]   | 12141311 | [ 12141311 ]
[ 1, 2, 1, 2, 1, 2 ] | 1015     | [ 221112 ]

1
Benim çözümümün çıktısı gibi set([(1, 2, 2)]). Geçerli mi yoksa kurtulmalı setmıyım?
Ölü Olasılık

@DeadPossum Evet, geçerli.
Arnauld

Samanlık girişi tek bir dize ("123") olabilir mi? Bazı dillerde, bir dizi karakter dizisi ile aynıdır, bu yüzden mantıklı olacağını düşünüyorum
Luis Mendo

@LuisMendo Çünkü olamaz ["12","3"]ve ["1","23"]iki farklı haystacks.
Arnauld

@Arnauld Ah, rakam olduğunu sanıyordum. Teşekkürler
Luis Mendo

Yanıtlar:


17

05AB1E , 10 8 bayt

İğneyi 1 bayttan tasarruf etmek için ikili olarak alır.

Emigna sayesinde -2 bayt

œJÙʒbŒIå

Çevrimiçi deneyin!

œJÙʒbŒIå   Arguments: a, n
œJÙ        Get all unique permutations of a
   ʒ       Filter: Keep if following code returns true
    b      Convert to binary
     Œ     Get all substrings
      Iå   Check if substrings contain n
           Implicit output of filtered list

1
œJÙʒbŒIå da çalışmalı.
Emigna

@Emigna Teşekkürler, bu 2 bayt kazandırır :)
kalsowerus

11

Python 2,90 bayt

@ Gábor Fekete sayesinde -3 bayt

Çevrimiçi deneyin

İğne'yi ikili olarak temsil eden, samandan ve dizeden gelen girişleri temsil eden girdi dizileri olarak alır

from itertools import*
lambda H,N:{i for i in permutations(H)if N in bin(int(''.join(i)))}

4
Yazmak {...}yerine set(...)3 bayt kaydeder.
Gábor Fekete

1
@ GáborFekete Her zaman unutacağım, {} ayarlandı: D Thanks
Dead Possum

Bunun başarısız olduğuna inanıyorum H=['1'], N='0'.
user2357112

Oh, bekle, girişin pozitif olması gerekiyor.
user2357112

10

Java 10, 320 312 305 297 292 bayt

import java.util.*;Set s=new HashSet();l->n->{Long q=0;p(l,0);for(var x:s)if(q.toString(q.decode(x+""),2).contains(n))System.out.println(x);}void p(List l,int k){int i=k,x=l.size();for(Collections C=null;i<x;p(l,k+1),C.swap(l,k,i++))C.swap(l,i,k);if(k>x-2)s.add((l+"").replaceAll("\\D",""));}

Liste ve ikili-Dize olarak giriş yapın, yeni satırlarda Dize olarak çıkış yapın.

Açıklama:

Burada dene.

import java.util.*;           // Required import for Set, HashSet, List, and Collections

Set s=new HashSet();          // Class-level Set

l->n->{                       // Method (1) with List and String parameters and no return-type
  Long q=0;                   //  Number-object is required for two static method-calls below
  p(l,0);                     //  Determine all permutations of given list and put it in the Set
  for(var x:s)                //  Loop over these permutations
    if(q.toString(q.decode(x+""),2)
                              //   If the binary String of the current permutation
        .contains(n))         //   contains the binary String of the input integer
      System.out.println(x);} //    Print this permutation

void p(List l,int k){         // Method (2) with List and integer parameters and no return-type
  int i=k,x=l.size();         //  Two temp integers
  for(Collections C;          //  Collections-object is required for two static method-calls below
      i<x                     //  Loop `i` in the range [`k`, list-size)
      ;                       //    After every iteration:
       p(l,k+1),              //     Do a recursive-call to this method with `k+1`
       Collections.swap(l,k,i++))
                              //     And swap the items at indices `k` and `i` back
    Collections.swap(l,i,k);  //   Swap the items at indices `i` and `k`
  if(k>x-2)                   //  If `k` is now equal to the size of the list - 1
    s.add((l+"").replaceAll("\\D",""));}
                              //   Add this permutation to the Set

Şahsen ben koyardım l->n->{...sonra void p(...lambda istemi cevabı ve fonksiyon çalışmalarına lambda için kurulum gerekli olduğu gibi. "İşlev ifadeleri" konusundaki fikir birliği, "gönderiminizin son" ifadesi "gibi bir değişkendir, eğer bir değişkene kaydedildiğinde bir işlev yanıtının gereksinimlerini karşılarsa" IIRC "olabilir. Ama bu sadece bir biçimlendirme sorunu ve bu konuda öznel bir sorun.
CAD97

@ CAD97 Siparişin önemli olduğu hakkında hiçbir fikrim yoktu. Geçen sefer Java 8 kullanmıştım void, kullandığım iki yöntemle cevap verdim çünkü ikinci lambda ve katlarından daha kısadı .apply. Bu cevap (yani için işaretli değil void p(List l,int k)ve 2x p(l,0)karşı (l,k)->2x & p.apply(l,0)). Hmm .. İkincisi bu durumda 1 bayt daha kısa görünüyor. Ama kuralların sadece bir lambda yöntemine sahip olabileceğini söylediğini söylüyorsun. Yine de neden sonuncusu olmak zorunda kaldığı konusunda biraz kafa karışıklığı var. Şahsen ben her zaman bu sırada benim cevapları sonrası: imports; class-fields; main-method/lambda; other methods.
Kevin Cruijssen

Yine, çoğunlukla görüş, gerçekten bir şekilde ya da diğerini söylemeden önce daha fazla zil sesi çeken birini istiyorum. Ancak, bunun doğru olduğunu biliyorum: Bir yöntemi çağırmanız gerekirse (örneğin özyinelemeli veya yardımcı olarak), bir adı olması gerekir. Ancak sipariş gelince , bayt sayısını değiştirmez gibi gerçekten önemli değil. Ama ben siparişimports;helper methods;lambda
CAD97

Elbette CAD97 Ah @ olacağını, böylece void p(List l,int k)ve 2x f(l,0);karşı f=(l,p)->ve 2x p.apply(l,0);(bu versiyon 1 bayt kısa olduğu anlamına gelir) kullanılarak. Siparişe gelince, sadece buna cevap vereceğim, çünkü tüm cevaplarımı yaptım ve açıklamada ana yöntemle başlamak kişisel olarak benim için anlamlı, ve sonra yardımcı yöntem (ler) i hiç var mı.
Kevin Cruijssen

ve ne yazık ki, sadece f=(lambda)Java'da yapamazsınız , bujava.util.function.BiConsumer<List,Integer>f=(l,p)->{...}
CAD97,

9

Japt , 15 14 13 12 10 bayt

Samanlıkta bir tamsayı dizisi, iğneyi de ikili bir dizge olarak alır. Bir tamsayı dizesi dizisi çıkarır.

á m¬f_°¤øV

Dene


açıklama

á m¬â f_°¤øV
              :Implicit input of array U=haystack and string V=needle
á             :Unique permutations of U
  m           :Map
   ¬          :  Join to a string
    f_        :Filter
      °       :  Postfix increment current element to cast it to an integer
       ¤      :  Convert to base-2 string
        øV    :  Does that contain V?
              :Implicit output of resulting array

Yaptıklarım hakkında çok hoş. ®¬nÃharitaya bir bayt kaydeder. ( âİkinci programdan kurtulmak için programın ortasına da Ã
taşınırdım

Aha, teşekkürler, @ETHproductions - Her numarayı bir dizi olarak çıkararak herhangi bir byte'ı tıraş edip edemeyeceğimi görmeye odaklandım, haritalamada bu basit değişikliği kaçırdım. âDaha verimli olacaktır filtreyi çalıştırmadan önce çiftleri kaldırarak, haklısın, Arnauld Final diziden çiftleri kaldırmak için unutmuştum o işaret ne zaman sonuna tacked hızlı bir düzeltme oldu ama.
Shaggy

4

Ruby , 61 59 bayt

->a,n{a.permutation.select{|s|"%b"%s.join=~/#{"%b"%n}/}|[]}

Çevrimiçi deneyin!

Günün harika özelliği: Sayı içeren bir dizgenin ikili gösterimini çıktılayabileceğimi bilmiyordum.

Örnek:

puts "%b"%"123"

-> 1111011

3

JavaScript (ES6), 140 bayt

İğneyi ikili dize olarak alır.

(h,n,S=new Set,p=(a,m='')=>a.length?a.map((_,i)=>p(A=[...a],m+A.splice(i,1))):S.add(+m),_=p(h))=>[...S].filter(d=>~d.toString(2).indexOf(n))


3

Brachylog , 15 bayt

{hpc.ḃs~ḃ~t?∧}ᵘ

Çevrimiçi deneyin!

açıklama

{            }ᵘ    Find all unique outputs, given [h, n], of:
 hpc.                The Output is the concatenation of a permutation of h
    .ḃs              Take a substring of the binary representation of the Output
       ~ḃ            Convert it back to a decimal number
         ~t?∧        This decimal number must me n

2

Mathematica, 170 156 bayt

(t={};l=Length;v=IntegerDigits;j=v[#2, 2];s=FromDigits/@Flatten/@v@Permutations@#1;Table[If[l@SequenceCases[v[s[[i]],2],j]>0,t~AppendTo~s[[i]]],{i,l@s}];t)&


giriş

[{12, 34, 56}, 21]

çıktı

{125634, 341256, 345612, 563412)


Bir boşluk var v[#2, 2].
Yytsi,

1

CJam, 23 22 21 19 bayt

{e!{si2b1$2b#)},\;}

Bu, n hyığında girişleri alan ve çıktıyı yığında bir dizi olarak bırakan bir bloktur .

Açıklama:

                   e# Stack:                      | 65 [1 2 3]
e!                 e# Unique Permutations:        | 65 [[1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 1 2] [3 2 1]]
  {                e# Filter where block is true: | 65 [3 2 1]
   s               e#   Convert to string:        | 65 "321"
    i              e#   Convert to int:           | 65 321
     2b            e#   Convert to binary:        | 65 [1 0 1 0 0 0 0 0 1]
       1$          e#   Copy behind:              | 65 [1 0 1 0 0 0 0 0 1] 65
         2b        e#   Convert to binary:        | 65 [1 0 1 0 0 0 0 0 1] [1 0 0 0 0 0 1]
           #       e#   Find array in another:    | 65 2
            )      e#   Increment:                | 65 3
             },    e# End filter                  | 65 [321]
               \;  e# Delete back:                | [321]

1

R, 114 bayt

pryr::f(plyr::l_ply(combinat::permn(x),function(y)if(grepl(p,R.utils::intToBin(paste(y,collapse=""))))cat(y,"\n")))

Bir sürü paket kullanır. pryr::f()otomatik olarak aranacak pikili düzende bir dize alarak bir işlev oluşturur ve xgirdi olarak diğer girişe sahip bir vektör. combinat::permntüm permütasyonlarını yaratır x. R.utils::intToBinbir nümerik (veya nümerik bir karakter temsilini) bir karakter sayısının halihazırda bir karakter olarak saklanan bir ikili sayıya dönüştürmesi için güzel ve küçük bir versiyondur. Bu nedenle, tüm permütasyonlar üzerine bunu uygulamak ve ikili dizge pbirleşmenin ikili versiyonunda yer alıyorsa bunları çıkarmak. Aksi halde çıktı alınacağı için açık bir yeni satır yazdırılır 12 56 3456 34 1234 56 1234 12 56.

plyr's l_ply, normal çıkışın yanı sıra boş bir listenin çıktısını bastırmak için kullanılır. Bunun gibi bir çıktıya izin verilirse:

3 2 1 
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

Sonra lapplybunun yerine birkaç byte'ı kaydedebiliriz :

108 bayt:

pryr::f(lapply(combinat::permn(x),function(y)if(grepl(p,R.utils::intToBin(paste(y,collapse=""))))cat(y,"\n")))

Bunun gibi bir çıktıya izin verilirse:

[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] 3 2 1

[[5]]
NULL

[[6]]
NULL

O zaman daha da kısa yapabiliriz:

101 bayt:

pryr::f(lapply(combinat::permn(x),function(y)if(grepl(p,R.utils::intToBin(paste0(y,collapse=""))))y))

İzin verilmedi.


0

Perl 6 , 69 bayt

{set @^a.permutations».join.grep(*.fmt('%b').contains($^b.base(2)))}
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.