Nora
Nora

Reputation: 15

Pig Latin Python program

I've been working on a Pig Latin program. However, it doesn't seem to be working and I can't figure out why.

user_input = input("Enter word to be translated:")

def translate(user_input): 
    first = user_input[0]
    if first == "a" or "e" or "i" or "o" or "u": 
         user_input = user_input.lower()
         user_input += "way" 
         return user_input
    else: 
        user_input = user_input.lower()
        user_input = user_input[1:]+first+"ay" 
        return user_input 

print(translate(user_input))

On top of that, I was looking to utilize enumerate to find the position of the first vowel, slicing to isolate the first letter of the word and concatenation to form the word. I've read up on how to use it on a couple websites but I can't seem to figure out how to correctly apply it to this program. I think I would have to define Vowels = 'aeiou' before def translate(user_input) right??

Upvotes: 1

Views: 9938

Answers (7)

antonis
antonis

Reputation: 133

Here is another two ways to go about it

Method 1: Using a function that recursively translates words

sentence = str(input('Input Sentence: '))
vowels = 'aeiouAEIOU'

# 1. strip removes whitespace before and after input
# 2. pig_word_latin deals with one word at a time
# 3. join collects all the words into one sentence with spaces

def pig_latin_word(word):
    vowelStart = True
    #print(word)
    if word[0] not in vowels:
        vowelStart = False
        return pig_latin_word(word[1:] + word[:1])
    elif word[0] in vowels and not vowelStart:
            return word + 'ay'
    elif word[0] in vowels and vowelStart:
        return word + 'way'

def pig_latin(sentence):
    words: list = sentence.strip().split(' ')
    new_words = []
    for word in words:
        new_words.append(pig_latin_word(word))

    print(" ".join(new_words))

pig_latin(sentence)

Method 2: Using a function that recursively translates sentences by keeping track of spaces

sentence = str(input('Input Sentence: ')).strip()
vowels = 'aeiouAEIOU'
suffix = {}
suffix[True] = 'way'
suffix[False] = 'ay'

def pig_latin(sentence, acc='', cluster='', word=''):
    #print('S:'+sentence, 'C:'+cluster, 'W:'+word)
    #print('Acc:',acc)
    new_word = len(word)==0
    vowel_start= len(cluster)==0
    #print('NW:',new_word, suffix[vowel_start])
    #print('-')
    if len(sentence) == 0:
        return acc+word+cluster+suffix[vowel_start]
    if sentence[0] == ' ':
        return pig_latin(sentence[1:], acc+word+cluster+suffix[vowel_start]+' ')        
    
    if new_word == True:
        if sentence[0] not in vowels:
            #print('1---')
            return pig_latin(sentence[1:], acc, cluster+sentence[0], '')
        elif sentence[0] in vowels and not vowel_start:
            #print('2---')
            return pig_latin(sentence[1:], acc, cluster, word+sentence[0])
        elif sentence[0] in vowels and vowel_start:
            #print('3---')
            return pig_latin(sentence[1:], acc, '', word+sentence[0])
    else:
        return pig_latin(sentence[1:], acc, cluster, word+sentence[0])
        

print(pig_latin(sentence))

Upvotes: 0

Chris
Chris

Reputation: 363

You can do it exactly the same as you are doing it except you will need to change the second line in translate:

if first == "a" or "e" or "i" or "o" or "u":

to:

if first == "a" or first == "e" or first == "i" or first == "o" or first == "u":

or:

if first in 'aeiou':

If you want to be able to use capital letters however, I would recommend changing first to first.lower().

This becomes:

user_input = input("Enter word to be translated:")

def translate(user_input): 
    first = user_input[0]
    if first.lower() in 'aeiou': 
         user_input = user_input.lower()
         user_input += "way" 
         return user_input
    else: 
        user_input = user_input.lower()
        user_input = user_input[1:]+first+"ay" 
        return user_input 

print(translate(user_input))

If you want the code a bit shorter, I have managed to shorten it to:

def translate():
    user_input = input('Enter a word or sentence')
    for i in range(len(user_input.split())): print(str((user_input.split())[i][1::])+((user_input.split())[i])[0]+'ay', end=' ')
translate()

Upvotes: 0

my logic to translate given word in to Pig Latin translation

vowels=['a','e','i','o','u']

def igpay(name):

a_list=list(name)

if a_list[0] in vowels:

print("First letter is a Vowel")

apnd_letters="way"

else:

print("First letter is a Consonant")

