มาสร้าง Diet Haskell กันเถอะ


21

Haskell มีสิ่งอันดับที่สามารถเขียนได้เช่น

(a,b,c)

อย่างไรก็ตามนี่เป็นเพียงน้ำตาล syntactic สำหรับ

(,,)a b c

โดยทั่วไปn tuple สามารถเกิดขึ้นได้ด้วยn-1 , s ระหว่าง(... )ตามด้วยองค์ประกอบที่คั่นด้วยช่องว่าง ตัวอย่างเช่น 7-tuple (1,2,3,4,5,6,7)สามารถสร้างขึ้นโดย

(,,,,,,)1 2 3 4 5 6 7

เนื่องจาก Haskell ไม่มี 1-tuples จึงไม่สามารถสร้างได้ คุณจะไม่รับผิดชอบต่อสิ่งอันดับที่ว่างเปล่า

tuples ที่ซ้อนกันสามารถเกิดขึ้นได้โดยใช้ parens เพื่อแทนที่ลำดับของการดำเนินการ

((1,2),3) == (,)((,)1 2)3

ในฐานะที่เป็นส่วนหนึ่งของการติดตามของเราที่จะลบน้ำตาล syntactic ทั้งหมดออกจาก Haskell ฉันจะขอให้คุณเขียนโปรแกรมที่ลบน้ำตาล syntactic จาก Tuples ของ Haskell เช่นกัน

โปรแกรมของคุณควรใช้ tuple, อาร์เรย์หรือสตริงที่แสดงถึง tuple หวานและควรส่งออกสตริงที่แสดงถึง tuple "ปราศจากน้ำตาล" สิ่งอันดับอินพุตจะมีจำนวนเต็มบวกหรือสิ่งอันดับอื่น ๆ เท่านั้น

