ระยะทางถึงสี่


13

ความท้าทายนี้ขึ้นอยู่กับวิดีโอนี้ ฉันแนะนำให้คุณดูมันก่อนที่จะลองความท้าทายนี้

ก่อนอื่นเรากำหนดฟังก์ชั่น ฟังก์ชันนี้ ( OEIS ) รับจำนวนเต็ม n เป็นอินพุตและเอาต์พุตจำนวนตัวอักษรในการแสดงภาษาอังกฤษของ n (โดยไม่มีช่องว่างหรือยัติภังค์) ตัวอย่างเช่น "สาม" มี 5 ตัวอักษรดังนั้น 3 แผนที่ถึง 5

ดังที่แสดงในวิดีโอที่เริ่มต้นด้วยหมายเลขใด ๆ ที่ทำซ้ำกระบวนการนี้ในที่สุดจะส่งผลให้มีสี่ซึ่งจะแมปกับตัวเองตลอดไป

นี่คือกราฟกำกับอย่างหยาบที่แสดงการโคจรของตัวเลขที่น้อยกว่า 16:

  12 11
    \|      
15 2 6 1 10 14 13
  \ \|/ /  /  /
   7 3-/  8--/
    \|   /
 9 0 5--/
  \ \|
   \-4

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

สร้างตัวเลขภาษาอังกฤษ

นี่คือคำอธิบายสั้น ๆ ว่าควรสร้างคำภาษาอังกฤษสำหรับความท้าทายนี้อย่างไร:

หมายเลขหนึ่งถึงสิบเก้าคือ:

หนึ่ง, สอง, สาม, สี่, ห้า, หก, เจ็ด, แปด, เก้า, สิบเอ็ด, สิบสอง, สิบสาม, สิบสี่, สิบห้า, สิบห้า, สิบหก, สิบหก, สิบเจ็ด, สิบแปด, สิบเก้า

สำหรับตัวเลขที่มากกว่าสิบเก้ากระบวนการมีดังนี้:

หากจำนวนนั้นมีหลายร้อยที่ขึ้นต้นด้วยชื่อของตัวเลขในหลักร้อยและ "ร้อย"

เช่น

100 -> "onehundred"

หากส่วนที่เหลือมีค่าน้อยกว่ายี่สิบผนวกท้ายการเป็นตัวแทนภาษาอังกฤษของส่วนที่เหลือ

เช่น

714 -> "sevenhundredfourteen"

มิฉะนั้นถ้าหลักสิบไม่ใช่ศูนย์ผนวกการแสดงที่เหมาะสม:

2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety

เช่น

470 -> "fourhundredseventy"

ในที่สุดหากมีตัวเลขหนึ่งตัวต่อท้ายการเป็นตัวแทน

เช่น

681 -> "sixhundredeightyone"

เงื่อนไขเพิ่มเติม

  • สำหรับตัวเลขที่มากกว่าหนึ่งร้อยคุณควรปล่อย "และ" ออกมาเมื่อนับจำนวนตัวอักษร ตัวอย่างเช่น 577 คือ "fivehundredseventyseven" ซึ่งมี 23 ตัวอักษร

  • โปรแกรมของคุณต้องยอมรับจำนวนเต็มทั้งหมดที่มากกว่า 0 และน้อยกว่า 1,000 เป็นอินพุตด้วยวิธีมาตรฐาน

  • โปรแกรมของคุณจะต้องส่งออกจำนวนขั้นตอนที่จำเป็นสำหรับวิธีการส่งออกมาตรฐาน

  • นี่คือ codegolf ดังนั้นคำตอบที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

กรณีทดสอบ

1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4 

1
ที่เกี่ยวข้องฉันคิดว่านี่เป็นล่อลวง แต่ฉันไม่สามารถหาได้
James

เกิดอะไรขึ้นกับ "และ"? หรือค่อนข้างทำไมปล่อยออกมาและ!
Jonathan Allan

คำตอบ:


5

JavaScript (ES6), 106 ไบต์

f=(n,a="03354435543668877998")=>n-4&&1+f(7*(n>99)-(-a[n/100|0]-(a[n%=100]||a[n%10])-"0066555766"[n/10|0]))

สตริงดูเหมือนเป็นวิธีที่ดีที่สุดในการเข้ารหัสความยาวแม้จะมีค่าใช้จ่ายในการแปลงตัวเลข


เอ้ยนั่นคือสิ่งที่คำตอบของฉัน (เกือบจะโพสต์) ดูเหมือนว่าจะสั้นกว่าเพียง 11 ไบต์
ETHproductions

@ ETHproductions สิ่งที่ดีฉัน golfed 16 ไบต์ออกก่อนโพสต์แล้ว
Neil

2

Python พร้อม num2words, 97 113 115 94 93 92 ไบต์

