คำที่มีตัวเลข


20

คำหลักคือคำที่หลังจากลบตัวอักษรบางตัวออกไปคุณจะเหลือหนึ่งหลักเดียว: หนึ่งสองสามสามสี่ห้าหกเจ็ดหรือเก้า (ไม่ใช่ศูนย์)

ตัวอย่างเช่น BOUNCE และประกาศเป็นคำหลักเนื่องจากมีหนึ่งหลัก

ENCODE ไม่ใช่คำหลักแม้ว่ามันจะมี O, N และ E เนื่องจากมันไม่ได้เป็นระเบียบ

เขียนโปรแกรม / ฟังก์ชั่นที่ใช้คำเดียว (ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก - คุณเลือก) เป็นอินพุตหรือพารามิเตอร์และพิจารณาว่าเป็นคำหลักหรือไม่ ทำให้รหัสสั้นที่สุด

หากคำนั้นไม่ใช่คำหลักคุณควรส่งคืนค่า 'ไม่', 0 หรือ 'เท็จ' ใด ๆ (ซึ่งอาจแตกต่างกันไปตามภาษาของคุณ) หากคำนั้นเป็นคำหลักคุณควรเอาท์พุทตัวเลขที่มีอยู่เป็นตัวเลข

คุณสามารถสันนิษฐานได้ว่าไม่มีคำใดที่มีตัวเลขมากกว่าหนึ่งหลักดังนั้นคุณจะไม่มีสิ่งใดที่เหมือน ONFIVE

กรณีทดสอบ

BOUNCE
1

ENCODE
NO

EIGHT
8

BLACKJACK
NO

FABULOUS
NO

EXERCISE
NO

DRIFTWOOD
2

SERVICEMAN
7

INSIGNIFICANCE
9

THROWDOWN
2

ZERO
NO

OZNERO
1

ความท้าทายนี้จะนำมาจาก (และการปรับเปลี่ยนเล็กน้อยมาก) คำถามที่ 1 จากBIO 2009 ส่วนกรณีการทดสอบจะนำมาจากโครงการเครื่องหมาย


3
เป็นสิ่งสำคัญหรือไม่ที่เราจะยอมรับเฉพาะคำที่เป็นตัวพิมพ์ใหญ่หรือเราสามารถเลือกที่จะใช้คำที่เป็นตัวพิมพ์เล็กแทนได้?
Greg Martin

6
NOFELINEVETมีทั้ง 5 และ 9 ... ฉันควรจะคืนอะไร
ติตัส

3
เราสามารถกลับมา0ในกรณีที่ไม่พบตัวเลขแม้ว่ามันจะไม่เป็นเท็จในภาษาที่เลือกหรือไม่?
nimi

@Titus: จากกฎ: "คุณสามารถสันนิษฐานได้ว่าไม่มีคำใดที่มีตัวเลขมากกว่าหนึ่งหลัก"
nimi

@ GregMartin ดีฉันคิดว่ามันไม่ได้เพิ่มอะไรลงไปในความท้าทายดังนั้นใช่อนุญาตให้ใช้ตัวพิมพ์เล็กได้ ฉันเปลี่ยนมันแล้ว
0WJYxW9FMN

คำตอบ:


9

Javascript (ES6), 101 99 ไบต์

f=
s=>-~'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split` `.findIndex(x=>s.match([...x].join`.*`))
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value))>
<datalist id=l><option value=BOUNCE>
<option value=ENCODE>
<option value=EIGHT>
<option value=BLACKJACK>
<option value=FABULOUS>
<option value=EXERCISE>
<option value=DRIFTWOOD>
<option value=SERVICEMAN>
<option value=INSIGNIFICANCE>
<option value=THROWDOWN>
<option value=ZERO>
<option value=OZNERO>


7

PHP> = 7.0, 87 ไบต์

<?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NO

หากแทรกเฉพาะตัวอักษรจากตัวเลขหนึ่งตัวเป็นคำที่ป้อนเสร็จแล้วออกจากโปรแกรมด้วยตัวเลข หรือเปลี่ยนคำสั่งเป็นlevenshtein("DIGIT $argn",IntlChar::charName("$i"),1,1,0)เป็นนับไม่ลบตัวอักษร

levenshtein

IntlChar :: charName

PHP> = 7.0, 112 ไบต์

for(;$i<9;)$r+=++$i*preg_match("#".chunk_split(substr(IntlChar::charName("$i"),6),1,".*")."#",$argn);echo$r?:NO;

