Als Zahl teilen, als Zeichenfolge verbinden, wiederholen


14

Betrachten Sie den Prozess von:

  1. Nehmen Sie eine nicht negative ganze Zahl N.
    z 27.

  2. Teilen Sie es in ganze Zahlen N - floor(N/2)und floor(N/2)(eine "größere" und "kleinere" Hälfte) und schreiben Sie sie in dieser Reihenfolge.
    zB 27wird 14 13.

  3. Entfernen Sie das Leerzeichen, um die Ganzzahlen zu einer neuen, viel größeren Ganzzahl zusammenzufügen.
    zB 14 13wird 1413.

  4. Wiederholen Sie die Schritte 2 und 3 einige Male.
    zB 1413707 706707706353853 353853353853353853→ ...

Bei dieser Herausforderung geht es darum, genau das zu tun, aber nicht immer in der Basis 10.

Herausforderung

Schreiben Sie ein Programm, das drei Zahlen B, N und S enthält:

  • B ist eine ganze Zahl von 2 bis 10, die die Basis von N ist (binär bis dezimal).

  • N ist die nicht negative ganze Zahl, auf die der Aufteilungs- und Wiedervereinigungsprozess angewendet werden soll. Zur Vereinfachung der Benutzereingabe wird diese als Zeichenfolge in Basis B und nicht als Ganzzahl angegeben.

  • S ist eine nicht negative ganze Zahl, die die Häufigkeit angibt, mit der der Vorgang des erneuten Aufteilens wiederholt wird.

Die Ausgabe des Programms ist die Zeichenfolgendarstellung von N in Basis B nach S Split-Join-Prozeduren.

Wenn S ist 0, werden keine Teilungen durchgeführt, daher ist die Ausgabe immer N.

Wenn N ist 0, haben alle Teilungen die Form 0 0und werden wieder auf reduziert 0, sodass die Ausgabe immer erfolgt 0.

Beispiele

  • 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

Tabelle für alle B mit N = 1für S = 0bis 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

Tabelle für alle B mit zufälligem N für S = 0bis 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

Einzelheiten

  • Eingabe über stdin oder die Kommandozeile. Ausgabe auf Standardausgabe.
  • Anstelle eines Programms können Sie eine Funktion schreiben, die B, N und S verwendet und das Ergebnis normal ausgibt oder es (als Zeichenfolge) zurückgibt.
  • B, N und S können in beliebiger Reihenfolge genommen werden.
  • Alle Eingänge, die Ausgänge erzeugen, deren Dezimalwerte unter 2 32 liegen, sollten funktionieren.
  • N wird wie gewohnt dargestellt. dh höchstwertige Ziffer zuerst und keine führenden Nullen außer in der Null selbst, die geschrieben wird 0. (Ausgabe 00statt 0ist ungültig.)
  • Der kürzeste Code in Bytes gewinnt.

Wenn Ihnen meine Herausforderungen gefallen, sollten Sie erwägen, Block Building Bot Flocks zu geben! etwas Liebe :)


Ich weiß nicht, ob eine Rangliste für Antworten wirklich notwendig ist.
25.

5
@orlp Wahrscheinlich nicht. Ich werde es entfernen und zurückstellen, wenn es ein paar Antworten gibt. Ich wollte nur meine und Optimizers Stack Snippet- Spielereien zur Schau stellen .
Calvins Hobbys

Antworten:


5

Pyth, 21 bis 19 Bytes

vujksmjldQc2UiGQvwz

Übernimmt Eingaben im Format N\nB\nS. Probieren Sie es online aus: Vorführ- oder Testgeschirr

Erläuterung

                      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 Bytes

jku+j-JiGQK/J2QjKQvwz

Wirklich unkomplizierte Umsetzung.

Übernimmt die Eingabe von stdin im folgenden Format:

N
B
S

Dies gibt die falsche Ausgabe 00für N=0.
Jakube

5

Mathematica, 101 Bytes

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

