ฐานในการผสม


23

การป้อนข้อมูล:
รายการ / 2-36อาร์เรย์ของจำนวนเต็มซึ่งแต่ละรายการอยู่ในช่วงของ

เอาท์พุท:
ผลรวมของจำนวนเต็ม (เป็นฐาน 10) โดยที่แต่ละจำนวนเต็มถัดไปอยู่ในฐานของค่าก่อนหน้า (เริ่มต้นด้วยฐานปกติ 10)

ตัวอย่าง:
สมมติว่าเรามีอินพุตดังนี้: [4, 12, 34, 20, 14, 6, 25, 13, 33]
จากนั้นเรามีผลรวมดังนี้:

4    (4  in base-10) +
6    (12 in base-4 ) +
40   (34 in base-12) +
68   (20 in base-34) +
24   (14 in base-20) +
6    (6  in base-14) +
17   (25 in base-6 ) +
28   (13 in base-26) +
42   (33 in base-13)
= 235

ฐานทางคณิตศาสตร์อธิบาย:
ฉันถือว่าสมมติว่าทุกคนรู้วิธีการทำงานของฐาน แต่ฉันจะให้ตัวอย่างสั้น ๆ ของวิธีการทำงานอย่างไรก็ตามในกรณี ลอง34 in base-12ยกตัวอย่างเราจะได้40อย่างไร

1-34 in regular base-10:
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34
 So, from 1 to 34 is 34 steps in base-10

1-34 in base-12:
 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 30, 31, 32, 33, 34
 So, from 1 to 34 is 40 steps in base-12

นี่อาจเป็นเครื่องคิดเลขที่มีประโยชน์

กฏท้าทาย:

  • ขนาดอาร์เรย์จะอยู่ในช่วงที่เหมาะสม (เช่น1-100/ ดูกรณีทดสอบ)
  • กรณีทดสอบจะไม่มีเลขจำนวนเต็มซึ่งค่าปัจจุบันไม่ถูกต้องเพราะเป็นฐานก่อนหน้า (เช่นคุณจะไม่มีวันคล้าย19 in base-6หรือ6 in base-6เพราะ base-6 มีตัวเลข0-5เท่านั้น)
  • คุณสามารถป้อนข้อมูลในแบบที่คุณต้องการ สามารถเป็น int-array, เป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค / เว้นวรรค, ฯลฯ การโทรของคุณ (นอกจากนี้คุณยังได้รับอนุญาตให้ย้อนกลับ int-array ซึ่งอาจเป็นประโยชน์สำหรับภาษาการเขียนโปรแกรมแบบกองซ้อน)

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ใช่กอล์ฟ พยายามหาคำตอบสั้น ๆ สำหรับภาษาการเขียนโปรแกรมใด ๆ
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ:

[4, 12, 34, 20, 14, 6, 25, 13, 33]                            ->   235
 4+ 6+  40+ 68+ 24+ 6+ 17+ 28+ 42

[5, 14, 2, 11, 30, 18]                                        ->   90
 5+ 9+  2+ 3+  33+ 38

[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10]    ->   98
 12+ 13+ 11+ 9+ 8+ 7+ 6+ 5+ 4+ 3+ 5+  2+ 3+  3+ 3+  2+ 2

[36, 36]                                                      ->   150
 36+ 114

1
สำหรับภาษาที่ใช้สแต็กซึ่งมีคอนเทนเนอร์ LIFO สามารถป้อนข้อมูลในลำดับที่กลับกันได้หรือไม่ ใน dc ฉันต้องการประมาณ 30 ไบต์เพื่อพลิกสแต็กเพื่อให้มีหมายเลขแรกในอินพุตเป็นคนแรกที่ถูกประมวลผลซึ่งภาษาที่ไม่ใช่สแต็กมีตามค่าเริ่มต้น
seshoumara

@seshoumara ทำไมไม่ ฉันจะอธิบายสิ่งนี้ในสิ่งที่ท้าทาย มันเกี่ยวกับความท้าทายและผลลัพธ์ไม่ใช่ส่วนใหญ่เกี่ยวกับรูปแบบอินพุต
Kevin Cruijssen

คำตอบ:


4

05AB1E , 7 6 5 ไบต์

ใช้การเข้ารหัส05AB1E

บันทึก 1 ไบต์โดยใช้บิวด์อินใหม่šตามที่Kevin Cruijssen แนะนำ

TšüöO

คำอธิบาย

รายการอินพุทถูกนำกลับรายการตามที่ได้รับอนุญาตจากสเปคความท้าทาย

Tš     # prepend a 10 to the list
  üö   # reduce by conversion to base-10
    O  # sum

