แปลง 1, 2, 3, 4, 5, 6, 7, 8, และ 9 เป็น“ หนึ่ง”,“ สอง”,“ สาม” ฯลฯ


47

ผู้ชนะ: คำตอบทุบตีของ professorfish ! ทั้ง 9 ไบต์! ว้าว!

คุณสามารถส่งคำตอบของคุณต่อไปได้ แต่คุณจะไม่สามารถชนะได้อีกต่อไป โพสต์ต้นฉบับเก็บไว้สำหรับลูกหลาน:


เป้าหมายของคุณคือการแปลงจำนวนเต็มระหว่าง 1-9 เป็นคำที่แสดง

  • คุณไม่จำเป็นต้องกังวลเรื่องทศนิยม
  • ผู้ใช้จะป้อนหมายเลข สมมติว่าพวกเขาจะไม่ป้อนอะไร 10 หรือสูงกว่า
  • ผู้ใช้ต้องพิมพ์ตัวเลขในบางจุดอย่างไรก็ตามวิธีการที่โปรแกรมอ่านไม่สำคัญ มันอาจจะเป็นกับ stdin อ่านไฟล์ข้อความ ฯลฯ อย่างไรก็ตามผู้ใช้จะต้องกดปุ่ม 9 บนแป้นพิมพ์ของพวกเขา (ตัวอย่าง) ในบางจุด
  • ไม่คำนึงถึงขนาดตัวพิมพ์ (เช่น "หนึ่ง", "หนึ่ง", "oNe", "OnE" และอื่น ๆ ทั้งหมดเป็นที่ยอมรับได้)
  • อนุญาตให้ใช้คำขอ HTTP / etc อย่างไรก็ตามโค้ดใด ๆ ที่ดำเนินการโดยเซิร์ฟเวอร์จะทำการนับจำนวนไบต์ของรหัสสุดท้ายของคุณ (เช่นถ้าฉันมีโปรแกรม C ++ ทำการร้องขอ HTTP, โค้ด PHP ที่ใช้ในการนับคำขอ HTTP )
  • สิ่งใดก็ตามที่สามารถคอมไพล์และรันได้นั้นยอมรับได้

  • การประกวดนี้สิ้นสุดลงเมื่อ 27 มิถุนายน 2014 (7 วันนับจากการโพสต์)
  • นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ

2
ช่องว่างต่อท้าย (เช่นone ) ยอมรับได้หรือไม่?
GRC

1
@grc ใช่ตราบใดที่โปรแกรมแสดงผลลัพธ์ออกมา
Jon

1
คุณควรระบุว่าจะพิมพ์เฉพาะจำนวนที่กำหนดและไม่ใช่ตัวเลขอื่น
Pinna_be

1
@Pinna_be สำหรับตัวอย่างเช่นถ้าผมป้อนข้อมูล3คุณไม่สามารถส่งออกone two three four five six seven eight nineแม้ว่าคุณในทางเทคนิคthreeเอาท์พุท ในทำนองเดียวกันคุณไม่สามารถส่งออกthree sevenฯลฯ
Jon

1
คำถามนี้ค่อนข้างดี แต่ฉันไม่ชอบการเพิ่มขีด จำกัด วันที่ โดยเฉพาะอย่างยิ่งขีด จำกัด วันที่ได้รับการเพิ่มก่อนกำหนดวันที่ไม่ใช่ 7 วันก่อน
Nicolas Barbulesco

คำตอบ:


19

Bash (with bsdgames), 9

number -l

อ่านจากอินพุตมาตรฐาน

ฉันไม่รู้ว่าทำไมถึงมีประโยชน์สำหรับเรื่องนี้ แต่อย่างใด


2
ฉันไม่แน่ใจว่าฉันชอบติดตั้ง bsdgames แล้วเรียกมันว่า "bash" แม้ว่าฉันจะยอมรับว่าการจองของฉันเป็นเรื่องส่วนตัว
พอลเดรเปอร์

@ PaulDraper ทั้งฉันฉันไม่ได้โพสต์สิ่งนี้เป็นคำตอบที่จริงจังฉันคิดว่าหนึ่งในคำตอบอื่น ๆ ที่สมควรได้รับการยอมรับ

5
นี่ไม่ใช่ช่องโหว่มาตรฐานใช่หรือไม่
Justin

2
@ Quincunx ใช่มันเป็นพื้น แม้ว่าสิ่งต่าง ๆ ส่วนใหญ่จะเป็นยูทิลิตี้ภายนอกใน Bash แต่ฉันก็ไม่นับแพ็คเกจ bsdgames ว่าเป็นสิ่งที่ได้รับอนุญาต (ไม่เหมือนกับ grep, wget, coreutils, sed, bc ... )

132

Python 2, 64

print' ottffssennwhoiieiieoruvxvgn  ere ehe  e   nt'[input()::9]

นี่คือลักษณะของสตริงที่มีช่องว่างพิเศษ (ลองอ่านในแนวตั้ง):

o t t f f s s e n
n w h o i i e i i
e o r u v x v g n
    e r e   e h e 
    e       n t

ตามที่อธิบายไว้ในความคิดเห็นด้านล่าง[input()::9]เริ่มต้นที่ดัชนีที่กำหนดและเลือกตัวละครที่ตามมาทุกเก้า


9
โอ้ฉันเป็นแบบนี้ น่าจะเป็นสิ่งที่ชี้ให้เห็นว่านี่คือไพ ธ อน 2 ตามทาง
undergroundmonorail

3
โปรดอธิบาย! :)
Christofer Ohlsson

6
@ChristoferOlsson input()::9เป็นช่วงจากinput()ถึงจุดสิ้นสุดของสตริงในขั้นตอนของ9เช่น1,10,19,28,37หรือ3,12,21,30,39ซึ่งเป็นดัชนีที่พบตัวอักษรสำหรับคำที่สอดคล้องกัน
Martin Ender