Verwendet einige ThroughTricks, um sowohl die Decken- als auch die Bodenfunktionen anzuwenden. Ignoriere einfach die Fehler.


5

CJam, 24 Bytes

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

Teste es hier. Übernimmt die Eingabe als "N" S B.

Erläuterung

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 9ausgegeben 00. Ich habe versucht, Golf zu spielen:, q~:B;{:~Bb,2/z:,Bfbs}*aber auch ungültig, weil stattdessen ein leerer String ausgegeben wurde.
Jimmy23013

Und iam Ende würde sich darum kümmern 00. Sie können die Byte zurück durch den Ersatz 2/:I-I]mit )\]2f/.
Dennis

3

JavaScript ( ES6 ) 78 79

Rekursive Funktion. Führen Sie das Snippet zum Testen aus (nur Firefox)

Bearbeite 1 Byte gespeichert dank @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>


Ich finde es wirklich toll, wie ausführlich Ihre Erfolgsnachweise sind. Außerdem können Sie 1 durch Ersetzen sparen m&&smit m*s.
DocMax

1
@ DocMax ist ein echter und nützlicher Unit-Test. Es ist zu einfach, beim Golfen alles zu zerbrechen.
edc65

1

ECMAScript 6, 90 Bytes

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

Das Definieren einer rekursiven Funktion mithilfe einer Variablen ist kein guter Stil, aber der kürzeste Code, den ich in ECMAScript 6 finden konnte.

Wenn der Eckfall "00" => "0"richtig ist, werden drei Bytes verschwendet ( s(n)anstatt einfach N).

Probieren Sie es aus, können Sie Babels REPL : copy / paste den Code und Druck Beispiel Aufruf Ergebnisse wie folgt: console.log(f(9, "27", 2)).


1

Common Lisp - 113 Zeichen

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

Ungolfed

(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)
  • Die ~vRFormat-Direktive gibt eine Ganzzahl in base aus v, wobei vals Argument für angegeben wird format.
  • parse-integerakzeptiert ein :radixArgument für die Konvertierung von einer angegebenen Basis.
  • #1=und #1#(bzw. zuweisen und verwenden) sind Leservariablen, mit denen gemeinsame Unterausdrücke verwendet werden können. Wenn sie erweitert werden, geben sie den folgenden Code an:

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

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

Nimmt Basis, Ganzzahl und Anzahl der Wiederholungen als Befehlszeilenargumente. Der Algorithmus ist unkompliziert, verwendet jedoch einige interessante Sprachfunktionen:

                             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

Der skalare Typ von Pip, der sowohl Zahlen als auch Zeichenfolgen darstellt, ist hier nützlich, ebenso wie die elementweisen Operationen auf Listen. Leider Klammern und die zweistelligen OperatorenFB , TBund //negieren ein Vorteil.

Alternative Lösung, ohne die Zwischenzuweisung, aber immer noch 27 Bytes:

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

0

C 245 Bytes

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

Das wird nicht gewinnen nichts , aber es war lustig zu machen!


0

PHP ,115 112 Bytes

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;}

Probieren Sie es online!

Ungolfed:

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;
}

Ausgabe

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 Bytes

_nW o ó ®ÊsWÃq}gV

Probieren Sie es online!

Nimmt Eingaben in der Reihenfolge S, N, B mit N als Singleton-Liste an . Das Akzeptieren von N ohne Singleton-Liste kostet 2 Byte .

Erläuterung:

_             }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

Viertens (gviertens) , 105 Bytes

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

Probieren Sie es online!

Erläuterung

Ändert die Basis in B und dann in einer Schleife, die S-mal ausgeführt wird:

  • Wandelt einen String in eine Zahl um
  • Teilt die Zahl in zwei Hälften (eine größer als die andere, wenn ungerade)
  • Kombiniert die beiden Zahlen wieder zu einer Zeichenfolge

Gibt die Zeichenkette aus, wenn sie fertig ist, und setzt die Basis auf 10 zurück (damit wir sie mehrmals hintereinander ausführen können)

Code-Erklärung

: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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.