IntlChar :: charName

PHP, 128 ไบต์

foreach([ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE]as$v)$r+=++$k*preg_match("#".chunk_split($v,1,".*")."#",$argn);echo$r?:NO;

ลองออนไลน์!

143 Bytes มากกว่า 1 หลัก

foreach([ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE]as$v)$r.=++$k*preg_match("#".chunk_split($v,1,".*")."#",$argn);echo+$r?strtr($r,[""]):NO;

ลองออนไลน์!


1
foreach(...)$r+=++$k*preg_match(...);echo$r?:NO;(-1 ไบต์) chunk_split($v,1,".*")แทนjoin(...)(-2 ไบต์)
ติตัส

@Titus ความคิดที่ดีมากกับการแทนที่ด้วยchunk_splitฉันไม่เคยเห็นมาก่อน คุณควรป้อนข้อมูลในส่วนเคล็ดลับ
JörgHülsermann

ความคิดชั่วร้าย! เพื่อตอบคำถามของคุณ: ฉันจะดูIntlChar::enumCharNames... พรุ่งนี้
ติตัส

2
levenshtein()<?for(;$i++<9;)levenshtein(IntlChar::charName("$i"),"DIGIT $argn",0,1,1)?:die("$i")?>NOดูเหมือนว่าจะทำงาน:
user63956

@ user63956 ความคิดที่ดีขอบคุณ คุณควรเพิ่มเข้าไปในส่วนเคล็ดลับเพื่อค้นหา
ส่วนประกอบ

5

Python 3, 150 ไบต์

from itertools import*;lambda x:([i for i in range(10)if(*' OTTFFSSENNWHOIIEIIEORUVXVGN  ERE EHE  E   NT '[i::9],)in[*combinations(x+'  ',5)]]+[0])[0]

combinationsส่งคืนการรวมกันของสิ่งต่าง ๆ ตามลำดับ มันจะง่ายกว่าถ้ามีหมายเลขที่ตั้งไว้สำหรับพารามิเตอร์ที่สองของcombinationsดังนั้นช่องว่างจะถูกเพิ่มลงในตอนท้ายของสตริงเดิมที่เป็นพารามิเตอร์ของแลมบ์ดาของฉัน นั่นเป็นคำอธิบายง่ายๆว่ารายการของฉันทำงานอย่างไร ถามว่าคุณต้องการคำชี้แจงเพิ่มเติมหรือไม่


5

Mathematica, 83 ไบต์ (การเข้ารหัส WindowsANSI)

