ค้นหาเข็มไบนารีในกองหญ้าที่เป็นทศนิยม


41

ความท้าทาย

คุณได้รับ:

  • hรายการที่ไม่ว่างและไม่เรียงลำดับของจำนวนเต็มบวก (กองหญ้า)
  • จำนวนเต็มบวกn (เข็ม)

งานของคุณคือการกลับรายการทั้งหมดที่ไม่ซ้ำกัน concatenations ทศนิยมของพีชคณิตชั่วโมงซึ่งแทน binary มีฐานเป็นตัวแทนของn

ตัวอย่าง

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

    ตัวอย่าง

    [321]มีเพียงคนเดียวที่ตรงกับการเรียงต่อกันเพื่อให้การส่งออกที่คาดว่าจะเป็น

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

    เวลานี้มีสาม concatenations ซึ่งมีรูปแบบไบนารี111 [123, 231, 312]การส่งออกที่คาดไว้คือ

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

    มีเพียงการเปลี่ยนลำดับสองแบบเท่านั้นและทั้งคู่กำลังจับคู่กัน [123, 312]การส่งออกที่คาดไว้คือ

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

    เรียงต่อกันเพียงจับคู่คือ122 ( 1111010ในไบนารีซึ่งประกอบด้วย1111 ) [122]ดังนั้นการส่งออกที่คาดว่าจะเป็น หมายเหตุว่าสองพีชคณิตจริงนำไปสู่122แต่คุณจะไม่ได้[122, 122]รับอนุญาตให้ส่งออก

คำอธิบายและกฎ

  • คุณอาจใช้เข็มเป็นจำนวนเต็ม ( 65) สตริงที่แสดงค่าทศนิยม ( "65") หรือสตริงคิดเป็นค่าไบนารี ( "1000001")
  • คุณอาจใช้กองหญ้าเป็นอาร์เรย์พื้นเมือง / วัตถุ / ชุดจำนวนเต็ม ( [11,12,13]), อาร์เรย์พื้นเมือง / วัตถุ / ชุดของสตริงที่เป็นตัวแทนของค่าทศนิยม ( ["11","12","13"]) หรือสตริงที่คั่นด้วยของค่าทศนิยม ( "11 12 13"หรือ"11,12,13") คุณอาจเลือกใช้ชุดตัวเลือกโดยใช้อาร์เรย์ของตัวเลข (เช่น[[1,1],[1,2],[1,3]])
  • เอาต์พุตจะต้องเป็นไปตามรูปแบบใดรูปแบบหนึ่งที่อธิบายไว้ข้างต้นสำหรับกองหญ้า แต่ไม่จำเป็นต้องเป็นรูปแบบเดียวกัน
  • คุณไม่ควรจัดการกับกองหญ้าที่มีการแบ่งทศนิยมที่สูงกว่าจำนวนเต็มที่ไม่ได้ลงนามสูงสุดในภาษาของคุณ
  • นอกจากนั้นโค้ดของคุณควรสนับสนุนอินพุตในทางทฤษฎีโดยสมมติว่ามีเวลาและหน่วยความจำเพียงพอ
  • นี่คือสปาร์ต้า! ดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!

กรณีทดสอบ

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
set([(1, 2, 2)])เอาท์พุทโซลูชั่นของฉันเป็นเหมือน มันถูกต้องหรือฉันควรกำจัด set?
Possum ที่ตายแล้ว

@DeadPossum ใช่ถูกต้อง
Arnauld

อินพุต haystack สามารถเป็นสตริงเดี่ยว ("123") ได้หรือไม่? ในบางภาษาสตริงจะเหมือนกับตัวอักษรหลายตัวฉันจึงคิดว่ามันจะสมเหตุสมผล
Luis Mendo

@LuisMendo มันสามารถไม่ได้เพราะ["12","3"]และ["1","23"]มีสองกองฟางที่แตกต่างกัน
Arnauld

@Arnauld Ah ฉันคิดว่าพวกเขาเป็นตัวเลข ขอบคุณ
Luis Mendo

คำตอบ:


17

05AB1E , 10 8 ไบต์

ใช้เข็มเป็นไบนารี่เพื่อบันทึก 1 ไบต์

-2 ไบต์ขอบคุณ Emigna

œJÙʒbŒIå

ลองออนไลน์!

œ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Œฉันควรทำงานเช่นกัน
Emigna

@Emigna ขอบคุณที่ช่วยประหยัด 2 ไบต์ :)
kalsowerus