1
@ m.buettner ขอบคุณ! เยี่ยมมาก
Christofer Ohlsson

6
นี่ไม่ใช่สิ่งที่เหมือนกับรหัสรถไฟรั้วใช่ไหม (+1 สำหรับวิธีการแก้ปัญหาที่เป็นไปตามทาง)
Lou

18

Common Lisp - 22 ไบต์

นี่คือทั่วไปหนึ่ง (ไม่เพียงสำหรับหนึ่ง - สิบ):

(format nil"~R"(read))

โอ้คุณต้องการเลข (แรก, สอง, ... สามร้อย ... )? ตกลง!

(format nil"~:R"(read))

10
นี่ไม่ใช่ช่องโหว่มาตรฐานใช่หรือไม่
Seequ

2
ช่องโหว่ในสิ่งที่เหมาะสม? มันกำหนดไว้อย่างชัดเจนใน Hyperspec: lispworks.com/documentation/lw50/CLHS/Body/22_cba.htm
filcab

10

3
ไม่ว่าจะเป็นช่องโหว่มาตรฐานหรือไม่มันเป็นสิ่งที่ฉันมาที่นี่เพื่อโพสต์ด้วย +1 :)
Joshua Taylor

5
@TheRare ดูความคิดเห็นต่อคำตอบนั้นฉันไม่คิดว่ามีฉันทามติของชุมชนที่เข้มแข็งว่านี่เป็นช่องโหว่ ความรู้สึกของฉันคือคำถามต้องระงับการใช้งานฟังก์ชั่นประเภทนี้อย่างชัดเจนหากไม่ควรใช้
Digital Trauma

16

ทุบตี 51

ดังนั้นฉันจึงสร้างอีกแนวคิดหนึ่งโดยใช้ความคิดที่สองของฉันบวกกับความช่วยเหลือจากผู้อื่น:

set one two three four five six seven eight nine

$X

ที่ 'X' คือหมายเลขที่คุณต้องการ


BASH 48 (67)

67 มี\nตัวแบ่งบรรทัด

ฉันไม่แน่ใจว่าทั้งหมดนี้นับเพราะอ่านจากไฟล์ แต่:

sed -n Xp a

โดยที่ "X" คืออินพุตและaไฟล์อยู่ที่ไหน:

one
two
three
four
five
six
seven
eight
nine

ไฟล์คือ 36 ตัวอักษรและคำสั่ง bash คือ 13

มันทำงานอย่างไร:

แต่ละบรรทัดในไฟล์จะถูกกำหนดหมายเลขเริ่มต้นด้วย 1 ดังนั้น 'หนึ่ง' จึงอยู่บนบรรทัดที่ 1 'สอง' ในวันที่ 2 คำสั่งsed -n 'Xp' aกล่าวว่า "โปรดพิมพ์สิ่งที่อยู่ในรายการ 'X' ของไฟล์ 'a'" sedเป็นเครื่องมือแก้ไข Unix -nหมายถึงเงียบหรือไม่สนใจสิ่งอื่นเป็นหลัก Xpหมายถึงพิมพ์สิ่งที่อยู่ในบรรทัด 'X'


2
คำตอบแรกที่ดี! ขอบคุณที่สละเวลาหาวิธีที่เราจัดรูปแบบคำตอบของเราในเว็บไซต์นี้ ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ!
จัสติน

2
คุณไม่ได้นับ linefeeds aค่ะ
Dennis

1
หนึ่งไบต์น้อยกว่าก่อนยอมรับอาร์กิวเมนต์บรรทัดคำสั่งและไม่ต้องการไฟล์เพิ่มเติม: pastebin.com/qdbXKQGP Bash จะบ่นเกี่ยวกับตัวคั่น heredoc ที่หายไป แต่จะทำงานได้ดีกับ Dash และ Zsh
Dennis

1
@Dennis oh cool ฉันชอบมัน ฉันควรจะแก้ไขคำตอบของคุณกับคุณตอนนี้หรือไม่? ขออภัยฉันยังไม่คุ้นเคยกับ code golf
Eric Lagergren

1
คุณสามารถละเว้น'คำพูด คุณสามารถลองใช้สตริงที่นี่แทนไฟล์ภายนอก แต่คุณควรนับการขึ้นบรรทัดใหม่ในไฟล์ของคุณจริงๆ
Digital Trauma

16

C # - 127 (86/46)

ถ้าคุณใช้ส่วนที่ปฏิบัติการได้เท่านั้น ...

Console.Write(((HourOfDay)Console.Read()-48));

และหากHourOfDayจะเป็นส่วนหนึ่งของ System namespace คุณจะต้องมี 46 ตัวอักษร น่าเสียดายที่มันอยู่ในSystem.DirectoryServices.ActiveDirectoryที่ที่ทำให้ 86 ... เสียงรบกวนอื่นทำลายมัน

สิ่งนี้สามารถคอมไพล์ได้และรันได้จาก commandline (127 chars):

using System;class P{static void Main(){Console.Write((System.DirectoryServices.ActiveDirectory.HourOfDay)Console.Read()-48);}}

หากบันทึกลงในไฟล์ชื่อ cg2.cs

csc cg2.cs /r:System.DirectoryServices.dll  && cg2

มันทำงานอย่างไร

HourOfDay เป็นประเภท enum เพื่อให้เราสามารถใช้ชื่อแทนค่าคงที่เวทมนตร์ ประเภท Enum มีการใช้งาน ToString () ที่ให้ชื่อของค่าแก่คุณ คุณสามารถส่ง int ถึง enum ได้ Console.Read ()อ่านอักขระจากอินพุตสตรีมที่แทนด้วยจำนวนเต็ม พิมพ์ '1' ให้49 , substract 48 เพื่อรับ 1, โยน / กล่องHourOfDayเพื่อส่งคืน 'หนึ่ง'