+16 ไบต์ (ลืมการใส่ไฮเฟ็นที่ num2words ใช้ซึ่งไม่ได้เปลี่ยนผลลัพธ์ของกรณีทดสอบใด ๆ ถึงแม้ว่า23และ577แต่ละอันจะมีการใส่ยัติภังค์)
+2 ไบต์ (ลืมที่จะรวมf=แม้ว่าแบบเรียกซ้ำ)
-20 ไบต์ (ใช้re)
-8 ไบต์ขอบคุณตัวช่วยสร้าง @Wheat (ใช้~แทนที่n!=4ด้วยn-4และ ... การนำเข้าหนึ่งบรรทัด> _ <)
-1 ไบต์ขอบคุณ @Cyoce (เว้นวรรค4 and)

import re,num2words as w
f=lambda n:n-4and-~f(len(re.sub('\W|and','',w.num2words(n))))

เพียงนับจำนวนขั้นตอน ใช้ได้กับจำนวนเต็มขนาดใหญ่และจำนวนลบเช่นกัน ( \Wค้นหาช่องว่างเครื่องหมายจุลภาคและเครื่องหมายขีดกลางในผลลัพธ์ num2words):

>>> for test in (1,4,7,23,577,600,-1*2**96,3**96):
...     print('test: {0}  ->  {1}'.format(test, f(test)))
...
test: 1  ->  3
test: 4  ->  0
test: 7  ->  2
test: 23  ->  5
test: 577  ->  6
test: 600  ->  4
test: -79228162514264337593543950336  ->  4
test: 6362685441135942358474828762538534230890216321  ->  5

นี่คือกรณีสุดท้าย, ทีละขั้นตอน:

sixquattuordecillionthreehundredsixtytwotredecillionsixhundredeightyfiveduodecillionfourhundredfortyoneundecilliononehundredthirtyfivedecillionninehundredfortytwononillionthreehundredfiftyeightoctillionfourhundredseventyfourseptillioneighthundredtwentyeightsextillionsevenhundredsixtytwoquintillionfivehundredthirtyeightquadrillionfivehundredthirtyfourtrilliontwohundredthirtybillioneighthundredninetymilliontwohundredsixteenthousthreehundredtwentyone
fourhundredfiftyone
nineteen
eight
five

1
คุณไม่ต้องการf=ฟังก่อนฟังก์ชั่นแลมบ์ดา
Ad Hoc Garf Hunter

1
ลองimport re,num2words as rแทนสองข้อความที่แตกต่างกัน
Ad Hoc Garf Hunter

1
n-4เป็นเช่นเดียวกับn!=4
Ad Hoc Garf Hunter

1
@WheatWizard num2wordsคือw, reยังคงre- ทราบว่าทั้งโมดูลและฟังก์ชั่นที่เรียกว่าnum2words
โจนาธานอัลลัน

1
ตกลงสุดท้ายand 1+สามารถแทนที่ด้วยand-~เพื่อบันทึกหนึ่งไบต์
Ad Hoc Garf Hunter


1

Mathematica, 89 ไบต์

