æååã«ã€ããŠããŸãã¯.Net / CïŒã§æååãå転ããããšã«ã€ããŠè©±ããŸãããã ããŸããŸæšæºã©ã€ãã©ãªã§ã¯ã察å¿ããé¢æ°ã芳å¯ãããŠããŸããã ãããŠã圌ããç§ã«èšã£ãããã«ãè¡å転é¢æ°ãæžãããšã¯ãå°±è·ã®é¢æ¥ã§ããªãäžè¬çãªè³ªåã§ãã ãã®ãã©ãããã©ãŒã ã䜿çšããŠãå¹æçã«ã©ã€ã³ãå転ã§ããæ¹æ³ãèŠãŠã¿ãŸãããã
ã«ããã®äžã«ã¯ãã©ã€ã³å転ã®ããŸããŸãªæ¹æ³ã®ããã©ãŒãã³ã¹ã®æ¯èŒåæããããŸãã
Khrr-rr ...-ãã§ãŒã³ãœãŒã¯èšã£ãã
Tyuyuyu ...-ç·æ§ã¯èšã£ãã
©å€ããžã§ãŒã¯ããããå§ããŸãããã ãã¹ãŠã®å®è£
ã¯ããµã€ãºã256ã¡ã¬ãã€ãïŒ128Ã1024Ã1024æåïŒã®åäžè¡ãš256ãã€ãïŒ128æåïŒã®1024Ã1024è¡ã§é床ããã¹ããããŸããã å枬å®ã®åã«ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå éããïŒãã®ãããªãµã€ãºã®ãã¹ãããŒã¿ã§éèŠã§ãïŒã枬å®ã50åå®è¡ããã20ã®æ¥µç«¯ãªãã®ãç Žæ£ãããæ®ãã®å€ãå¹³ååãããŸããã æ¡ä»¶ä»ããªãŠã ã¯ãã¹ããããŠã©ããã¯ã©ã¹ã®ãªããžã§ã¯ãã«ãã£ãŠçºè¡ããããã£ãã¯ã®æ°ãéžæããŸããã
ãã®ãã¹ãã¯ãAthlon64 x2 4200 +ã2GBãã¥ã¢ã«ãã£ã³ãã«DDR2 RAMããã³Pentium4 HT 3GHzã3GB DDR RAMã®2å°ã®ã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããŸããã ãã®ãã¹ãã®æ§æã®äž»ãªéãã¯ãã¡ã¢ãªãã£ãã·ã¥ãã³ãã«ã®ããã©ãŒãã³ã¹ã§ãã2çªç®ã®ã·ã¹ãã ã¯ããã®ç¹ã§èããäœéã§ãã
æè¡çãªæç¶ãã¯çµãããŸãããå®éã®å®è£
ã«ç§»ããŸãããã æ確ã«ããããã«ãããã§ã¯
ãŠãã³ãŒãã®ãµãã²ãŒãã³ãŒããã€ã³ãã¯èæ
®ãããŠããŸããã åšå²ã®ããšã³ã·ã¹ãã ãã®ã³ã³ããã¹ãã§ãããžãã¯ãšå®è£
ã®ãå¯æããã®é ã«ã¢ãããŒããæ€èšããŸãã
ãã®ããŒãã®æåŸã®éšåã«ãæ¯èŒæž¬å®å€ããããŸãã äžè¬ã«ã
ReverseUnsafeCopyé¢æ°ã¯ãå®å
šãªã³ãŒã
-ReverseArrayManualãå¶éãããŠããå Žåã«ã®ã¿
æé©ã§ããããšãå€æããŸããã å®å
šãªã³ãŒããšå·šå€§ãªæååãå¿
èŠãªå Žåã
ReverseStringBuilderã§èŠããå¿
èŠããããŸãã
ããŒã1ïŒãéåžžã®ãã¡ãœããã
1. ReverseStringBuilder
æšå¥šäºé
ã«åŸããã倧ããªãæååãäœæããããã«ãç¹å¥ãªããŒã«StringBuilderã¯ã©ã¹ã䜿çšããŸãã ã¢ã€ãã¢ã¯æãããã»ã©åçŽã§ããé©åãªãµã€ãºã®ãã«ããŒãäœæããéã®é åºã§è¡ã«æ²¿ã£ãŠç§»åããæ°ããè¡ã«æåãè¿œå ããŸãã
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
Copy Source | Copy HTML static string ReverseStringBuilder( string str) { StringBuilder sb = new StringBuilder (str.Length); for ( int i = str.Length; i-- != 0 ; ) sb.Append(str[i]); return sb.ToString(); }
ç§ãã¡ã¯è©ŠããŠãèµ·åããŸããã¯ã...ããã¯ãã¹ãŠäœããã®åœ¢ã§äœããã®åœ¢ã§ãã£ããåäœããŸãã
2. ReverseArrayFramework
ãïŒ ãããã£ãŠããã®ãã«ããŒã«ã¯ããã¹ãŠã®åŽé¢ããã¹ã¬ããã®å®å
šæ§ã確ä¿ããããã®ãã§ãã¯ãè£
åãããŠããŸããããããããã¯å¿
èŠãããŸããã ããããæååã¯æåã®é
åã§ãã è£è¿ããŠãçµæãæååã«å€æããŸãã
Copy Source | Copy HTML
- éçæåå ReverseArrayFrameworkïŒ æåå strïŒ
- {
- char [] arr = str.ToCharArrayïŒïŒ;
- é
å .ReverseïŒarrïŒ;
- æ°ãã æåå ïŒarrïŒãè¿ããŸãã
- }
ãŸã£ããå¥ã®åé¡ã§ã3.5åé«éã§ããã ããŒããå€åãã£ãšããïŒ
3. ReverseArrayManual
ã ãããç§ãã¡ã¯æãã æåã«ãããŒã¿ã2åã³ããŒãããŸããæåã¯æååããé
åã«ã次ã«é
åå
ã«ã³ããŒãããŸãã 次ã«ãArray.Reverseã¯ã©ã€ãã©ãªã¡ãœããã§ããã€ãŸããå
¥åãã§ãã¯ããããŸãã ããã«ãã¢ãããã¯ã¿ã€ãã®å Žåããã€ãã£ãã¡ãœãããšããŠæ瀺çã«å®è£
ãããããã¯å®è¡ã³ã³ããã¹ãã®è¿œå ã®åãæ¿ãã§ãã æååãæåã§é
åã«å€æããŠã¿ãŸãããã
Copy Source | Copy HTML
- éçæåå ReverseArrayManualïŒ string originalStringïŒ
- {
- char [] reverseCharArray = new char [originalString.Length];
- for ïŒ int i = originalString.Length- 1 ; i> -1 ; i--ïŒ
- ReverseCharArray [originalString.Length-i- 1 ] = originalString [i];
- æ°ããæååãè¿ããŸã ïŒreversedCharArrayïŒ;
- }
4. ReverseManualHalf
ã©ãã ãã®å Žåãã¢ã¯ã·ã§ã³ã¯è¡ã®äžå€®ã«å¯ŸããŠå¯Ÿç§°ã§ããã€ãŸãã2ã€ã®ã€ã³ããã¯ã¹ãå察æ¹åã«é
眮ããå埩åæ°ãååã«ããããšãã§ããŸãã
Copy Source | Copy HTML
- éçæåå ReverseManualHalfïŒ string originalStringïŒ
- {
- char [] reverseCharArray = new char [originalString.Length];
- int i = 0 ;
- int j = originalString.Length- 1 ;
- while ïŒi <= jïŒ
- {
- reverseCharArray [i] = originalString [j];
- reverseCharArray [j] = originalString [i];
- i ++; j--;
- }
- æ°ããæååãè¿ããŸã ïŒreversedCharArrayïŒ;
- }
ããŒã...äœããããŸããããªãã£ããé
ãã¡ã¢ãªã®ã·ã¹ãã ã§ãé床ã1.5åèœã¡ãã æ§æãšå®è£
ã®è©³çŽ°ãèãããšãã¡ã¢ãªé床ãšããã»ããµãã£ãã·ã¥ãåå ã§ãããšèããããšãã§ããŸãã以åã¯2ã€ã®ãªã¢ãŒãã¡ã¢ãªé åãåæã«æäœããŠããŸããããçŸåšã¯ãããã4ã€ãããããŒã¿ãã£ããã£ã¯ããé »ç¹ã«å®è¡ãããŸãã
LINQãšéã®æ¹æ³
LINQã«ã¯ãŸã æ¯èŒççŸããçãæ¹æ³ããããŸãããããã©ãŒãã³ã¹ã«é¢ããæ¹å€ã«èããããšã¯ã§ããŸãããStringBuilderã«åºã¥ãæ¹æ³ããã3ã3.5åé
ãåäœããŸãã ãã®çç±ã¯ãIEnumerableãä»ããããŒã¿ã®ãã³ãã³ã°ãšåå埩ã®ä»®æ³åŒã³åºãã§ãã ãåžæã®æ¹ã«ã¯ã以äžãå®è£
ã§ãã
Copy Source | Copy HTML
- éçæåå ReverseStringLinqïŒ string originalStringïŒ
- {
- æ°ããæååãè¿ããŸã ïŒoriginalString.ReverseïŒïŒãToArrayïŒïŒïŒ;
- }
ã¡ã¢ãªäœ¿çšé
ã»ãšãã©ã®å Žåãåé¡ã¯ããã»ã©é倧ã§ã¯ãããŸããããèæ
®ãããã¡ãœããã®ãã¹ãŠã®ãé«éãã¯ãæåã®é
åã®åœ¢åŒã§æååã®äžéã³ããŒãäœæããŸãã åæãã¹ãã§ã¯ãããã¯æåã®ã¡ãœããã®ã¿ã512MBã®æååãã©ããã§ããæ®ãã¯System.OutOfMemoryExceptionã«ãªã£ããšããäºå®ã«çŸããŠããŸãã ãŸããäžå¿
èŠãªäžæãªããžã§ã¯ããGCã®é »åºŠãå¢ããããšãå¿ããŠã¯ãªããŸãããããã¯ææã®ãã€ã³ãã«æé©åãããŠããŸããããšã«ããæéã浪費ããŸãã 次ã®ããŒãã§ã¯ãé床ã®æé©åã«å ããŠããã®åé¡ã®è§£æ±ºçãæ¢ããŸãã
ããŒã2ïŒããéããããå¹ççã«ããŸãã¯å®å
šã§ãªãã³ãŒããå¿
èŠãªå Žåã
å®å
šã§ãªãã³ãŒãã䜿çšãããšã1ã€ã®èå³æ·±ãå©ç¹ãåŸãããŸãã以åã¯
äžå€ã§ãã£ãè¡ãå€æŽã§ããããã«ãªããŸããããéåžžã«æ³šæããŠ
è¡ã®ã³ããŒã®ã¿ãå€æŽããå¿
èŠããããŸã-ã©ã€ãã©ãªã¯1è¡ã®ã³ããŒã®æ°ãæå°éã«æããŸããã¢ããªã±ãŒã·ã§ã³ã
ãããã£ãŠãé©åãªãµã€ãºã®æ°ããè¡ãäœæãããããããé
åãšããŠèŠãŠãå¿
èŠãªããŒã¿ãå
¥åã§ããŸãã ããŠãã€ã³ããã¯ã¹ã®æå¹æ§ã®ãã§ãã¯ããªãããšãå¿ããªãã§ãã ãããããã«ããã³ãŒãã®é床ãäžãããŸãã ãã ãã.Netã®æååã®ä»æ§ã«ãããç®çã®é·ãã®æååãäœæããããšã¯ã§ããŸããã StringïŒcharãintïŒã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠãç¹°ãè¿ãæåïŒã¹ããŒã¹ãªã©ïŒããã¹ããªã³ã°ãäœæããããString.CopyïŒStringïŒã䜿çšããŠå
ã®ã¹ããªã³ã°ãã³ããŒã§ããŸãã
ãã®ç¥èãæŠåšã«ã次ã®2ã€ã®å®è£
ãäœæããŸãã
5. ReverseUnsafeFill
ã¹ããŒã¹ã®è¡ãäœæããéã®é åºã§åããŸãã
Copy Source | Copy HTML
- éçãªå®å
šã§ãªãæåå ReverseUnsafeFillïŒ æåå strïŒ
- {
- if ïŒstr.Length <= 1 ïŒstrãè¿ã ;
- String copy = new String ïŒ '' ãstr.LengthïŒ;
- ä¿®æ£ ïŒ char * buf_copy = copyïŒ
- {
- ä¿®æ£ ïŒ char * buf = strïŒ
- {
- int i = 0 ;
- int j = str.Length- 1 ;
- while ïŒi <= jïŒ
- {
- buf_copy [i] = buf [j];
- buf_copy [j] = buf [i];
- i ++; j--;
- }
- }
- }
- ã³ããŒãè¿ã ;
- }
6. ReverseUnsafeCopy
è¡ãã³ããŒããŠå転ããŸãã
Copy Source | Copy HTML
- éçãªå®å
šã§ãªãæåå ReverseUnsafeCopyïŒ æåå strïŒ
- {
- if ïŒstr.Length <= 1 ïŒstrãè¿ã ;
- char tmp;
- String copy = String .CopyïŒstrïŒ;
- ä¿®æ£ ïŒ char * buf = copyïŒ
- {
- char * p = buf;
- char * q = buf + str.Length- 1 ;
- while ïŒp <qïŒ
- {
- tmp = * p;
- * p = * q;
- * q = tmp;
- p ++; q--;
- }
- }
- ã³ããŒãè¿ã ;
- }
枬å®çµæã瀺ãããã«ã2çªç®ã®ããŒãžã§ã³ã¯ãäœéã¡ã¢ãªã§ã¯ã¯ããã«éãåäœããé«éã§ã¯ãããã«é
ããªããŸã:)ããã€ãã®çç±ããããŸãïŒ4ã€ã§ã¯ãªã2ã€ã®ãªã¢ãŒãã¡ã¢ãªé åã§åäœããã¡ã¢ãªãããã¯ã®ã³ããŒé床ãšã«ãŒãã®åçŽãªå
å¡«é床ã®éã ãã«ãã¹ã§ReverseUnsafeFillããŒãžã§ã³ãäœæããŠïŒã¡ã¢ãªãããã£ãã·ã¥ãžã®ããŒã¿ãã£ããã£ã®æ°ãæžããããšãã§ããŸãïŒãé
ãã¡ã¢ãªã§ãã¹ãããããšãã§ããŸãããReverseUnsafeCopyãããé
ããšä¿¡ããçç±ããããŸãïŒééã£ãŠããå¯èœæ§ããããŸãïŒã
7. ReverseUnsafeXorCopy
次ã¯ïŒ ãããã«ãã
ãšãXORæŒç®åãšã®
亀æã¯ã 3çªç®ã®å€æ°ãã³ããŒãããããé«éã«åäœããŸãïŒã¡ãªã¿ã«ãé·æã§ã¯ãa ^ = b ^ = a ^ = b;ããCïŒã§ã¯ããã®è¡ã¯æ©èœããŸããïŒ ã ããŠãå®éã«ç¢ºèªããŸãããã
Copy Source | Copy HTML
- éçãªå®å
šã§ãªãæåå ReverseUnsafeXorCopyïŒ string strïŒ
- {
- if ïŒstr.Length <= 1 ïŒstrãè¿ã ;
- String copy = String .CopyïŒstrïŒ;
- ä¿®æ£ ïŒ char * buf = copyïŒ
- {
- char * p = buf;
- char * q = buf + str.Length- 1 ;
- while ïŒp <qïŒ
- {
- * p ^ = * q;
- * q ^ = * p;
- * p ^ = * q;
- p ++; q--;
- }
- }
- ã³ããŒãè¿ã ;
- }
ãã®çµæãã³ããŒããã1.2ã1.5åé
ããªããŸãã ã¬ãžã¹ã¿ã®å€ããã°ãã亀æããããã«æ©èœããããªãã¯ã¯ãå€æ°ã«å¯ŸããŠã¯æ©èœããŸããã§ããïŒå€ãã®C / C ++ã³ã³ãã€ã©ã§ã¯æ©èœããŸããïŒã
ãã®äºå®ã®èª¬æãæ±ããŠãã¢ããªã±ãŒã·ã§ã³ã®å
éšã«ç»ããçµæã®CILã³ãŒããèªã¿åããŸãã
ããŒã3ïŒCILããã³.Netã©ã€ãã©ãªã³ãŒãã«é²ã¿ãŸãã
XORã«ãã亀æãããæªãããšãå€æããçç±
ãã®è³ªåãžã®åçã«ã€ããŠã¯ã2ã€ã®äº€ææ¹æ³çšã«çæãããCILã³ãŒããèŠã䟡å€ããããŸãã ãããã®åœä»€ãç解ããããããããã«ããã®ç®çã説æããŸã
ãldloc.N-ã¹ã¿ãã¯ã«ããŒã«ã«å€æ°çªå·
NãããŒããã
stloc .N-ã¹ã¿ãã¯ã®å
é ãããŒã«ã«å€æ°çªå·
Nã«èªã¿èŸŒã¿ãŸã
xor-ã¹ã¿ãã¯ã®å
é ã«ãã2ã€ã®å€ã®XORæŒç®ã®å€ãèšç®ããçµæãèªã¿èŸŒã¿ãŸã代ããã«ã¹ã¿ãã¯ã«ã
ã³ããŒå
±æ | XORããŒã¹ã®äº€æ | å®å
šãªCIL亀æ |
---|
- int aãb;
- int tmp = a;
- a = b;
- b = tmp;
| - int aãb;
- a ^ = b;
- b ^ = a;
- a ^ = b;
| |
.locals init (<br/> [0] int32 a,<br/> [1] int32 b,<br/> [2] int32 tmp)
| .locals init (<br/> [0] int32 a,<br/> [1] int32 b)<br/>
| .locals init (<br/> [0] int32 a,<br/> [1] int32 b)<br/>
|
L_0004: ldloc .0<br/> L_0005: stloc .2<br/> L_0006: ldloc .1<br/> L_0007: stloc .0<br/> L_0008: ldloc .2<br/> L_0009: stloc .1<br/> <br/> <br/> <br/> <br/> <br/>
| L_0004: ldloc .0<br/> L_0005: ldloc .1<br/> L_0006: xor <br/> L_0007: stloc .0<br/> L_0008: ldloc .1<br/> L_0009: ldloc .0<br/> L_000a: xor <br/> L_000b: stloc .1<br/> L_000c: ldloc .0<br/> L_000d: ldloc .1<br/> L_000e: xor <br/> L_000f: stloc .0<br/>
| L_0004: ldloc .0<br/> L_0005: ldloc .1<br/> L_0006: stloc .0<br/> L_0007: stloc .1<br/> <br/> <br/> <br/> <br/> <br/> <br/> <br/>
|
ã芧ã®ãšãããXORæŒç®åã䜿çšããããŒãžã§ã³ã§ã¯ãããå€ãã®ä»®æ³ãã·ã³æäœãå¿
èŠã§ãã ããã«ããã®åŸã®ãã€ãã£ãã³ãŒããžã®ã³ã³ãã€ã«æã«ã䜿çšãããããã»ããµã®èœåãèæ
®ããŠã3çªç®ã®å€æ°ãä»ããäžè¬çãªäº€æãããå¹ççãªäº€ææäœã«çœ®ãæããæé©åãè¡ãããå¯èœæ§ããããŸãã åæã®å¯äœçšãšããŠãCILã®ä»®æ³çãªãçæ³çãªã亀æãè¡ãããŸããCILã®äœ¿çšã«äœããã®å¹æããããã©ããã確èªããã®ã¯èå³æ·±ãã§ããããããã®ããã«ilasmãŸãã¯åå°/æŸåºãå°ç¡ãã«ããå¿
èŠããããŸãã ãã ããçµæã®ã³ãŒãã¯å®å
šã§ã¯ãªãcïŒãããé©çšæ§ãäœããããå®çšçãªé¢å¿ã¯ãããŸããã
Array.Reverseã¯ã©ã®ããã«æ©èœããŸããïŒ
ããŠããªãã¬ã¯ã¿ãŒã䜿çšããŠã¢ã»ã³ããªã®å
éšãèŠããšãæåã®éšåã§äœ¿çšãããã©ã€ãã©ãªã¡ãœããã®å®è£
ãèŠãã®ãçã«ããªã£ãŠããŸãã ããã§ã¯Array.Reverseãéç«ã£ãŠããããã€ãã£ãã¡ãœãããšããŠå®è£
ãããç¹å®ã®é¢æ°Array.TrySZReverseã«äŸåããŠããŸãã ãããã£ãŠã
Shared Source Common Language Infrastructure 2.0 -source .net 2.0ãããŠã³ããŒãããŠãã©ããªçš®é¡ã®ç£ãã確èªããŠãã ãã:)çãæ€çŽ¢ã®åŸããã¡ã€ã«ãsscli20 \ clr \ src \ vm \ comarrayhelpers.hãã«ãªããŒã¹ãã³ãã¬ãŒãé¢æ°ããããŸãïŒããã«ã¯KINDã®ã±ãŒã¹ã¯UINT16ïŒã«å¯Ÿå¿ããŸãããããã¯ïŒé©ãïŒïŒReverseUnsafeCopyå®è£
ãšæããã䌌ãŠããŸãã
Copy Source | Copy HTML
- static void ReverseïŒ KINDé
å[]ã UNIT32ã€ã³ããã¯ã¹ã UNIT32ã«ãŠã³ãïŒ{
- LEAF_CONTRACT;
- _ASSERTEïŒarrayïŒ= NULLïŒ;
- if ïŒcount == 0ïŒ{
- åž°ã
- }
- UNIT32 i =ã€ã³ããã¯ã¹ã
- UNIT32 j =ã€ã³ããã¯ã¹+ã«ãŠã³ã-1 ;
- while ïŒi <jïŒ{
- KIND temp = array [i];
- é
å[i] =é
å[j];
- é
å[j] = temp;
- i ++;
- j--;
- }
- }
ããŒã4ïŒãã€ããªãã©ãœã³ã®çµæã
枬å®çµæã®åæã¯æåã®2ã€ã®éšåã§è¡ããŸãããããã§ã¯äžèšã®æ©èœã®æ§èœæ¯ã瀺ãæ¯èŒå³ã®ã¿ã瀺ããŸãã ããã£ãã¯ãã®æ£ç¢ºãªæ°å€ã¯æ§æã«äŸåããããŠãããç¹ã«é¢å¿ãåŒãããšã¯ã»ãšãã©ãããŸããã誰ããæäŸãããã³ãŒãã䜿çšããŠèªåã®ããã©ãŒãã³ã¹ã枬å®ã§ããŸãã
æåã®2ã€ã®éšåã®ãã¹ããã©ã¯ãã£ã¹ã®æ¯èŒ
é«éã¡ã¢ãªäž
é
ãã¡ã¢ãª
é«éã¡ã¢ãªã§ã®ãããã°ããã³ãªãªãŒã¹æ§æã®ãã¹ãŠã®ã¡ãœããã®æ¯èŒ
倧ããªç·
çãç·
äœéã¡ã¢ãªã§ã®ãããã°ããã³ãªãªãŒã¹æ§æã®ãã¹ãŠã®ã¡ãœããã®æ¯èŒ
倧ããªç·
çãç·