Séparer en nombre, joindre en chaîne, répéter


14

Considérez le processus de:

  1. Prenant un entier non négatif N.
    ex 27.

  2. Le diviser en entiers N - floor(N/2)et floor(N/2)(une moitié «plus grande» et «plus petite») et les écrire dans cet ordre. devient
    par exemple .2714 13

  3. Suppression de l'espace pour joindre les entiers en un nouvel entier beaucoup plus grand. devient
    par exemple .14 131413

  4. Répétez les étapes 2 et 3 un certain nombre de fois souhaité.
    par exemple 1413707 706707706353853 353853353853353853→ ...

Ce défi consiste à faire exactement cela, mais pas toujours en base 10.

Défi

Écrivez un programme qui comprend trois nombres, B, N et S:

  • B est un entier de 2 à 10 qui est la base de N (binaire à décimal).

  • N est l'entier non négatif auquel appliquer le processus de fractionnement-réassemblage. Pour faciliter la saisie par l'utilisateur, elle est donnée sous forme de chaîne dans la base B, et non sous forme d'entier.

  • S est un entier non négatif qui est le nombre de fois pour répéter le processus de fractionnement-réassemblage.

Le résultat du programme est la représentation sous forme de chaîne de N dans la base B après S procédures de jointure fractionnée.

Lorsque S est 0 , aucune division n'est effectuée, donc la sortie est toujours N.

Lorsque N est 0, toutes les divisions ont la forme 0 0et se réduisent à 0nouveau, donc la sortie est toujours 0.

Exemples

  • B = 10, N = 27, S = 11413
  • B = 10, N = 27, S = 2707706
  • B = 9, N = 27, S = 11413
  • B = 9, N = 27, S = 2652651
  • B = anything, N = anything, S = 0N
  • B = anything, N = 0, S = anything0

Tableau pour tous les B avec N = 1pour S = 0à 7:

B       S=0     S=1     S=2     S=3         S=4             S=5                 S=6                                 S=7
2       1       10      11      101         1110            111111              10000011111                         10000100001000001111
3       1       10      21      1110        202201          101101101100        1201201201212012012011              212100212102121002121212100212102121002120
4       1       10      22      1111        223222          111311111311        2232222232322322222322              11131111131311311111311113111113131131111131
5       1       10      32      1413        432431          213441213440        104220331443104220331442            2433241322130211014044424332413221302110140443
6       1       10      33      1514        535535          245550245545        122553122553122553122552            4125434125434125434125441254341254341254341254
7       1       10      43      2221        11111110        40404044040403      2020202202020220202022020201        10101011010101101010110101011010101101010110101011010100
8       1       10      44      2222        11111111        44444454444444      2222222622222222222226222222        11111113111111111111131111111111111311111111111113111111
9       1       10      54      2726        13581357        62851746285173      3142536758708231425367587081        15212633743485606571782880411521263374348560657178288040
10      1       10      55      2827        14141413        70707077070706      3535353853535335353538535353        17676769267676676767692676771767676926767667676769267676

Tableau pour tous les B avec N aléatoire pour S = 0à 3:

B       S=0     S=1         S=2                 S=3
2       11011   11101101    11101111110110      11101111110111110111111011
3       2210    11021101    20102012010200      1001212100121210012121001211
4       1113    230223      112112112111        2302302302323023023022
5       101     2323        11341134            31430423143042
6       120     4040        20202020            1010101010101010
7       134     5252        24612461            1230456412304564
8       22      1111        445444              222622222622
9       4       22          1111                505505
10      92      4646        23232323            1161616211616161

Détails

  • Prenez l'entrée via stdin ou la ligne de commande. Sortie vers sortie standard.
  • Au lieu d'un programme, vous pouvez écrire une fonction qui prend B, N et S et imprime le résultat normalement ou le renvoie (sous forme de chaîne).
  • B, N et S peuvent être pris dans n'importe quel ordre.
  • Toutes les entrées qui produisent des sorties dont les valeurs décimales sont inférieures à 2 32 devraient fonctionner.
  • N est représenté de la manière habituelle. c'est-à-dire le chiffre le plus significatif en premier et pas de zéros en tête sauf dans le zéro lui-même qui est écrit 0. (La sortie 00au lieu de 0n'est pas valide.)
  • Le code le plus court en octets gagne.