a_list.append(a_list[0])

a_list.pop(0)

apnd_letters="ay"

print("Pig transaltion is {0}".format("".join(a_list)+str(apnd_letters)))

Output:

igpay("pig") First letter is a Consonant Pig transaltion is igpay

igpay("apple") First letter is a Vowel Pig transaltion is appleway

Upvotes: 0

Jash Enakulapati
Jash Enakulapati

Reputation: 19

My Solution covers the below rules: 1. A word is a consecutive sequence of letters (a-z, A-Z) or apostrophes. You may assume that the input to the function will only be a single "word". Examples: Zebra , apple 2. If a word starts with a vowel, the Pig Latin version is the original word with "way" added to the end 3. If a word starts with a consonant, or a series of consecutive consonants, the Pig Latin version transfers ALL consonants up to the first vowel to the end of the word, and adds "ay" to the end. 4. The letter 'y' should be treated as a consonant if it is the first letter of a word, but treated as a vowel otherwise. 5. If the original word is capitalized, the new Pig Latin version of the word should be capitalized in the first letter. If the original capital letter was a consonant, and thus moved, it should not be capitalized once in its new location.

Solution Starts here:

    eng_to_pig_latin = {"football": "ootballfay", "Pittsburgh":"Ittsburghpay",
                "Apple":"Appleway","oink":"oinkway", 
    "ontology":"ontologyway","yellow":"ellowyay","yttrium":"iumyttray"}
     eng_word = 'yttrium'
     vowels = 'aeiou'
     def pig_latin(eng_word):
        sub,str1 = [],''
        first = eng_word[0]
        second =  eng_word[1]
        # Rule 2
        if first.lower() in vowels:
            piglatin = eng_word +'way'
        # Rule 3
        elif first.lower() == first and second.lower() in vowels:
            piglatin = eng_word[1:]+first+'ay'
        elif first.lower()+second.lower() not in vowels:
            # Rule 3 & 4
            for l in eng_word:
                if l not in vowels:
                    sub.append(l)
                else:
                    str1 = eng_word[eng_word.index(l):]
                    break
            str2 = ''.join(sub)
            piglatin = str1+str2+'ay'
        else:
            # Rule 5
            piglatin = eng_word[1:].capitalize()+first.lower()+'ay'
        print(f'Test word is {eng_word} and its equivalent piglatin word is 
              {piglatin}. Comparison with mapping dictionary is 
               {eng_to_pig_latin[eng_word] == piglatin}')

    pig_latin(eng_word)

Note: The dictionary uses is only to cross-check if the results are as expected, which I am doing in the last print statement.

Upvotes: 0

void
void

Reputation: 2642

Here is the solution. I've made a few changes in your code which i will be explaining below.

user_input = input("Enter word to be translated:\n")
#change_1
vowels = ['a','e','i','o','u']
def translate(user_input): 
    first = user_input[0]
#change_2
    if first in vowels: 
         user_input = user_input.lower()
         user_input += "way" 
         return user_input
    else: 
        user_input = user_input.lower()
#change_3
        for letter in user_input:
            if letter in vowels:
                index_value = user_input.index(letter)
                break
#change_4
        user_input = user_input[index_value:] +user_input[:index_value]+ "ay" 
        return user_input 

print(translate(user_input))

1) Create a list of vowels.

2) As our friend @zwer mentioned You cannot chain if statements like that in Python. So

if first in vowels:

3) For every letter in user_input check if that letter is a vowel and if that letter is a vowel then find the index of it's occurrence.

For example take the word 'trash'

Here a is the first vowel and it's index is 2

if letter in vowels: 
    index_value = user_input.index(letter)

4) According to wikipedia

"all letters before the initial vowel are placed at the end of the word sequence"

For the word 'trash' it would be

user_string = user_input[2:] + user_input[:2]+"ay"

which would be slicing the word from that index to end, merged with letters before that index. And finally an "ay".

'ash' + 'tr' + 'ay'

Hope this helps.

Upvotes: 1

John Vandenberg
John Vandenberg

Reputation: 535

You can define vowels in the outer scope.

vowels = 'a', 'e', 'i', 'o', 'u'

Then anywhere you can use:

if first in vowels:

Upvotes: 0

zwer
zwer

Reputation: 25789

You cannot chain if statements like that in Python, you have to do it the long way:

if first == "a" or first == "e" or first == "i" or first == "u":

or shorten it to:

if first in ["a", "e", "i", "u"]:

Upvotes: 3

Related Questions