ลองดูที่ Powershell เวอร์ชั่นของเล่ห์เหลี่ยมเดียวกันนี้


มันทำงานอย่างไร สมมติว่าฉันใส่ 9. โปรแกรมทำอะไร?
Nicolas Barbulesco


สิ่งนี้จะ-48ทำที่นี่?
Nicolas Barbulesco

2
@NicolasBarbulesco เพิ่มวิธีนี้ทำงานอย่างไร ย่อหน้า มันสมเหตุสมผลหรือไม่
rene

1
@NicolasBarbulesco - มันเรียงตามตัวอักษร ซึ่งเข้าท่าทุกบริบทยกเว้น "คำเหล่านี้คือตัวเลข" เนื่องจากฉันแน่ใจว่าเอกสารถูกสร้างขึ้นโดยอัตโนมัติจึงไม่มีความหมายสำหรับกรณีพิเศษในบทความเดียว
Bobson

13

Befunge 98, 116 105 103 ไบต์

&1-       v
vvvvvvvvvj<
"""""""""
etnxereoe
nheivuewn
igvsiorto
nie"ffh""
"es ""t
 ""   "
>>>>>>>>>4k,@

Befunge ไม่ได้ถูกสร้างขึ้นเพื่อสิ่งนี้ ...

คำอธิบาย:

&1-           ;Grab the input number (`n`) and subtract 1 from it
&1-       v   ;Start moving downwards
          <   ;Start moving leftwards
         j    ;Jump `n - 1` characters to the left.
vvvvvvvvvj    ;Redirect each of the possible locations to jump to, sending the IP down.

        "     ;If `n` was 1, push `o, n, e` onto the stack (`o` is at the bottom)
        e
        n
        o
        "

       "      ;If `n` was 2, push `t, w, o` onto the stack
       o
       w
       t
       "

    *
    *
    *

"             ;If `n` was 9, push `n, i, n, e` onto the stack
e
n
i
n
"

>>>>>>>>>     ;Collect all the different possible positions the IP could be in, and send it right
>>>>>>>>>4k,  ;Print the top 5 chars. If there are less than 5, the rest are null characters. This is allowed
            @ ;End of program

8
@Dennis ฉันไม่เห็นว่ามันจะยากขนาดไหน เพียงแค่นำไฟล์เปลี่ยนเป็น a char[][]เก็บxและyตำแหน่งและเรียกใช้อักขระที่ตำแหน่งนั้น สิ่งที่ยากที่สุดคือการกำหนดการทำงานของตัวละครทุกตัวที่เป็นไปได้
Justin

1
&1-คุณสามารถบันทึกไบต์ที่สองด้วย
har-wradim

10

Javascript 68

Atob / btoa เป็นเครื่องมือบีบอัดข้อมูลของคนจน (แต่ถ้าคุณต้องการลองในคอนโซลคุณไม่สามารถคัดลอกจากข้อความที่จัดรูปแบบที่คุณเห็นในครั้งเดียวไปที่ 'แก้ไข' และคัดลอกจากแผงแหล่งข้อมูล)

เครื่องมือแก้ไข Markdown ไม่ชอบตัวละครบางตัวในคำตอบนี้: ตัวละครบางตัวหายไปขณะกำลังบันทึก ถึงกระนั้นฉันคิดว่ามันเป็นปัญหาบรรณาธิการไม่ใช่ของฉัน อักขระที่หายไปนั้นเป็นตัวอักษรแบบ Unicode ที่ถูกต้อง 8 บิต
(หรือฉันผิดถ้าปัญหานี้ได้รับการถกเถียงกันแล้วในเมตาแจ้งให้ฉันทราบ) นี่คือรุ่นที่มีตัวละครที่ทำผิดกฎหมายหนีแต่ละลำดับ \ xNN ควรนับ 1

alert(btoa("×C§{Dð£Dá­ç´\x16\x8b«ÐX¯{D¢ÇD\x9e½éô\x12(!·Cb\x9dí").split(0)[prompt()])

ทดสอบง่าย

ในคอนโซล Firefox:

[0,1,2,3,4,5,6,7,8,9]
.map(x=>x +',' btoa("×C§{Dð£Dá­ç´\x16\x8b«ÐX¯{D¢ÇD\x9e½éô\x12(!·Cb\x9dí").split(0)[x])

ฉันลองสิ่งที่คล้ายกัน แต่ไม่สามารถหาสตริงเบส 64 ที่ถูกต้องเริ่มต้นด้วยตัวเลข ฉันคิดว่าคุณตอบได้รับความเสียหายจาก stackexchange ว่า
nderscore

@nnnnnnnnnnnnnn เจ้าแช้ดของคุณ การแก้ไขการโพสต์ยังคงใช้ได้ตามฉัน
edc65

1
กับรุ่นที่มีตัวละครหนีงานทุกอย่าง แต่ 3 และ 8 เอาท์พุทและTree EightF
Justin

3
@Quincunx 'Tree' ฉันไม่พูดภาษาอังกฤษ
edc65

10

Javascript 73

alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[prompt()])

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])

ในทางเทคนิคแล้วจะไม่alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])เหมือนเดิม แต่ช่วยให้คุณประหยัดได้ 8 ไบต์? ผู้ใช้ยังคงป้อนหมายเลขที่พวกเขาต้องการ ...
Eric Lagergren

@eric_lagergren คุณหมายถึงผู้ใช้จะต้องเปลี่ยนหมายเลขในแหล่งที่มาหรือไม่ ฉันไม่คิดว่าจะนับเป็นข้อมูลเข้า
nderscore

โอเคฉันเข้าใจแล้วว่าคุณหมายถึงอะไร ฉันคิดว่าถ้าคุณวิ่งมันเหมือนคำสั่งในคอนโซลมันจะเป็นส่วนหนึ่งของอินพุตเมื่อเทียบกับแหล่งที่มา
Eric Lagergren

7

Perl, 55

$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]

มันทำงานด้วยตัวเลือก-p(+1 ไบต์) เช่น:

perl -pe '$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]'

คาดว่าอินพุตเป็น STDIN และเอาต์พุตถูกเขียนไปยัง STDOUT

รหัสเพิ่งสร้างอาร์เรย์และเลือกองค์ประกอบที่เหมาะสม ตัวเลือกที่-pจะดูแลการอ่านบรรทัดการป้อนข้อมูลเข้าและพิมพ์ผลใน$_$_

รูปแบบ:

  • ด้วยการขึ้นบรรทัดใหม่ (+3):

    $_=(nine,eight,seven,six,five,four,three,two,one)[-$_].$/

    หรือ (นับไบต์เดียวกัน):

    s/./(nine,eight,seven,six,five,four,three,two,one)[-$&]/e

ปรับปรุง:

  • ใช้คำเปล่าแทนqw[...](ขอบคุณ Zaid)

  • ดัชนีลบบันทึกไบต์ (ขอบคุณ aragaer)


1
บันทึกอักขระสองตัว:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid

2
@ Zaid: ขอบคุณมันบันทึกสองไบต์ (ฉันคุ้นเคยกับuse strict)
Heiko Oberdiek

ฉันไม่ชอบ "-1" $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- ตัวละครสั้นลงหนึ่งตัว
aragaer

@aragaer: ขอบคุณความคิดที่ดี
Heiko Oberdiek

6

Oracle SQL - 46

select to_char(to_date(&1,'j'),'jsp')from dual

สาธิต

ซึ่งรวมถึงช่องโหว่มาตรฐานฉันยอมรับ แต่ SQL นั้นสั้นกว่า Golfscript ฉันไม่สามารถต้านทาน!

มันทำงานโดย (ab) โดยใช้รูปแบบรูปแบบวันที่และเวลาของ Oracle TO_DATE(n, 'j')แปลงตัวเลขเป็นวันจูเลียนจำนวนวันตั้งแต่วันที่ 1 มกราคม 4712 BC TO_CHAR(<date>, 'jsp')แปลงกลับเป็นจำนวนเต็ม (แม้ว่าจะเป็นสตริง) กระบวนการsp, เป็นส่วนต่อท้ายองค์ประกอบรูปแบบที่สะกดหมายเลข มันจะใช้งานได้จริงกับตัวเลขจำนวนมาก

&1เป็นตัวแปรเปลี่ยนตัวเท่านั้นที่จะทำงานร่วมกับลูกค้าที่ยอมรับมันเช่น SQL * Plus


ฉันมีความรัก / เกลียดความสัมพันธ์กับ RDBMS ของออราเคิล แต่นี่เป็นสิ่งที่ดี
rene

6

CJam, 45 43 ไบต์

"^AM-^L8M-xM-^L^US^_M-^WrM-rM- 1M-s^CHM-|M-X^HE,M-qM-^EM-q4"256bKb'ef+'j/li=

ข้อมูลด้านบนใช้เครื่องหมาย ^ และ M- เนื่องจากอักขระบางตัวไม่สามารถพิมพ์ได้

ด้วยค่าใช้จ่ายอีก 9 ไบต์สามารถหลีกเลี่ยงอักขระที่ไม่สามารถพิมพ์ได้:

" one two three four five six seven eight nine"S/li=

ลองออนไลน์

มันทำงานอย่างไร

" Convert the string into an integer by considering it a base-256 number.                ";

"^AM-^L8M-xM-^L^US^_M-^WrM-rM- 1M-s^CHM-|M-X^HE,M-qM-^EM-q4"256b

" Convert the integer from above into an array by considering it a base-20 number.       ";

Kb

" Add the ASCII character code of “e” to all elements of that array. This casts to char. ";

'ef+

" So far, we've pushed the string “jonejtwojthreejfourjfivejsixjsevenjeightjnine”.       ";

" Split the the above string where the character “j” occurs.                             ";

'j/

" Read an integer from STDIN and push the corresponding substring.                       ";

li=

ตัวอย่าง

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five

ว้าวคำตอบของเราเหมือนกันแม้จะมีความยาว (ฉันถือว่าผู้ใช้ป้อนสตริง)
จัสติน

1
@Quincunx: จิตใจที่เหมือนกันคิดว่าดี! : P แต่อ่านท่านผู้ใช้จะเสียค่าใช้จ่ายสองไบต์ใน CJam ดังนั้นฉันจะต้องคิดอย่างอื่น ...
เดนนิส

@Quincunx: มันควรจะทำงานร่วมกับ GolfScript ด้วยเช่นกันถึงแม้ว่ามันอาจจะไม่บันทึกไบต์ การถ่ายโอนข้อมูล Base64:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
เดนนิส

นี่คือสิ่งที่ฉันจัดการมาด้วย; นานกว่านี้: golfscript.apphb.com/…
Justin

คุณรู้ไหมว่าการเข้ารหัส golfscript คาดหวังสำหรับตัวอักษรที่ไม่ใช่ ASCII? ดูเหมือนว่าจะไม่ใช่ utf-8
Justin

5

GolfScript, 51 ไบต์

~'
one
two
three
four
five
six
seven
eight
nine'n/=

มันเป็นตารางค้นหาอย่างง่าย อินพุตถูกประเมิน ( ~) อาร์เรย์ของค่าถูกสร้างขึ้นและพบดัชนี

ลองที่นี่


ผู้ใช้จะต้องใส่สตริงคุณไม่สามารถเข้ารหัสได้ยาก นอกจากนี้Try it hereลิงก์ของคุณมีรหัสแตกต่างจากรหัสที่วาง
Jon

@Chipperyman ผู้ใช้ป้อนสตริงในโปรแกรมนี้ ความTry it hereแตกต่างของโค้ดในลิงก์นั้นเป็นเพราะเว็บเพจไม่รองรับการป้อนข้อมูลของผู้ใช้ เปลี่ยนสตริงหลังจากนั้นสิ่ง;นี้จะเหมือนกับการป้อนข้อมูลของผู้ใช้
Justin

อ่าฉันเข้าใจแล้ว ฉันไม่รู้ golfscript ดีมากขอบคุณที่ให้ฉันรู้
Jon

2
@Chipperyman: GolfScript วางเนื้อหาของ STDIN ไว้ในสแต็กก่อนที่จะเรียกใช้งานสคริปต์
Dennis

2
ฮะ! ฉันสามารถเอาชนะคุณทีละไบต์ ! ;-)
Ilmari Karonen

4

Perl, 60 ไบต์

$_=(ZOneTwoThreeFourFiveSixSevenEightNine=~/.[a-z]*/g)[$_]

ต้องการ-pสวิตช์ (สองไบต์)

ตัวอย่าง

$ perl -p convert.pl <<< 5
Five

มันทำงานอย่างไร

  • -pอ่านจาก STDIN $_และบันทึกผลใน

  • =~/.[a-z]*/g แยก bareword ก่อนหน้านี้เป็นสตริงย่อยของตัวอักษร (ตัวพิมพ์ใหญ่) หนึ่งตัวตามด้วยตัวอักษรตัวพิมพ์เล็กจำนวนเท่าใดก็ได้

  • (…) รวบรวมสารตั้งต้นเข้าไปในอาร์เรย์

  • [$_] ดึงสตริงย่อยที่สอดคล้องกับการป้อนข้อมูลของผู้ใช้

  • $_=…$_บันทึกผลใน

  • -p$_พิมพ์ค่าของ


2
ฉันชอบเคล็ดลับ regex +1
seequ

3

DOS Batch - 162 Chars (รวมตัวแบ่งบรรทัด)

คำตอบนี้ได้แรงบันดาลใจจากคำตอบ Python ของ @ grc แม้ว่าฉันจะมีบางอย่างที่คล้ายกันในใจ

@setlocal enabledelayedexpansion
@set s="ottffssennwhoiieiieoruvxvgn  ere ehe  e   nt
@set /a c=%1
@set z=!s:~%c%,1!
@if _%z%==_ exit /b
@echo %z%
@%0 %c%+9

การใช้งาน:

[ชื่อไฟล์] [หมายเลข]

ตัวอย่างเช่นหากรหัสอยู่ในไฟล์ชื่อ speak.bat และคุณต้องการดูหมายเลข "ห้า" คุณจะเรียกใช้เป็น:

speak 5

นอกจากนี้เอาต์พุตยังจากบนลงล่างไม่ใช่ซ้ายไปขวา! ดังนั้นแทนที่จะ

ห้า

แล้วคุณจะได้เห็น

f
ฉัน
v
e


3

Bash + coreutils, 64

แนวคิดการบีบอัดที่ไม่มีการแข่งขัน

xxd -p<<<TàPnàõ:àsÀ~®@ãCN|tr 0-9a-d \\ng-inor-x|sed -n $1p

อักขระแปลกใหม่บางตัวที่นี่อาจไม่แสดงผลที่ดีดังนั้นสคริปต์นี้อาจถูกสร้างขึ้นใหม่จากการแสดงฐาน 64:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

ตัวอย่างผลลัพธ์

$ ./n.sh 1
one
$ ./n.sh 9
nine
$ 

คำอธิบาย

มันเกิดขึ้นกับฉันว่าสตริงone two three four five six seven eight nineมีเพียงตัวอักษรefghinorstuvwxและตัวคั่นช่องว่าง - รวม 15 ค่าตัวอักษร ดังนั้นอักขระแต่ละตัวสามารถแสดงเป็น 4 บิตหรือ 2 อักขระต่อ 1 ไบต์ เราสามารถใช้การแสดงเลขฐานสิบหกของไบต์เป็นวิธีที่ง่ายในการแยกแต่ละไบต์เป็นเลขฐานสิบหกสองหลัก จากนั้นเราสามารถแปลงตัวเลขฐานสิบหกกลับไปเป็นตัวอักษรที่เราต้องการใช้trหรือคล้ายกัน เป็นโชคดีจะได้มันrstuvwxมีความต่อเนื่องกันดังนั้นอาจจะแสดงเป็นไปr-x trการเข้ารหัสจะถูกจัดเรียงอย่างนั้นeและfถูกปล่อยไว้ตามที่เป็นอยู่และคำนั้นคั่นด้วยตัวแบ่งบรรทัดดังนั้นเราจึงสามารถใช้sedเพื่อแสดงเฉพาะบรรทัดที่เราต้องการ

กระบวนการถอดรหัสนี้จบลงด้วยการใช้พื้นที่เพิ่มเติมในปริมาณที่พอเหมาะดังนั้นจึงทำให้คำตอบนี้ไม่สามารถแข่งขันได้ในฐานะคำตอบแบบเชลล์ - สคริปต์ แต่อาจเป็นแนวคิดที่มีประโยชน์ในภาษาอื่น


3

(บริสุทธิ์) Bash, 64

รับอินพุตเป็นอาร์กิวเมนต์แรกโดยถือว่าเป็นอินพุตที่ถูกต้อง

v=(o one two three four five six seven eight nine)
echo ${v[$1]}

สร้างอาร์เรย์vจากนั้นเข้าถึงองค์ประกอบที่ระบุในอินพุต เนื่องจากอาร์เรย์มีการทำดัชนีเป็นศูนย์ฉันจึงต้องเพิ่มองค์ประกอบที่ 0 เป็นตัวยึดตำแหน่ง อีกทางหนึ่ง (ขอบคุณ @DennisWilliamson สำหรับการชี้เรื่องนี้):

v=(one two three four five six seven eight nine)
echo ${v[$1-1]}

2
จำนวนตัวอักษรเดียวกัน: v=(one two three four five six seven eight nine)และecho ${v[$1-1]}
เดนนิสวิลเลียมสัน

3

Python 2.x - 65 64

ไม่ดีเท่ากับคำตอบของ @grc แต่ชัดเจนมากขึ้น :-)

'one two three four five six seven eight nine'.split()[input()-1]

ถ่านหนึ่งอันน้อยกว่าต้องขอบคุณ @flornquake

'nine eight seven six five four three two one'.split()[-input()]

อันนี้ก็ดีเหมือนกัน :-) มันได้ผล.
Nicolas Barbulesco

3
คุณสามารถบันทึกหนึ่งตัวละครเช่นนี้:'nine eight seven six five four three two one'.split()[-input()]
flornquake

เป็นคนดี!
วิลเล็ม

3

Java 7 - 185

class Num{
public static void main(String[] args) {
    System.out.print("ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".split(",")[(new java.util.Scanner(System.in)).nextInt()-1]);
    }}

3

C 111

#include <stdio.h>
int main(){printf("%.5s","one  two  threefour five six  seveneightnine"+5*(getchar()-'1'));}

ความยาวที่นี่ถูกออกแบบอย่างระมัดระวังเพื่อให้สามารถตีความมันเป็นไบนารีและแปลงที่ให้เป็นทศนิยม ด้วยตัวละครเพียง 7 ตัวฉันมั่นใจว่าฉันจะมีผู้ชนะ!


1
+1 นักกอล์ฟโดยทั่วไปไม่สนใจว่ารหัส c ของคุณรวบรวมคำเตือนตราบใดที่มันตรงตามข้อกำหนด ดังนั้นคุณสามารถละเว้น#includeและmain()ประเภทการคืนของ ยังแสดงการแสดงออกของคุณmain(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}อีกเล็กน้อย: . 86 ตัวอักษรโดยการนับของฉัน
บาดเจ็บทางดิจิตอล

ฉันไม่เข้าใจความยาวและฉันไม่เห็นว่าจะมีตัวอักษร 7 ตัวอยู่ที่ไหน
Nicolas Barbulesco

@NicolasBarbulesco: มันคือ 111 ตัวอักษร - แต่ถ้าเราใช้111เลขฐานสองมันจะแปลงเป็น7ทศนิยม
Jerry Coffin

เจอรี่มีโค้ดกอล์ฟวิ่งอยู่ในหัวของคุณ!
Nicolas Barbulesco

3

bash say (OS X): 3 8

"เป้าหมายของคุณคือการแปลงจำนวนเต็มระหว่าง 1-9 เป็นคำที่หมายถึง"

ครั้งล่าสุดที่ฉันตรวจสอบคำพูดก็เป็นคำศัพท์เช่นกัน ความพยายามก่อนหน้า (ไม่รับอินพุต)

say 4

แก้ไขจะต้องสามารถอ่านอินพุตได้:

say|read

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

ตัวอย่างไฟล์เสียง: four.aiff


ไม่ควรเป็น 5?
rpax

@rpax ฉันไม่เชื่อว่าอินพุตจะนับเป็นตัวละครใช่ไหม
CousinCocaine

1
นี่คือฉลาด แต่นี่พลาดอินพุต
Nicolas Barbulesco

1
น่าเสียดายที่นี่ไม่ใช่คำตอบที่ถูกต้องเพราะ: มันไม่เคยยอมรับการป้อนข้อมูลจากผู้ใช้และจะทำงานได้ก็ต่อเมื่อตัวเลขนั้นคือ 4
Jon

1
ความคิดเห็นโดย Chipperyman ในคำตอบของ CousinCocaine นี้เป็นความจริง แต่มันก็เป็นจริงสำหรับคำตอบโดย @RegisteredUserด้วย อย่างไรก็ตาม Chipperyman ได้ปฏิเสธคำตอบนี้โดย CousinCocaine และได้ประกาศคำตอบโดยผู้ชนะการลงทะเบียนผู้ใช้เช่นอดีต นอกจากนี้คำตอบโดยผู้ใช้ที่ลงทะเบียนเป็นแบบจำลองของคำตอบนี้โดย CousinCocaine นี่เป็นสิ่งที่ไม่ยุติธรรม
Nicolas Barbulesco


2

J - 68 หรือ 60 57 หรือ 53 ไบต์

รุ่นอินเทอร์แอกทีฟ (stdin):

>one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1

รุ่นฟังก์ชั่น:

f=:one`two`three`four`five`six`seven`eight`nine>@{~<:

คำอธิบาย:

f=:one`two`three`four`five`six`seven`eight`nine>@{~<:
                                                   <: Decrease by one
                                                 {~   Get the correct string
                                               >@     Unbox

".(1!:1)1 อ่านสตริงและแปลงเป็นจำนวนเต็ม


คุณสามารถบันทึกหนึ่งถ่านโดยการเขียนเป็นรถไฟ ( (;:'one two blah')>@{~<:) และหกอื่นโดยใช้อาการนามแทนone`two`blah ;:
algorithmshark

@ อัลกอริทึมขอขอบคุณ! ฉันยังคงเรียนรู้ J. แม้ว่ารุ่นรถไฟจะไม่ต้องการข้อความที่จะไม่มีที่สิ้นสุดอันดับ (แก้ไข: เห็นได้ชัดว่าไม่ ... ทำไมไม่?) และคำพูดพิเศษรุ่น gerund (แก้ไข: โอ้มันสร้างรายการของ กล่อง)?
Seequ

ทางแยกสามารถมีคำนามในอาร์กิวเมนต์ซ้ายซึ่งเป็นชวเลขสำหรับคำกริยาคงที่ผลิตคำนามที่มีอันดับไม่ จำกัด (qv the Dictionary ) และไม่ไม่มีเครื่องหมายอัญประกาศพิเศษสำหรับคำนาม gerund: ชื่อที่ไม่ได้กำหนดจะถือว่าเป็นการอ้างอิงถึงคำกริยาและคำสั่ง gerund สำหรับนั้นเป็นเพียงสายอักขระที่มีชื่อ
algorithmshark

นอกจากนี้คุณไม่จำเป็นต้องเขียนเวอร์ชัน STDIN เป็นนิพจน์กริยา: >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1สั้นลง 3 ตัวอักษร
algorithmshark

1
@algorithmshark ฮ่าฮ่าทำไมฉันไม่ทำอย่างนั้นล่ะ
Seequ

2

Perl 36 (58 สแตนด์อโลน)

use Number::Spell;say spell_number<>

หรือไม่มีโมดูลเพิ่มเติม:

say qw(one two three four five six seven eight nine)[<>-1]

สคริปต์ตัวแรกของคุณใช้งานไม่ได้บน Mac ของฉัน Can't locate Number/Spell.pm in @INC (@INC contains: /Library/Perl/5.16/darwin-thread-multi-2level /Library/Perl/5.16 /Network/Library/Perl/5.16/darwin-thread-multi-2level /Network/Library/Perl/5.16 /Library/Perl/Updates/5.16.2 /System/Library/Perl/5.16/darwin-thread-multi-2level /System/Library/Perl/5.16 /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level /System/Library/Perl/Extras/5.16 .) at toto.pl line 1. BEGIN failed--compilation aborted at toto.pl line 1.
Nicolas Barbulesco

สคริปต์ที่สองของคุณไม่ทำงานบน Mac ของฉัน syntax error at titi.pl line 1, near "say qw(one two three four five six seven eight nine)" Execution of titi.pl aborted due to compilation errors.
Nicolas Barbulesco

2

ใน AppleScript 123 ตัวอักษร

{"one","two","three","four","five","six","seven","eight","nine"}'s item((display dialog""default answer"")'s text returned)

สคริปต์นี้รับอินพุตในไดอะล็อก จากนั้นก็จะช่วยให้การส่งออกใน AppleScript ของ  ผล

ตัวอย่าง:

  • อินพุต: 6
  • ผลผลิต: "six"

นี่คือรุ่นที่ดีกว่า:

set l to {"one","two","three","four","five","six","seven","eight","nine"}
set n to text returned of (display dialog "?" default answer "")
display dialog (l's item n) buttons ("OK") default button 1

รุ่นนี้แสดงผลลัพธ์ในกล่องโต้ตอบที่ดี

ตัวอย่าง:

  • อินพุต: 9
  • ผลผลิต: nine

[ตอบแก้ไข; ปรับปรุงกล่องโต้ตอบสำหรับอินพุตเล็กน้อย ยังคง 124 ตัวอักษร ตอบแก้ไขอีกครั้ง ตอนนี้ 1 ถ่านน้อยลง! ]


1
set n to text returned of... ว้าว.
Seequ

2

Powershell - 91 74

[Enum]::ToObject([System.DirectoryServices.ActiveDirectory.HourOfDay],[Console]::Read()-48)

พบวิธีการส่งออกเพื่อลบการเรียก Enum และ ToObject:

[System.DirectoryServices.ActiveDirectory.HourOfDay]([Console]::Read()-48)

มันทำงานอย่างไร

HourOfDay เป็นประเภท enum เพื่อให้เราสามารถใช้ชื่อแทนค่าคงที่เวทมนตร์ ประเภท Enum มีการใช้งาน ToString () ที่ให้ชื่อของค่าคงที่ คุณสามารถส่ง int ถึง enum ได้ Console.Read ()อ่านอักขระจากอินพุตสตรีมที่แทนด้วยจำนวนเต็ม พิมพ์ '1' ให้ 49, substract 48 เพื่อรับ 1, ส่งไปยัง HourOfDay เพื่อส่งคืน 'One'

เนื่องจาก powershell ทำ ToString บนวัตถุทั้งหมดที่ถูกเขียนไปยังกระแสข้อมูลขาออกและไม่จำเป็นต้องใช้ปุยเพื่อทำให้สิ่งนี้กลายเป็นสิ่งที่ปฏิบัติการได้ทั้งหมดที่จำเป็นนอกเหนือจาก powershell ...


2

CJam - 50

นี่เป็นโซลูชัน ASCII แบบธรรมดาที่ใช้การร้องขอ HTTP (ได้รับอนุญาตในคำถาม):

"aj21.com/"r+g

บนเซิร์ฟเวอร์มีไฟล์ข้อความธรรมดา 9 ไฟล์ชื่อ 1, 2, ... , 9 แต่ละไฟล์มีคำที่เกี่ยวข้อง

ขนาดทั้งหมด: 14 + 3 ("หนึ่ง") + 3 ("สอง") + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50
มันสามารถเล่นกอล์ฟได้มากขึ้นโดยใช้โดเมนที่สั้นลง

ล่ามออนไลน์ไม่สนับสนุนการร้องขอ HTTP เพื่อตอบสนองความต้องการโปรแกรมจะทำงานโดยใช้ล่ามภาษาจาวา


1
กรุณาเพิ่มความคิดเห็นหาก downvoting
aditsu

-1 นี้เป็นช่องโหว่มาตรฐาน
nyuszika7h

3
@ nyuszika7h ได้รับอนุญาตเป็นพิเศษในคำถามนี้
aditsu

1
ขออภัยฉันพลาดไป ฉันไม่สามารถเลิกทำการ downvote ของฉันได้ในตอนนี้จนกว่าคำตอบจะได้รับการแก้ไข
nyuszika7h

1
@ nyuszika7h แก้ไขแล้ว
aditsu

2

รุ่นที่ - 86

สั้นกว่าคำตอบแบทช์อื่น ๆ และมีการแข่งขันที่น่าประหลาดใจ

for /f "tokens=%1" %%1 in ("one two three four five six seven eight nine") do echo>%%1

ใช้เป็นfilename.bat numberและเอาต์พุตอยู่ในรูปแบบของไฟล์ที่มีชื่อของหมายเลขที่ถูกต้อง


2

ทับทิม 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]

1
คุณสามารถสับเพิ่มได้อีกสองสามไบต์โดยแทนที่ 9 โดยตรงที่ตำแหน่ง x
Mr. Alien

6
ฉันไม่เห็นว่าจะใช้รหัสนี้จากที่ใด และทำไมเขียน9-1เมื่อคุณสามารถพูดได้8? แน่นอนทั้งผิด9-1และ8ผิด สคริปต์นี้แสดงผล "เก้า" ตลอดเวลาและละเว้นอินพุต
Ray Toal

2

ทุบตี 9

Linux จำลองที่ไร้ยางอายของคำตอบของ cousincoicane

spd-say 1

พูดออกมาหนึ่ง


1
มันจะไม่ทำงานถ้าอินพุตเป็น 1 หรือไม่
Jon

1
@Chipperyman ใช้งานได้กับทุกหมายเลข
ผู้ใช้ที่ลงทะเบียน

จำกัด แต่ฉลาด!
Nicolas Barbulesco

สิ่งนี้ขาดการป้อนข้อมูล
Nicolas Barbulesco

@nicolasbarbulesco ใช่ แต่มีคำตอบอื่น ๆ อีกมากมายที่พลาดการป้อนข้อมูลดังนั้นฉันจึงดำเนินการต่อไป
ผู้ใช้ที่ลงทะเบียน

2

GolfScript 50 ไบต์

ฉันต้องการดูว่าฉันสามารถเอาชนะโซลูชัน GolfScript ขนาด 51 ไบต์ของ Quincunxได้หรือไม่ ปรากฎว่ามีกลอุบายเพียงพอใช่ฉันทำได้ทีละไบต์

เนื่องจากหนึ่งในเทคนิคที่ฉันใช้คือการใช้ไบต์ที่อยู่นอกช่วง ASCII ที่พิมพ์ได้โปรแกรมที่ได้จึงไม่สามารถวางได้โดยตรงที่นี่ แต่ฉันกำลังให้ดัมพ์แบบเลขฐานสิบหกแทน ผู้ใช้บนระบบ Unixish สามารถใช้xxd -rสร้างโปรแกรม GolfScript ขนาด 50 ไบต์จริงจากฐานสิบหก:

0000000: 7e6e 270b 97eb 442f e166 9894 9f00 c63c  ~n'...D/.f.....<
0000010: 8128 73a3 9b55 5065 a9fb f06a 2727 ff16  .(s..UPe...j''..
0000020: 277b 6261 7365 7d2f 2b6e 2f3d 7b39 392b  '{base}/+n/={99+
0000030: 7d25                                     }%

เคล็ดลับพื้นฐานที่ใช้ในการสร้างโปรแกรมนี้เป็นเรื่องง่าย: ฉันบีบอัดตัวอักษรสตริงที่ยาวซึ่งทำให้ส่วนใหญ่ของรหัสของ Quincunx โดยการลบ 99 (รหัส ASCII ของตัวอักษรc) จากค่าตัวอักษรตีความค่าผลลัพธ์เป็นตัวเลขในฐาน 22 (เพียงพอที่จะเข้ารหัสตัวอักษรจนถึงx) จากนั้นเข้ารหัสหมายเลขผลลัพธ์ในฐาน 255 อีกครั้งเพื่อสร้างสตริงไบต์ที่ไม่สามารถพิมพ์ได้ซึ่งทำขึ้นในครึ่งแรกของโปรแกรมของฉันเกือบทั้งหมด ส่วนที่เหลือของโปรแกรมจะกลับกระบวนการนี้ถอดรหัสสตริงกลับไปเป็นสิ่งที่พิมพ์ได้

(เนื่องจากตัวอักษรที่ต่ำที่สุดที่จริงปรากฏอยู่ในชื่อหมายเลขคือeฉันสามารถทำให้สตริงไบต์สั้นลงโดยการลบ 101 จากรหัส ASCII และใช้ฐาน 20 อย่างไรก็ตามการลบ 101 จะแมปตัวอักษรoขึ้นบรรทัดใหม่ซึ่งฉัน ใช้เป็นตัวคั่นตัวเลขเพราะสะดวกในการเป็นค่าคงที่nใน GolfScript การทำงานที่ต้องเสียค่าใช้จ่ายฉันมากกว่าหนึ่งไบต์ที่ใช้ฐานที่ต่ำกว่าจะประหยัดการใช้ offset 99 ทำให้ขึ้นบรรทัดใหม่ตามตัวอักษรmซึ่งหายไปจากชื่อหมายเลข)

นี่คือโปรแกรมรุ่นที่ไม่มีการตีกอล์ฟ:

~       # eval the input, turning it into a number
n       # push a newline onto the stack; we'll need it later

# this is the byte string encoding the number names:
"\x0B\x97\xEBD/\xE1f\x98\x94\x9F\x00\xC6<\x81(s\xA3\x9BUPe\xA9\xFB\xF0j"

# convert the encoded string from base 255 to base 22
# (and, incidentally, from a string to an array):
"\xFF\x16" {base}/

+       # prepend the newline pushed earlier to the array, re-stringifying it
n/      # split the resulting string at newlines
=       # pick the substring corresponding to the input number
{99+}%  # add 99 to the character values in the chosen substring
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.