折叠数组矩阵【难度:2级】:
答案1:
using System. Linq;
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
int length = array. Length/ 2 ;
var folded = array. Take ( length) . Zip ( array. Reverse ( ) . Take ( length) , ( a, b) = > a + b) ;
if ( array. Length% 2 == 1 )
{
folded = folded. Concat ( new int [ ] { array[ length] } ) ;
}
runs-- ;
return runs == 0 ? folded. ToArray ( ) : FoldArray ( folded. ToArray ( ) , runs) ;
}
}
答案2:
using System. Linq;
using System. Collections. Generic;
using System;
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
int half = ( int ) Math. Ceiling ( ( double ) array. Count ( ) / 2 ) ;
var firstHalf = array. Take ( half) . ToArray ( ) ;
var secondHalf = array. Skip ( half) . Take ( half) . Reverse ( ) . ToArray ( ) ;
for ( int i = 0 ; i < secondHalf. Count ( ) ; i++ ) {
firstHalf[ i] + = secondHalf[ i] ;
}
if ( runs > 1 )
return FoldArray ( firstHalf, runs- 1 ) ;
else
return firstHalf;
}
}
答案3:
using System;
using System. Collections. Generic;
using System. Linq;
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
List< int > arr = array. ToList ( ) ;
for ( int c = 0 ; c < runs; c++ )
{
int cou = arr. Count;
for ( int i = 0 ; i < ( cou / 2 ) ; i++ )
{
arr[ i] = arr[ i] + arr[ cou - i - 1 ] ;
arr. RemoveAt ( cou - i - 1 ) ;
}
}
return arr. ToArray ( ) ;
}
}
答案4:
using System;
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
var length = ( int ) Math. Ceiling ( array. Length/ 2.0 ) ;
var foldedArray = new int [ length] ;
for ( int i= 0 ; i< length; i++ )
{
if ( i != array. Length - 1 - i)
{
foldedArray[ i] = array[ i] + array[ array. Length - 1 - i] ;
}
else
{
foldedArray[ i] = array[ i] ;
}
}
if ( runs == 1 )
{
return foldedArray;
}
return FoldArray ( foldedArray, runs - 1 ) ;
}
}
答案5:
using System. Linq;
public class Kata {
public static int [ ] FoldArray ( int [ ] a, int runs)
= > runs == 0 ? a :
FoldArray ( Enumerable. Range ( 0 , ( int ) ( a. Length/ 2 ) )
. Select ( i= > a[ i] + a[ a. Length- i- 1 ] )
. ToList ( )
. Concat ( ( a. Length & amp; 1 ) == 1 ? new int [ ] { a[ ( a. Length- 1 ) / 2 ] } : new int [ 0 ] { } )
. ToArray ( )
, runs- 1 ) ;
}
答案6:
using System;
using System. Collections. Generic;
using System. Linq;
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
List< int > arr = array. ToList ( ) ;
while ( runs != 0 )
{
int len = arr. Count ( ) ;
bool check = len % 2 == 0 ? true : false ;
List< int > temp = new List < int > ( ) ;
if ( check)
{
int i = 0 ;
int j = arr. Count ( ) - 1 ;
for ( int k = 0 ; k < len / 2 ; ++ k)
{
temp. Add ( arr[ i++ ] + arr[ j-- ] ) ;
}
}
else
{
int i = 0 ;
int j = arr. Count ( ) - 1 ;
for ( int k = 0 ; k < len / 2 ; ++ k)
{
temp. Add ( arr[ i++ ] + arr[ j-- ] ) ;
}
temp. Add ( arr[ len / 2 ] ) ;
}
arr. Clear ( ) ;
arr = temp;
runs-- ;
}
int [ ] _arr = arr. ToArray ( ) ;
return _arr;
}
}
答案7:
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
for ( int i= 0 ; i< runs; i++ ) {
int x, l= array. Length;
int [ ] r= new int [ ( l> > 1 ) + ( l& amp; 1 ) ] ;
for ( x= 0 ; x< l> > 1 ; x++ ) r[ x] = array[ x] + array[ l- 1 - x] ;
if ( ( l& amp; 1 ) == 1 ) r[ x] = array[ x] ;
array= r;
}
return array;
}
}
答案8:
using System. Linq;
public class Kata
{
public static int [ ] FoldArray ( int [ ] array, int runs)
{
return -- runs == 0 ? array. Length % 2 == 1 ? array. Take ( array. Length / 2 ) . Zip ( array. Reverse ( ) . Take ( array. Length / 2 ) , ( a, b) = > a + b) . Concat ( new int [ ] { array[ array. Length / 2 ] } ) . ToArray ( ) : array. Take ( array. Length / 2 ) . Zip ( array. Reverse ( ) . Take ( array. Length / 2 ) , ( a, b) = > a + b) . ToArray ( ) : FoldArray ( array. Length % 2 == 1 ? array. Take ( array. Length / 2 ) . Zip ( array. Reverse ( ) . Take ( array. Length / 2 ) , ( a, b) = > a + b) . Concat ( new int [ ] { array[ array. Length / 2 ] } ) . ToArray ( ) : array. Take ( array. Length / 2 ) . Zip ( array. Reverse ( ) . Take ( array. Length / 2 ) , ( a, b) = > a + b) . ToArray ( ) , runs) ;
}
}
答案9:
using System;
using System. Linq;
public class Kata
{
public static int [ ] FoldArray ( int [ ] a, int runs)
{
if ( runs == 0 ) return a;
int l = a. Length / 2 + a. Length % 2 ;
var fold = a
. Take ( l)
. Select ( ( n, i) = > {
int f = a. Length - i - 1 ;
if ( i == f) return n;
return n + a[ f] ;
} ) ;
return FoldArray ( fold. ToArray ( ) , runs - 1 ) ;
}
}
答案10:
using System. Collections. Generic;
public class Kata {
public static int [ ] FoldArray ( int [ ] array, int runs) {
if ( runs == 0 ) {
return array;
}
List< int > newArray = new List < int > ( ) ;
for ( int i = 0 ; i < ( array. Length / 2 ) ; i++ ) {
newArray. Add ( array[ i] + array[ array. Length - 1 - i] ) ;
}
if ( array. Length % 2 != 0 )
newArray. Add ( array[ ( array. Length / 2 ) ] ) ;
return Kata. FoldArray ( newArray. ToArray ( ) , runs - 1 ) ;
}
}