เนื่องจากเรากำลังเล่นกอล์ฟที่นี่ผลผลิตของคุณควรสั้น มันไม่ควรมีความจำเป็น

  • ช่องว่าง ช่องว่างควรใช้เพื่อแยกอาร์กิวเมนต์ของฟังก์ชัน tuple เท่านั้นและไม่ควรปรากฏหลัง a )หรือก่อนหน้า(

  • วงเล็บ ควรใช้วงเล็บเมื่อสร้างฟังก์ชัน tuple หรือเมื่อทำรัง tuples เท่านั้น

นี่เป็นคำถามเกี่ยวกับดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยมีจำนวนไบต์น้อยกว่าดีกว่า

กรณีทดสอบ

(1,2)     -> (,)1 2
(1,2,3)   -> (,,)1 2 3
((1,2),3) -> (,)((,)1 2)3
(1,2,3,4) -> (,,,)1 2 3 4
(1,(2,3)) -> (,)1((,)2 3)
(10,1)    -> (,)10 1

ถ้าฉันไม่ได้พลาดอะไรคุณครอบคลุม 1 tuples แต่ไม่ใช่ tuples ที่ว่างเปล่า .. ? อินพุต tuples ว่างเปล่าถูกต้องหรือไม่?
สิ้นเชิงมนุษย์

3
@tallyallyhuman คุณไม่ต้องจัดการกับสิ่งอันดับที่ว่างเปล่า
ข้าวสาลี Wizard

กรณีทดสอบครั้งที่ 5 มีค่าใช้จ่ายเพิ่มเติม,
H.PWiz

2
นอกจากนี้โดย "numbers" คุณหมายถึง "integers positive" หรือไม่
Erik the Outgolfer

2
แนะนำกรณีทดสอบ: และ((1,(2,3)),4,(5,6)) (1,(2,3),4)
Ørjan Johansen

คำตอบ:


17

Haskell , 169 148 ไบต์

init.tail.fst.([]%)
p:k="(,"
l%('(':r)|(y,x:s)<-[]%r,m<-y:l=last$m%(p:s):[(p:p:(l>>k)++x:foldl(\r x->x++[' '|x>k,r>k]++r)[x]m,s)|x<',']
l%r=lex r!!0

ลองออนไลน์! ใช้ tuple เป็นสตริง init.tail.fst.([]%)เป็นฟังก์ชั่นหลักที่ไม่ระบุชื่อ ผูกมันเช่นfและการใช้งานเช่นการที่อัตราผลตอบแทนf "(3,(14,1),4,7)""(,,,)3((,)14 1)4 7"

ทำไมอินพุตไม่ให้เป็นทูเปิลของ Haskell คุณถาม เนื่องจาก Haskell ถูกพิมพ์อย่างมากสิ่งอันดับ(1,2)มีพิมพ์(Int,Int)1และ tuple มีประเภท(1,(2,3)) (Int,(Int,Int))ดังนั้นฟังก์ชั่นที่ยอมรับชนิดแรกของ tuple ไม่สามารถนำไปใช้กับประเภทที่สองและโดยเฉพาะอย่างยิ่งสามารถมีฟังก์ชั่นซึ่งจะนำโดยพล tuple ไม่มี2

คำอธิบาย:

  • p:k="(,"เป็นวิธีที่สั้นที่จะกำหนดให้pการ'('และการk","
  • (%)เป็นฟังก์ชั่นการแยกวิเคราะห์และการแปลงซ้ำ อาร์กิวเมนต์แรกคือรายการของรายการ tuple ที่แจงแล้วอาร์กิวเมนต์ที่สองคือส่วนที่เหลือของสตริงเดิม การเรียกแต่ละครั้งจะส่งคืน tuple ของ tuple ที่แปลงแล้วปัจจุบัน (เป็นสตริงและอยู่ในวงเล็บ) และส่วนที่เหลือของสตริง
    • l%('(':r)หากสตริงเริ่มต้นด้วยวงเล็บเปิดเราต้องแยกรายการ tuple ใหม่
      (y,x:s)<-[]%rเราใช้ซ้ำ%และได้รับรายการ tuple yและสตริงเหลือ splitted เป็นตัวอักษรถัดไปและส่วนที่เหลือของสตริงx เราเพิ่มรายการใหม่ในรายการปัจจุบันของรายการที่พบแล้วและเรียกผลลัพธ์s
      m<-y:lylmและเรียกผล
    • ตัวละครต่อไปxตอนนี้เป็นทั้งจุลภาคหรือวงเล็บปิด, เป็นเพียงวิธีที่สั้นของการเขียน)last$ <B> :[ <A> |x<',']if x == ')' then <A> else <B>
    • ดังนั้นหาก a ,ถัดไปเราจำเป็นต้องแยกวิเคราะห์ซ้ำรายการถัดไป: m%(p:s)เราเตรียมวงเล็บเปิดเพื่อที่จะจบลงในกรณีที่ถูกต้องและผ่านรายการของรายการที่พบแล้วmเราย่อหน้าวงเล็บเปิดเพื่อที่จะจบลงในกรณีที่เหมาะสมและผ่านรายการของรายการพบแล้ว
    • หากเป็นอย่างอื่นx == ')'เราจะเสร็จสิ้น tuple ปัจจุบันและจำเป็นต้องทำการเปลี่ยนแปลงที่ต้องการ:(p:p:(l>>k)++x:foldl(\r x->x++[' '|x>k,r>k]++r)[x]m,s)
      • p:p:(l>>k)++x:ถ้าเราได้พบnรายการแล้วmมีnองค์ประกอบและyรายการก่อนที่จะเพิ่มองค์ประกอบส่วนใหญ่เมื่อเร็ว ๆ นี้พบว่ามีn-1รายการ สิ่งนี้มีประโยชน์ในขณะที่เราต้องการn-1 ,สำหรับnองค์ประกอบ tuple และl>>kทำงานในรายการเป็น"เชื่อมต่อรายการkด้วยตัวเองหลาย ๆ ครั้งที่yมีองค์ประกอบ"มีองค์ประกอบ""((,,,)"ดังนั้นนี้ส่วนแรกอัตราผลตอบแทนสตริงบางอย่างเช่น
      • foldl(\r x->x++[' '|x>k,r>k]++r)[x]mเชื่อมองค์ประกอบของm(ในลำดับย้อนกลับเพราะโดยการเพิ่มรายการใหม่ลงในด้านหน้าmตัวเองถูกสร้างขึ้นในลำดับย้อนกลับ) ในขณะที่เพิ่มช่องว่างเฉพาะระหว่างสององค์ประกอบถ้าพวกเขาทั้งสองตัวเลข: [' '|x>k,r>k]เราตรวจสอบว่ารายการปัจจุบันxและrตัวเลขโดยเปรียบเทียบ พวกเขาถึง","- หากไม่ใช่ตัวเลขพวกมันเป็นตัวแทนของ tuple ที่อยู่ในวงเล็บ'(' < ','แล้ว
    • หากรูปแบบการจับคู่ที่เหมาะสมในการเริ่มต้นล้มเหลวแล้วเราจบลงในบรรทัดสุดท้าย:l%('(':r) l%r=lex r!!0ซึ่งหมายความว่าเราจำเป็นต้องแยกตัวเลขและส่งกลับจำนวนและส่วนที่เหลือของสตริง โชคดีที่มีlexฟังก์ชั่นที่ทำสิ่งนั้นอย่างแน่นอน (มันจะแยกโทเค็น Haskell ที่ถูกต้องตัวถัดไป อย่างไรก็ตามสิ่งอันดับ tuple ถูกห่อไว้ในรายการดังนั้นเราจึงใช้!!0เพื่อรับองค์ประกอบแรกของรายการ
  • init.tail.fst.([]%)เป็นฟังก์ชั่นหลักที่ใช้สตริงและนำไปใช้%กับรายการที่ว่างกับมัน เช่นสำหรับอินพุต"(1,2)",, ให้ใช้([]%)อัตราผลตอบแทน("((,)1 2)","")ดังนั้น tuple ด้านนอกและวงเล็บต้องถูกลบออก fstรับองค์ประกอบแรกของ tuple tailลบวงเล็บปิดและinitที่เปิดออก

แก้ไข:ขอบคุณ@ Ørjan Johansenสำหรับการเล่นกอล์ฟทั้งหมด21 ไบต์ !


1 ที่จริงแล้วประเภทคือ(Num t1, Num t) => (t, t1)แต่นั่นเป็นเรื่องที่แตกต่างกัน

2ไม่สนใจฟังก์ชัน polymorphic เช่นidซึ่งไม่สามารถใช้งานได้กับอินพุตของพวกเขา


1
หนึ่งสามารถเขียนฟังก์ชัน polymorphic โดยใช้ typeclass Desugarableแต่จะต้องประกาศกรณีIntและประเภท tuple ทั้งหมด
Bergi

1
gสามารถย่อให้สั้นfoldr1(\x r->x++[' '|x>k,r>k]++r)และอินไลน์ได้
Ørjan Johansen

@Bergi: ... และหนึ่งไม่สามารถประกาศอินสแตนซ์สำหรับแท้จริงทุกประเภท tuple :-) (ลอง: show (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5)ใน GHCi จากนั้นเพิ่ม,6ที่ส่วนท้ายแล้วลองอีกครั้ง)
wchargin

1
การปรับปรุงการอินไลน์สำหรับอีกหกไบต์: ใช้m<-y:l, พับซ้ายแทนขวาและใช้[x]เป็นค่าเริ่มต้น ลองออนไลน์!
Ørjan Johansen

1
fสามารถไม่ระบุชื่อ: init.tail.fst.([]%).
Ørjan Johansen

11

Haskell, 141 ไบต์138 ไบต์(ขอบคุณØrjan Johansen)

import Language.Haskell.TH
f(TupE l)='(':tail(","<*l)++')':""%l
q%(LitE(IntegerL i):l)=q++show i++" "%l
_%(e:l)='(':f e++')':""%l
_%[]=[]

fExp -> Stringมีประเภท

  • อินพุต: เทมเพลต HaskellExp ression (เช่นการแสดง AST มาตรฐานของค่า Haskell แบบกำหนดเอง - โดยทั่วไปจะแยกโค้ด Haskell ก่อนที่จะตรวจสอบชนิด) ต้องเป็นตัวแทนของ tuple ที่มีเฉพาะจำนวนเต็มที่ไม่ใช่ค่าลบและ tuples อื่น ๆ

  • เอาต์พุต: สตริงที่มีไวยากรณ์ที่ถูกลบทิ้งสำหรับนิพจน์ tuple นั้น

การสาธิต:

$ ghci TupDesugar.hs 
GHCi, version 8.3.20170711: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/sagemuej/.ghc/ghci.conf
Loaded GHCi configuration from /home/sagemuej/.ghci
[1 of 1] Compiling Main             ( TupDesugar.hs, interpreted )
Ok, 1 module loaded.
*Main> :set -XTemplateHaskell -XQuasiQuotes
*Main> f <$> runQ [|(1,2)|]
"(,)1 2"
*Main> f <$> runQ [|(1,2,3)|]
"(,,)1 2 3"
*Main> f <$> runQ [|((1,2),3)|]
"(,)((,)1 2)3"
*Main> f <$> runQ [|(1,2,3,4)|]
"(,,,)1 2 3 4"
*Main> f <$> runQ [|(1,(2,3))|]
"(,)1((,)2 3)"
*Main> f <$> runQ [|(10,1)|]
"(,)10 1"

2
คุณสามารถเปลี่ยน")"++เป็น')':สองแห่งและประหยัดพื้นที่หลังจากนั้นได้tailโดยการย้ายนอกวงเล็บ
Ørjan Johansen

7

Haskell , 119 ไบต์

data T=I Int|U[T]
f(U t)="(("++init(t>>",")++')':foldr(\x y->f x++[' '|f x>",",y>","]++y)")"t
f(I n)=show n
init.tail.f

ลองออนไลน์! สิ่งนี้ใช้ชนิดข้อมูลที่กำหนดเองTเพื่อแสดงสิ่งอันดับนั่นคือสิ่งอันดับ((1,2),3)จะถูกแทนU[U[I 1,I 2],I 3]ด้วย ตัวอย่างการใช้งาน: อัตราผลตอบแทนinit.tail.f $ U[U[I 1,I 2],I 3](,)((,)1 2)3



4

GNU sed 149 82 + 2 = 84 ไบต์

+2 ไบต์สำหรับ-rแฟล็ก

y/(),/<>'/
:
s/([^<>']+)'/,\1 /
t
s/ ?<(,+)([^>]+)>/((\1)\2)/
t
s/^.|(\)) |.$/\1/g

ลองออนไลน์!

คำอธิบาย

y/(),/<>'/                   # Replace parens and commas with brackets and apostrophes
:
  s/([^<>']+)'/,\1 /.          # Remove each apostrophe and insert comma after <
  t                            # Branch to : if substitution was made
  s/ ?<(,+)([^>]+)>/((\1)\2)/  # Change <,,,...> to ((,,,)...)
  t                            # Branch to : if substitution was made
s/^.|(\)) |.$/\1/g           # Remove outermost ()s and extra spaces

นี้ล้มเหลวในกรณีที่มีความซับซ้อนมากขึ้นบางอย่างและ((1,(2,3)),4,(5,6)) (1,(2,3),4)
Ørjan Johansen

@ ØrjanJohansenจับได้ดี ฉันจะดูแลอาหารเช้า
Jordan

3

JavaScript, 75 ไบต์

f=a=>`(${t=a.map(x=>'')})${a.map(v=>t=1/v?1/t?' '+v:v:`(${f(v)})`).join``}`

อาร์เรย์อินพุตของจำนวน | อาร์เรย์สตริงเอาต์พุต

ขอบคุณ Neil บันทึก 2 ไบต์


(1/t?' ':0)+v1/t?' '+v:vสามารถ
Neil

2

Mathematica, 94 ไบต์

{"(",","&/@Most@#,")",c=1>0;(xIf[j=ListQ@x,c=j;"("<>#0@x<>")",If[c,c=j;x," "<>x]])/@#}<>""&

ประกอบด้วย unprintable U+F4A1Functionฟังก์ชันในตัวที่ได้

ใช้เวลา Listจำนวนเต็มStrings ถ้าไม่ได้รับอนุญาตนี้สามารถแก้ไขได้โดยการเพิ่ม 10 ไบต์ (รุ่นนี้จะใช้เวลาListของLists / Integers):

{"(",","&/@Most@#,")",c=1>0;(xIf[j=ListQ@x,c=j;"("<>#0@x<>")",If[c,c=j;""," "]<>ToString@x])/@#}<>""&

2

Pip , 45 ไบต์

{Y"()"b:yJ',X#a-1Fcab.:c>0?s.cyJ(fc)bR") "')}

นี่คือฟังก์ชั่นที่รับรายการเป็นอาร์กิวเมนต์ ลองออนไลน์!

แสดงความคิดเห็นรุ่น

; Define an anonymous function (the argument is available inside as the variable a)
{
  ; Yank the string "()" into y variable
  Y "()"
  ; Create a string of len(a)-1 commas, join y on it, and assign to b
  b: y J ',X#a-1
  ; For each item c in a
  F c a
    ; Concatenate to b the following expression
    b .:
      ; Is c integer or list?
      ; (If c is a positive integer, c>0 is true; but if c is a list, c>0 is false)
      c>0 ?
        ; If c is integer, concatenate space followed by c
        s.c
        ; If c is list, call function recursively on c and use the result to join y
        yJ(fc)
  ; Replace ") " with ")" in b and return the resulting string
  b R ") " ')
}

2

JavaScript (ES6), 88 84 ไบต์

f=a=>a.reduce((s,e)=>s+=e[0]?`(${f(e)})`:/\)$/.test(s)?e:' '+e,`(${[...a].fill``})`)

รับอาร์เรย์จำนวนเต็มและอาร์เรย์ แก้ไข: บันทึก 1 ไบต์โดยใช้แทนของทั้งสองที่แยกต่างหากจากการใช้งานs+= s+บันทึกเพิ่มอีก 3 ไบต์ในขณะนี้ซึ่งฉันสามารถลดความซับซ้อนของไตรภาค หากฉันขโมยความคิดของ @ tsh ดังนั้นฉันสามารถลดขนาดลงเหลือ 76 ไบต์:

f=a=>a.reduce((s,e)=>s+=t=1/e?1/t?' '+e:e:`(${f(e)})`,`(${t=a.map(_=>``)})`)

Your program should take either a tuple or a string representing a sugary tupleฉันคิดว่าอาร์เรย์ของอาร์เรย์ / จำนวนเต็มควรจะดี
JungHwan Min

1
แน่ใจว่าได้รับอนุญาต
Wheat Wizard

1

R, 316 ไบต์?

(ต้องออกไปก่อนและไม่แน่ใจว่าวิธีที่เหมาะสมในการนับจำนวนไบต์ ... รวมทั้งไม่ใช่วิธีแก้ปัญหาที่ดี แต่ต้องการโพสต์มันตั้งแต่ฉันใช้เวลาทำให้ ... )

p=function(x){
x=eval(parse(text=gsub("\\(","list(",x)))
f=function(j,r=T){
p=paste
s=if(r){"("}else{"(("}
o=paste0(s,p(rep(",",length(j)-1),collapse=""),")")
n=lengths(j)
for(i in seq_along(n)){
v=j[[i]]
if(n[i]>1){v=f(v,F)}
o=p(o,v)}
if(!r){o=p(o,")")}
o=gsub(" *([()]) *","\\1",o)
return(o)}
f(x)
}

กรณีทดสอบ:

> p("(1,2)")
[1] "(,)1 2"
> p("(1,2,3)")
[1] "(,,)1 2 3"
> p("((1,2),3)")
[1] "(,)((,)1 2)3"
> p("(1,2,3,4)")
[1] "(,,,)1 2 3 4"
> p("(1,(2,3))")
[1] "(,)1((,)2 3)"
> p("(10,1)")
[1] "(,)10 1"

ขนาด 301 ไบต์: ลองออนไลน์!
Laikoni

2
แข็งแรงเล่นกอล์ฟ 261 ไบต์ ผมปล่อยให้คำอธิบายสำหรับสิ่งที่ผมเปลี่ยนแดกดัน แต่ผมยังต้องไป ... แต่ +1 ผมไม่สามารถตัดหัวของฉันรอบนี้เลย; เยี่ยมมาก!
Giuseppe

0

JavaScript (ES6), 72 ไบต์

f=(a,b="",c="")=>a.map?b+"("+a.map(x=>'')+")"+a.map(x=>f(x,"(",")"))+c:a

อินพุต: อาร์เรย์ที่มีตัวเลขและ / หรืออาร์เรย์

เอาท์พุท: สตริง

การใช้งาน: f ([... ])

เสร็จสิ้นกรณีทดสอบทั้งหมดยินดีต้อนรับการปรับปรุง


0

C, 308 หรือ 339 ไบต์

#include <ctype.h>
#define p putchar
f(s,e,c,i,l)char*s,*e,*c;{i=1,l=40;if(*s++==l){p(l);for(c=s;i;i+=*c==l,i-=*c==41,i+*c==45&&p(44),c++);p(41);}for(;s<e;s=c){for(i=0;isdigit(*s);s+=*s==44)for(i&&p(32),i=1;isdigit(*s);s++)p(*s);*s==l&&p(l);for(c=s,i=1;++c,c<=e&&i;i+=*c==l)i-=*c==41;f(s,c-1);*s==l&&p(41);}}
#define g(x) f(x, x+strlen(x))

308 หรือ 339 ไบต์ขึ้นอยู่กับว่าอนุญาตให้ส่งผ่านตัวชี้ไปยังจุดสิ้นสุดของสตริงอินพุตหรือไม่ บรรทัดสุดท้ายมีเพียงเพื่อให้ผ่านตัวอักษรสตริงโดยตรงโดยไม่ต้องคำนวณความยาวของมัน

คำอธิบาย

อัลกอริทึมที่เรียบง่าย มันนับจำนวนเครื่องหมายจุลภาคที่ระดับความลึกปัจจุบันพิมพ์พวกเขาเป็นตัวสร้างสิ่งอันดับจากนั้นตามด้วยอาร์กิวเมนต์ของ tuple หนี (ช่องว่างระหว่างตัวเลขทับซ้อนระหว่างวงเล็บ) ซ้ำ

#include <stdio.h>
#include <ctype.h>
typedef enum { false, true } bool;

void tup2ptsfree(char *s, char *e)
{
  int depth;
  char *c;

  if (*s++ == '(') { /* If we are at the start of a tuple, write tuple function `(,,,)` (Otherwise, we are at a closing bracket or a comma) */
    putchar('(');
    /* do the search for comma's */
    c=s; /* probe without moving the original pointer */
    for (depth=1; depth != 0; c++) {
      if (*c == '(') depth++;
      if (*c == ')') depth--;
      if (*c == ',' && depth == 1) putchar(','); /* We have found a comma at the right depth, print it */
    }
    putchar(')');
  }
  while (s < e) { /* The last character is always ')', we can ignore it and save a character. */
    bool wroteNumber;
    for (wroteNumber=false; isdigit(*s); wroteNumber = true) {
      if (wroteNumber) p(' ');           /* If this is not the first number we are writing, add a space */
      while (isdigit(*s)) putchar(*s++); /* Prints the entire number */
      if (*s == ',') s++;                /* We found a ',' instead of a ')', so there might be more numbers following */
    }
    /* Add escaping parenthesis if we are expanding a tuple (Using a small if statement instead of a large branch to prevent doing the same thing twice, since the rest of the code is essentially the same for both cases). */
    if (*s == '(') putchar('(');
    /* Find a matching ')'... */
    c=s+1;
    for (depth=1; c <= e && depth != 0; c++) {
      if (*c == '(') depth++;
      if (*c == ')') depth--;
    }
    /* Found one */
    /* Note how we are looking for a matching paren twice, with slightly different parameters. */
    /* I couldn't find a way to golf this duplication away, though it might be possible. */
    /* Expand the rest of the tuple */
    tup2ptsfree(s, c-1);
    /* idem */
    if (*s == '(') putchar(')');
    /* Make the end of the last expansion the new start pointer. */
    s=c;
  }
}

#define h(x) tup2ptsfree(x, x+strlen(x))

กรณีทดสอบและการใช้งาน

#include <stdio.h>

#define ARRAYSIZE(arr) (sizeof(arr)/sizeof(*arr))
static char *examples[] = {
  "(1,2)",
  "(10,1)",
  "(1,2,3)",
  "(1,2,3,4)",
  "((1,2),3)",
  "(1,(2,3))",
  "(1,(2,3),4)",
  "((1,2),(3,4))",
  "((1,(2,3)),4,(5,6))",
  "((1,((2,3), 4)),5,(6,7))",
  "(42,48)",
  "(1,2,3,4,5,6,7)"
};

int main(void)
{
  int i;
  for (i=0; i < ARRAYSIZE(examples); i++) {
    printf("%-32s | \"", examples[i]);
    g(examples[i]); /* Test with golfed version */
    printf("\"\n");
    printf("%-32s | \"", examples[i]);
    h(examples[i]); /* Test with original version */
    printf("\"\n");
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.