Ssi vous apprécierez mes défis, pensez à donner Building Block Bot Troupeaux! un peu d'amour :)


Je ne sais pas si un classement des réponses est vraiment nécessaire.
orlp

5
@orlp Probablement pas. Je vais le retirer et le remettre s'il y a un tas de réponses. Je voulais juste montrer mes manigances et les optimiseurs Stack Snippet .
Loisirs de Calvin

Réponses:


5

Pyth, 21 19 octets

vujksmjldQc2UiGQvwz

Prend la saisie dans le format N\nB\nS. Essayez-le en ligne: démonstration ou test harnais

Explication

                      implicit: z = 1st input (N)
                                Q = 2nd input evaluated (B)
 u              vwz   reduce z (evaluated 3rd input) times by:
             iGQ         convert string from base Q to base 10
            U            create a range [0, 1, ..., ^-1]
          c2             split into 2 lists (lengths are N-[N/2] and [N/2])
     m                   map each list d to:
       ld                   their length
      j  Q                  in base Q
    s                    join both lists
  jk                     join the numbers by ""
v                     convert string to int (getting rid of leading zeros)

5

Pyth, 29 21 octets

jku+j-JiGQK/J2QjKQvwz

Mise en œuvre vraiment simple.

Prend l'entrée sur stdin dans le format suivant:

N
B
S

Cela donne la mauvaise sortie 00pour N=0.
Jakube

5

Mathematica, 101 octets

Nest[a~Function~(b=FromDigits)[Through@((c=IntegerString)@*Ceiling<>c@*Floor)[a/2],#],#2~b~#,#3]~c~#&

Utilise une Throughastuce pour appliquer les fonctions de plafond et de plancher. Ignorez simplement les erreurs.


5

CJam, 24 octets

q~:B;{:~Bb_)\]2f/Bfbs}*i

Testez-le ici. Prend l'entrée comme "N" S B.

Explication

q~                       e# Read an eval input.
  :B;                    e# Store the base in B and discard it.
     {               }*  e# Repeat S times.
      :~                 e# Turn the string N into an array of digits.
        Bb               e# Interpret as base B.
          _)\            e# Duplicate and increment. Swap order.
             ]2f/        e# Wrap them in an array and (integer-)divide both by 2.
                 Bfb     e# Convert both to base B.
                    s    e# Flatten into a single string.
                       i e# Convert to an integer to fix the N = 0 case.

"0" 1 9sortie 00. J'ai essayé de le jouer au golf:, q~:B;{:~Bb,2/z:,Bfbs}*mais aussi invalide car il a produit une chaîne vide à la place.
jimmy23013

Un ià la fin s'occuperait de 00. Vous pouvez récupérer l'octet en remplaçant 2/:I-I]par )\]2f/.
Dennis

3

JavaScript ( ES6 ) 78 79

Fonction récursive. Exécutez l'extrait de code pour tester (Firefox uniquement)

Modifier 1 octet enregistré thx @DocMax

F=(b,n,s,S=x=>x.toString(b),m=parseInt(n,b))=>m*s?F(b,S(-~m>>1)+S(m>>1),s-1):n

// Ungolfed

U=(b,n,s)=>
{
  var S=x=>x.toString(b) // function to convert in base b
  var m=parseInt(n,b) // string in base b to integer
  if (m==0 || s==0)
    return n
  else  
    return F(b,S((m+1)>>1) + S( m>>1 ),s-1)
}

// Test
test=[
  {B: 10, N: '0', S:3, K: '0' }, {B: 10, N: '27', S: 1, K: '1413' }, {B: 10, N: '27', S: 2, K: '707706' }, {B: 9, N: '27', S: 1, K: '1413' }, {B: 9, N: '27', S: 2, K: '652651' }
];

test2=[[2, '11011', '11101101', '11101111110110', '11101111110111110111111011'],[3, '2210', '11021101', '20102012010200', '1001212100121210012121001211'],[4, '1113', '230223', '112112112111', '2302302302323023023022'],[5, '101', '2323', '11341134', '31430423143042' ]  ,[6, '120', '4040', '20202020', '1010101010101010'],[7, '134', '5252', '24612461', '1230456412304564'],[8, '22', '1111', '445444', '222622222622'],[9, '4', '22', '1111', '505505'],[10, '92', '4646', '23232323', '1161616211616161' ]
]
test2.forEach(r=>test.push(
  {B:r[0],N:r[1],S:1,K:r[2]}, {B:r[0],N:r[1],S:2,K:r[3]}, {B:r[0],N:r[1],S:3,K:r[4]}
))  