Length@FixedPointList[StringLength@StringReplace[IntegerName@#,{" "->"","-"->""}]&,#]-2&

Mathematica ทั่วไป: ฟังก์ชันในตัวดีชื่อฟังก์ชันยาวไม่ดี FixedPointListใช้อาร์กิวเมนต์แรก (ฟังก์ชัน) กับอาร์กิวเมนต์ที่สองซ้ำ ๆ จนกว่าคำตอบจะไม่เปลี่ยนแปลงโดยแสดงรายการผลลัพธ์ทั้งหมด ผลลัพธ์รวมถึงอินพุตต้นฉบับและสำเนาสองชุดของเอาต์พุตที่ทำซ้ำดังนั้น-2เมื่อสิ้นสุด built-in ของ Mathematica IntegerNameมีช่องว่างและเครื่องหมายยัติภังค์ดังนั้นเราจำเป็นต้องกำจัดมันด้วยมือ

น่ารำคาญIntegerNameเอาต์พุตของตัวละครประกอบด้วยอักขระ "-" (Unicode # 8208) แทนที่จะเป็นเครื่องหมายขีดกลางปกติ นั่นเป็นเหตุผลที่การส่งนี้คือ 89 ไบต์มากกว่า 88 (และฉันไม่สามารถนำหน้ารหัสด้านบนด้วยช่องว่างสี่ช่องและให้มันยอมรับอักขระ Unicode - ความช่วยเหลือใด ๆ ? - ดังนั้นรหัสด้านบนจะไม่ทำงานอย่างถูกต้องถ้าตัดและวาง .)


1

Python 2.7, 344 216 208 ไบต์:

x=`input()`;c=0;y=lambda v:dict(zip(range(0,10),[0]+v));l=[3,3,5,4,4,3,5,5,4];d=y(l);e=y([3,6,6,6,5,5,7,7,6]);f=y([i+7for i in l])
while x!='4':x=`sum([q[int(r)]for q,r in zip([d,e,f],x[::-1])])`;c+=1
print c

ห้ามใช้ไลบรารีภายนอกใด ๆ ซึ่งแตกต่างจากคำตอบ Python อื่น ๆ จะเข้าผ่านและผลการstdinstdout

Rep..it กับทุกกรณีทดสอบ!

คำอธิบาย

ขั้นแรกสร้างพจนานุกรม 3 พจนานุกรมโดยแต่ละคู่จับคู่ความยาวของการแทนคำภาษาอังกฤษของแต่ละหมายเลขให้เป็นตัวเลขที่แสดงในช่วงปิด[1,9]ในอันที่หนึ่งหลักสิบและร้อยตามลำดับ ยกตัวอย่างเช่นรายการแรกในพจนานุกรมdจะ1:3เป็น1สะกดoneในภาษาอังกฤษและมี3ตัวอักษร

จากนั้นตัวเลขแต่ละตัวในสตริงอินพุตบางตัวxจะถูกกำหนดให้กับพจนานุกรมที่เกี่ยวข้องหลังจากนั้นแต่ละหมายเลขในแต่ละตำแหน่งจะถูกจับคู่กับค่าของมันในพจนานุกรมที่เกี่ยวข้อง 23ตัวอย่างเช่นสมมติว่าจำนวนการป้อนข้อมูลที่เป็น 20ในสถานที่นับจะได้รับการจับคู่กับพจนานุกรมeในสิ่งที่มันจะถูกจับคู่กับ6และ3ในสถานที่คนจะได้รับการจับคู่กับพจนานุกรมในสิ่งที่มันจะถูกจับคู่กับd 5ตัวเลขที่ตรงกันเหล่านี้จะถูกรวมเข้าด้วยกันเพื่อแสดงความยาวของการแสดงตัวเลขภาษาอังกฤษซึ่งกำหนดให้xเป็นสตริงและตราบใดx!='4'ที่ห่วงในขณะที่ดำเนินต่อไปจะเพิ่มขึ้นcโดย1แต่ละครั้งเพื่อเป็นตัวแทนจำนวนขั้นตอนที่ดำเนินการป่านนี้ ดังนั้น23จะสอดคล้องกับ11ซึ่งจะสอดคล้องกับ6สิ่งที่จะหันไป3และจากนั้นไป5และในที่สุดจะ4ส่งผลให้ใน5ขั้นตอนทั้งหมด

สุดท้ายเมื่อเสร็จสิ้นห่วงcคือออกไปstdoutเพื่อเป็นตัวแทนของ "ระยะห่างจากสี่" 5ซึ่งในกรณีนี้จะเป็น


1

ชวา 556 295 ไบต์

ขอบคุณ @KevinCruijssen สำหรับการบันทึก261 ไบต์

  void int(n) {int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;while(n>0){if(n/100>0)c+=(s[n/100]+7);else {if(n>0&n<25){c+=s[n];break;}else{c+=s[(n/10)+22];}}n=n%t;t=t/10;}while(c!=4){v++;c=s[c];}System.out.print(v);}


Ungolfed:

  void int(n) {

    int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};
     int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;
         while(n>0){
            if(n/100>0)
                c+=(s[n/100]+7);
            else {if(n>0&n<25){
                c+=s[n];
            break;
            }
            else{
                c+=s[(n/10)+22];

            }
            }
            n=n%t;
            t=t/10;
        }

        while(c!=4)
        {
            v++;
        c=s[c];
        }
System.out.print(v);
}

ฉันคิดว่าคุณมีข้อผิดพลาดในรหัสของคุณเพราะs++เป็นไปไม่ได้ใน String-array .. : S
Kevin Cruijssen

@KevinCruijssen ฉันประกาศ S (ตัวนับ) เป็น INT และ STRING ด้วย .... java ตัดสินใจโดยอัตโนมัติว่าเป็น INT
Numberknot

ดีถ้าฉันเรียกใช้รหัสของคุณใน ideone หรือ Eclipse IDE ของฉันมันล้มเหลวเพราะคุณมีสองs.. Btw คุณสามารถกอล์ฟรหัสของคุณโดยจำนวนมากเช่นนี้:int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}
เควิน Cruijssen

ฉันช็อค ...... เกิดอะไรขึ้นกับรหัสของฉันและขอบคุณ @ KevinCruijssen .. และฉันกำลังแก้ไข ... ขอขอบคุณอีกครั้ง
Numberknot

Np :) ฉันคิดว่ามันอาจจะเล่นกอล์ฟได้อีกโดยไม่ใช้ if-else และบุกเข้าไปที่นั่น (แต่ฉันจะปล่อยให้คนอื่น) แต่รหัสเริ่มต้นของคุณเป็นฐานที่ดีในการแก้ปัญหาความท้าทายดังนั้น +1 จากฉัน.
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.