Trova un ago binario in un pagliaio decimale


41

La sfida

Ti viene dato:

  • un elenco non vuoto, non ordinato h di numeri interi positivi (il pagliaio)
  • un numero intero positivo n (l'ago)

Il tuo compito è di restituire l'elenco di tutte le concatenazioni decimali uniche di permutazioni di h la cui rappresentazione binaria contiene la rappresentazione binaria di n .

Esempi

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

    esempio

    C'è solo una concatenazione corrispondente, quindi l'output previsto è [321].

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

    Questa volta, ci sono tre concatenazioni che contengono il modello binario 111 . L'output previsto è [123, 231, 312].

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

    Sono disponibili solo due permutazioni ed entrambe corrispondono. L'output previsto è [123, 312].

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

    L'unica concatenazione corrispondente è 122 ( 1111010 in binario, che contiene 1111 ), quindi l'output previsto è [122]. Nota che due permutazioni effettivamente portare a 122 ma siete senza possibile eseguire l'output [122, 122].

Chiarimenti e regole

  • Puoi prendere l'ago come un numero intero ( 65), una stringa che rappresenta un valore decimale ("65" ) o una stringa che rappresenta un valore binario ( "1000001").
  • Puoi prendere il pagliaio come un array / oggetto / set nativi di numeri interi ( [11,12,13]), un array / oggetto / set di stringhe nativi che rappresentano valori decimali ( ["11","12","13"]) o una stringa delimitata di valori decimali ( "11 12 13"o"11,12,13" ). Puoi anche optare per una variante usando matrici di cifre (come [[1,1],[1,2],[1,3]]).
  • L'output deve seguire uno dei formati sopra descritti per il pagliaio, ma non necessariamente lo stesso.
  • Non dovresti gestire covoni di fieno la cui concatenazione decimale più alta è maggiore dell'intero senza segno più alto rappresentabile nella tua lingua.
  • A parte questo, il tuo codice dovrebbe teoricamente supportare qualsiasi input, supponendo che abbia abbastanza tempo e memoria.
  • Questo è SPARTA! , quindi vince la risposta più breve in byte!

Casi test

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
L'output della mia soluzione è simile set([(1, 2, 2)]). È valido o dovrei sbarazzarmi di set?
Dead Possum,

@DeadPossum Sì, è valido.
Arnauld,

L'ingresso del pagliaio può essere una singola stringa ("123")? In alcune lingue una stringa è la stessa di una serie di caratteri, quindi penso che avrebbe senso
Luis Mendo,

@LuisMendo Non può perché ["12","3"]e ["1","23"]sono due pagliai distinti.
Arnauld,

@Arnauld Ah, pensavo fossero cifre. Grazie
Luis Mendo,

Risposte:


17

05AB1E , 10 8 byte

Prende l'ago in binario per salvare 1 byte.

-2 byte grazie a Emigna

œJÙʒbŒIå

Provalo online!

œ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
"JB" Anche io dovrebbe funzionare.
Emigna,

@Emigna Grazie, che risparmia 2 byte :)
kalsowerus,

11

Python 2, 90 byte

-3 byte grazie a @ Gábor Fekete

Provalo online

Prende come matrice di input di stringhe, che rappresentano ints da fieno e stringa, che rappresenta l'ago in binario

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

4
Scrivere {...}invece di set(...)salvare 3 byte.
Gábor Fekete,

1
@ GáborFekete Ho sempre dimenticato che è impostato {}: D Grazie
Dead Possum

Credo che fallisca H=['1'], N='0'.
user2357112 supporta Monica

Oh, aspetta, l'ingresso deve essere positivo.
user2357112 supporta Monica

10

Java 10, 320 312 305 297 292 byte

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

Input come Elenco e stringa binaria, output come String su new-line.

Spiegazione:

Provalo qui.

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

