Beni ikiye böl


15

Bir numara verilecektir xnerede 0 <= x <= 2^32 - 1.

İkili biçimde özyinelemeli bölünmeden sonra, sayıların bir listesini ondalık olarak vermelisiniz.

Örnekler:

Örnek 1:

255 -> 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1

Geçerli liste sadece 255.

İkili gösterimi 255olduğunu 1111 1111. Bölme o biz almak 1111ve 1111ondalık olan, 15ve 15.

Bunları listeye ekliyoruz, öyle olacak 255 15 15.

Şimdi sayılar 15ve 15girişler olarak işlev görecek ve bu sayılar bölünecektir.

Yine aynı şeyi biz (get 3 3hem 15s): 255 15 15 3 3 3 3.

Mantık devam ederken, son liste olacak 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1. Ve 1artık bölünemediğinden çıktı durur.

Örnek 2:

225 -> 225 14 1 3 2 1 1 1 0

Başlangıç ​​listesi 225.

İkili gösterimi 225olduğunu 1110 0001. Bölme o biz almak 1110ve 0001ondalık olan, 14ve 1.

Bunları listeye ekledik 225 14 1.

Şimdi sayılar 14ve 1girişler olarak işlev görecek ve bu sayılar bölünecektir.

Yana 1hiçbir ayrılabilir, çıkış olacaktır 225 14 1 3 2.

Örnek 3:

32 -> 32 4 0 1 0

Koşullar :

  1. İkili basamak sayısı tekse, ilk sayının diğerinden bir tane daha az ikili basamağı olacaktır. Örnek, 20 (10100)olarak bölünmüş olacak 10ve 100ondalık çıkış olmak üzere 2ve 4.
  2. Standart boşluklar geçerlidir.
  3. 0s ve 1s daha fazla yayılmaz.
  4. Program çok fazla sayı görüntülemeye çalıştığından çökmesi geçerli bir çıkış koşulu.

Sadece bir öneri ama 0uzunluk garip olduğunda ikili rakamları s ile doldurmaya ne dersiniz ?
coinheringaahing Caird

1
@ Satan'sSon Önde takılırsanız, açıklama ile eşdeğerdir.
isaacg

1
Belirtilen çıktı sırası gerekli mi yoksa sadece değerler mi?
Jonathan Allan

@ Satan'sSon 0s ile dolgu yok .
ctrl-shift-esc

1
@JonathanAllan Belirtilen çıkış sırası gerekli.
ctrl-shift-esc

Yanıtlar:


13

Pyth, 18 bayt

u+QiR2smc2+0dt#.BM

Test odası

Bu kod u, Pyth'in sabit nokta operatörü ile çok zor ve zekice bir şey yapar .

Fonksiyonun gövdesi, yani her şeyden başka u, oldukça basittir:

+QiR2smc2+0dt#.BM
+QiR2smc2+0dt#.BMG    Implicit variable
                      G will store the list of numbers from the previous iteration.
              .BMG    Map each number to its binary representation
            t#        Filter out the ones of length 1 (0 and 1)
      m               Map the remaining binary
         +0d          Prefix with a 0
       c2             Chop in half.
                      Since c puts the larger half first, prefixing with a 0
                      makes the chop work out right, and doesn't change the value.
     s                Concatenate
  iR2                 Map back to binary
+Q                    Add the input to the front of the list

Bu kod 0'ları ve 1'leri kaldırır, her sayıyı böler ve girişi öne ekler.

u sonuç değişmeyi durdurana kadar bu işlevi işlevin önceki sonucunda çalıştıracaktır.

Hangi başlangıç ​​değeri ukullanılır? Bu akıllıca bir bölümdür: kod hangi değerin kullanılacağını belirtmez, bu nedenle varsayılan olarak girdidir. Ancak girdi bir sayı listesi değil, bir sayıdır. Pyth, döngü süresi boyunca ilk sayı olan sayının aralığına kadar olan sayıyı zorla zorlar [0, 1, ..., Q-1]. Almak istediğimiz çıktıya benzemiyor. Neyse ki, uilk girişin ne olduğuna bakılmaksızın doğru sonucu bulacak - istenen çıktı işlevin tek sabit noktasıdır ve tekrarlanan uygulama her zaman ona ulaşacaktır.

Girdi ile programın ara değerlerine bakalım 7. İlk girişten bağımsız olarak, doğru olması garanti edilen sonucun önekini vurguladım:

  1. 7(Örtük olarak [0, 1, 2, 3, 4, 5, 6])

  2. [7,1, 0, 1, 1, 1, 0, 1, 1, 1, 2]

  3. [7, 1, 3,1, 0]

  4. [7, 1, 3, 1, 1]

Hangi çıktı.


Paketlenmiş Pyth, 16 bayt

Pyth yalnızca 0-127 ASCII aralığını kullandığından, 8 bit kodlama yerine 7 bit kodlama kullanılarak sıkıştırılabileceğini unutmayın. Böylece, yukarıdaki program 16 bayt içine paketlenebilir. Ortaya çıkan program:

ꮎ�L����[
    ���4

HexDump:

0000000: eaae 8e9a 4cb9 edc6 c95b 0c9d 11ae 8534  ....L....[.....4

Tercüman burada bulunur . Girişi komut satırı bağımsız değişkeni olarak sağlayın.

Bu dilin kod sayfası (Paketlenmiş Pyth), ASCII'nin 0-127 aralığıdır ve her karakter, sonunda dolgulu 7 bit ile temsil edilir. Böylece, yukarıdaki okunamayan hexdump şunları temsil eder:

u+QiR2smc2+0dt#.BM

Ama 16 bayt.


6

05AB1E , 21 20 18 17 bayt

,¸[Žrbvy0ì2äCʒ=1›

Çevrimiçi deneyin!

açıklama

,¸[Žrbvy0ì2äCʒ=1›   Argument n
,¸                  Print n and push n as array
  [Ž                Loop until stack is empty
    r               Reverse stack
     b              Convert elements in array to binary
      v             For each y in array
       y0ì2ä        Prepend '0' to y and split it into 2 elements
                    (the first element will take the additional character)
            C       Convert elements to decimal
             ʒ=1›   Keep only elements greater than 1, while printing each element

@JonathanAllan Yep şimdi düzeltti. Örneklerin kapsamadığı bir sorun gibi görünüyor, teşekkürler :)
kalsowerus 19:17

ʒ- Bu yeni kod sayfası ... 05AB1E Jelly ne zamandan beri? Beni severim.
Sihirli Ahtapot Urn

4

JavaScript (ES6), 99 bayt

Bu biraz uzun görünüyor. Doğru siparişi almanın daha iyi bir yolu olabilir.

f=(n,p=(a=[],1),i=33-Math.clz32(n)>>1)=>(a[p]=n)>1?f(n>>i,p*=2)&&f(n&(1<<i)-1,p+1):a.filter(n=>1/n)

gösteri


4

Jöle , 21 20 bayt

Bir monadik zinciri çıkararak ve sonra boş bir listenin daha sonra 0 veren ikili veriden dönüştürülmesinin sonucu ile -1 bayt.

ỊÐḟBUœs€2UḄF
WÇÐĿṖUF

Numarayı alan ve belirtilen listeyi döndüren monadik bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

ỊÐḟBUœs€2UḄF - Link 1, perform an iteration: list of numbers
 Ðḟ          - filter out if:
Ị            -   insignificant (absolute value <= 1 - hence any 0s or 1s)
   B         - convert to a binary list (vectorises)
    U        - upend (reverse each)
     œs€2    - split €ach into 2 equal chunks (the first half is longer if odd ...hence
         U   - upend (reverse each)         ...this upend and the previous one)
          Ḅ  - convert from binary list to number (vectorises, although when the filter
             -                                     removes everything a zero is yielded)
           F - flatten the resulting list of lists to a single list

WÇÐĿṖUF - Main link: number
W       - wrap in a list
  ÐĿ    - loop and collect results until no change occurs:
 Ç      -   call last link (1) as a monad
    Ṗ   - pop (remove the last element - a list containing a single zero which results
        -     from the effect of Ḅ when link 1's input only contained ones and zeros)
     U  - upend (put the iterations into the required order)
      F - flatten to yield a single list

Bu nasıl çalışıyor?
coinheringaahing Caird

@ Satan'sSon Şimdi bir açıklama ekledim
Jonathan Allan

Ben aynı zamanda ekledim ben yorumladı: D
caird coinheringaahing

@ ØrjanJohansen her iki yol da aynı bayt maliyetine sahiptir
Jonathan Allan

Oh, ilk önce bu hileyi kullanan Pyth cevabını görmedim.
Ørjan Johansen

2

Java 7, 541 bayt

import java.util.*;List l=new ArrayList(),L=new ArrayList();String c(int n){l.add(x(n));return a(n+" ",l,n);}String a(String r,List q,Integer n){boolean e=q.equals(l),E=q.equals(L);if(e)L.clear();else l.clear();for(String i:new ArrayList<String>(q)){int s=i.length()/2,a=n.parseInt(i.substring(0,s),2),z=n.parseInt(i.substring(s),2);r+=a+" "+z+" ";if(e&a>1)L.add(x(a));if(e&z>1)L.add(x(z));if(E&a>1)l.add(x(a));if(E&z>1)l.add(x(z));}if(e&L.size()>0)r=a(r,L,n);if(E&l.size()>0)r=a(r,l,n);return r;}String x(Integer n){return n.toString(n,2);}

Orijinal siparişi tutmak beni büyük zamana mahvetti, aksi takdirde kolay bir döngü ve özyinelemeli çağrı prensibi olurdu. Yine de, düzeni korurken anlamaya eğlenceli bir meydan okuma.

Açıklama:

import java.util.*;                    // Required import for List and Array List

List l=new ArrayList(),L=new ArrayList(); 
                                       // Two Lists on class-level

String c(int n){                       // Method (1) with integer parameter and String return-type
  l.add(x(n));                         //  Start by adding the binary-String of the input integer to list `l`
  return a(n+" ",l,n);                 //  And let the magic begin in method `a` (2)
}                                      // End of method (1)

String a(String r,List q,Integer n){   // Method (2) with a bunch of parameters and String return-type
  boolean e=q.equals(l),E=q.equals(L); //  Determine which of the two class-level Lists the parameter-List is
  if(e)                                //  If it's `l`:
    L.clear();                         //   Empty `L`
  else                                 //  If it's `L` instead:
    l.clear();                         //   Empty `l`
  for(String i:new ArrayList<String>(q)){
                                       //  Loop over the input list (as new ArrayList to remove the reference)
    int s=i.length()/2,                //   Get the length of the current item in the list divided by 2
                                       //   NOTE: Java automatically floors on integer division,
                                       //   which is exactly what we want for the splitting of odd-length binary-Strings
    a=n.parseInt(i.substring(0,s),2),  //   Split the current binary-String item in halve, and convert the first halve to an integer
    z=n.parseInt(i.substring(s),2);    //   And do the same for the second halve
    r+=a+" "+z+" ";                    //   Append the result-String with these two integers
    if(e&a>1)                          //   If the parameter List is `l` and the first halve integer is not 0:
      L.add(x(a));                     //    Add this integer as binary-String to list `L`
    if(e&z>1)                          //   If the parameter List is `l` and the second halve integer is not 0:
      L.add(x(z));                     //    Add this integer as binary-String to List `L`
    if(E&a>1)                          //   If the parameter List is `L` and the first halve integer is not 0:
      l.add(x(a));                     //    Add this integer as binary-String to List `l`
    if(E&z>1)                          //   If the parameter List is `L` and the second halve integer is not 0:
      l.add(x(z));                     //    Add this integer as binary-String to List `l`
  }                                    //  End of loop
  if(e&L.size()>0)                     //  If the parameter List is `l` and List `L` now contains any items:
    r=a(r,L,n);                        //   Recursive call with List `L` as parameter
  if(E&l.size()>0)                     //  If the parameter List is `L` and List `l` now contains any items:
    r=a(r,l,n);                        //   Recursive call with List `l` as parameter
  return r;                            //  Return the result-String with the now appended numbers
}                                      // End of method (2)

String x(Integer n){                   // Method (3) with Integer parameter and String return-type
  return n.toString(n,2);              //  Convert the integer to its Binary-String
}                                      // End of method (3)

Test kodu:

Burada deneyin.

import java.util.*;
class M{
  List l=new ArrayList(),L=new ArrayList();String c(int n){l.add(x(n));return a(n+" ",l,n);}String a(String r,List q,Integer n){boolean e=q.equals(l),E=q.equals(L);if(e)L.clear();else l.clear();for(String i:new ArrayList<String>(q)){int s=i.length()/2,a=n.parseInt(i.substring(0,s),2),z=n.parseInt(i.substring(s),2);r+=a+" "+z+" ";if(e&a>1)L.add(x(a));if(e&z>1)L.add(x(z));if(E&a>1)l.add(x(a));if(E&z>1)l.add(x(z));}if(e&L.size()>0)r=a(r,L,n);if(E&l.size()>0)r=a(r,l,n);return r;}String x(Integer n){return n.toString(n,2);}

  public static void main(String[] a){
    M m=new M();
    System.out.println(m.c(255));
    m.l.clear();
    m.L.clear();
    System.out.println(m.c(225));
    m.l.clear();
    m.L.clear();
    System.out.println(m.c(32));
  }
}

Çıktı:

255 15 15 3 3 3 3 1 1 1 1 1 1 1 1 
225 14 1 3 2 1 1 1 0 
32 4 0 1 0 


2

Retina , 142 bayt

.+
$*
+`(1+)\1
${1}0
01
1
{`.+$
$&¶<$&>
+`;(\d*)>
>;<$1>
<.>

{`(\d)>
>$1
}`<(\d)
$1<
<>
;
\b0+\B

}`^;|;\B

¶
;
;;

1
01
+`10
011
0\B

1+
$.&

Çevrimiçi deneyin!


2

PHP, 132 Bayt

for($r=[$argn];""<$n=$r[+$i++];)$n<2?:[$r[]=bindec(substr($d=decbin($n),0,$p=strlen($d)/2)),$r[]=bindec(substr($d,$p))];print_r($r);

Çevrimiçi deneyin!


Bu sayfadaki Try it online sistemine göre, bu işe yaramaz,
Martin Barker

@MartinBarker ne demek istiyorsun?
Jörg Hülsermann

tio.run/nexus/… => Array( [0] => 225 [1] => 14 [2] => 1 [3] => 3 [4] => 2 [5] => 1 [6] => 1 [7] => 1 [8] => 0 )olmadığında = 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1
Martin Barker

@MartinBarker Sürüm başlığındaki girdiyi değiştirmeniz gerekir. Değişkeni değiştirme $argnBu değişken, PHP'yi komut satırından -Rseçeneğiyle çalıştırıyorsanız kullanılabilir . 255 girdisi için bir örnek İşte çevrimiçi deneyin!
Jörg Hülsermann

Ben online sistem denemek göre işe yaramadı söylemeye çalıştım budur. (yazı ile bağlantılı)
Martin Barker


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.