test.forEach(t => (
  r=F(t.B, t.N, t.S), 
  B.innerHTML += '<tr><th>'+(r==t.K?'Ok':'Failed')
      +'</th><td>'+t.B +'</td><td>'+t.N
      +'</td><td>'+t.S +'</td><td>'+r +'</td><td>'+t.K +'</td></tr>'
))
th,td { font-size: 12px; padding: 4px; font-family: helvetica }
<table><thead><tr>
  <th>Test<th>B<th>N<th>S<th>Result<th>Check
  </tr></thead>
  <tbody id=B></tbody>
</table>


J'aime vraiment à quel point vos preuves de succès sont élaborées. Vous pouvez également enregistrer 1 en remplaçant m&&spar m*s.
DocMax

1
@DocMax c'est un test unitaire réel et utile. Il est trop facile de tout casser en jouant au golf.
edc65

1

ECMAScript 6, 90 octets

var f=(B,N,S)=>((n,s)=>S?f(B,s(n+1>>1)+s(n>>1),S-1):s(n))(parseInt(N,B),x=>x.toString(B))

Définir une fonction récursive à l'aide d'une variable n'est pas vraiment un bon style, mais c'est le code le plus court que j'ai pu trouver dans ECMAScript 6.

Obtenir le "00" => "0"bon cas de coin gaspille trois octets ( s(n)au lieu de simplementN ).

Pour l' essayer, vous pouvez utiliser la REPL de Babel : copier / coller l'exemple de code et d' imprimer les résultats d'invocation comme ceci: console.log(f(9, "27", 2)).


1

Lisp commun - 113 caractères

