ท้าทาย
เขียนโปรแกรมที่ได้รับสตริงxซึ่งเป็น 10 ตัวอักษรและตัวอักษรy, เอาท์พุทของตัวละครจำนวนครั้งที่เกิดขึ้นในสตริงyx
โปรแกรมที่สั้นที่สุดในหน่วยไบต์เพื่อให้ชนะ
ตัวอย่าง
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
เขียนโปรแกรมที่ได้รับสตริงxซึ่งเป็น 10 ตัวอักษรและตัวอักษรy, เอาท์พุทของตัวละครจำนวนครั้งที่เกิดขึ้นในสตริงyx
โปรแกรมที่สั้นที่สุดในหน่วยไบต์เพื่อให้ชนะ
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
คำตอบ:
/ww
ตัวอย่างการเรียกใช้:
$ pyth -c '/ww'
sdhkfhjkkj
k
3
แน่นอนผู้ใช้สามารถป้อนมากกว่าหรือน้อยกว่า 10 ตัวอักษรในการป้อนข้อมูลครั้งแรก แต่เราไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อผู้ใช้ละเมิดข้อกำหนด
/เพียงแค่นับจำนวนที่เกิดขึ้นในสายอักขระแรกของสายอักขระที่สอง wรับสายอินพุต
คำตอบ Pyth ที่ต่างกันและชัดเจนน้อยกว่าในขนาดเดียวกัน มันพับนับมากกว่าอินพุต
/FQ
Test Suite
(p=prompt)().split(p()).length-1
x=${1//[^$2]}
echo ${#x}
วิ่งตัวอย่าง:
bash-4.3$ bash letter-count.sh tttggloyoi t
3
bash-4.3$ bash letter-count.sh onomatopoe o
4
(.)(?=.*\1$)
เพียง regex ที่ตรงกับตัวละครซึ่งเท่ากับตัวอักษรตัวสุดท้ายในการป้อนข้อมูล (ยกเว้นตัวเอง) เมื่อได้รับ regex เพียงครั้งเดียว Retina ก็จะคืนค่าจำนวนการแข่งขัน
),}{)-
@ , +);__
!-`{:}
สิ่งนี้จะอ่านอักขระตัวเดียวก่อนตามด้วยสตริงที่จะนับและสมมติว่าไม่มีค่า null-bytes ในสตริง
รหัสเริ่มต้นด้วย),}ซึ่งตั้งค่าด้านล่างของสแต็คไป1อ่านตัวอักษรตัวแรกและย้ายไปที่สแต็คเสริมสำหรับการใช้งานในอนาคต 1จะเป็นเคาน์เตอร์ของเรา (offset ของ 1 จะถูกยกเลิกในภายหลังและเป็นสิ่งที่จำเป็นสำหรับ IP เพื่อผลัดที่จำเป็น)
IP ,ที่ตอนนี้จะย้ายลงเพื่ออ่านตัวอักษรตัวแรกของสตริงค้นหาด้วย ค่าจะถูกทำให้ไร้ผลด้วย`เพื่อให้ได้พฤติกรรมการเลี้ยวที่ถูกต้อง ขณะที่เรากำลังอ่านตัวละครจาก STDIN ตอนนี้ IP จะติดตามวงนี้:
}{)-
, +);__
`{:}
{:}สร้างสำเนาของรหัสอักขระที่เก็บไว้และ+เพิ่มลงในค่าปัจจุบัน หากผลเป็น0(เช่นตัวละครในปัจจุบันเป็นหนึ่งที่เรากำลังมองหา) ย้ายทรัพย์สินทางปัญญาตรงไปข้างหน้า: -เพียงแค่ได้รับกำจัดของ0, )การเพิ่มขึ้นนับ{}เป็น no-op
อย่างไรก็ตามหากผลลัพธ์หลังจาก+นั้นไม่ใช่ศูนย์เราไม่ต้องการนับอักขระปัจจุบัน ดังนั้น IP จะเลี้ยวขวาแทน นั่นเป็นจุดสิ้นสุดดังนั้นโค้ดนั้นจะถูกดำเนินการสองครั้งหนึ่งครั้งส่งต่อและย้อนกลับหนึ่งครั้ง );___;)+-){}นั่นคือรหัสที่เกิดขึ้นจริงในกรณีนี้จะกลายเป็น );เพิ่งกำจัดความแตกต่างที่ไม่เป็นศูนย์___กด 3 ศูนย์ แต่;จะทิ้งหนึ่งในนั้น )หนึ่งในการเพิ่มขึ้นของทั้งสองที่เหลืออีกสองเลข+เพิ่มให้เป็นหนึ่งเดียว1, -หักได้จากเคาน์เตอร์และ)เพิ่มขึ้นทีละเคาน์เตอร์ ในคำอื่น ๆ เราได้สร้างไม่มี -op ซับซ้อนมาก
เมื่อเราตี EOF, ,ผลักดัน-1ซึ่ง`จะกลายเป็น1และ IP ยิงเลี้ยวขวา -ลบออก1จากตัวนับ (การยกเลิกออฟเซ็ตเริ่มต้น) !พิมพ์ตัวนับและ@ยุติโปรแกรม
print(input().count(input()))
นี่มันง่ายนะ สมมติว่าอินพุตเป็นสตริงตัวอักษรสิบตัว
f=lambda x,y:x.count(y)สั้นลงไหม? (ขออภัยหากไม่ได้ผลผมบนโทรศัพท์มือถือและไม่สามารถตรวจสอบ)
print input().count(input())หรือa,b=input();print a.count(b)ในจำนวนเดียวกัน
~vgvgaSaLNdEtSsP
น่าแปลกที่สั้น คำอธิบาย:
~ make all vars active (even though we only need two, we don't really care)
vgvg get two lines of input
aS split first line on second line
aL length of the new array
NdE decrement (because ex. "axbxc""x"aS -> ["a" "b" "c"] which is length 3)
tSsP to-string and print
เพียงเพื่อหัวเราะคิกคัก
ขอบคุณที่อดีตบาร์ตสำหรับการเล่นกอล์ฟลง!
template<int w,int x,int y,int...s>class A:A<w+(x==y),x,s...>{};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;
การใช้งาน: อักขระตัวแรกในการติดตั้งเทมเพลตคืออักขระที่จะค้นหา
สอดคล้องกับclang -std = c ++ 11 -c -> ผลลัพธ์อยู่ที่จุดเริ่มต้นของข้อความแสดงข้อผิดพลาด
Occurences.cpp:1:66: error: too few template arguments for class template 'A'
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};
^
Occurences.cpp:1:66: note: in instantiation of template class 'A<3, 't', '\x00'>' requested here
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};
สอดคล้องกับgcc -std = c ++ 11 -c -> ผลลัพธ์อยู่ที่ด้านล่างของข้อความแสดงข้อผิดพลาด
Occurences.cpp: In instantiation of ‘const int A<3, 't', '\000'>::a’:
Occurences.cpp:1:64: recursively required from ‘const int A<1, 't', 't', 't', 'g', 'g', 'l', 'o', 'y', 'o', 'i', '\000'>::a’
Occurences.cpp:1:64: required from ‘const int A<0, 't', 't', 't', 't', 'g', 'g', 'l', 'o', 'y', 'o', 'i', '\000'>::a’
Occurences.cpp:2:62: required from here
Occurences.cpp:1:64: error: wrong number of template arguments (2, should be at least 3)
ค้นหา A < 3 , 't', '\ 000'> และ A < 3 , 't', '\ x00'>
รุ่น 154 ไบต์
template<int w,char x,char y,char...s>class A{static const int a=A<w+(x==y),x,s...>::a;};
int a=A<0,'t','t','t','t','g','g','l','o','y','o','i','\0'>::a;
รุ่น 160 ไบต์:
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};
int a=A<0,'t','t','t','t','g','g','l','o','y','o','i','\0'>::a;
((x==y)?1:0)ให้เหลือเพียง(x==y)ประมาณ 6 ไบต์ (ฉันคิดว่า)
boolถึงintการเปลี่ยนใจอย่างไร
enum static constใช้0แทน'\0'การยกเลิก ใช้แทนint charใช้การประกาศที่แตกต่างกันเล็กน้อยเพื่อทำการติดตั้ง ลบบรรทัดใหม่ superflouos template<int w,int x,int y,int...s>class A{enum{a=A<w+(x==y),x,s...>::a};};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;. ตรวจสอบกับ g ++ และเสียงดังกราว
grep -o "$1"<<<"$2"|wc -l
(a,b)=>a.split(b).length-1
โซลูชัน quick'n'easy นี้กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ หากต้องการใช้งานให้เพิ่มการประกาศตัวแปรไปยังจุดเริ่มต้น ลองดูสิ:
แก้ไข:โอ้ฉันเห็นว่ามีวิธีแก้ปัญหาที่คล้ายกันมากอยู่แล้ว ฉันหวังว่าไม่เป็นไร
a!b=sum[1|x<-a,x==b]
int main(int,char**v){int c=0,i=0;while(i<10)v[1][i++]==*v[2]&&++c;return c;}
โทรแบบนี้:
$ g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out tttggloyoi t; echo $?
3
__);11'[)\
~="0 1@][+]`
ขึ้นบรรทัดใหม่เป็นส่วนหนึ่งของโปรแกรม ฉันกำลังจริงใช้มันเป็นชื่อตัวแปร
โดยทั่วไปโปรแกรมนี้จะทำงานโดยเก็บอักขระเป้าหมายไว้ในตัวแปรโดยรักษาสตริงปัจจุบันไว้ที่ด้านบนสุดของสแต็กจากนั้นวนลูป "สับเปรียบเทียบและย้ายผลลัพธ์ภายใต้กระบวนการ" เพิ่มผลลัพธ์ในท้ายที่สุด
การขึ้นบรรทัดใหม่ในชื่อตัวแปรมาจากการใช้การขึ้นบรรทัดใหม่ที่ส่วนท้ายของอินพุตโดยการตัดมันและเก็บไว้ในนั้น บรรทัดใหม่ในรหัสคือที่ฉันอ่านจากมัน
อินพุตเป็นดังนี้:
qqqqwwweee
q
ผลผลิตเป็นเช่นนี้
4
f(s,c)=endof(findin(s,c))
findinฟังก์ชันส่งกลับดัชนีในอาร์กิวเมนต์แรกที่อาร์กิวเมนต์ที่สองพบเป็นเวกเตอร์ ความยาวของเวกเตอร์คือจำนวนครั้งที่เกิดขึ้น
บันทึกหนึ่งไบต์ต้องขอบคุณ Glen O.
endoflengthจะช่วยให้คุณประหยัดไบต์ในสถานที่ของ
+/⍷
สิ่งนี้จะสร้างฟังก์ชั่นรถไฟ มันทำงานได้โดยการสร้างเวกเตอร์ของศูนย์และคนที่สอดคล้องกับดัชนีที่ตัวละครที่ปรากฏในสตริง ( ⍷) จากนั้นจะรวมเวกเตอร์ ( +/)
บันทึกแล้ว 4 ไบต์ด้วย kirbyfan64sos และ NBZ!
+/⍷นั้น (ฉันไม่รู้ APL ดังนั้นฉันอาจผิด)
(13 ตัวอักษรรหัส + 3 ตัวเลือกบรรทัดคำสั่ง)
$_=0+s/$^I//g
วิ่งตัวอย่าง:
bash-4.3$ perl -it -pe '$_=0+s/$^I//g' <<< tttggloyoi
3
bash-4.3$ perl -io -pe '$_=0+s/$^I//g' <<< onomatopoe
4
bash-4.3$ perl -i5 -pe '$_=0+s/$^I//g' <<< 1234
0
<>!
-lecho -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
perl -pe '$_+=s/${\<>}//g'
+=จำเป็น? =ดูเหมือนว่าจะใช้งานได้เช่นกัน (และควรจะยังคงทำงานได้เมื่ออินพุตเริ่มต้นด้วยตัวเลขบางหลัก)
<?=substr_count($argv[1],$argv[2]);
การใช้งาน:
เรียกใช้สคริปต์ด้วยอาร์กิวเมนต์สองตัว
php script.php qwertzqwertz q
หากคุณลงทะเบียนตัวแปรทั่วโลก (เป็นไปได้เฉพาะใน PHP 5.3 และด้านล่าง) คุณสามารถบันทึก 12 ไบต์ (ขอบคุณMartijn )
<?=substr_count($a,$b);
การใช้งาน:
เรียกใช้สคริปต์และประกาศตัวแปรกลางphp script.php?a=qwertzqwertz&b=q
script.php?a=qwertzqwertz&b=qและทำ<?=substr_count($a,$b);23 ตัวอักษร
+/=
Ie "ผลรวมของจำนวนไบต์ที่เท่ากัน" เช่น:
f ← +/=
'onomatopoe' f 'o'
4
หรือเพียงแค่
'onomatopoe'(+/=)'o'
4
K ไม่ชนะ APL ในเวลานี้
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
ความแตกต่างระหว่างสตริงอินพุตและสตริงที่ลบอักขระออกไปอย่างง่ายดาย รับอินพุตจากตาราง t
แก้ไขการเปลี่ยนแปลงเพื่อลบปัญหาการนับช่องว่างและนำเข้าบัญชีที่ยอมรับได้ในปัจจุบันสำหรับ SQL ขอบคุณ @BradC สำหรับการเปลี่ยนแปลงและการออมทั้งหมด
SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM tที่t เป็นตารางการป้อนข้อมูลก่อนที่มีประชากรที่มีเขตข้อมูลและs c
A B C D จุดสิ้นสุดในช่องว่าง (ถ้าคุณถูกขอให้นับช่องว่าง) เนื่องจากLENละเว้นช่องว่างต่อท้าย
spaceปัญหาเมื่อฉันมีเวลานิดหน่อย
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
sum(input('','s')==input('','s'))
+/@:=
ฉันรู้สึกเหมือนว่า J จะมี built-in สำหรับสิ่งนี้ แต่ฉันไม่สามารถหาได้ - บางทีหนึ่งในผู้ใช้ J ที่ใช้งานสามารถสอนฉัน ดังนั้นแทนที่จะนี้เป็นครั้งแรกใช้=ปัจจัยการผลิตที่เปลี่ยนลงไปในตัวละครแต่ละตัว1ถ้ามันเท่ากับขอหนึ่งหรือ0มิฉะนั้น จากนั้น+/คำนวณผลรวมของรายการนั้น
เพราะฉันเป็นนักทำโทษ ...
SET c=0
SET e=_
SET t=%1%%e%
:l
SET a=%t:~0,1%
IF "%a%"=="%2" SET /A c+=1
SET t=%t:~1%
IF NOT "%t%"=="%e%" GOTO l
ECHO %c%
_ไม่มีสิ่งใดเกิดขึ้นในสายป้อนข้อมูล ถ้าเป็นเช่นนั้นตัวแปรeจะต้องมีการปรับอย่างเหมาะสมสิ่งนี้จะตั้งค่าตัวแปรตัวนับของเราcและการแบ่งส่วนจุดสิ้นสุดของสตริงเป็น_ก่อนที่จะต่อท้ายนั้นกับสตริงอินพุตของเรา%1และตั้งค่าสตริงที่ต่อtกันเป็น จากนั้นเรากำลังป้อนห่วง:lเราตั้งตัวแปรตัวละครชั่วคราวaจะเป็นอักษรตัวแรกของtตรวจสอบว่าตรงกับสายป้อนที่สองของเรา%2และเพิ่มขึ้นถ้าเป็นจริงแล้วตัดตัวอักษรตัวแรกออกจากc tเงื่อนไขสิ้นสุดการวนรอบtของเราจะตรวจสอบกับการแบ่งเขตการสิ้นสุดของสตริงและวนกลับถ้าไม่ จากนั้นเราก็echoออกค่าของเคาน์เตอร์ของเรา
อาจเป็นไปได้ที่จะใช้การFORวนซ้ำแทน แต่นั่นจะทำให้การเปิดใช้งานการหน่วงเวลาล่าช้าซึ่งฉันคิดว่าจริง ๆ แล้วจะต้องใช้เวลานานกว่าไบต์ การตรวจสอบของที่เหลือเป็นแบบฝึกหัดให้ผู้อ่าน
ll/,(
l e# read x
l e# read y
/ e# split x by y
, e# count
( e# subtract one
สี่ต่อหนึ่ง! และพวกมันก็มีความยาวเท่ากัน! :)
($args[0]-split$args[1]).Count-1
หรือ
param($a,$b)($a-split$b).Count-1
อีกวิธีหนึ่งคือ
$args[0].Split($args[1]).Count-1
หรือ
param($a,$b)$a.Split($b).Count-1
สองสไตล์แรกใช้ตัวดำเนินการอินไลน์-splitในขณะที่สองสองสไตล์จะใช้อาร์กิวเมนต์แรกเป็นสตริงและใช้ตัวดำเนินการ.Split()แบบอิงสตริง ในทุกกรณีอาเรย์จะถูกส่งกลับโดยที่เราจะต้องลดจำนวนลงทีละหนึ่งเนื่องจากเราได้รับไอเท็มอาเรย์มากกว่าหนึ่งรายการที่เกิดขึ้นจากอาร์กิวเมนต์ที่สอง
อันนี้สนุกนะ ...
f(s,c)=sum(i->c==i,s)
โปรดทราบว่ามันต้องcมีลักษณะเป็นอักขระไม่ใช่อักขระตัวเดียว ดังนั้นคุณใช้มันเป็นf("test me",'e')(ซึ่งผลตอบแทน 2) และไม่f("test me","e")(ซึ่งผลตอบแทน 0 เพราะ'e'!="e")
0&v
=?\ilb
=?\:@=&+&l1
n&/;
รับสตริงจากนั้นอักขระที่จะนับ การป้อนข้อมูลไม่ได้แยก (อย่างน้อยในล่ามออนไลน์) ลองใช้กับล่ามออนไลน์: http://fishlanguage.comฉันนับไบต์ด้วยมือดังนั้นให้ฉันรู้ว่าฉันผิด
คำอธิบาย
ก่อนอื่น> <> คือ 2 มิติและลูปผ่านเส้นหรือคอลัมน์จนกว่าจะถึง a ;ข้อผิดพลาดหรือ ซึ่งหมายความว่าหากดำเนินการจากซ้ายไปขวา (เช่นเดียวกับที่เริ่มต้นของโปรแกรม) มันจะล้อมรอบบรรทัดหากถึงจุดสิ้นสุดและจะไม่ถูกย้ายหรือถูกบอกให้หยุดโปรแกรม อักขระบางตัวต่อบรรทัดจะถูกทำซ้ำเพราะมีฟังก์ชั่นที่แตกต่างกันขึ้นอยู่กับทิศทางของตัวชี้และบรรทัดที่สี่จะมีตัวอักษรในลำดับย้อนกลับเนื่องจากตัวชี้ย้ายจากขวาไปซ้าย
บทสรุปของโปรแกรมมีให้ด้านล่าง ดูคำแนะนำในรายการสำหรับ> <> บน esolangsเพื่อดูว่าแต่ละตัวละครทำอะไร
บรรทัด 1: 0&v
0&v -put 0 into the register and change direction to down-up
บรรทัด 2: =?\ilb
(เริ่มต้นที่บรรทัดที่ 1 เลื่อนตัวชี้ไปที่นั่นคืออักขระที่สาม)
\ -reflect the pointer and make it move left-right
i -read input
lb=?\ -reflect downwards if there are 11 values in the stack
บรรทัด 3: =?\:@=&+&l1
(เริ่มต้นที่ตัวละครที่สาม)
:@ -duplicate y and shift the stack e.g. ['x','y','y'] -> ['y','x','y']
=&+& -increment the register if the character popped from x = y
l1=?\ -reflect downwards if there is 1 value in the stack
บรรทัด 4: n&/;
(เริ่มต้นที่ตัวละครที่สาม)
/ -reflect right-left
&n; -print value of the register
p gets.count(gets)-1
ตัวอย่าง: http://ideone.com/MEeTd2
-1เป็นเพราะความจริงที่ว่าgetsดึงอินพุตบวกอักขระ newline Ruby String#countนับจำนวนครั้งที่มีอักขระจากการโต้แย้งเกิดขึ้นในสตริง
ตัวอย่างเช่นสำหรับการป้อนข้อมูล [ test\n, t\n] การtเกิดขึ้นสองครั้งและการ\nเกิดขึ้นครั้งเดียวและจะต้องถูกลบออก
$><<และลดขนาด 4 ไบต์
p gets.count(gets)-1
->s,c{p s.count c}
->s,c{p s.count c}.call 'tttggloyoi', 't'
->s,c{p s.count c}.call 'onomatopoe', 'o'