Personalmente lo metterei l->n->{...dopo void p(...che lambda è la risposta al prompt e la funzione è richiesta per il funzionamento di lambda. Il consenso sulle "espressioni di funzione" è qualcosa come "l'ultima" espressione "della tua presentazione può essere una" espressione di funzione "se, se memorizzata in una variabile, soddisfa i requisiti di una risposta di funzione" IIRC. Ma questo è solo un problema di formattazione e soggettivo.
CAD97,

@ CAD97 Non avevo idea che l'ordine fosse importante. L'ultima volta che ho pubblicato una risposta Java 8 con due metodi che ho usato voidperché era più breve di una seconda lambda e del multiplo .apply. Non ho controllato per questa risposta (cioè void p(List l,int k)& 2x p(l,0)contro (l,k)->& 2x p.apply(l,0)). Hmm .. il secondo sembra essere più corto di 1 byte in questo caso. Ma dici che le regole affermano che ti è permesso avere solo un metodo lambda? Ancora un po 'confuso perché deve essere l'ultimo. Personalmente ho sempre posterò le mie risposte in questo ordine: imports; class-fields; main-method/lambda; other methods.
Kevin Cruijssen,

di nuovo, è per lo più opinione, vorrei che qualcuno con più esperienza entrasse in campo prima di dire davvero in un modo o nell'altro. Tuttavia, so che questo è vero: se devi chiamare un metodo (ad esempio ricorsivo o come aiuto), deve avere un nome. Ma per quanto riguarda l'ordinamento, non importa davvero in quanto non cambia il conteggio dei byte. Ma ordino comeimports;helper methods;lambda
CAD97

@ CAD97 Ah ovviamente, quindi sarebbe void p(List l,int k)& 2x f(l,0);invece di f=(l,p)->& 2x p.apply(l,0);(il che significa che la versione corrente è più corta di 1 byte). Per quanto riguarda l'ordine, mi limiterò a questo poiché l'ho fatto con tutte le mie risposte, e ha anche senso per me personalmente iniziare con il metodo principale nella spiegazione, e quindi i metodi di aiuto se ci sono alcuni.
Kevin Cruijssen,

e sfortunatamente non puoi semplicemente farlo f=(lambda)in Java, èjava.util.function.BiConsumer<List,Integer>f=(l,p)->{...}
CAD97

9

Japt , 15 14 13 12 10 byte

Prende il pagliaio come una matrice di numeri interi e l'ago come una stringa binaria. Emette un array di stringhe intere.

á m¬f_°¤øV

Provalo


Spiegazione

á 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

Molto bello, per quello che avrei fatto. ®¬nÃsalva un byte sulla mappatura. (Mi sposterei anche âal centro del programma per sbarazzarmi del secondo Ã; non salva alcun byte, ma è un po 'più efficiente e sembra leggermente migliore)
ETHproductions

Aha, grazie, @ETHproductions - Ero così concentrato nel vedere se potevo radunare i byte emettendo ogni numero come un array che mi mancava quella semplice modifica alla mappatura. La soluzione è âstata risolta alla fine quando Arnauld ha sottolineato che avevo dimenticato di rimuovere i duplicati dall'array finale ma, hai ragione, rimuovere i duplicati prima di eseguire il filtro sarebbe stato più efficiente.
Shaggy,

4

Rubino , 61 59 byte

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

Provalo online!

Fantastica funzionalità del giorno: non sapevo di poter generare la rappresentazione binaria di una stringa contenente un numero.

Esempio:

puts "%b"%"123"

-> 1111011

3

JavaScript (ES6), 140 byte

Prende l'ago come una stringa binaria.

(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 byte

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

Provalo online!

Spiegazione

{            }ᵘ    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 byte

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


ingresso

[{12, 34, 56}, 21]

produzione

{125634, 341256, 345612, 563412}


C'è uno spazio bianco a v[#2, 2].
Yytsi,

1

CJam, 23 22 21 19 byte

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

Questo è un blocco che accetta input n h nello stack e lascia l'output come array nello stack.

Spiegazione:

                   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 byte

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

Utilizza un sacco di pacchetti. pryr::f()crea automaticamente una funzione, prendendo p, una stringa del modello binario da cercare e xun vettore con l'altro input come input. combinat::permncrea tutte le permutazioni di x. R.utils::intToBinè una versione piacevole e prolissa per convertire un numero (o rappresentazione di carattere di un numero) in un numero binario, già convenientemente memorizzato come carattere. Quindi applicando questo su tutte le permutazioni e emettendole se la stringa binaria pè contenuta nella versione binaria della concatenazione. Viene stampato un newline esplicito, perché altrimenti sarebbe l'output 12 56 3456 34 1234 56 1234 12 56.

plyr's l_plyè usato per sopprimere l'output di un elenco null, oltre al normale output. Se l'output in questo modo è consentito:

3 2 1 
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

Quindi possiamo salvare pochi byte usando lapplyinvece:

108 byte:

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

Se l'output in questo modo è consentito:

[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] 3 2 1

[[5]]
NULL

[[6]]
NULL

Quindi possiamo farlo ancora più breve:

101 byte:

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

Non autorizzato.


0

Perl 6 , 69 byte

{set @^a.permutations».join.grep(*.fmt('%b').contains($^b.base(2)))}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.