Εξαφανισμένοι δυαδικοί τοίχοι

HyperNeutrino 08/18/2017. 14 answers, 1.278 views
code-golf number binary binary-matrix

Εμπνευσμένο από Δημιουργία δυαδικού τοίχου

Λαμβάνοντας μια λίστα με θετικούς ακέραιους, μπορούμε να τις γράψουμε όλοι επάνω ο ένας τον άλλον έτσι όπως για παράδειγμα [2, 6, 9, 4] :

0010
0110
1001
0100 

Μπορούμε να φανταστούμε αυτό ως τοίχο:

..#.
.##.
#..#
.#.. 

Ωστόσο, αυτό είναι ένα πολύ αδύναμο τείχος, και έχει καταρρεύσει! Κάθε 1 ( # ) πέφτει μέχρι να χτυπήσει το "έδαφος" ή άλλο 1 ( # ). Τα 0 s ( . S) υπάρχουν σε σημεία που απομένουν μετακινώντας 1 δευτερόλεπτο.

Αυτό γίνεται το εξής:

....
....
.##.
#### 

Η οποία μεταφράζεται ξανά σε:

0000
0000
0110
1111 

Η οποία, ως λίστα αριθμών, είναι [0, 0, 6, 15] .

Μια άλλη δοκιμαστική περίπτωση

[10, 17, 19, 23] 

Αυτό γίνεται:

01010
10001
10011
10111 

που γίνεται:

00000
10011
10011
11111 

μετάφραση πίσω στο:

[0, 19, 19, 31] 

Πρόκληση

Λαμβάνοντας μια λίστα θετικών ακεραίων, εφαρμόστε αυτή τη μετατροπή στη λίστα. Εισαγωγή / Εξαγωγή ως κατάλογοι θετικών ακεραίων σε οποιαδήποτε λογική μορφή. Ισχύουν τυποποιημένα κενά.

Αυτό είναι ένα , οπότε κερδίζει η συντομότερη απάντηση σε bytes!

5 Comments
1 Leaky Nun 07/29/2017
Περισσότερες δοκιμές; Ξέρετε, οι μη τετραγωνικές δοκιμές θα ήταν καλές.
HyperNeutrino 07/29/2017
@LeakyNun Σίγουρα. Θα το κάνω.
Marcus Müller 07/30/2017
Αυτό είναι μόνο ένα πρόβλημα ταξινόμησης για συστοιχίες bit.
HyperNeutrino 07/30/2017
@ MarcusMüller Έχετε δίκιο - συνειδητοποίησα ότι μετά την απάντηση MATL: P

14 Answers


Suever 07/29/2017.

MATL , 4 byte

BSXB 

Δοκιμάστε το στο MATL Online

Explanation

% Implicitly grab input as an array 
    %   STACK: [10, 17, 19, 23]
B   % Convert each element to binary where each decimal number results in a row
    %   STACK: [0 1 0 1 0;
    %           1 0 0 0 1;
    %           1 0 0 1 1;
    %           1 0 1 1 1]
S   % Sort each column, placing all of the 1's at the bottom of each column
    %   STACK: [0 0 0 0 0;
    %           1 0 0 1 1;
    %           1 0 0 1 1;
    %           1 1 1 1 1] 
XB  % Convert each row from its binary representation to its decimal number
    %   STACK: [0, 19, 19, 31]
    % Implicitly display the result 
5 comments
HyperNeutrino 07/29/2017
o_O Πώς λειτουργεί αυτό: o
1 totallyhuman 07/29/2017
Μήπως το MATL μόλις έξω-γκολφ ζελέ από 4 bytes ; o_O
Leaky Nun 07/29/2017
5 bytes τώρα :-p
HyperNeutrino 07/29/2017
Ποτέ δεν πίστευα ότι θα υπάρχει μια ενσωματωμένη για να μετακινήσετε αυτά στο κάτω μέρος xD +1
1 JungHwan Min 07/29/2017
@totallyhuman καλά, περιμένετε μέχρι Dennis έρχεται

Anders Kaseorg 07/29/2017.

Python , 68 bytes

 f=lambda a:a and[x|y&a[0]for x,y in zip([0]+f(a[1:]),f(a[1:])+[-1])] 

Δοκιμάστε το online!


Neil 07/29/2017.

JavaScript (ES6), 50 bytes

f=a=>a.map(_=>a.map((e,i)=>a[a[i]|=a[--i],i]&=e))&&a 

Επεξήγηση: Ας υποθέσουμε ότι δύο σειρές του τοίχου ήταν έτσι:

0011
0101 

Το αποτέλεσμα πρέπει να είναι αυτό:

0001
0111 

Με άλλα λόγια, η πρώτη σειρά γίνεται η AND των δύο σειρών και η δεύτερη σειρά γίνεται η OR των δύο σειρών. Αυτό πρέπει να επαναληφθεί αρκετές φορές για να πέσουν όλα τα κομμάτια στο κάτω μέρος.


Leaky Nun 07/29/2017.

Jelly , 9 byte

BUz0Ṣ€ZUḄ 

Δοκιμάστε το online!


Justin Mariner 07/29/2017.

Japt , 16 bytes

m¤z3 ®¬n qÃz mn2 

Δοκιμάστε το online! χρησιμοποιώντας τη σημαία -Q για να μορφοποιήσετε το αποτέλεσμα πίνακα.

Εξήγηση

m¤z3 ®¬n qÃz mn2    Implicit: U = input array.
                        [10, 17, 19, 23]
m¤z3                Map U to binary strings and rotate the array left 90°
                         1010       0111
                        10001   ->  1011
                        10011       0001
                        10111       1000
                                     111
®¬n qà              Sort each binary string, putting 0s and spaces at the start
                        0111
                        0111
                        0001
                        0001
                         111
z mn2               Rotate right 90° and convert each back to a number
                         0000       0
                        10011   ->  19
                        10011       19
                        11111       31
                    Implicit output of resulting array 
2 comments
ETHproductions 07/30/2017
Νομίζω think μπορείτε να αποθηκεύσετε ένα byte με mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHproductions Φαίνεται ότι περιστρέφοντας τη συστοιχία 2D, αντί να περιστρέφεται η συστοιχία των συμβολοσειρών, επιθέτει κάθε εσωτερική διάταξη με null αντί των διαστημάτων. Γι 'αυτό δεν φαίνεται να δουλεύει. Και το null είναι ταξινομημένο στα δεξιά του 1 δευτερολέπτου, αντίθετα από τα κενά, τα οποία ταξινομούνται προς τα αριστερά.

DanTheMan 07/30/2017.

Mathematica, 64 bytes

#~FromDigits~2&/@(Sort/@(PadLeft[#~IntegerDigits~2&/@#]))& 

 είναι \[Transpose]

Αυτό μετατρέπει την είσοδο (μια λίστα αριθμών) σε μια λίστα με τους καταλόγους των ψηφίων, την επιθέτει ως τετράγωνο πλέγμα, την μεταφέρει, ταξινομεί τις σειρές, έτσι ώστε η "πτώση" του 1 στο κάτω μέρος, μεταφέρει πίσω, μετατρέπεται ξανά σε αριθμούς .


xnor 07/30/2017.

Python 3,5 , 60 bytes

 def f(a,*t):
 if t:b,*r=f(*t);t=f(a|b,*r);a&=b
 return(a,*t) 

Δοκιμάστε το online!

Παίρνει εισροές όπως f(2, 6, 9, 4) . Υποθέτει ότι η είσοδος δεν είναι κενή. Χρησιμοποιεί πολύ αποσυσκευασία με πλειάδα .


Suever 07/30/2017.

Octave, 29 25 bytes

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de αποθηκεύει 4 bytes στην οκτάβα. Λειτουργεί στο octave-online.net.
Suever 07/30/2017
@StewieGriffin Ευχαριστώ!

miles 07/29/2017.

J , 13 byte

/:~"1&.|:&.#: 

Δοκιμάστε το online!

Εξήγηση

/:~"1&.|:&.#:  Input: array M
           #:  Convert each in M to binary with left-padding
       |:&     Transpose
/:~"1&         Sort each row
     &.|:      Inverse of transpose (which is just transpose)
         &.#:  Inverse of converting to binary 
2 comments
Zacharý 07/30/2017
Υπάρχει πάλι αυτό το δυαδικό αριστερό επίθεμα, +1. Και επίσης, μπορείτε να εξηγήσετε γιατί θα χρειαστεί να χρησιμοποιήσετε το αντίστροφο της μετάθεσης, δεδομένου ότι είναι απλώς μεταφορά;
miles 08/01/2017
@ Zacharý Τα αντιστρόφια χρησιμοποιούνται για να ακυρώσουν τις λειτουργίες που χρησιμοποιήθηκαν πριν από τη διαλογή κάθε σειράς. Είναι αλήθεια ότι το αντίστροφο της μετάθεσης είναι απλώς μεταφορά, αλλά ένας άλλος τρόπος για να δείτε αυτό είναι το M , όπου οι πρώτες δύο λειτουργίες είναι μόνο οι αντιστρόφως των δύο τελευταίων.

Erik the Outgolfer 07/30/2017.

05AB1Ε , 9 byte

bí0ζR€{øC 

Δοκιμάστε το online!

Κάπως διαφορετικός αλγόριθμος από το Magic.

3 comments
Magic Octopus Urn 07/31/2017
ζ , καταστραφεί. Διαγράφεται η δική μου, πάρετε +1 μου.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Γιατί διαγράψατε τα δικά σας; Δεν χρειάζεται να.
Magic Octopus Urn 07/31/2017
Δεν είναι πολύ διαφορετικό (από άποψη αλγόριθμου) και αυτό ήταν 25% καλύτερο.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 bytes

2⊥↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⎕ 

Δοκιμάστε το online! (τροποποιήθηκε έτσι το TryAPL το δέχεται ως έγκυρο)

Πως?

  • αξιολόγηση εισόδου (οι συστοιχίες χωρίζονται χωριστά)
  • 2⊥⍣¯1⊢ μετατρέπει κάθε ένα από τα επιχειρήματα σε δυαδικό (μεταφέρθηκε σε ό, τι είναι στο ερώτημα)
  • μετατρέπει μια 2D συστοιχία σε ένα διάνυσμα των διανυσμάτων
  • {⍵[⍋⍵]}¨ ταξινομεί κάθε στοιχείο του διανύσματος
  • μετατρέπει ξανά το διάνυσμα των διανυσμάτων σε μια συστοιχία 2D
  • 2⊥ μετατροπή από δυαδικό (δεδομένου ότι το είδος της μεταφέρει, φτάνουμε στο σωστό αποτέλεσμα)

James Heslip 07/30/2017.

Dyalog APL (23 χαρακτήρες)

NO 
  1. Μετατρέψτε τα επιχειρήματα εισόδου σε δυαδική μήτρα
  2. Διαχωρίστε τη μήτρα σε στήλες
  3. Ταξινόμηση των στηλών σε αύξουσα σειρά
  4. Μετατρέψτε τις ταξινομημένες σειρές πίσω σε δεκαδική

Παράδειγμα

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}10 17 19 23
      0 19 19 31 

Χάρη στον Zacharý για τη διόρθωσή μου σε αυτό.

5 comments
Zacharý 07/30/2017
Μπορείτε να αντικαταστήσετε με (⊥⍣¯1)⍵ με ⊥⍣¯1⊢⍵ . Επίσης, δεν νομίζω ότι χρειάζεστε την προδιαγραφή του άξονα για τη διαίρεση ( ↓[1] => ).
Zacharý 07/30/2017
Ω, και πρέπει να το μετατρέψεις σε μια λίστα!
Zacharý 07/30/2017
Αυτό δεν είναι έγκυρο.
James Heslip 07/30/2017
Σας ευχαριστώ, Zacharý, δούλευα αργά χθες το βράδυ και νομίζω ότι το λάθος αναρωτιέμαι. Έχω τροποποιήσει τη λύση μου τώρα.
1 Zacharý 07/30/2017
Καλά καλή δουλειά! ( ⊥⍣¯1 πρέπει πραγματικά να είναι ενσωματωμένο). Και σας ευχαριστώ για την σωστή χρήση του ονόματος χρήστη μου.

ThePirateBay 07/29/2017.

JavaScript, 127 125 byte

a=>a[m='map'](_=>b[m]((n,i)=>n&&(b[i]--,d|=1<a[m](e=>d+=!!(2**c&e),d=0)&&d)).reverse() 

Δοκιμάστε το online

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1< μπορεί να γίνει 2**c&e

Dopapp 07/30/2017.

Python 2, 142 bytes

... και ακόμα γκολφ ... ελπίζω - Οποιαδήποτε βοήθεια εκτιμήθηκε!

 def c(l):b=[bin(n)[2:]for n in l];print[int(n,2)for n in map(''.join,zip(*map(sorted,zip(*['0'*(len(max(b,key=len))-len(x))+x for x in b]))))] 

Ένα μεγάλο κομμάτι αυτού είναι για την πλήρωση των αριθμών με μηδενικά.

Ευανάγνωστο:

 def collapse(nums):
    bins = [bin(n)[2:] for n in nums]
    bins = [('0'*(len(max(bins, key = len)) - len(x))) + x for x in bins]
    print [int(n, 2) for n in map(''.join, zip(*map(sorted, zip(*bins))))] 

Αυτό δημιουργεί μια σειρά από παραστάσεις δυαδικών συμβολοσειρών, το σμίγει, το περιστρέφει 90 ° δεξιόστροφα, ταξινομεί κάθε σειρά, περιστρέφει το πίσω 90 ° και στη συνέχεια δημιουργεί ακεραίους έξω από κάθε σειρά.

2 comments
Mr. Xcoder 07/30/2017
142 bytes , έχετε κάποια περιττή παρένθεση.
Dopapp 07/30/2017
@ Mr.Xcoder, ναι, αυτό ήταν ανόητο

Related questions

Hot questions

Language

Popular Tags