±w_:=Rest@Position[Subsets@w~Cases~#&/@Characters@*IntegerName~Array~9,Except@{},1]

นิยามฟังก์ชัน unary ±ที่ใช้รายการของอักขระตัวพิมพ์เล็กเป็นอินพุตและส่งกลับตัวเลขในรูปแบบเช่น{{7}}หรือรายการอื่นที่ว่างเปล่า{}รายการที่ว่างเปล่า ฉันไม่รู้สึกว่าฉันทำสิ่งที่ตีกอล์ฟได้ที่นี่ยกเว้นว่าCharacters@*IntegerName~Array~9จะสร้างชื่อที่ตรงกับหมายเลขที่จะค้นหาโดยไม่ต้องเข้ารหัสยาก

ตัวอย่างการใช้งาน:

±{"i", "n", "s", "i", "g", "n", "i", "f", "i", "c", "a", "n", "c", "e"}

{{9}}อัตราผลตอบแทน


1
แก้ไขเพื่อชี้แจงการใช้งาน
Greg Martin

4

เยลลี่ , 31 28ไบต์

-2 ไบต์ในขณะนี้ที่อินพุตตัวพิมพ์เล็กเป็นที่ยอมรับ

“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»Ḳe€ŒPT

โปรแกรมเต็มรูปแบบที่คาดหวังอินพุตตัวพิมพ์เล็กและพิมพ์ผลลัพธ์โดยใช้ 0สำหรับ

เมื่อลิงก์ monadic รับรายการอักขระจริง ๆ แล้วมันจะส่งคืนรายการจำนวนเต็มซึ่งมีหนึ่ง0ในกรณี falsey, จำนวนเต็มหนึ่งเดียวระหว่าง1และ9รวมในกรณีการใช้งานที่คาดหวังและหลายรายการดังกล่าวในกรณีที่มีมากกว่าหนึ่งหมายเลขใน คำ.

ลองออนไลน์!

อย่างไร?

“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»Ḳe€ŒPT - Main link: list of characters, s
“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»       - dictionary lookup of "one two three four five six seven eight nine"
                      Ḳ      - split on spaces
                         ŒP  - partitions of s
                       e€    - exists in? for €ach
                           T - truthy indexes

คุณใช้สตริงที่บีบอัดได้อย่างไร > _> คอมเพรสเซอร์ของ Lynn ใช้ไม่ได้สำหรับฉันและเคล็ดลับใด ๆ
HyperNeutrino

มุ่งหน้าไปยังห้องแชทของ Jelly และโพสต์ข้อผิดพลาด / ปัญหา
Jonathan Allan

1
ไม่จำเป็นต้องใช้ตัวพิมพ์ใหญ่
Erik the Outgolfer

3

Ruby + to_words : 49 48 + 12 = 61 60 ไบต์

-rto_words -nใช้ธง ใช้คำตัวพิมพ์เล็ก ส่งคืนnilถ้าไม่พบ "หลัก"

-1 ไบต์ตอนนี้อนุญาตให้ป้อนตัวพิมพ์เล็กอนุญาตให้ลบiแฟล็กบน regex

p (1..9).find{|i|$_=~/#{i.to_words.chars*".*"}/}

สำหรับคำตอบทับทิมที่บริสุทธิ์ยิ่งขึ้นโดยไม่มีอัญมณีภายนอกให้ 91 + 1 = 92 ไบต์:

p (1..9).find{|i|$_=~/#{%w"0 ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"[i].chars*".*"}/}

2

05AB1E , 26 ไบต์

ค่า falsy นี่คือ0

æ‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#å1k>

คำอธิบาย:

æ                           # Compute the powerset of the input
 ‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘       # Push "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"
                     #      # Break on spaces
                      å     # Check each for membership
                       1k   # Get the index of 1 in the array (-1 if not found)
                         >  # Increment by one

ใช้การเข้ารหัส05AB1E ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด!


2

Haskell, 113 111 ไบต์

import Data.List
last.((`elemIndices`([]:words"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE"))=<<).subsequences

ลองออนไลน์!

ส่งคืน0ถ้าไม่พบตัวเลข

ค้นหาทุกลำดับของคำที่ป้อนในรายการของตัวเลข เตรียมสตริงว่าง[]ที่ดัชนี 0 ซึ่งเป็นส่วนหนึ่งของทุกลำดับ elemIndicesส่งคืนรายการดัชนีและทำให้=<<แบนเป็นรายการเดียว เลือกดัชนีสุดท้าย


2

JavaScript (ES6), 121 ไบต์

f=
s=>[...s].map(c=>a=a.map(s=>s.slice(s[0]==c)),a=`ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE`.split` `)&&1+a.indexOf(``)
<input oninput=o.textContent=f(this.value)><pre id=o>0

ส่งคืนตัวเลขที่ตรวจพบต่ำสุดหรือ0หากไม่มีการตรวจพบตัวเลข (+6 ถ้าNOจำเป็น)



2

Retina , 160 126 120 ไบต์

O.*N.*E
1
T.*W.*O
2
T.*H.*R.*E.*E
3
F.*O.*U.*R
4
F.*I.*V.*E
5
S.*I.*X
6
S.*E.*V.*E.*N
7
E.*I.*G.*H.*T
8
N.*I.*N.*E
9
\D

ลองออนไลน์!

ส่งคืนสตริงว่างถ้าอินพุตไม่มีตัวเลข

-6 ไบต์ขอบคุณที่@CalculatorFeline


1 ไบต์ประหยัดใช้งาน: ใช้แทน0 NO
CalculatorFeline

@CalculatorFeline หรือแม้กระทั่งสตริงว่างซึ่งเป็น 6 ถ่านบันทึก ขอบคุณ!
eush77

1

PHP, 134 132 128 ไบต์

<?=preg_match(strtr(chunk_split("#(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE",1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO;

เรียกใช้เป็นไพพ์ด้วย-nFหรือลองออนไลน์ลองออนไลน์

สร้าง regex ด้วยคำในวงเล็บ คือแต่ละคำที่Nอยู่ในการNแสดงออกย่อยที่
หากพบคำใด ๆ สตริงที่ตรงกันจะอยู่ใน$m[0]และในNองค์ประกอบที่สามโดยที่องค์ประกอบระหว่างมันจะว่างเปล่าและไม่มีสตริงว่างอยู่ด้านหลัง ie $mมีN+1องค์ประกอบ


ฉันรักมันมาก
JörgHülsermann

1
คุณสามารถบันทึก 3 ไบต์ด้วยความคิดของคุณเองเล็กน้อยปรับปรุง<?=preg_match("#(".strtr(chunk_split(ONE0TWO0THREE0FOUR0FIVE0SIX0SEVEN0EIGHT0NINE,1,".*"),[")|("]).")#",$argn,$m)?count($m)-1:NO; ลองออนไลน์!
JörgHülsermann

คุณสามารถใช้แนวทางใหม่ของฉันได้ไหม?
JörgHülsermann

1

Pythonขนาด 148 ไบต์

from itertools import*
lambda s:[tuple(w)in combinations(s,len(w))for w in("x ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE "+s).split()].index(1)%10

ฟังก์ชั่นที่ไม่มีชื่อการใช้ตัวพิมพ์ใหญ่คำเดียวและส่งกลับจำนวนเต็ม ( 1ถึง9) หรือ0สำหรับNOสำหรับ

ลองออนไลน์!

อย่างไร?

สำหรับสตริงอินพุตsฟังก์ชันลัดเลาะผ่านรายการของสตริงที่: "x", "ONE","TWO" , "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"และs . ตัวเองมองสำหรับการแข่งขันใด ๆ *

การเปรียบเทียบที่ใช้คือสตริงนี้หรือไม่นั้นเป็นสตริงwที่อาจเกิดขึ้นจากการรวมตัวอักษรตามลำดับจากอินพุต ฟังก์ชันcombinationsรับสิ่งเหล่านี้สำหรับเรา (และเฉพาะความยาวที่ต้องการโดยใช้len(w)) แต่อยู่ในรูปของ tuples ดังนั้นสตริงจึงถูกส่งไปยัง tuples สำหรับการเปรียบเทียบ

ของผลลัพธ์ที่ 1101 สำหรับ"x"จะเป็นFalseในขณะที่หนึ่งสำหรับตัวเองจะเป็นs Trueที่"x"นั่นเพื่อให้แน่ใจว่าดัชนีของการแข่งขันด้วยONEผ่านNINEเป็นค่าที่จำเป็น (ตั้งแต่รายการหลาม 0 จัดทำดัชนี) ที่sมีเพื่อให้แน่ใจว่าการเรียกร้องให้index(1)(ตรงกันกับindex(True)) เคยล้มเหลวเมื่อไม่มีคำหลักถูกพบครั้นแล้วเกิด10จะถูกแปลงเป็นกับโมดูโลสิบใช้0%10

* ถ้า sมีช่องว่างด้วยเหตุผลบางอย่างรายการของws จะยาวขึ้น แต่กระบวนการจะยังคงทำงานเนื่องจากการจับคู่คำหลักจะทำงานในลักษณะเดียวกันและหากไม่มีการจับคู่สตริงย่อยการแยกช่องว่างครั้งแรกจากsจะจับคู่อีกครั้ง10และกลับมา0และกลับมา

หากมีคำหลักหลายคำฟังก์ชันจะส่งคืนคำที่น้อยที่สุด


1

Java, 167 153 ไบต์

s->{for(int i=0;i<9;)if(s.matches(".*"+"".join(".*","ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i++].split(""))+".*"))return i;return"NO";}

การใช้งานที่ค่อนข้างไร้เดียงสาจับคู่กับ regex

ทดสอบและไม่ดี

import java.util.function.Function;

public class Main {

  public static void main(String[] args) {
    Function<String, Object> f = s -> {
      for (int i = 0; i < 9;) {
        if (s.matches(".*" + "".join(".*", "ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i++].split("")) + ".*")) {
          return i;
        }
      }
      return "NO";
    };

    String[] tests = {
      "BOUNCE",
      "ENCODE",
      "EIGHT",
      "BLACKJACK",
      "FABULOUS",
      "EXERCISE",
      "DRIFTWOOD",
      "SERVICEMAN",
      "INSIGNIFICANCE",
      "THROWDOWN",
      "ZERO",
      "OZNERO"
    };

    for (String test : tests) {
      System.out.printf("%s%n%s%n%n", test, f.apply(test));
    }
  }
}

ประหยัด

  • 167 -> 153: การเพิ่มประสิทธิภาพที่หลากหลายด้วย @KevinCruijssen

1
คุณจะใช้อาร์เรย์ครั้งเดียวเพื่อให้คุณสามารถใช้"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")[i].split("")โดยตรงในห่วงสำหรับและได้รับการกำจัดและString[]N= ;และคุณสามารถบันทึกเพิ่มอีก 2 ไบต์ได้โดยเปลี่ยนลำดับของ for-loop: for(int i=0;i<9;)ใช้[i++]แทน[i]if-check และกำจัด+1ในทางกลับกัน
Kevin Cruijssen

คุณสามารถบันทึกไบต์อื่นโดยการเปลี่ยนไป"".join s.join
Kevin Cruijssen

1

Bash , 163 ไบต์

a=NO;case $1 in *O*N*E*)a=1;;*T*W*O*)a=2;;*T*H*R*E*E*)a=3;;*F*O*U*R*)a=4;;*F*I*V*E*)a=5;;*S*I*X*)a=6;;*S*E*V*E*N*)a=7;;*E*I*G*H*T*)a=8;;*N*I*N*E*)a=9;;esac;echo $a

ลองออนไลน์!

a=NO;
case $1 in
 *O*N*E*)a=1;;
 *T*W*O*)a=2;;
 *T*H*R*E*E*)a=3;;
 *F*O*U*R*)a=4;;
 *F*I*V*E*)a=5;;
 *S*I*X*)a=6;;
 *S*E*V*E*N*)a=7;;
 *E*I*G*H*T*)a=8;;
 *N*I*N*E*)a=9;;