11

Python 2, 90 ไบต์

-3 ไบต์ขอบคุณ @ Gábor Fekete

ลองออนไลน์

ใช้เป็นอาร์เรย์อินพุตของสตริงแสดงถึง ints จากฟางและสตริงแสดงถึงเข็มในไบนารี

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

4
การเขียน{...}แทนการset(...)บันทึก 3 ไบต์
Gábor Fekete

1
@GáborFeketeฉันลืมอยู่เสมอว่า {} ถูกตั้งค่า: D Thanks
Dead Possum

H=['1'], N='0'ผมเชื่อว่านี่ล้มเหลวใน
user2357112

โอ้ต้องรอให้อินพุตเป็นค่าบวก
user2357112

10

Java 10, 320 312 305 297 292 ไบต์

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

ป้อนข้อมูลเป็นรายการ & ไบนารีสตริงส่งออกเป็นสตริงในบรรทัดใหม่

คำอธิบาย:

ลองที่นี่

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

ส่วนตัวผมต้องการใส่l->n->{...หลังจากvoid p(...เป็นแลมบ์ดาเป็นคำตอบที่จะรวดเร็วและฟังก์ชั่นที่จำเป็นในการติดตั้งสำหรับแลมบ์ดาในการทำงาน ฉันทามติเกี่ยวกับ "การแสดงออกของฟังก์ชั่น" เป็นเหมือน "การแสดงออกสุดท้าย" ของการส่งของคุณอาจเป็น 'การแสดงออกของฟังก์ชั่น' ถ้าเมื่อเก็บไว้ในตัวแปร แต่นั่นเป็นเพียงปัญหาการจัดรูปแบบและเป็นเรื่องแบบอัตนัย
CAD97

@ CAD97 ฉันไม่รู้ว่าคำสั่งนั้นสำคัญ ครั้งล่าสุดที่ฉันโพสต์คำตอบ Java 8 ด้วยสองวิธีที่ฉันใช้voidเพราะมันสั้นกว่าแลมบ์ดาที่สองและหลาย.applyวิธี ยังไม่ได้ตรวจสอบคำตอบนี้ (เช่นvoid p(List l,int k)& 2x p(l,0)กับ(l,k)->& 2x p.apply(l,0)) อืม .. อันที่สองดูเหมือนจะสั้นลง 1 ไบต์ในกรณีนี้ แต่คุณบอกว่ากฎระบุว่าคุณได้รับอนุญาตให้มีวิธีแลมบ์ดาเพียงวิธีเดียวเท่านั้น ยังสับสนอยู่เล็กน้อยว่าทำไมต้องเป็นคนสุดท้าย imports; class-fields; main-method/lambda; other methodsส่วนตัวผมมักจะโพสต์คำตอบของฉันในลำดับนี้:
Kevin Cruijssen

อีกครั้งเป็นความเห็นส่วนใหญ่ฉันต้องการใครสักคนที่มีประสบการณ์มากขึ้นในการพูดสอดก่อนพูดอย่างใดอย่างหนึ่งหรืออื่น ๆ อย่างไรก็ตามฉันรู้ว่าสิ่งนี้เป็นจริง: หากคุณต้องการเรียกวิธีการ (เช่นเรียกซ้ำหรือเป็นผู้ช่วย) ก็ต้องมีชื่อ แต่เป็นสำหรับการสั่งซื้อก็ไม่ได้จริงๆเรื่องที่มันไม่ได้เปลี่ยนการนับไบต์ แต่ฉันสั่งเป็นimports;helper methods;lambda
CAD97

@ CAD97 อาแน่นอนดังนั้นมันจะvoid p(List l,int k)& 2x f(l,0);เมื่อเทียบกับf=(l,p)->& 2x p.apply(l,0);แทน (ซึ่งหมายถึงรุ่นปัจจุบันคือ 1 ไบต์สั้น) สำหรับการสั่งซื้อฉันจะยึดติดกับเรื่องนี้ตั้งแต่ฉันทำทุกอย่างด้วยคำตอบของฉันและมันก็สมเหตุสมผลสำหรับฉันที่จะเริ่มต้นด้วยวิธีการหลักในการอธิบายและจากนั้นวิธีการของผู้ช่วยถ้า มีผู้ใด
Kevin Cruijssen

และน่าเสียดายที่คุณไม่สามารถทำf=(lambda)ใน Java ได้java.util.function.BiConsumer<List,Integer>f=(l,p)->{...}
CAD97

9

Japtap , 15 14 13 12 10 ไบต์

ใช้กองหญ้าเป็นอาร์เรย์ของจำนวนเต็มและเข็มเป็นสตริงไบนารี ส่งออกอาร์เรย์ของสตริงจำนวนเต็ม

á m¬f_°¤øV
  • บันทึกเป็นไบต์ด้วยETHproductions

ลองมัน


คำอธิบาย

á 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

ดีมากเกี่ยวกับสิ่งที่ฉันจะทำ ®¬nÃบันทึกไบต์บนแผนที่ (ฉันจะย้ายâไปที่ตรงกลางของโปรแกรมเพื่อกำจัดวินาทีÃ; ไม่ได้บันทึกไบต์ใด ๆ แต่มันมีประสิทธิภาพมากกว่าเล็กน้อยและดูดีขึ้นเล็กน้อย)
ETHproductions

Aha ขอบคุณ @ETHproductions - ฉันมุ่งเน้นไปที่การดูว่าฉันสามารถโกนไบต์ใด ๆ ด้วยการแสดงผลแต่ละหมายเลขเป็นอาร์เรย์ที่ฉันพลาดการเปลี่ยนแปลงการทำแผนที่แบบง่ายๆ การâแก้ไขนั้นถูกแก้ไขอย่างรวดเร็วในตอนท้ายเมื่อ Arnauld ชี้ว่าฉันลืมลบรายการที่ซ้ำออกจากอาร์เรย์สุดท้าย แต่คุณพูดถูกการลบรายการที่ซ้ำกันก่อนใช้ตัวกรองจะมีประสิทธิภาพมากขึ้น
Shaggy

4

Ruby , 61 59 ไบต์

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

ลองออนไลน์!

คุณสมบัติที่ยอดเยี่ยมของวัน: ฉันไม่รู้ว่าฉันสามารถส่งออกการเป็นตัวแทนไบนารีของสตริงที่มีจำนวน

ตัวอย่าง:

puts "%b"%"123"

-> 1111011

3

JavaScript (ES6), 140 ไบต์

ใช้เข็มเป็นสตริงไบนารี

(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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

{            }ᵘ    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 ไบต์

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


อินพุต

[{12, 34, 56}, 21]

เอาท์พุต

{125634, 341256, 345612, 563412}


v[#2, 2]มีช่องว่างที่เป็น
Yytsi

1

CJam, 23 22 21 19 ไบต์

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

นี่คือบล็อกที่รับอินพุตn hในสแต็กและปล่อยเอาต์พุตเป็นอาร์เรย์บนสแต็ก

คำอธิบาย:

                   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 ไบต์

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

ใช้แพ็คเกจจำนวนมาก pryr::f()สร้างฟังก์ชั่นโดยอัตโนมัติรับpสตริงของรูปแบบไบนารีที่จะค้นหาและxเวกเตอร์ที่มีอินพุตอื่นเป็นอินพุต สร้างพีชคณิตทั้งหมดของcombinat::permn เป็นรุ่นที่ดีและใช้คำมากในการแปลงตัวเลข (หรือการแสดงอักขระของตัวเลข) เป็นเลขฐานสองซึ่งถูกจัดเก็บไว้อย่างสะดวกสบายเป็นอักขระ ดังนั้นการใช้สิ่งนี้กับพีชคณิตทั้งหมดและส่งออกมันถ้าสตริงไบนารีมีอยู่ในรุ่นไบนารีของการต่อกัน ขึ้นบรรทัดใหม่อย่างชัดเจนมีการพิมพ์เพราะมิฉะนั้นการส่งออกจะเป็นxR.utils::intToBinp12 56 3456 34 1234 56 1234 12 56

plyrของl_plyที่ใช้ในการแสดงผล surpress รายการโมฆะนอกเหนือจากการส่งออกปกติ หากอนุญาตให้ใช้เอาต์พุตเช่นนี้:

3 2 1 
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

จากนั้นเราสามารถบันทึกไม่กี่ไบต์โดยใช้lapplyแทน:

108 ไบต์:

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

หากอนุญาตให้ใช้เอาต์พุตเช่นนี้:

[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] 3 2 1

[[5]]
NULL

[[6]]
NULL

จากนั้นเราสามารถทำมันให้สั้นลงได้:

101 ไบต์:

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

ไม่ได้รับอนุญาต.


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.