ลองออนไลน์!

ดัดแปลง Testuite


2
สามารถ 5 ไบต์ตอนนี้มีในตัวแทนš ¸ìนอกจากนี้ยังมีคำอธิบายของคุณฯ " ผนวก " แทน " ย่อหน้า " :)
Kevin Cruijssen

@KevinCruijssen: ขอบคุณ :)
Emigna

9

Python 3, 40 ไบต์

lambda a:sum(map(int,map(str,a),[10]+a))

การทดสอบอยู่ที่ideone

map(str, a)สร้างเครื่องกำเนิดไฟฟ้าGที่เรียกใช้strในแต่ละค่าในaการแปลงเป็นสตริง
map(int, G, [10]+a)สร้างเครื่องกำเนิดไฟฟ้าที่เรียกร้องint(g, v)ให้คู่ข้ามGและ[10]+a
int(g, v)แปลงสตริงgจากฐานจำนวนเต็มv(ถ้าvอยู่ใน[2,36]และgถูกต้อง)
sumทำสิ่งที่มันบอกว่าบนดีบุก


7

Python 2, 48 ไบต์

lambda a:sum(int(`x`,y)for x,y in zip(a,[10]+a))

การทดสอบอยู่ที่ideone

zip(a,[10]+a)ลัดเลาะคู่ค่าในaและค่าก่อนหน้านี้หรือ10สำหรับครั้งแรกในแปลงโทรสตริง, แปลงสตริงจากฐานจำนวนเต็ม(ถ้าอยู่ในและถูกต้อง) ไม่สิ่งที่กล่าวในดีบุก
backticksintxs
int(s, y)syy[2,36]s
sum


6

Perl, 35 34 33 ไบต์

รวมถึง +2 สำหรับ -ap

รันด้วยรายการตัวเลขใน STDIN:

basemix.pl <<< "4 12 34 20 14 6 25 13 33";echo

basemix.pl:

#!/usr/bin/perl -ap
$\+=$&+"$`$& 10"*/.$/*$`for@F}{

ฉันรอมานานแล้วสำหรับโอกาสที่จะใช้การละเมิดนี้ ...

คำอธิบาย

หมายเลขอินพุตสามารถมีได้สูงสุด 2 หลัก จำนวนxyในฐานเป็นเพียงb b*x+yฉันจะใช้ regex ไม่/.$/ดังนั้นหลักแรกจะสิ้นสุดลงใน$`และหลักสุดท้ายในเพื่อให้มีส่วนร่วมในการรวมเป็น$&$&+$b*$`

ฉันใช้ความจริงที่ว่าforตัวแปร regex ไม่ถูกต้อง (เช่นmapและwhileทำได้) จำกัด ผลลัพธ์ของการแข่งขันในลูปก่อนหน้านี้ยังคงมีอยู่ในลูปปัจจุบัน ดังนั้นถ้าฉันระวังเกี่ยวกับลำดับที่ฉันใช้ในการดำเนินการฐานนั้นมีอยู่"$`$&"ยกเว้นลูปแรกที่ฉันต้องการให้เบสเป็น 10 ดังนั้นฉันจึงใช้"$`$& 10"แทน

วิธีการ$&ทำงานแรกเป็นการละเมิดเช่นกันเนื่องจากมีการเปลี่ยนแปลงใน/.$/ขณะที่มันอยู่ในสแต็กที่รอการเพิ่มอยู่แล้ว

การละเมิดครั้งสุดท้ายคือ}{ตอนท้ายซึ่งจะเปลี่ยนลูปโดยนัย-pจาก

LINE: while (defined($_ = <ARGV>)) {
    ...code..
}
continue {
    die "-p destination: $!\n" unless print $_;
}

ไปยัง

LINE: while (defined($_ = <ARGV>)) {
    ...code..
}
{
}
continue {
    die "-p destination: $!\n" unless print $_;
}

ซึ่งหมายความว่า$_จะไม่ได้กำหนดในการพิมพ์ แต่ก็ยังเพิ่ม$\ที่ฉันสะสมผลรวม นอกจากนี้ยังเป็นเคล็ดลับกอล์ฟมาตรฐานในการประมวลผลแบบวนซ้ำ


ฉันจะสนใจคำอธิบายสำหรับพวกเราด้วย perl-fu ที่อ่อนแอลง!
m-chrzan

2
แก้ไข @ m-chrzan โซลูชันแล้วและเพิ่มคำอธิบาย
Ton Hospel

4

PHP, 53 51 ไบต์

for(;$x=$argv[++$i];$b=$x)$s+=intval($x,$b);echo$s;

ทำซ้ำผ่านอินพุตแปลงแต่ละอินพุตเป็นตัวแปรสตริง จากนั้นรับค่าจำนวนเต็มโดยใช้หมายเลขก่อนหน้าเป็นฐาน สำหรับหมายเลขแรกฐานจะไม่ถูกตั้งค่า PHP จะเริ่มต้นด้วย 10 (อนุมานจากรูปแบบตัวเลข)

ทำงานแบบนี้ ( -dเพิ่มเพื่อความสวยงามเท่านั้น):

php -d error_reporting=30709 -r 'for(;$x=$argv[++$i];$b=$x)$s+=intval($x,$b);echo$s;' -- 12 11 10 9 8 7 6 5 4 3 12 2 11 3 10 2 10;echo

การปรับแต่ง

  • ที่จริงแล้วไม่จำเป็นต้องแปลงเป็นสตริงเนื่องจากอาร์กิวเมนต์ CLI เป็นสตริงอยู่แล้ว บันทึก 2 ไบต์


3

Java, 86 ไบต์

s->{int[]b={10};return s.reduce(0,(r,n)->{r+=n.valueOf(""+n,b[0]);b[0]=n;return r;});}

การทดสอบและ ungolfed

import java.util.function.ToIntFunction;
import java.util.stream.Stream;

public class Main {

  public static void main(String[] args) {
    ToIntFunction<Stream<Integer>> f = s -> {
      int[] b = {10};                 // Base, initialized with 10
      return s.reduce(0, (r, n) -> {  // Typical use of reduction, sum starts with 0.
        r += n.valueOf("" + n, b[0]); // Add the value in the previous base.
        b[0] = n;                     // Assign the new base;
        return r;
      });
    };

    System.out.println(f.applyAsInt(Stream.of(new Integer[]{4, 12, 34, 20, 14, 6, 25, 13, 33})));
  }
}

3

JavaScript ES6, 45 42 41 ไบต์

const g =
     a=>a.map(v=>s+=parseInt(v,p,p=v),s=p=0)|s
;

console.log(g.toString().length);                                            // 42
console.log(g([4, 12, 34, 20, 14, 6, 25, 13, 33]));                          // 235
console.log(g([5, 14, 2, 11, 30, 18]  ));                                    // 90
console.log(g([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10] )); // 98

parseInt(x,0) === parseInt(x,10)Conventiently

แก้ไข : บันทึกแล้ว 1 ไบต์ขอบคุณ @ETHproductions


ดี! ฉันคิดว่าคุณสามารถบันทึกไบต์โดยการแทนที่ด้วย&&s |s
ETHproductions

คุณสามารถแทนที่const gด้วยเพียงg
ไคลด์ Lobo


3

Java 7, 109 89 86 ไบต์

int c(int[]a){for(Byte i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}

Golfed 20 bytes ขอบคุณ@cliffroot (ที่ 12 เพราะความผิดพลาดโง่ฉันทำเอง)

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static int c(int[] a){
     for(Byte i = 1; i < a.length; a[0] += i.valueOf(a[i]+"", a[++i-2]));
     return a[0];
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 4, 12, 34, 20, 14, 6, 25, 13, 33 }));
    System.out.println(c(new int[]{ 5, 14, 2, 11, 30, 18 }));
    System.out.println(c(new int[]{ 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10 }));
    System.out.println(c(new int[]{ 36, 36 }));
  }
}

เอาท์พุท:

235
90
98
150

คุณต้องการจริงๆpเหรอ? ผลรวมสามารถคำนวณได้เช่นนี้r+=r.valueOf(""+a[i],a[i-1])ใช่ไหม:
Olivier Grégoire

1
ใช้การแปลง+""แทนvalueOfและลบตัวแปรที่ไม่จำเป็นออกไป -int c(int[]a){for(Integer i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}
cliffroot

@cliffroot อ่าฉันเป็นคนงี่เง่า .. ตอนที่ฉันกำลังทดสอบฉันทำผิดพลาด10และpย้อนกลับไป ฉันตระหนักถึงความผิดพลาดและแก้ไขมัน แต่เนื่องจากตอนนี้ส่วน String เป็นฐานปกติ -10 ฉันสามารถลบtoStringและใช้งานได้จริง ๆ+""ขอบคุณและขอบคุณสำหรับการเล่นกอล์ฟสิ่งอื่น ๆ -20 ไบต์ ฉันต้องตอบว่าคุณไม่สามารถเล่นกอล์ฟได้มากกว่านี้ (ไม่ใช่ว่าฉันไม่ซาบซึ้ง! ยิ่งหลักสูตรยิ่งสั้นเท่าไหร่ - ในการตีกอล์ฟ - นั่นคือ P)
Kevin Cruijssen

เพียงเพื่อเปรียบเทียบกับคำตอบของฉันคุณอยู่ในไวยากรณ์ของ Java ปัจจุบันคือ 79 ไบต์ยาว (ฉันมีความยาว 86 ไบต์ปัจจุบัน) แต่นั่นไม่ใช่รหัสสนุกถ่ายคนอื่น ๆ ;)
โอลิเวียGrégoire

1
@KevinCruijssen ฉันทำได้ดีกว่านี้ :) ฉันแค่รู้สึกว่า Java ไม่แนบเนียนกับ 5-6 ไบท์โซลูชันดังนั้นฉันจึงไม่เพิ่มคำตอบของตัวเองบ่อยๆ แต่ฉันก็ยังสนุกกับการเล่นกอล์ฟ แก้ปัญหาของผู้อื่น
หน้าผา

2

จริงแล้ว 12 ไบต์

;p(dX(♂$♀¿Σ+

ลองออนไลน์!

คำอธิบาย:

;p(dX(♂$♀¿Σ+
;             dupe input
 p            pop first element from list
  (dX         pop and discard last element from other copy
     (♂$      stringify all elements in first copy
        ♀¿    for each pair of elements in the two lists, interpret the first element as a base-(second element) integer
          Σ   sum
           +  add first element of original list

2

CJam , 15 ไบต์

l~{A\:A10bb}%:+

ลองออนไลน์!

คำอธิบาย

l~     e# Read and evaluate input.
{      e# Map this block over the input...
  A    e#   Push A. Initially this is 10, afterwards it will be the value of the
       e#   last iteration.
  \:A  e#   Swap with current value and store that in A for the next iteration.
  10b  e#   Convert to base 10 to get its decimal digits.
  b    e#   Interpret those in the base of the previous A.
}%
:+     e# Sum all of those values.


2

Matlab, 68 ไบต์

ไม่ใช่วิธีที่สร้างสรรค์มาก แต่นี่คือ:

function[s]=r(x);j=10;s=0;for(i=x)s=s+base2dec(num2str(i),j);j=i;end

แบบทดสอบ:

>> r([4,12,34,20,14,6,25,13,33])
ans =
   235
>> r([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10])
ans =
   98
>> r([5, 14, 2, 11, 30, 18])
ans =
   90
>> r([36,36])
ans =
   150

คุณสามารถบันทึกหนึ่งไบต์ด้วยfunction s=r(x);...
Luis Mendo

2

JavaScript (ES6), 54 48 40 ไบต์

ฉันใช้วิธีเรียกซ้ำ

f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0

บันทึกแล้ว 6 ไบต์ขอบคุณ Lmis!
บันทึก 8 ไบต์ขึ้นไปขอบคุณ Neil!


1
ฉันคิดว่าคุณสามารถบันทึกได้ 3 ไบต์โดยใช้parseInt(a,b)แทนparseInt(a[0],b)ตั้งแต่parseIntแปลงอาร์กิวเมนต์แรกเป็นสตริงและละเว้นทุกอย่างที่เริ่มต้นด้วยอักขระที่ไม่ถูกต้องตัวแรก (เช่น ',')
Lmis

1
ฉันยังคิดว่าคุณสามารถบันทึกไบต์โดยใช้a[0]?stuff():0แทนa.length&&stuff()
Lmis

@Lmis ขอบคุณผมได้ปรับปรุงมัน :)
Huntro

1
ฉันคิดว่าคุณสามารถย่อให้เหลือ 40 ไบต์:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil

@ ไม่มีวิธีที่ดีที่จะไม่ใช้sliceฟังก์ชั่น
Huntro

2

Perl 6 ,  52  50 ไบต์

{sum (10,|@_).rotor(2=>-1).map:{+":{.[0]}<{.[1]}>"}}
{sum (10,|@_).rotor(2=>-1).map:{":{.[0]}<$_[1]>"}}

คำอธิบาย:

# bare block lambda with implicit parameter 「@_」
{
  sum

    ( 10, |@_ )        # the input with a preceding 10
    .rotor( 2 => -1 )  # grab 2 values, back up one, repeat
    .map:
    {
      # create a string of the form ":10<4>"
      ":{
        .[0]            # first element from $_
      }<{
        .[1]            # second element from $_
      }>"
    }
}


1

Julia, 63 Bytes

f(l)=sum([parse(Int,string(l[i]),l[i-1])for i=2:length(l)])+l[]

แยกแต่ละตัวเลข (ยกเว้นคนแรก) ที่ใช้องค์ประกอบก่อนหน้านี้เป็นฐานและผลรวม เพิ่มองค์ประกอบแรกในตอนท้าย


1

ทับทิม 52 ไบต์

->a{eval a.zip([10]+a).map{|e|'"%s".to_i(%s)'%e}*?+}

ungolfed

->a{
  eval(
    a.zip([10]+a).map { |e|
      '"%s".to_i(%s)' % e
    }.join("+")
  )
}

การใช้

f=->a{eval a.zip([10]+a).map{|e|'"%s".to_i(%s)'%e}*?+}
p f[[4, 12, 34, 20, 14, 6, 25, 13, 33]] # => 235

1

สกาลา 67 ไบต์

def f(a:Int*)=a zip(10+:a)map{t=>Integer.parseInt(""+t._1,t._2)}sum

คำอธิบาย:

def f(a: Int*) =     //declare a method f with varargs of type Int as parameter
a zip (10 +: a)      //zip a with 10 prepended to a, resulting in...
                     //...Array((4,10), (12,4), (34,12), (20,34), (14,20), (6,14), (25,6), (13,25), (33,13))
map { t =>           //map each tuple t to...
  Integer.parseInt(  //...an integer by parsing...
    ""+t._1, t._2    //...a string of the first item in base-second-item.
  )
}
sum                  //and sum

1

Mathematica, 59 ไบต์

ฉันหวังว่าชื่อฟังก์ชันของ Mathematica จะสั้นกว่า แต่อย่างอื่นฉันมีความสุข

Tr[FromDigits@@@Transpose@{IntegerDigits/@{##,0},{10,##}}]&

ตัวอย่างเช่น,

Tr[FromDigits@@@Transpose@{IntegerDigits/@{##,0},{10,##}}]&[4,12,34,20,14,6,25,13,33]

235อัตราผลตอบแทน

{##,0}เป็นรายการของอินพุตอาร์กิวเมนต์ที่มี 0 ต่อท้าย (แทนตัวเลข); {10,##}เป็นรายการของอินพุตอาร์กิวเมนต์ที่มี 10 แบบเติม (แทนฐาน) คู่ของรายการที่เป็นTransposeวันที่จะเชื่อมโยงแต่ละคนมีตัวเลขที่มีฐานของตนและFromDigits(เย้!) แปลงเลขฐานแต่ละคู่กับฐาน-10 Trจำนวนเต็มผลของการที่จะสรุปโดย


1

เสียงกระเพื่อมสามัญ 83

(lambda(s)(loop for b ="10"then x for x in s sum(#1=parse-integer x :radix(#1#b))))

รายละเอียด

(defun base-mix (list)
  (loop
     for base = "10" then string
     for string in list
     sum (parse-integer string :radix (parse-integer base))))

การloopสร้างยอมรับ"v แล้ว w"การวนซ้ำสร้างที่ไหน vคือนิพจน์ที่จะถูกประเมินในครั้งแรกที่คำนวณตัวแปรการทำซ้ำและwคือนิพจน์ที่จะถูกประเมินสำหรับการทำซ้ำที่ต่อเนื่อง การประกาศจะถูกประเมินหลังจากหนึ่งรายการดังนั้นจึงbaseเป็นครั้งแรก "10" จากนั้นองค์ประกอบก่อนหน้าstringของรายการที่listถูกทำซ้ำ sumคำหลักคำนวณผลรวม: จำนวนเต็มอ่านจากstringที่มีฐานที่เป็นจำนวนเต็มแยกวิเคราะห์จากbaseสตริง 10 ฐาน#1=และ#1#เป็นสัญลักษณ์ในการกำหนดและการใช้ตัวแปรอ่าน: ตัวแรกจะส่งผลกระทบต่อ s-expression กับตัวแปรส่วนอีกอันหนึ่งแทนที่การอ้างอิงโดยวัตถุเดียวกัน สิ่งนี้จะบันทึกอักขระบางตัวสำหรับชื่อที่มีความยาว

ตัวอย่าง

(base-mix '("4" "12" "34" "20" "14" "6" "25" "13" "33"))
=> 235

1

Japtap -x , 7 ไบต์

äÏsnX}A

ลองมัน

äÏsnX}A     :Implicit input of array
ä           :Take each consecutive pair of elements
 Ï          :Pass them through the following function as X & Y
  s         :  Convert Y to a base-10 string
   nX       :  Convert to an integer from base-X
     }      :End function
      A     :Before doing any of that, though, prepend 10 to the array
            :Implicit output of the sum of the resulting array
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.