esac;
echo $a

ไม่ทราบ RETINA แต่ดูเหมือนจะเป็นคำตอบนั้น


พยายามลด*ด้วยj=0;for i in ONE TWO .. ; do ((j++)); printf "%s)a=%s;;" $(sed 's/./\*&\*/g' <<<$i) $j ; done แต่จะยาวกว่า
marcosm

0

Javascript, 121 ไบต์

(s,a=0)=>'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split``.map((p,i)=>RegExp(p.split``.join`.*`).exec(s)?a=i+1:0)&&a

หรือ 116

(s,a=0)=>' ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split` `.map((p,i)=>a|=~s.search(p.split``.join`.*`)&&i)&&a

แต่เพียงรีไซเคิลวัสดุ ณ จุดนี้


0

Pyth, -44- 41 ไบต์

+1xm}dyQc."EX%~)Û#lº,îQÓCe¯4Aô4"\P1

รับสตริงที่มีเครื่องหมายคำพูดเอาต์พุต 0 สำหรับ NO

ลองมัน!

คำอธิบาย

+1xm}dyQc."EX%~)Û#lº,îQÓCe¯4Aô4"\P1
         ."EX%~)Û#lº,îQÓCe¯4Aô4"      # Compressed string: "ONEPTWOPTHREEPFOURPFIVEPSIXPSEVENPEIGHTPNINE" (P is close to the other letters, makes the compression better)
        c                       \P    # split on P: ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
   m                                  # map over this list (variable: d)
    }dyQ                              # is d a (ordered) subset of the input (Q)? (= element of the powerset)
  x                                1  # get the index of the first true
+1                                    # add one, because the list was indexed at 0 and conveniently -1 (not found) becomes 0 

0

Java, 254 ไบต์

int g(String a,String b){int i=0,p=0;for(char c:a.toCharArray()){p=i;i=b.indexOf(c);if(i<=p)return 0;}return 1;}
String f(String a){String[]T={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};for(String t:T)if(g(t,a)>0)return t;return"NO";}

ลองออนไลน์

boolean g(String a,String b)
{
    int i = 0, p = 0;
    for(char c:a.toCharArray())
    {
        p = i;
        i = b.indexOf(c);
        if(i <= p) return false;
    }
    return true;
}

String f(String a)
{
    String[]T={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};
    for(String t:T)if(g(t,a))return t;
    return"NO";
}


0

Python 2, 155 ไบต์

import re;lambda k:next((i for i,j in enumerate([re.search('.*'.join(list(s)),k)for s in'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()])if j),-1)+1

ฟังก์ชั่นที่ไม่ระบุชื่อค้นหากลุ่ม regex ไม่ใช่ทางออกที่ดีที่สุดใน Python แต่เป็นทางเลือกอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.