(lambda(b n s)(dotimes(i s)(setf n(format ()"~vR~vR"b (- #1=(parse-integer n :radix b)#2=(floor #1# 2))b #2#)))n)

Non golfé

(lambda(b n s)
  (dotimes(i s)
    (setf n (format () "~vR~vR" b (- #1=(parse-integer n :radix b)
                                     #2=(floor #1# 2))
                                b #2#)))
  n)
  • La ~vRdirective format renvoie un entier dans la base v, où vest fourni comme argument pourformat .
  • parse-integeraccepte un :radixargument pour convertir à partir d'une base spécifiée.
  • #1=et #1#(respectivement assigner et utiliser) sont des variables de lecture qui permettent de partager des sous-expressions communes. Une fois développés, ils donnent le code suivant:

    (lambda (b n s)
      (dotimes (i s)
        (setf n
                (format nil "~vr~vr" b
                        (- (parse-integer n :radix b)
                           (floor (parse-integer n :radix b) 2))
                        b (floor (parse-integer n :radix b) 2))))
      n)

0

Pip , 27 octets

Lcb:+J[(bFB:a)%2i]+b//2TBab

Prend la base, l'entier et le nombre de répétitions comme arguments de ligne de commande. L'algorithme est simple, mais utilise quelques fonctionnalités de langage intéressantes:

                             a, b, c initialized from cmdline args, and i = 0 (implicit)
Lc                           Do c times:
        bFB:a                Convert b from base a to decimal and assign back to b
      [(     )%2i]           Construct a list containing b%2 and 0 (using i to avoid
                               scanning difficulties)
                  +b//2      Add floor(b/2) to both elements of list; the list now contains
                               b-b//2 and b//2
                       TBa   Convert elements of list back to base a
     J                       Join list
    +                        Coerce to number (necessary to turn 00 into plain 0)
  b:                         Assign back to b
                          b  Print b at the end

Le type scalaire de Pip, qui représente à la fois des nombres et des chaînes, est pratique ici, tout comme les opérations par élément sur les listes; malheureusement, les parenthèses et les opérateurs à deux caractèresFB , TBet// annuler tout avantage.

Solution alternative, sans affectation intermédiaire mais toujours 27 octets:

Lcb:+J[bFBa%2i]+bFBa//2TBab

0

C, 245 octets

int b,z,n,f,r;c(char*t,n){return n?((z=c(t,n/b)),z+sprintf(t+z,"%d",n%b)):0;}main(){char t[99],*p;gets(t);b=atoi(t);f=n=strtol(p=strchr(t,32)+1,0,b);if(!(r=atoi(strchr(p,32)+1)))f=0;while(r--)n=strtol(t+c(t+c(t,n-n/2),n/2)*0,0,b);puts(f?t:"0");}

Cela ne va rien gagner , mais c'était amusant à faire!


0

PHP ,115 112 octets

function($b,$n,$s){while($s--)$n=($c=base_convert)(ceil($n=$c($n,$b,10)/2),10,$b).$c(floor($n),10,$b);return$n;}

Essayez-le en ligne!

Non golfé:

function split_join_repeat( $b, $n, $s ) {
    // repeat S times
    for( $x=0; $x < $s; $x++ ) {
        // convert N from base B to base 10 for arithmetic
        $n = base_convert( $n, $b, 10 );
        // divide and split in base 10, convert back to base B and join
        $n = base_convert( ceil( $n / 2 ), 10, $b ) .
            base_convert( floor( $n / 2 ), 10, $b );
    }
    return $n;
}

Production

B = 10, N = 27, S = 1   1413
B = 10, N = 27, S = 2   707706
B = 9, N = 27, S = 1    1413
B = 9, N = 27, S = 2    652651

2   1   10  11  101 1110    111111  10000011111 10000100001000001111    
3   1   10  21  1110    202201  101101101100    1201201201212012012011  212100212102121002121212100212102121002120  
4   1   10  22  1111    223222  111311111311    2232222232322322222322  11131111131311311111311113111113131131111131    
5   1   10  32  1413    432431  213441213440    104220331443104220331442    12141204110401030043301214120411040103004330    
6   1   10  33  1514    535535  245550245545    122553122553122553122552    131022143412311313533131022143412311313533  
7   1   10  43  2221    11111110    40404044040403  2020202202020220202022020201    40556522600645213204055652260064521320  
8   1   10  44  2222    11111111    44444454444444  2222222622222222222226222222    76650460747555347665046074755534    
9   1   10  54  2726    13581357    62851746285173  3142536758708231425367587081    4861155667688600048611556676886000  
10  1   10  55  2827    14141413    70707077070706  3535353853535335353538535353    17676769267677271767676926767727

0

Japt , 17 octets

_nW o ó ®ÊsWÃq}gV

Essayez-le en ligne!

Prend les entrées dans l'ordre S, N, B avec N comme liste singleton . Accepter N sans liste unique coûte 2 octets .

Explication:

_             }g     #Get the Sth item generated by this function...
                V    #...Starting with N as the 0th item:
 nW                  # Evaluate the previous item as a base B number
    o                # Create a list with that length
      ó              # Divide it into two lists as evenly as possible
        ®   Ã        # For each of those lists:
         Ê           #  Get the length
          sW         #  Convert it to base B
             q       # Join the two strings together

0

Forth (gforth) , 105 octets

: f base ! 0 ?do 0. 2swap >number nip 2drop 2 /mod >r i + r> 0 tuck <# #s 2drop #s #> loop type decimal ;

Essayez-le en ligne!

Explication

Change la base en B, puis en boucle qui s'exécute S fois:

  • Convertit une chaîne en nombre
  • Divise le nombre en 2 moitiés (une plus grande que l'autre si elle est impaire)
  • Regroupe les deux nombres dans une chaîne

Imprime la chaîne une fois terminé et remet la base à 10 (afin que nous puissions exécuter plusieurs fois de suite)

Explication du code

:f                    \ start a new word definition
  base !              \ set the base to B
  0 ?do               \ loop from 0 to S-1 (runs S times)
    0. 2swap          \ places a double-length 0 on the stack behind the string
    >number           \ converts the string to a number in the current base
    nip 2drop         \ get rid of string remainder and second part of double
    2 /mod            \ get the quotient and remainder of dividing by 2
    >r                \ throw the quotient on the return stack
    i                 \ get a copy of the quotient from the return stack
    +                 \ add quotient and remainder
    r>                \ move quotient from return stack to stack
    0 tuck            \ convert both to double-length numbers
    <#                \ start a pictured numeric output
      #s              \ add entire number to output
      2drop           \ drop empty number
      #s              \ add second number to output
    #>                \ convert output to a string and drop number from stack
  loop                \ end loop
  type                \ print output string
  decimal             \ set base back to 10
;                     \ end word definition
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.